blob: 6110bac731642016edff494a4539733eb3169f39 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Jooyung Han35155c42020-02-06 17:33:20 +090087// withNativeBridgeTargets sets configuration with targets including:
88// - X86_64 (primary)
89// - X86 (secondary)
90// - Arm64 on X86_64 (native bridge)
91// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000092var withNativeBridgeEnabled = android.FixtureModifyConfig(
93 func(config android.Config) {
94 config.Targets[android.Android] = []android.Target{
95 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
96 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
97 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
98 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
99 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
103 }
104 },
105)
106
107func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
108 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
109 variables.ManifestPackageNameOverrides = specs
110 })
Jooyung Han35155c42020-02-06 17:33:20 +0900111}
112
Albert Martineefabcf2022-03-21 20:11:16 +0000113func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
116 })
117}
118
Paul Duffin810f33d2021-03-09 14:12:32 +0000119var withBinder32bit = android.FixtureModifyProductVariables(
120 func(variables android.FixtureProductVariables) {
121 variables.Binder32bit = proptools.BoolPtr(true)
122 },
123)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withUnbundledBuild = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Unbundled_build = proptools.BoolPtr(true)
128 },
129)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900130
Paul Duffin284165a2021-03-29 01:50:31 +0100131// Legacy preparer used for running tests within the apex package.
132//
133// This includes everything that was needed to run any test in the apex package prior to the
134// introduction of the test fixtures. Tests that are being converted to use fixtures directly
135// rather than through the testApex...() methods should avoid using this and instead use the
136// various preparers directly, using android.GroupFixturePreparers(...) to group them when
137// necessary.
138//
139// deprecated
140var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000141 // General preparers in alphabetical order as test infrastructure will enforce correct
142 // registration order.
143 android.PrepareForTestWithAndroidBuildComponents,
144 bpf.PrepareForTestWithBpf,
145 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100146 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000147 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
148 rust.PrepareForTestWithRustDefaultModules,
149 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800150 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000151
152 PrepareForTestWithApexBuildComponents,
153
154 // Additional apex test specific preparers.
155 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
156 filegroup {
157 name: "myapex-file_contexts",
158 srcs: [
159 "apex/myapex-file_contexts",
160 ],
161 }
162 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000163 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000164 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 "a.java": nil,
166 "PrebuiltAppFoo.apk": nil,
167 "PrebuiltAppFooPriv.apk": nil,
168 "apex_manifest.json": nil,
169 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
171 "system/sepolicy/apex/myapex2-file_contexts": nil,
172 "system/sepolicy/apex/otherapex-file_contexts": nil,
173 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
174 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700175 "mylib.cpp": nil,
176 "mytest.cpp": nil,
177 "mytest1.cpp": nil,
178 "mytest2.cpp": nil,
179 "mytest3.cpp": nil,
180 "myprebuilt": nil,
181 "my_include": nil,
182 "foo/bar/MyClass.java": nil,
183 "prebuilt.jar": nil,
184 "prebuilt.so": nil,
185 "vendor/foo/devkeys/test.x509.pem": nil,
186 "vendor/foo/devkeys/test.pk8": nil,
187 "testkey.x509.pem": nil,
188 "testkey.pk8": nil,
189 "testkey.override.x509.pem": nil,
190 "testkey.override.pk8": nil,
191 "vendor/foo/devkeys/testkey.avbpubkey": nil,
192 "vendor/foo/devkeys/testkey.pem": nil,
193 "NOTICE": nil,
194 "custom_notice": nil,
195 "custom_notice_for_static_lib": nil,
196 "testkey2.avbpubkey": nil,
197 "testkey2.pem": nil,
198 "myapex-arm64.apex": nil,
199 "myapex-arm.apex": nil,
200 "myapex.apks": nil,
201 "frameworks/base/api/current.txt": nil,
202 "framework/aidl/a.aidl": nil,
203 "dummy.txt": nil,
204 "baz": nil,
205 "bar/baz": nil,
206 "testdata/baz": nil,
207 "AppSet.apks": nil,
208 "foo.rs": nil,
209 "libfoo.jar": nil,
210 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000211 },
212 ),
213
214 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000215 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
216 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
217 variables.Platform_sdk_codename = proptools.StringPtr("Q")
218 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000219 // "Tiramisu" needs to be in the next line for compatibility with soong code,
220 // not because of these tests specifically (it's not used by the tests)
221 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000222 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000223 }),
224)
225
Paul Duffin52bfaa42021-03-23 23:40:12 +0000226var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
227 "system/sepolicy/apex/myapex-file_contexts": nil,
228})
229
Colin Crossb614cd42024-10-11 12:52:21 -0700230var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/otherapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900268 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jooyung Hana3fddf42024-09-03 13:22:21 +0900279func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
280 t.Helper()
281 p := regexp.MustCompile(expectedRex)
282 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
283 t.Errorf("%q is not found in %v", expectedRex, result)
284 }
285}
286
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if !android.InList(expected, result) {
290 t.Errorf("%q is not found in %v", expected, result)
291 }
292}
293
294func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900295 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900296 if android.InList(notExpected, result) {
297 t.Errorf("%q is found in %v", notExpected, result)
298 }
299}
300
Jooyung Hane1633032019-08-01 17:41:43 +0900301func ensureListEmpty(t *testing.T, result []string) {
302 t.Helper()
303 if len(result) > 0 {
304 t.Errorf("%q is expected to be empty", result)
305 }
306}
307
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000308func ensureListNotEmpty(t *testing.T, result []string) {
309 t.Helper()
310 if len(result) == 0 {
311 t.Errorf("%q is expected to be not empty", result)
312 }
313}
314
Jiyong Park25fc6a92018-11-18 18:02:45 +0900315// Minimal test
316func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700317 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800318 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900319 apex_defaults {
320 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900321 manifest: ":myapex.manifest",
322 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900324 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900325 native_shared_libs: [
326 "mylib",
327 "libfoo.ffi",
328 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900329 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800330 multilib: {
331 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900332 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800333 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900334 },
Jiyong Park77acec62020-06-01 21:39:15 +0900335 java_libs: [
336 "myjar",
337 "myjar_dex",
338 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000339 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900340 }
341
Jiyong Park30ca9372019-02-07 16:27:23 +0900342 apex {
343 name: "myapex",
344 defaults: ["myapex-defaults"],
345 }
346
Jiyong Park25fc6a92018-11-18 18:02:45 +0900347 apex_key {
348 name: "myapex.key",
349 public_key: "testkey.avbpubkey",
350 private_key: "testkey.pem",
351 }
352
Jiyong Park809bb722019-02-13 21:33:49 +0900353 filegroup {
354 name: "myapex.manifest",
355 srcs: ["apex_manifest.json"],
356 }
357
358 filegroup {
359 name: "myapex.androidmanifest",
360 srcs: ["AndroidManifest.xml"],
361 }
362
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 cc_library {
364 name: "mylib",
365 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900366 shared_libs: [
367 "mylib2",
368 "libbar.ffi",
369 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900370 system_shared_libs: [],
371 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000372 // TODO: remove //apex_available:platform
373 apex_available: [
374 "//apex_available:platform",
375 "myapex",
376 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900377 }
378
Alex Light3d673592019-01-18 14:37:31 -0800379 cc_binary {
380 name: "foo",
381 srcs: ["mylib.cpp"],
382 compile_multilib: "both",
383 multilib: {
384 lib32: {
385 suffix: "32",
386 },
387 lib64: {
388 suffix: "64",
389 },
390 },
391 symlinks: ["foo_link_"],
392 symlink_preferred_arch: true,
393 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800394 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900395 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700396 }
397
Jiyong Park99644e92020-11-17 22:21:02 +0900398 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000399 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900400 srcs: ["foo.rs"],
401 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700402 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900403 apex_available: ["myapex"],
404 }
405
406 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000407 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900408 srcs: ["foo.rs"],
409 crate_name: "foo",
410 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900411 shared_libs: ["libfoo.shared_from_rust"],
412 }
413
414 cc_library_shared {
415 name: "libfoo.shared_from_rust",
416 srcs: ["mylib.cpp"],
417 system_shared_libs: [],
418 stl: "none",
419 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900420 }
421
422 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000423 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900424 srcs: ["foo.rs"],
425 crate_name: "foo",
426 apex_available: ["myapex"],
427 }
428
Colin Cross49f1a8f2024-10-23 13:04:15 -0700429 rust_library_dylib {
430 name: "libfoo.transitive.dylib.rust",
431 srcs: ["foo.rs"],
432 crate_name: "foo",
433 apex_available: ["myapex"],
434 }
435
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900436 rust_ffi_shared {
437 name: "libfoo.ffi",
438 srcs: ["foo.rs"],
439 crate_name: "foo",
440 apex_available: ["myapex"],
441 }
442
443 rust_ffi_shared {
444 name: "libbar.ffi",
445 srcs: ["foo.rs"],
446 crate_name: "bar",
447 apex_available: ["myapex"],
448 }
449
Paul Duffindddd5462020-04-07 15:25:44 +0100450 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900451 name: "mylib2",
452 srcs: ["mylib.cpp"],
453 system_shared_libs: [],
454 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900455 static_libs: ["libstatic"],
456 // TODO: remove //apex_available:platform
457 apex_available: [
458 "//apex_available:platform",
459 "myapex",
460 ],
461 }
462
Paul Duffindddd5462020-04-07 15:25:44 +0100463 cc_prebuilt_library_shared {
464 name: "mylib2",
465 srcs: ["prebuilt.so"],
466 // TODO: remove //apex_available:platform
467 apex_available: [
468 "//apex_available:platform",
469 "myapex",
470 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700471 }
Paul Duffindddd5462020-04-07 15:25:44 +0100472
Jiyong Park9918e1a2020-03-17 19:16:40 +0900473 cc_library_static {
474 name: "libstatic",
475 srcs: ["mylib.cpp"],
476 system_shared_libs: [],
477 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000478 // TODO: remove //apex_available:platform
479 apex_available: [
480 "//apex_available:platform",
481 "myapex",
482 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900483 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484
485 java_library {
486 name: "myjar",
487 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900488 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 sdk_version: "none",
490 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900492 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900498 }
499
Jiyong Park77acec62020-06-01 21:39:15 +0900500 dex_import {
501 name: "myjar_dex",
502 jars: ["prebuilt.jar"],
503 apex_available: [
504 "//apex_available:platform",
505 "myapex",
506 ],
507 }
508
Jiyong Park7f7766d2019-07-25 22:02:35 +0900509 java_library {
510 name: "myotherjar",
511 srcs: ["foo/bar/MyClass.java"],
512 sdk_version: "none",
513 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900514 // TODO: remove //apex_available:platform
515 apex_available: [
516 "//apex_available:platform",
517 "myapex",
518 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900519 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900520
521 java_library {
522 name: "mysharedjar",
523 srcs: ["foo/bar/MyClass.java"],
524 sdk_version: "none",
525 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900526 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 `)
528
Jooyung Hana0503a52023-08-23 13:12:50 +0900529 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900530
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900532 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700533 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900534 var builder strings.Builder
535 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
536
537 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000538 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900539 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
540
Jiyong Park42cca6c2019-04-01 11:15:50 +0900541 optFlags := apexRule.Args["opt_flags"]
542 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700543 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900544 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900545
Jiyong Park25fc6a92018-11-18 18:02:45 +0900546 copyCmds := apexRule.Args["copy_commands"]
547
548 // Ensure that main rule creates an output
549 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
550
551 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700559 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
560 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900561 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
562 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700563 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900566
567 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800568 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
569 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900570 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900571 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900572 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700573 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900574 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
575 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900576 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900577 // .. but not for java libs
578 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900579 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800580
Colin Cross7113d202019-11-20 16:39:12 -0800581 // Ensure that the platform variant ends with _shared or _common
582 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
583 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900584 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
585 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900586 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
587
588 // Ensure that dynamic dependency to java libs are not included
589 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800590
591 // Ensure that all symlinks are present.
592 found_foo_link_64 := false
593 found_foo := false
594 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900595 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800596 if strings.HasSuffix(cmd, "bin/foo") {
597 found_foo = true
598 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
599 found_foo_link_64 = true
600 }
601 }
602 }
603 good := found_foo && found_foo_link_64
604 if !good {
605 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
606 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900607
Colin Crossf61d03d2023-11-02 16:56:39 -0700608 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
609 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
612 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
613 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100614
Colin Crossf61d03d2023-11-02 16:56:39 -0700615 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
616 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100617 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100618 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
619 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
620 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800621}
622
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700624 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800625 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900626 apex_defaults {
627 name: "myapex-defaults",
628 key: "myapex.key",
629 prebuilts: ["myetc"],
630 native_shared_libs: ["mylib"],
631 java_libs: ["myjar"],
632 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900633 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800634 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000635 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900636 }
637
638 prebuilt_etc {
639 name: "myetc",
640 src: "myprebuilt",
641 }
642
643 apex {
644 name: "myapex",
645 defaults: ["myapex-defaults"],
646 }
647
648 apex_key {
649 name: "myapex.key",
650 public_key: "testkey.avbpubkey",
651 private_key: "testkey.pem",
652 }
653
654 cc_library {
655 name: "mylib",
656 system_shared_libs: [],
657 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000658 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 }
660
661 java_library {
662 name: "myjar",
663 srcs: ["foo/bar/MyClass.java"],
664 sdk_version: "none",
665 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000666 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 }
668
669 android_app {
670 name: "AppFoo",
671 srcs: ["foo/bar/MyClass.java"],
672 sdk_version: "none",
673 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000674 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900676
677 runtime_resource_overlay {
678 name: "rro",
679 theme: "blue",
680 }
681
markchien2f59ec92020-09-02 16:23:38 +0800682 bpf {
683 name: "bpf",
684 srcs: ["bpf.c", "bpf2.c"],
685 }
686
Ken Chenfad7f9d2021-11-10 22:02:57 +0800687 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800688 name: "netdTest",
689 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800690 sub_dir: "netd",
691 }
692
Jooyung Hanf21c7972019-12-16 22:32:06 +0900693 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900694 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 "etc/myetc",
696 "javalib/myjar.jar",
697 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000698 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900699 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800700 "etc/bpf/bpf.o",
701 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800702 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900703 })
704}
705
Jooyung Han01a3ee22019-11-02 02:52:25 +0900706func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700707 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800708 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709 apex {
710 name: "myapex",
711 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000712 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713 }
714
715 apex_key {
716 name: "myapex.key",
717 public_key: "testkey.avbpubkey",
718 private_key: "testkey.pem",
719 }
720 `)
721
Jooyung Hana0503a52023-08-23 13:12:50 +0900722 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900723 args := module.Rule("apexRule").Args
724 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
725 t.Error("manifest should be apex_manifest.pb, but " + manifest)
726 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900727}
728
Liz Kammer4854a7d2021-05-27 14:28:27 -0400729func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700730 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400731 ctx := testApex(t, `
732 apex_defaults {
733 name: "my_defaults",
734 key: "myapex.key",
735 product_specific: true,
736 file_contexts: ":my-file-contexts",
737 updatable: false,
738 }
739 apex {
740 name: "myapex_30",
741 min_sdk_version: "30",
742 defaults: ["my_defaults"],
743 }
744
745 apex {
746 name: "myapex_current",
747 min_sdk_version: "current",
748 defaults: ["my_defaults"],
749 }
750
751 apex {
752 name: "myapex_none",
753 defaults: ["my_defaults"],
754 }
755
756 apex_key {
757 name: "myapex.key",
758 public_key: "testkey.avbpubkey",
759 private_key: "testkey.pem",
760 }
761
762 filegroup {
763 name: "my-file-contexts",
764 srcs: ["product_specific_file_contexts"],
765 }
766 `, withFiles(map[string][]byte{
767 "product_specific_file_contexts": nil,
768 }), android.FixtureModifyProductVariables(
769 func(variables android.FixtureProductVariables) {
770 variables.Unbundled_build = proptools.BoolPtr(true)
771 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
772 }), android.FixtureMergeEnv(map[string]string{
773 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
774 }))
775
776 testCases := []struct {
777 module string
778 minSdkVersion string
779 }{
780 {
781 module: "myapex_30",
782 minSdkVersion: "30",
783 },
784 {
785 module: "myapex_current",
786 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
787 },
788 {
789 module: "myapex_none",
790 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
791 },
792 }
793 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900794 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400795 args := module.Rule("apexRule").Args
796 optFlags := args["opt_flags"]
797 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
798 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
799 }
800 }
801}
802
Jihoon Kang842b9992024-02-08 01:41:51 +0000803func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700804 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000805 ctx := testApex(t, `
806 apex_defaults {
807 name: "my_defaults",
808 key: "myapex.key",
809 product_specific: true,
810 file_contexts: ":my-file-contexts",
811 updatable: false,
812 }
813 apex {
814 name: "myapex_30",
815 min_sdk_version: "30",
816 defaults: ["my_defaults"],
817 }
818
819 apex {
820 name: "myapex_current",
821 min_sdk_version: "current",
822 defaults: ["my_defaults"],
823 }
824
825 apex {
826 name: "myapex_none",
827 defaults: ["my_defaults"],
828 }
829
830 apex_key {
831 name: "myapex.key",
832 public_key: "testkey.avbpubkey",
833 private_key: "testkey.pem",
834 }
835
836 filegroup {
837 name: "my-file-contexts",
838 srcs: ["product_specific_file_contexts"],
839 }
840 `, withFiles(map[string][]byte{
841 "product_specific_file_contexts": nil,
842 }), android.FixtureModifyProductVariables(
843 func(variables android.FixtureProductVariables) {
844 variables.Unbundled_build = proptools.BoolPtr(true)
845 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
846 }), android.FixtureMergeEnv(map[string]string{
847 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
848 }))
849
850 testCases := []struct {
851 module string
852 minSdkVersion string
853 }{
854 {
855 module: "myapex_30",
856 minSdkVersion: "30",
857 },
858 {
859 module: "myapex_current",
860 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
861 },
862 {
863 module: "myapex_none",
864 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
865 },
866 }
867 for _, tc := range testCases {
868 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
869 args := module.Rule("apexRule").Args
870 optFlags := args["opt_flags"]
871 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
872 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
873 }
874 }
875}
876
Jooyung Hanaf730952023-02-28 14:13:38 +0900877func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700878 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900879 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900880 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900881 if vendor {
882 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900883 }
884 ctx := testApex(t, `
885 apex {
886 name: "myapex",
887 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900888 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900889 `+prop+`
890 }
891
892 apex_key {
893 name: "myapex.key",
894 public_key: "testkey.avbpubkey",
895 private_key: "testkey.pem",
896 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900897 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900898
Jooyung Hana0503a52023-08-23 13:12:50 +0900899 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900900 if vendor {
901 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
902 rule.RuleParams.Command,
903 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900904 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900905 android.AssertStringDoesContain(t, "should force-label as system_file",
906 rule.RuleParams.Command,
907 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900908 }
909 }
910}
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700913 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800914 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 apex {
916 name: "myapex",
917 key: "myapex.key",
918 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900919 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000920 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 }
922
923 apex_key {
924 name: "myapex.key",
925 public_key: "testkey.avbpubkey",
926 private_key: "testkey.pem",
927 }
928
929 cc_library {
930 name: "mylib",
931 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800932 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933 system_shared_libs: [],
934 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000935 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 }
937
938 cc_library {
939 name: "mylib2",
940 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900941 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900942 system_shared_libs: [],
943 stl: "none",
944 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000945 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900946 versions: ["1", "2", "3"],
947 },
948 }
949
950 cc_library {
951 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900952 srcs: ["mylib.cpp"],
953 shared_libs: ["mylib4"],
954 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900955 stl: "none",
956 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000957 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900958 versions: ["10", "11", "12"],
959 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000960 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900962
963 cc_library {
964 name: "mylib4",
965 srcs: ["mylib.cpp"],
966 system_shared_libs: [],
967 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000968 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900969 }
Jiyong Park105dc322021-06-11 17:22:09 +0900970
Spandan Das357ffcc2024-07-24 18:07:48 +0000971 cc_prebuilt_library_shared {
972 name: "my_prebuilt_platform_lib",
973 stubs: {
974 symbol_file: "my_prebuilt_platform_lib.map.txt",
975 versions: ["1", "2", "3"],
976 },
977 srcs: ["foo.so"],
978 }
979
980 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
981 cc_prebuilt_library_shared {
982 name: "my_prebuilt_platform_stub_only_lib",
983 stubs: {
984 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
985 versions: ["1", "2", "3"],
986 }
987 }
988
Jiyong Park105dc322021-06-11 17:22:09 +0900989 rust_binary {
990 name: "foo.rust",
991 srcs: ["foo.rs"],
992 shared_libs: ["libfoo.shared_from_rust"],
993 prefer_rlib: true,
994 apex_available: ["myapex"],
995 }
996
997 cc_library_shared {
998 name: "libfoo.shared_from_rust",
999 srcs: ["mylib.cpp"],
1000 system_shared_libs: [],
1001 stl: "none",
1002 stubs: {
1003 versions: ["10", "11", "12"],
1004 },
1005 }
1006
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 `)
1008
Jooyung Hana0503a52023-08-23 13:12:50 +09001009 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001010 copyCmds := apexRule.Args["copy_commands"]
1011
1012 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001013 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001014
1015 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001016 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001017
1018 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001019 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001020
Colin Crossaede88c2020-08-11 12:17:01 -07001021 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001022
1023 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001024 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001025 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001026 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001027
Colin Crossea91a172024-11-05 16:14:05 -08001028 // 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 -07001029 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001030 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001031 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001032
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001033 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1034 // is replaced by sharing of "cFlags" in cc/builder.go.
1035 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1036 // module variable representing "cflags". So it was not detected by ensureNotContains.
1037 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1038 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1039 // including the original cflags's "-include mylib.h".
1040 //
Jiyong Park64379952018-12-13 18:37:29 +09001041 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001042 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1043 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001044
Jiyong Park85cc35a2022-07-17 11:30:47 +09001045 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1046 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1047 // Ensure that genstub for apex-provided lib is invoked with --apex
1048 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001049
Jooyung Hana0503a52023-08-23 13:12:50 +09001050 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001051 "lib64/mylib.so",
1052 "lib64/mylib3.so",
1053 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001054 "bin/foo.rust",
1055 "lib64/libc++.so", // by the implicit dependency from foo.rust
1056 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001057 })
Jiyong Park105dc322021-06-11 17:22:09 +09001058
1059 // Ensure that stub dependency from a rust module is not included
1060 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1061 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001062 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001063 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1064 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001065
Jooyung Hana0503a52023-08-23 13:12:50 +09001066 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001067 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001068
1069 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1070 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1071 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1072 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1073 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1074 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1075
1076 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1077 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1078 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1079 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1080 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1081 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001082}
1083
Jooyung Han20348752023-12-05 15:23:56 +09001084func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001085 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001086 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1087 apex {
1088 name: "myapex",
1089 key: "myapex.key",
1090 vendor: true,
1091 updatable: false,
1092 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1093 }
1094
1095 apex_key {
1096 name: "myapex.key",
1097 public_key: "testkey.avbpubkey",
1098 private_key: "testkey.pem",
1099 }
1100
1101 cc_library {
1102 name: "libbar",
1103 srcs: ["mylib.cpp"],
1104 llndk: {
1105 symbol_file: "libbar.map.txt",
1106 }
1107 }
1108 `)
1109}
1110
Jiyong Park1bc84122021-06-22 20:23:05 +09001111func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001112 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001113 ctx := testApex(t, `
1114 apex {
1115 name: "myapex",
1116 key: "myapex.key",
1117 native_shared_libs: ["mylib"],
1118 binaries: ["foo.rust"],
1119 updatable: false,
1120 platform_apis: true,
1121 }
1122
1123 apex_key {
1124 name: "myapex.key",
1125 public_key: "testkey.avbpubkey",
1126 private_key: "testkey.pem",
1127 }
1128
1129 cc_library {
1130 name: "mylib",
1131 srcs: ["mylib.cpp"],
1132 shared_libs: ["mylib2"],
1133 system_shared_libs: [],
1134 stl: "none",
1135 apex_available: [ "myapex" ],
1136 }
1137
1138 cc_library {
1139 name: "mylib2",
1140 srcs: ["mylib.cpp"],
1141 cflags: ["-include mylib.h"],
1142 system_shared_libs: [],
1143 stl: "none",
1144 stubs: {
1145 versions: ["1", "2", "3"],
1146 },
1147 }
1148
1149 rust_binary {
1150 name: "foo.rust",
1151 srcs: ["foo.rs"],
1152 shared_libs: ["libfoo.shared_from_rust"],
1153 prefer_rlib: true,
1154 apex_available: ["myapex"],
1155 }
1156
1157 cc_library_shared {
1158 name: "libfoo.shared_from_rust",
1159 srcs: ["mylib.cpp"],
1160 system_shared_libs: [],
1161 stl: "none",
1162 stubs: {
1163 versions: ["10", "11", "12"],
1164 },
1165 }
1166 `)
1167
Jooyung Hana0503a52023-08-23 13:12:50 +09001168 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001169 copyCmds := apexRule.Args["copy_commands"]
1170
1171 // Ensure that indirect stubs dep is not included
1172 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1173 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1174
1175 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1176 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001177 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001178 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1179 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001180 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001181 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1182 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1183}
1184
Colin Cross7812fd32020-09-25 12:35:10 -07001185func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1186 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001187 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001188 apex {
1189 name: "myapex",
1190 key: "myapex.key",
1191 native_shared_libs: ["mylib", "mylib3"],
1192 min_sdk_version: "29",
1193 }
1194
1195 apex_key {
1196 name: "myapex.key",
1197 public_key: "testkey.avbpubkey",
1198 private_key: "testkey.pem",
1199 }
1200
1201 cc_library {
1202 name: "mylib",
1203 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001204 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001205 system_shared_libs: [],
1206 stl: "none",
1207 apex_available: [ "myapex" ],
1208 min_sdk_version: "28",
1209 }
1210
1211 cc_library {
1212 name: "mylib2",
1213 srcs: ["mylib.cpp"],
1214 cflags: ["-include mylib.h"],
1215 system_shared_libs: [],
1216 stl: "none",
1217 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001218 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001219 versions: ["28", "29", "30", "current"],
1220 },
1221 min_sdk_version: "28",
1222 }
1223
1224 cc_library {
1225 name: "mylib3",
1226 srcs: ["mylib.cpp"],
1227 shared_libs: ["mylib4"],
1228 system_shared_libs: [],
1229 stl: "none",
1230 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001231 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001232 versions: ["28", "29", "30", "current"],
1233 },
1234 apex_available: [ "myapex" ],
1235 min_sdk_version: "28",
1236 }
1237
1238 cc_library {
1239 name: "mylib4",
1240 srcs: ["mylib.cpp"],
1241 system_shared_libs: [],
1242 stl: "none",
1243 apex_available: [ "myapex" ],
1244 min_sdk_version: "28",
1245 }
1246 `)
1247
Jooyung Hana0503a52023-08-23 13:12:50 +09001248 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001249 copyCmds := apexRule.Args["copy_commands"]
1250
1251 // Ensure that direct non-stubs dep is always included
1252 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1253
1254 // Ensure that indirect stubs dep is not included
1255 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1256
1257 // Ensure that direct stubs dep is included
1258 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1259
1260 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1261
Jiyong Park55549df2021-02-26 23:57:23 +09001262 // Ensure that mylib is linking with the latest version of stub for mylib2
1263 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001264 // ... and not linking to the non-stub (impl) variant of mylib2
1265 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1266
Colin Crossea91a172024-11-05 16:14:05 -08001267 // 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 -07001268 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1269 // .. and not linking to the stubs variant of mylib3
1270 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1271
1272 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001273 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001274 ensureNotContains(t, mylib2Cflags, "-include ")
1275
Jiyong Park85cc35a2022-07-17 11:30:47 +09001276 // Ensure that genstub is invoked with --systemapi
1277 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001278
Jooyung Hana0503a52023-08-23 13:12:50 +09001279 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001280 "lib64/mylib.so",
1281 "lib64/mylib3.so",
1282 "lib64/mylib4.so",
1283 })
1284}
1285
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001286func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1287 t.Parallel()
1288 // myapex (Z)
1289 // mylib -----------------.
1290 // |
1291 // otherapex (29) |
1292 // libstub's versions: 29 Z current
1293 // |
1294 // <platform> |
1295 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001296 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001297 apex {
1298 name: "myapex",
1299 key: "myapex.key",
1300 native_shared_libs: ["mylib"],
1301 min_sdk_version: "Z", // non-final
1302 }
1303
1304 cc_library {
1305 name: "mylib",
1306 srcs: ["mylib.cpp"],
1307 shared_libs: ["libstub"],
1308 apex_available: ["myapex"],
1309 min_sdk_version: "Z",
1310 }
1311
1312 apex_key {
1313 name: "myapex.key",
1314 public_key: "testkey.avbpubkey",
1315 private_key: "testkey.pem",
1316 }
1317
1318 apex {
1319 name: "otherapex",
1320 key: "myapex.key",
1321 native_shared_libs: ["libstub"],
1322 min_sdk_version: "29",
1323 }
1324
1325 cc_library {
1326 name: "libstub",
1327 srcs: ["mylib.cpp"],
1328 stubs: {
1329 versions: ["29", "Z", "current"],
1330 },
1331 apex_available: ["otherapex"],
1332 min_sdk_version: "29",
1333 }
1334
1335 // platform module depending on libstub from otherapex should use the latest stub("current")
1336 cc_library {
1337 name: "libplatform",
1338 srcs: ["mylib.cpp"],
1339 shared_libs: ["libstub"],
1340 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001341 `,
1342 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1343 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1344 variables.Platform_sdk_final = proptools.BoolPtr(false)
1345 variables.Platform_version_active_codenames = []string{"Z"}
1346 }),
1347 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001348
Jiyong Park55549df2021-02-26 23:57:23 +09001349 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001350 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001351 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001352 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001353 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001354
1355 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1356 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1357 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1358 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1359 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1360}
1361
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001362func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001363 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001364 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001366 name: "myapex2",
1367 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001369 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001370 }
1371
1372 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001373 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001374 public_key: "testkey.avbpubkey",
1375 private_key: "testkey.pem",
1376 }
1377
1378 cc_library {
1379 name: "mylib",
1380 srcs: ["mylib.cpp"],
1381 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001382 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001383 system_shared_libs: [],
1384 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001385 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001386 }
1387
1388 cc_library {
1389 name: "libfoo",
1390 srcs: ["mylib.cpp"],
1391 shared_libs: ["libbar"],
1392 system_shared_libs: [],
1393 stl: "none",
1394 stubs: {
1395 versions: ["10", "20", "30"],
1396 },
1397 }
1398
1399 cc_library {
1400 name: "libbar",
1401 srcs: ["mylib.cpp"],
1402 system_shared_libs: [],
1403 stl: "none",
1404 }
1405
Jiyong Park678c8812020-02-07 17:25:49 +09001406 cc_library_static {
1407 name: "libbaz",
1408 srcs: ["mylib.cpp"],
1409 system_shared_libs: [],
1410 stl: "none",
1411 apex_available: [ "myapex2" ],
1412 }
1413
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001414 `)
1415
Jooyung Hana0503a52023-08-23 13:12:50 +09001416 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001417 copyCmds := apexRule.Args["copy_commands"]
1418
1419 // Ensure that direct non-stubs dep is always included
1420 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1421
1422 // Ensure that indirect stubs dep is not included
1423 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1424
1425 // Ensure that dependency of stubs is not included
1426 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1427
Colin Crossaede88c2020-08-11 12:17:01 -07001428 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001429
1430 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001431 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001432 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001433 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001434
Jiyong Park3ff16992019-12-27 14:11:47 +09001435 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001436
1437 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1438 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001439
Colin Crossf61d03d2023-11-02 16:56:39 -07001440 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1441 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001442 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001443
Colin Crossf61d03d2023-11-02 16:56:39 -07001444 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1445 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001446 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001447}
1448
Jooyung Hand3639552019-08-09 12:57:43 +09001449func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001450 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001451 /*
1452 myapex
1453 |
1454 v (runtime_libs)
1455 mylib ------+------> libfoo [provides stub]
1456 |
1457 `------> libbar
1458 */
Colin Cross1c460562021-02-16 17:55:47 -08001459 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001460 apex {
1461 name: "myapex",
1462 key: "myapex.key",
1463 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001464 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001465 }
1466
1467 apex_key {
1468 name: "myapex.key",
1469 public_key: "testkey.avbpubkey",
1470 private_key: "testkey.pem",
1471 }
1472
1473 cc_library {
1474 name: "mylib",
1475 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001476 static_libs: ["libstatic"],
1477 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001478 runtime_libs: ["libfoo", "libbar"],
1479 system_shared_libs: [],
1480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001481 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001482 }
1483
1484 cc_library {
1485 name: "libfoo",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 stubs: {
1490 versions: ["10", "20", "30"],
1491 },
1492 }
1493
1494 cc_library {
1495 name: "libbar",
1496 srcs: ["mylib.cpp"],
1497 system_shared_libs: [],
1498 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001499 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001500 }
1501
Liz Kammer5f108fa2023-05-11 14:33:17 -04001502 cc_library {
1503 name: "libstatic",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 runtime_libs: ["libstatic_to_runtime"],
1509 }
1510
1511 cc_library {
1512 name: "libshared",
1513 srcs: ["mylib.cpp"],
1514 system_shared_libs: [],
1515 stl: "none",
1516 apex_available: [ "myapex" ],
1517 runtime_libs: ["libshared_to_runtime"],
1518 }
1519
1520 cc_library {
1521 name: "libstatic_to_runtime",
1522 srcs: ["mylib.cpp"],
1523 system_shared_libs: [],
1524 stl: "none",
1525 apex_available: [ "myapex" ],
1526 }
1527
1528 cc_library {
1529 name: "libshared_to_runtime",
1530 srcs: ["mylib.cpp"],
1531 system_shared_libs: [],
1532 stl: "none",
1533 apex_available: [ "myapex" ],
1534 }
Jooyung Hand3639552019-08-09 12:57:43 +09001535 `)
1536
Jooyung Hana0503a52023-08-23 13:12:50 +09001537 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001538 copyCmds := apexRule.Args["copy_commands"]
1539
1540 // Ensure that direct non-stubs dep is always included
1541 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1542
1543 // Ensure that indirect stubs dep is not included
1544 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1545
1546 // Ensure that runtime_libs dep in included
1547 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001548 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1549 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1550
1551 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001552
Jooyung Hana0503a52023-08-23 13:12:50 +09001553 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001554 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1555 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001556}
1557
Paul Duffina02cae32021-03-09 01:44:06 +00001558var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1559 cc.PrepareForTestWithCcBuildComponents,
1560 PrepareForTestWithApexBuildComponents,
1561 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562 apex {
1563 name: "com.android.runtime",
1564 key: "com.android.runtime.key",
1565 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001566 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001567 }
1568
1569 apex_key {
1570 name: "com.android.runtime.key",
1571 public_key: "testkey.avbpubkey",
1572 private_key: "testkey.pem",
1573 }
Paul Duffina02cae32021-03-09 01:44:06 +00001574 `),
1575 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1576)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001577
Paul Duffina02cae32021-03-09 01:44:06 +00001578func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001579 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001580 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001581 cc_library {
1582 name: "libc",
1583 no_libcrt: true,
1584 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001585 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001586 stl: "none",
1587 system_shared_libs: [],
1588 stubs: { versions: ["1"] },
1589 apex_available: ["com.android.runtime"],
1590
1591 sanitize: {
1592 hwaddress: true,
1593 }
1594 }
1595
1596 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001597 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598 no_libcrt: true,
1599 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001600 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001601 stl: "none",
1602 system_shared_libs: [],
1603 srcs: [""],
1604 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001605 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001606
1607 sanitize: {
1608 never: true,
1609 },
Spandan Das4de7b492023-05-05 21:13:01 +00001610 apex_available: [
1611 "//apex_available:anyapex",
1612 "//apex_available:platform",
1613 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001614 } `)
1615 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001616
Jooyung Hana0503a52023-08-23 13:12:50 +09001617 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001618 "lib64/bionic/libc.so",
1619 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1620 })
1621
Colin Cross4c4c1be2022-02-10 11:41:18 -08001622 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001623
1624 installed := hwasan.Description("install libclang_rt.hwasan")
1625 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1626
1627 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1628 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1629 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1630}
1631
1632func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001633 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001634 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001635 prepareForTestOfRuntimeApexWithHwasan,
1636 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1637 variables.SanitizeDevice = []string{"hwaddress"}
1638 }),
1639 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001640 cc_library {
1641 name: "libc",
1642 no_libcrt: true,
1643 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001644 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001645 stl: "none",
1646 system_shared_libs: [],
1647 stubs: { versions: ["1"] },
1648 apex_available: ["com.android.runtime"],
1649 }
1650
1651 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001652 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001653 no_libcrt: true,
1654 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001655 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001656 stl: "none",
1657 system_shared_libs: [],
1658 srcs: [""],
1659 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001660 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001661
1662 sanitize: {
1663 never: true,
1664 },
Spandan Das4de7b492023-05-05 21:13:01 +00001665 apex_available: [
1666 "//apex_available:anyapex",
1667 "//apex_available:platform",
1668 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001669 }
Paul Duffina02cae32021-03-09 01:44:06 +00001670 `)
1671 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001672
Jooyung Hana0503a52023-08-23 13:12:50 +09001673 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001674 "lib64/bionic/libc.so",
1675 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1676 })
1677
Colin Cross4c4c1be2022-02-10 11:41:18 -08001678 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001679
1680 installed := hwasan.Description("install libclang_rt.hwasan")
1681 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1682
1683 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1684 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1685 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1686}
1687
Jooyung Han61b66e92020-03-21 14:21:46 +00001688func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001689 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001690 testcases := []struct {
1691 name string
1692 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001693 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001694 shouldLink string
1695 shouldNotLink []string
1696 }{
1697 {
Jiyong Park55549df2021-02-26 23:57:23 +09001698 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001699 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001700 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001701 shouldLink: "current",
1702 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001703 },
1704 {
Jiyong Park55549df2021-02-26 23:57:23 +09001705 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001706 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001707 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001708 shouldLink: "current",
1709 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 },
1711 }
1712 for _, tc := range testcases {
1713 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001714 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001715 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001716 apex {
1717 name: "myapex",
1718 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001719 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001720 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001721 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001722 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001723
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 apex_key {
1725 name: "myapex.key",
1726 public_key: "testkey.avbpubkey",
1727 private_key: "testkey.pem",
1728 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001729
Jooyung Han61b66e92020-03-21 14:21:46 +00001730 cc_library {
1731 name: "mylib",
1732 srcs: ["mylib.cpp"],
1733 vendor_available: true,
1734 shared_libs: ["libbar"],
1735 system_shared_libs: [],
1736 stl: "none",
1737 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001738 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001739 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001740
Jooyung Han61b66e92020-03-21 14:21:46 +00001741 cc_library {
1742 name: "libbar",
1743 srcs: ["mylib.cpp"],
1744 system_shared_libs: [],
1745 stl: "none",
1746 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001747 llndk: {
1748 symbol_file: "libbar.map.txt",
1749 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001750 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001751 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001752 withUnbundledBuild,
1753 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001754
Jooyung Han61b66e92020-03-21 14:21:46 +00001755 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001756 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001757 "lib64/mylib.so",
1758 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001759
Jooyung Han61b66e92020-03-21 14:21:46 +00001760 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001761 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001762 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1763 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001764
Steven Moreland2c4000c2021-04-27 02:08:49 +00001765 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1766 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001767 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001768 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001769 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001770
Steven Moreland2c4000c2021-04-27 02:08:49 +00001771 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001772 ver := tc.shouldLink
1773 if tc.shouldLink == "current" {
1774 ver = strconv.Itoa(android.FutureApiLevelInt)
1775 }
1776 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001777 })
1778 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001779}
1780
Jiyong Park25fc6a92018-11-18 18:02:45 +09001781func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001782 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001783 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 apex {
1785 name: "myapex",
1786 key: "myapex.key",
1787 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001788 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001789 }
1790
1791 apex_key {
1792 name: "myapex.key",
1793 public_key: "testkey.avbpubkey",
1794 private_key: "testkey.pem",
1795 }
1796
1797 cc_library {
1798 name: "mylib",
1799 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001800 system_shared_libs: ["libc"],
1801 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001802 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001803 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804 }
1805
1806 cc_library_shared {
1807 name: "mylib_shared",
1808 srcs: ["mylib.cpp"],
1809 shared_libs: ["libdl#27"],
1810 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001811 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001812 }
1813
1814 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001815 name: "libBootstrap",
1816 srcs: ["mylib.cpp"],
1817 stl: "none",
1818 bootstrap: true,
1819 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001820 `)
1821
Jooyung Hana0503a52023-08-23 13:12:50 +09001822 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001823 copyCmds := apexRule.Args["copy_commands"]
1824
1825 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001826 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001827 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1828 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001829
1830 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001831 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001832
Colin Crossaede88c2020-08-11 12:17:01 -07001833 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1834 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1835 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001836
1837 // For dependency to libc
1838 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001839 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001841 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001842 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001843 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1844 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001845
1846 // For dependency to libm
1847 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001848 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001849 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001850 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001851 // ... and is not compiling with the stub
1852 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1853 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1854
1855 // For dependency to libdl
1856 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001857 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001858 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001859 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1860 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001861 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001862 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001863 // ... Cflags from stub is correctly exported to mylib
1864 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1865 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001866
1867 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001868 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1869 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1870 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1871 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001872}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001873
Jooyung Han749dc692020-04-15 11:03:39 +09001874func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001875 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001876 // there are three links between liba --> libz.
1877 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001878 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001879 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001880 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001881 apex {
1882 name: "myapex",
1883 key: "myapex.key",
1884 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001885 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001886 }
1887
1888 apex {
1889 name: "otherapex",
1890 key: "myapex.key",
1891 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001892 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001893 }
1894
1895 apex_key {
1896 name: "myapex.key",
1897 public_key: "testkey.avbpubkey",
1898 private_key: "testkey.pem",
1899 }
1900
1901 cc_library {
1902 name: "libx",
1903 shared_libs: ["liba"],
1904 system_shared_libs: [],
1905 stl: "none",
1906 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001907 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001908 }
1909
1910 cc_library {
1911 name: "liby",
1912 shared_libs: ["liba"],
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001916 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001917 }
1918
1919 cc_library {
1920 name: "liba",
1921 shared_libs: ["libz"],
1922 system_shared_libs: [],
1923 stl: "none",
1924 apex_available: [
1925 "//apex_available:anyapex",
1926 "//apex_available:platform",
1927 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001928 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001929 }
1930
1931 cc_library {
1932 name: "libz",
1933 system_shared_libs: [],
1934 stl: "none",
1935 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001936 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001937 },
1938 }
Jooyung Han749dc692020-04-15 11:03:39 +09001939 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001940
1941 expectLink := func(from, from_variant, to, to_variant string) {
1942 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1943 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1944 }
1945 expectNoLink := func(from, from_variant, to, to_variant string) {
1946 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1947 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1948 }
1949 // platform liba is linked to non-stub version
1950 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001951 // liba in myapex is linked to current
1952 expectLink("liba", "shared_apex29", "libz", "shared_current")
1953 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001954 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001955 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001956 // liba in otherapex is linked to current
1957 expectLink("liba", "shared_apex30", "libz", "shared_current")
1958 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001959 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1960 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001961}
1962
Jooyung Hanaed150d2020-04-02 01:41:41 +09001963func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001964 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001965 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001966 apex {
1967 name: "myapex",
1968 key: "myapex.key",
1969 native_shared_libs: ["libx"],
1970 min_sdk_version: "R",
1971 }
1972
1973 apex_key {
1974 name: "myapex.key",
1975 public_key: "testkey.avbpubkey",
1976 private_key: "testkey.pem",
1977 }
1978
1979 cc_library {
1980 name: "libx",
1981 shared_libs: ["libz"],
1982 system_shared_libs: [],
1983 stl: "none",
1984 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001985 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001986 }
1987
1988 cc_library {
1989 name: "libz",
1990 system_shared_libs: [],
1991 stl: "none",
1992 stubs: {
1993 versions: ["29", "R"],
1994 },
1995 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001996 `,
1997 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1998 variables.Platform_version_active_codenames = []string{"R"}
1999 }),
2000 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002001
2002 expectLink := func(from, from_variant, to, to_variant string) {
2003 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2004 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2005 }
2006 expectNoLink := func(from, from_variant, to, to_variant string) {
2007 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2008 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2009 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002010 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2011 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002012 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2013 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002014}
2015
Jooyung Han4c4da062021-06-23 10:23:16 +09002016func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002017 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002018 testApex(t, `
2019 apex {
2020 name: "myapex",
2021 key: "myapex.key",
2022 java_libs: ["libx"],
2023 min_sdk_version: "S",
2024 }
2025
2026 apex_key {
2027 name: "myapex.key",
2028 public_key: "testkey.avbpubkey",
2029 private_key: "testkey.pem",
2030 }
2031
2032 java_library {
2033 name: "libx",
2034 srcs: ["a.java"],
2035 apex_available: [ "myapex" ],
2036 sdk_version: "current",
2037 min_sdk_version: "S", // should be okay
2038 }
2039 `,
2040 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2041 variables.Platform_version_active_codenames = []string{"S"}
2042 variables.Platform_sdk_codename = proptools.StringPtr("S")
2043 }),
2044 )
2045}
2046
Jooyung Han749dc692020-04-15 11:03:39 +09002047func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002048 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002049 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002050 apex {
2051 name: "myapex",
2052 key: "myapex.key",
2053 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002054 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002055 }
2056
2057 apex_key {
2058 name: "myapex.key",
2059 public_key: "testkey.avbpubkey",
2060 private_key: "testkey.pem",
2061 }
2062
2063 cc_library {
2064 name: "libx",
2065 shared_libs: ["libz"],
2066 system_shared_libs: [],
2067 stl: "none",
2068 apex_available: [ "myapex" ],
2069 }
2070
2071 cc_library {
2072 name: "libz",
2073 system_shared_libs: [],
2074 stl: "none",
2075 stubs: {
2076 versions: ["1", "2"],
2077 },
2078 }
2079 `)
2080
2081 expectLink := func(from, from_variant, to, to_variant string) {
2082 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2083 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2084 }
2085 expectNoLink := func(from, from_variant, to, to_variant string) {
2086 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2087 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2088 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002089 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002090 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002091 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002092 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002093}
2094
Jooyung Handfc864c2023-03-20 18:19:07 +09002095func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002096 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002097 ctx := testApex(t, `
2098 apex {
2099 name: "myapex",
2100 key: "myapex.key",
2101 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002102 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002103 vendor: true,
2104 min_sdk_version: "29",
2105 }
2106
2107 apex_key {
2108 name: "myapex.key",
2109 public_key: "testkey.avbpubkey",
2110 private_key: "testkey.pem",
2111 }
2112
2113 cc_library {
2114 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002115 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002116 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002117 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002118 shared_libs: ["libbar"],
2119 }
2120
2121 cc_library {
2122 name: "libbar",
2123 stubs: { versions: ["29", "30"] },
2124 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002125 }
2126 `)
2127
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002128 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002129
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002130 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002131
2132 // Ensure that mylib links with "current" LLNDK
2133 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002134 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002135
2136 // Ensure that mylib is targeting 29
2137 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2138 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2139
2140 // Ensure that the correct variant of crtbegin_so is used.
2141 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2142 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002143
2144 // Ensure that the crtbegin_so used by the APEX is targeting 29
2145 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2146 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2147}
2148
Jooyung Han4495f842023-04-25 16:39:59 +09002149func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002150 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002151 ctx := testApex(t, `
2152 apex {
2153 name: "myapex",
2154 key: "myapex.key",
2155 updatable: true,
2156 native_shared_libs: [
2157 "mylib",
2158 "yourlib",
2159 ],
2160 min_sdk_version: "29",
2161 }
2162
2163 apex {
2164 name: "myapex2",
2165 key: "myapex.key",
2166 updatable: false,
2167 native_shared_libs: ["yourlib"],
2168 }
2169
2170 apex_key {
2171 name: "myapex.key",
2172 public_key: "testkey.avbpubkey",
2173 private_key: "testkey.pem",
2174 }
2175
2176 cc_library {
2177 name: "mylib",
2178 srcs: ["mylib.cpp"],
2179 shared_libs: ["libbar"],
2180 min_sdk_version: "29",
2181 apex_available: ["myapex"],
2182 }
2183
2184 cc_library {
2185 name: "libbar",
2186 stubs: { versions: ["29", "30"] },
2187 }
2188
2189 cc_library {
2190 name: "yourlib",
2191 srcs: ["mylib.cpp"],
2192 min_sdk_version: "29",
2193 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2194 }
2195 `, withFiles(android.MockFS{
2196 "packages/modules/common/build/allowed_deps.txt": nil,
2197 }))
2198
2199 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2200 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2201 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002202 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002203 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002204 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002205
Jooyung Hana0503a52023-08-23 13:12:50 +09002206 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002207 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2208 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002209 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2210 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2211 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2212 flatlist, "mylib:(minSdkVersion:29)")
2213 android.AssertStringListContains(t, "track platform-available lib",
2214 flatlist, "yourlib(minSdkVersion:29)")
2215}
2216
Nouby Mohamed8609a552024-09-04 22:19:51 +00002217func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002218 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002219 ctx := testApex(t, `
2220 apex {
2221 name: "myapex",
2222 key: "myapex.key",
2223 updatable: true,
2224 native_shared_libs: [
2225 "mylib",
2226 "yourlib",
2227 ],
2228 min_sdk_version: "29",
2229 }
2230
2231 apex {
2232 name: "myapex2",
2233 key: "myapex.key",
2234 updatable: false,
2235 native_shared_libs: ["yourlib"],
2236 }
2237
2238 apex_key {
2239 name: "myapex.key",
2240 public_key: "testkey.avbpubkey",
2241 private_key: "testkey.pem",
2242 }
2243
2244 cc_library {
2245 name: "mylib",
2246 srcs: ["mylib.cpp"],
2247 shared_libs: ["libbar"],
2248 min_sdk_version: "29",
2249 apex_available: ["myapex"],
2250 }
2251
2252 cc_library {
2253 name: "libbar",
2254 stubs: { versions: ["29", "30"] },
2255 }
2256
2257 cc_library {
2258 name: "yourlib",
2259 srcs: ["mylib.cpp"],
2260 min_sdk_version: "29",
2261 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2262 }
2263 `, withFiles(android.MockFS{
2264 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2265 }),
2266 android.FixtureModifyProductVariables(
2267 func(variables android.FixtureProductVariables) {
2268 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2269 },
2270 ))
2271
2272 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2273 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2274 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2275 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2276 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2277 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2278
2279 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2280 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2281 myapex.Output("depsinfo/flatlist.txt")), "\n")
2282 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2283 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2284 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2285 flatlist, "mylib:(minSdkVersion:29)")
2286 android.AssertStringListContains(t, "track platform-available lib",
2287 flatlist, "yourlib(minSdkVersion:29)")
2288}
2289
2290func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002291 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002292 ctx := testApex(t, `
2293 apex {
2294 name: "myapex",
2295 key: "myapex.key",
2296 updatable: true,
2297 native_shared_libs: [
2298 "mylib",
2299 "yourlib",
2300 ],
2301 min_sdk_version: "29",
2302 }
2303
2304 apex {
2305 name: "myapex2",
2306 key: "myapex.key",
2307 updatable: false,
2308 native_shared_libs: ["yourlib"],
2309 }
2310
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316
2317 cc_library {
2318 name: "mylib",
2319 srcs: ["mylib.cpp"],
2320 shared_libs: ["libbar"],
2321 min_sdk_version: "29",
2322 apex_available: ["myapex"],
2323 }
2324
2325 cc_library {
2326 name: "libbar",
2327 stubs: { versions: ["29", "30"] },
2328 }
2329
2330 cc_library {
2331 name: "yourlib",
2332 srcs: ["mylib.cpp"],
2333 min_sdk_version: "29",
2334 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2335 }
2336 `, withFiles(android.MockFS{
2337 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2338 "packages/modules/common/build/allowed_deps.txt": nil,
2339 }),
2340 android.FixtureModifyProductVariables(
2341 func(variables android.FixtureProductVariables) {
2342 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2343 },
2344 ))
2345
2346 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2347 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2348 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2349 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2350 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2351 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2352
2353 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2354 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2355 myapex.Output("depsinfo/flatlist.txt")), "\n")
2356 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2357 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2358 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2359 flatlist, "mylib:(minSdkVersion:29)")
2360 android.AssertStringListContains(t, "track platform-available lib",
2361 flatlist, "yourlib(minSdkVersion:29)")
2362}
2363
Jooyung Han4495f842023-04-25 16:39:59 +09002364func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002365 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002366 ctx := testApex(t, `
2367 apex {
2368 name: "myapex",
2369 key: "myapex.key",
2370 updatable: true,
2371 min_sdk_version: "29",
2372 }
2373
2374 apex_key {
2375 name: "myapex.key",
2376 public_key: "testkey.avbpubkey",
2377 private_key: "testkey.pem",
2378 }
2379 `)
2380 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2381 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2382 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2383 }
2384}
2385
Jooyung Han03b51852020-02-26 22:45:42 +09002386func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002387 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002388 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002389 apex {
2390 name: "myapex",
2391 key: "myapex.key",
2392 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002393 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002394 }
2395
2396 apex_key {
2397 name: "myapex.key",
2398 public_key: "testkey.avbpubkey",
2399 private_key: "testkey.pem",
2400 }
2401
2402 cc_library {
2403 name: "libx",
2404 system_shared_libs: [],
2405 stl: "none",
2406 apex_available: [ "myapex" ],
2407 stubs: {
2408 versions: ["1", "2"],
2409 },
2410 }
2411
2412 cc_library {
2413 name: "libz",
2414 shared_libs: ["libx"],
2415 system_shared_libs: [],
2416 stl: "none",
2417 }
2418 `)
2419
2420 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002421 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002422 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2423 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2424 }
2425 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002426 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002427 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2428 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2429 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002430 expectLink("libz", "shared", "libx", "shared_current")
2431 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002432 expectNoLink("libz", "shared", "libz", "shared_1")
2433 expectNoLink("libz", "shared", "libz", "shared")
2434}
2435
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002436var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2437 func(variables android.FixtureProductVariables) {
2438 variables.SanitizeDevice = []string{"hwaddress"}
2439 },
2440)
2441
Jooyung Han75568392020-03-20 04:29:24 +09002442func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002443 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002444 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002445 apex {
2446 name: "myapex",
2447 key: "myapex.key",
2448 native_shared_libs: ["libx"],
2449 min_sdk_version: "29",
2450 }
2451
2452 apex_key {
2453 name: "myapex.key",
2454 public_key: "testkey.avbpubkey",
2455 private_key: "testkey.pem",
2456 }
2457
2458 cc_library {
2459 name: "libx",
2460 shared_libs: ["libbar"],
2461 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002462 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002463 }
2464
2465 cc_library {
2466 name: "libbar",
2467 stubs: {
2468 versions: ["29", "30"],
2469 },
2470 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002471 `,
2472 prepareForTestWithSantitizeHwaddress,
2473 )
Jooyung Han03b51852020-02-26 22:45:42 +09002474 expectLink := func(from, from_variant, to, to_variant string) {
2475 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2476 libFlags := ld.Args["libFlags"]
2477 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2478 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002479 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002480}
2481
Jooyung Han75568392020-03-20 04:29:24 +09002482func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002483 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002484 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002485 apex {
2486 name: "myapex",
2487 key: "myapex.key",
2488 native_shared_libs: ["libx"],
2489 min_sdk_version: "29",
2490 }
2491
2492 apex_key {
2493 name: "myapex.key",
2494 public_key: "testkey.avbpubkey",
2495 private_key: "testkey.pem",
2496 }
2497
2498 cc_library {
2499 name: "libx",
2500 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002501 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002502 }
Jooyung Han75568392020-03-20 04:29:24 +09002503 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002504
2505 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002506 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002507 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002508 // note that platform variant is not.
2509 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002510 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002511}
2512
Jooyung Han749dc692020-04-15 11:03:39 +09002513func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002514 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002515 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002516 apex {
2517 name: "myapex",
2518 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002519 native_shared_libs: ["mylib"],
2520 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002521 }
2522
2523 apex_key {
2524 name: "myapex.key",
2525 public_key: "testkey.avbpubkey",
2526 private_key: "testkey.pem",
2527 }
Jooyung Han749dc692020-04-15 11:03:39 +09002528
2529 cc_library {
2530 name: "mylib",
2531 srcs: ["mylib.cpp"],
2532 system_shared_libs: [],
2533 stl: "none",
2534 apex_available: [
2535 "myapex",
2536 ],
2537 min_sdk_version: "30",
2538 }
2539 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002540
2541 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2542 apex {
2543 name: "myapex",
2544 key: "myapex.key",
2545 native_shared_libs: ["libfoo.ffi"],
2546 min_sdk_version: "29",
2547 }
2548
2549 apex_key {
2550 name: "myapex.key",
2551 public_key: "testkey.avbpubkey",
2552 private_key: "testkey.pem",
2553 }
2554
2555 rust_ffi_shared {
2556 name: "libfoo.ffi",
2557 srcs: ["foo.rs"],
2558 crate_name: "foo",
2559 apex_available: [
2560 "myapex",
2561 ],
2562 min_sdk_version: "30",
2563 }
2564 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002565
2566 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2567 apex {
2568 name: "myapex",
2569 key: "myapex.key",
2570 java_libs: ["libfoo"],
2571 min_sdk_version: "29",
2572 }
2573
2574 apex_key {
2575 name: "myapex.key",
2576 public_key: "testkey.avbpubkey",
2577 private_key: "testkey.pem",
2578 }
2579
2580 java_import {
2581 name: "libfoo",
2582 jars: ["libfoo.jar"],
2583 apex_available: [
2584 "myapex",
2585 ],
2586 min_sdk_version: "30",
2587 }
2588 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002589
2590 // Skip check for modules compiling against core API surface
2591 testApex(t, `
2592 apex {
2593 name: "myapex",
2594 key: "myapex.key",
2595 java_libs: ["libfoo"],
2596 min_sdk_version: "29",
2597 }
2598
2599 apex_key {
2600 name: "myapex.key",
2601 public_key: "testkey.avbpubkey",
2602 private_key: "testkey.pem",
2603 }
2604
2605 java_library {
2606 name: "libfoo",
2607 srcs: ["Foo.java"],
2608 apex_available: [
2609 "myapex",
2610 ],
2611 // Compile against core API surface
2612 sdk_version: "core_current",
2613 min_sdk_version: "30",
2614 }
2615 `)
2616
Jooyung Han749dc692020-04-15 11:03:39 +09002617}
2618
2619func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002620 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002621 testApex(t, `
2622 apex {
2623 name: "myapex",
2624 key: "myapex.key",
2625 native_shared_libs: ["libfoo"],
2626 java_libs: ["libbar"],
2627 min_sdk_version: "29",
2628 }
2629
2630 apex_key {
2631 name: "myapex.key",
2632 public_key: "testkey.avbpubkey",
2633 private_key: "testkey.pem",
2634 }
2635
2636 cc_library {
2637 name: "libfoo",
2638 srcs: ["mylib.cpp"],
2639 shared_libs: ["libfoo_dep"],
2640 apex_available: ["myapex"],
2641 min_sdk_version: "29",
2642 }
2643
2644 cc_library {
2645 name: "libfoo_dep",
2646 srcs: ["mylib.cpp"],
2647 apex_available: ["myapex"],
2648 min_sdk_version: "29",
2649 }
2650
2651 java_library {
2652 name: "libbar",
2653 sdk_version: "current",
2654 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002655 static_libs: [
2656 "libbar_dep",
2657 "libbar_import_dep",
2658 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002659 apex_available: ["myapex"],
2660 min_sdk_version: "29",
2661 }
2662
2663 java_library {
2664 name: "libbar_dep",
2665 sdk_version: "current",
2666 srcs: ["a.java"],
2667 apex_available: ["myapex"],
2668 min_sdk_version: "29",
2669 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002670
2671 java_import {
2672 name: "libbar_import_dep",
2673 jars: ["libbar.jar"],
2674 apex_available: ["myapex"],
2675 min_sdk_version: "29",
2676 }
Jooyung Han03b51852020-02-26 22:45:42 +09002677 `)
2678}
2679
Colin Cross8ca61c12022-10-06 21:00:14 -07002680func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002681 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002682 // Tests that an apex dependency with min_sdk_version higher than the
2683 // min_sdk_version of the apex is allowed as long as the dependency's
2684 // min_sdk_version is less than or equal to the api level that the
2685 // architecture was introduced in. In this case, arm64 didn't exist
2686 // until api level 21, so the arm64 code will never need to run on
2687 // an api level 20 device, even if other architectures of the apex
2688 // will.
2689 testApex(t, `
2690 apex {
2691 name: "myapex",
2692 key: "myapex.key",
2693 native_shared_libs: ["libfoo"],
2694 min_sdk_version: "20",
2695 }
2696
2697 apex_key {
2698 name: "myapex.key",
2699 public_key: "testkey.avbpubkey",
2700 private_key: "testkey.pem",
2701 }
2702
2703 cc_library {
2704 name: "libfoo",
2705 srcs: ["mylib.cpp"],
2706 apex_available: ["myapex"],
2707 min_sdk_version: "21",
2708 stl: "none",
2709 }
2710 `)
2711}
2712
Artur Satayev8cf899a2020-04-15 17:29:42 +01002713func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002714 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002715 testCases := []struct {
2716 name string
2717 expectedError string
2718 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002719 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002720 }{
2721 {
2722 name: "Non-updatable apex with non-stable dep",
2723 bp: `
2724 apex {
2725 name: "myapex",
2726 java_libs: ["myjar"],
2727 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002728 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002729 }
2730 apex_key {
2731 name: "myapex.key",
2732 public_key: "testkey.avbpubkey",
2733 private_key: "testkey.pem",
2734 }
2735 java_library {
2736 name: "myjar",
2737 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002738 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002739 apex_available: ["myapex"],
2740 }
2741 `,
2742 },
2743 {
2744 name: "Updatable apex with stable dep",
2745 bp: `
2746 apex {
2747 name: "myapex",
2748 java_libs: ["myjar"],
2749 key: "myapex.key",
2750 updatable: true,
2751 min_sdk_version: "29",
2752 }
2753 apex_key {
2754 name: "myapex.key",
2755 public_key: "testkey.avbpubkey",
2756 private_key: "testkey.pem",
2757 }
2758 java_library {
2759 name: "myjar",
2760 srcs: ["foo/bar/MyClass.java"],
2761 sdk_version: "current",
2762 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002763 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002764 }
2765 `,
2766 },
2767 {
2768 name: "Updatable apex with non-stable dep",
2769 expectedError: "cannot depend on \"myjar\"",
2770 bp: `
2771 apex {
2772 name: "myapex",
2773 java_libs: ["myjar"],
2774 key: "myapex.key",
2775 updatable: true,
2776 }
2777 apex_key {
2778 name: "myapex.key",
2779 public_key: "testkey.avbpubkey",
2780 private_key: "testkey.pem",
2781 }
2782 java_library {
2783 name: "myjar",
2784 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002785 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002786 apex_available: ["myapex"],
2787 }
2788 `,
2789 },
2790 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002791 name: "Updatable apex with non-stable legacy core platform dep",
2792 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2793 bp: `
2794 apex {
2795 name: "myapex",
2796 java_libs: ["myjar-uses-legacy"],
2797 key: "myapex.key",
2798 updatable: true,
2799 }
2800 apex_key {
2801 name: "myapex.key",
2802 public_key: "testkey.avbpubkey",
2803 private_key: "testkey.pem",
2804 }
2805 java_library {
2806 name: "myjar-uses-legacy",
2807 srcs: ["foo/bar/MyClass.java"],
2808 sdk_version: "core_platform",
2809 apex_available: ["myapex"],
2810 }
2811 `,
2812 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2813 },
2814 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002815 name: "Updatable apex with non-stable transitive dep",
2816 // This is not actually detecting that the transitive dependency is unstable, rather it is
2817 // detecting that the transitive dependency is building against a wider API surface than the
2818 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002819 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002820 bp: `
2821 apex {
2822 name: "myapex",
2823 java_libs: ["myjar"],
2824 key: "myapex.key",
2825 updatable: true,
2826 }
2827 apex_key {
2828 name: "myapex.key",
2829 public_key: "testkey.avbpubkey",
2830 private_key: "testkey.pem",
2831 }
2832 java_library {
2833 name: "myjar",
2834 srcs: ["foo/bar/MyClass.java"],
2835 sdk_version: "current",
2836 apex_available: ["myapex"],
2837 static_libs: ["transitive-jar"],
2838 }
2839 java_library {
2840 name: "transitive-jar",
2841 srcs: ["foo/bar/MyClass.java"],
2842 sdk_version: "core_platform",
2843 apex_available: ["myapex"],
2844 }
2845 `,
2846 },
2847 }
2848
2849 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002850 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2851 continue
2852 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002853 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002854 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002855 errorHandler := android.FixtureExpectsNoErrors
2856 if test.expectedError != "" {
2857 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002858 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002859 android.GroupFixturePreparers(
2860 java.PrepareForTestWithJavaDefaultModules,
2861 PrepareForTestWithApexBuildComponents,
2862 prepareForTestWithMyapex,
2863 android.OptionalFixturePreparer(test.preparer),
2864 ).
2865 ExtendWithErrorHandler(errorHandler).
2866 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002867 })
2868 }
2869}
2870
Jooyung Han749dc692020-04-15 11:03:39 +09002871func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2872 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2873 apex {
2874 name: "myapex",
2875 key: "myapex.key",
2876 native_shared_libs: ["mylib"],
2877 min_sdk_version: "29",
2878 }
2879
2880 apex_key {
2881 name: "myapex.key",
2882 public_key: "testkey.avbpubkey",
2883 private_key: "testkey.pem",
2884 }
2885
2886 cc_library {
2887 name: "mylib",
2888 srcs: ["mylib.cpp"],
2889 shared_libs: ["mylib2"],
2890 system_shared_libs: [],
2891 stl: "none",
2892 apex_available: [
2893 "myapex",
2894 ],
2895 min_sdk_version: "29",
2896 }
2897
2898 // indirect part of the apex
2899 cc_library {
2900 name: "mylib2",
2901 srcs: ["mylib.cpp"],
2902 system_shared_libs: [],
2903 stl: "none",
2904 apex_available: [
2905 "myapex",
2906 ],
2907 min_sdk_version: "30",
2908 }
2909 `)
2910}
2911
2912func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002913 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002914 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2915 apex {
2916 name: "myapex",
2917 key: "myapex.key",
2918 apps: ["AppFoo"],
2919 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002920 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002921 }
2922
2923 apex_key {
2924 name: "myapex.key",
2925 public_key: "testkey.avbpubkey",
2926 private_key: "testkey.pem",
2927 }
2928
2929 android_app {
2930 name: "AppFoo",
2931 srcs: ["foo/bar/MyClass.java"],
2932 sdk_version: "current",
2933 min_sdk_version: "29",
2934 system_modules: "none",
2935 stl: "none",
2936 static_libs: ["bar"],
2937 apex_available: [ "myapex" ],
2938 }
2939
2940 java_library {
2941 name: "bar",
2942 sdk_version: "current",
2943 srcs: ["a.java"],
2944 apex_available: [ "myapex" ],
2945 }
2946 `)
2947}
2948
2949func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002950 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002951 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002952 apex {
2953 name: "myapex",
2954 key: "myapex.key",
2955 native_shared_libs: ["mylib"],
2956 min_sdk_version: "29",
2957 }
2958
2959 apex_key {
2960 name: "myapex.key",
2961 public_key: "testkey.avbpubkey",
2962 private_key: "testkey.pem",
2963 }
2964
Colin Crossea91a172024-11-05 16:14:05 -08002965 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002966 cc_library {
2967 name: "mylib",
2968 srcs: ["mylib.cpp"],
2969 shared_libs: ["mylib2"],
2970 system_shared_libs: [],
2971 stl: "none",
2972 apex_available: ["myapex", "otherapex"],
2973 min_sdk_version: "29",
2974 }
2975
2976 cc_library {
2977 name: "mylib2",
2978 srcs: ["mylib.cpp"],
2979 system_shared_libs: [],
2980 stl: "none",
2981 apex_available: ["otherapex"],
2982 stubs: { versions: ["29", "30"] },
2983 min_sdk_version: "30",
2984 }
2985
2986 apex {
2987 name: "otherapex",
2988 key: "myapex.key",
2989 native_shared_libs: ["mylib", "mylib2"],
2990 min_sdk_version: "30",
2991 }
2992 `)
2993 expectLink := func(from, from_variant, to, to_variant string) {
2994 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2995 libFlags := ld.Args["libFlags"]
2996 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2997 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002998 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08002999 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003000}
3001
Jooyung Haned124c32021-01-26 11:43:46 +09003002func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003003 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003004 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3005 func(variables android.FixtureProductVariables) {
3006 variables.Platform_sdk_codename = proptools.StringPtr("S")
3007 variables.Platform_version_active_codenames = []string{"S"}
3008 },
3009 )
Jooyung Haned124c32021-01-26 11:43:46 +09003010 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3011 apex {
3012 name: "myapex",
3013 key: "myapex.key",
3014 native_shared_libs: ["libfoo"],
3015 min_sdk_version: "S",
3016 }
3017 apex_key {
3018 name: "myapex.key",
3019 public_key: "testkey.avbpubkey",
3020 private_key: "testkey.pem",
3021 }
3022 cc_library {
3023 name: "libfoo",
3024 shared_libs: ["libbar"],
3025 apex_available: ["myapex"],
3026 min_sdk_version: "29",
3027 }
3028 cc_library {
3029 name: "libbar",
3030 apex_available: ["myapex"],
3031 }
3032 `, withSAsActiveCodeNames)
3033}
3034
3035func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003036 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003037 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3038 variables.Platform_sdk_codename = proptools.StringPtr("S")
3039 variables.Platform_version_active_codenames = []string{"S", "T"}
3040 })
Colin Cross1c460562021-02-16 17:55:47 -08003041 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003042 apex {
3043 name: "myapex",
3044 key: "myapex.key",
3045 native_shared_libs: ["libfoo"],
3046 min_sdk_version: "S",
3047 }
3048 apex_key {
3049 name: "myapex.key",
3050 public_key: "testkey.avbpubkey",
3051 private_key: "testkey.pem",
3052 }
3053 cc_library {
3054 name: "libfoo",
3055 shared_libs: ["libbar"],
3056 apex_available: ["myapex"],
3057 min_sdk_version: "S",
3058 }
3059 cc_library {
3060 name: "libbar",
3061 stubs: {
3062 symbol_file: "libbar.map.txt",
3063 versions: ["30", "S", "T"],
3064 },
3065 }
3066 `, withSAsActiveCodeNames)
3067
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003068 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003069 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3070 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003071 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003072}
3073
Jiyong Park7c2ee712018-12-07 00:42:25 +09003074func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003075 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003076 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003077 apex {
3078 name: "myapex",
3079 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003080 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003081 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003082 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003083 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003084 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003085 }
3086
3087 apex_key {
3088 name: "myapex.key",
3089 public_key: "testkey.avbpubkey",
3090 private_key: "testkey.pem",
3091 }
3092
3093 prebuilt_etc {
3094 name: "myetc",
3095 src: "myprebuilt",
3096 sub_dir: "foo/bar",
3097 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003098
3099 cc_library {
3100 name: "mylib",
3101 srcs: ["mylib.cpp"],
3102 relative_install_path: "foo/bar",
3103 system_shared_libs: [],
3104 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003105 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003106 }
3107
3108 cc_binary {
3109 name: "mybin",
3110 srcs: ["mylib.cpp"],
3111 relative_install_path: "foo/bar",
3112 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003113 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003114 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003115 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003116
3117 rust_binary {
3118 name: "mybin.rust",
3119 srcs: ["foo.rs"],
3120 relative_install_path: "rust_subdir",
3121 apex_available: [ "myapex" ],
3122 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003123 `)
3124
Jooyung Hana0503a52023-08-23 13:12:50 +09003125 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003126 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003127
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003128 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003129 ensureContains(t, cmd, "/etc ")
3130 ensureContains(t, cmd, "/etc/foo ")
3131 ensureContains(t, cmd, "/etc/foo/bar ")
3132 ensureContains(t, cmd, "/lib64 ")
3133 ensureContains(t, cmd, "/lib64/foo ")
3134 ensureContains(t, cmd, "/lib64/foo/bar ")
3135 ensureContains(t, cmd, "/lib ")
3136 ensureContains(t, cmd, "/lib/foo ")
3137 ensureContains(t, cmd, "/lib/foo/bar ")
3138 ensureContains(t, cmd, "/bin ")
3139 ensureContains(t, cmd, "/bin/foo ")
3140 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003141 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003142}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003143
Jooyung Han35155c42020-02-06 17:33:20 +09003144func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003145 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003146 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003147 apex {
3148 name: "myapex",
3149 key: "myapex.key",
3150 multilib: {
3151 both: {
3152 native_shared_libs: ["mylib"],
3153 binaries: ["mybin"],
3154 },
3155 },
3156 compile_multilib: "both",
3157 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003158 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003159 }
3160
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166
3167 cc_library {
3168 name: "mylib",
3169 relative_install_path: "foo/bar",
3170 system_shared_libs: [],
3171 stl: "none",
3172 apex_available: [ "myapex" ],
3173 native_bridge_supported: true,
3174 }
3175
3176 cc_binary {
3177 name: "mybin",
3178 relative_install_path: "foo/bar",
3179 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003180 stl: "none",
3181 apex_available: [ "myapex" ],
3182 native_bridge_supported: true,
3183 compile_multilib: "both", // default is "first" for binary
3184 multilib: {
3185 lib64: {
3186 suffix: "64",
3187 },
3188 },
3189 }
3190 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003191 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003192 "bin/foo/bar/mybin",
3193 "bin/foo/bar/mybin64",
3194 "bin/arm/foo/bar/mybin",
3195 "bin/arm64/foo/bar/mybin64",
3196 "lib/foo/bar/mylib.so",
3197 "lib/arm/foo/bar/mylib.so",
3198 "lib64/foo/bar/mylib.so",
3199 "lib64/arm64/foo/bar/mylib.so",
3200 })
3201}
3202
Jooyung Han85d61762020-06-24 23:50:26 +09003203func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003204 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003205 result := android.GroupFixturePreparers(
3206 prepareForApexTest,
3207 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3208 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003209 apex {
3210 name: "myapex",
3211 key: "myapex.key",
3212 binaries: ["mybin"],
3213 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003214 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003215 }
3216 apex_key {
3217 name: "myapex.key",
3218 public_key: "testkey.avbpubkey",
3219 private_key: "testkey.pem",
3220 }
3221 cc_binary {
3222 name: "mybin",
3223 vendor: true,
3224 shared_libs: ["libfoo"],
3225 }
3226 cc_library {
3227 name: "libfoo",
3228 proprietary: true,
3229 }
3230 `)
3231
Jooyung Hana0503a52023-08-23 13:12:50 +09003232 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003233 "bin/mybin",
3234 "lib64/libfoo.so",
3235 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3236 "lib64/libc++.so",
3237 })
3238
Jooyung Hana0503a52023-08-23 13:12:50 +09003239 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003240 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003241 name := apexBundle.BaseModuleName()
3242 prefix := "TARGET_"
3243 var builder strings.Builder
3244 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003245 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003246 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003247 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003248
Jooyung Hana0503a52023-08-23 13:12:50 +09003249 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003250 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3251 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003252}
3253
Justin Yun13decfb2021-03-08 19:25:55 +09003254func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003255 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003256 ctx := testApex(t, `
3257 apex {
3258 name: "myapex",
3259 key: "myapex.key",
3260 updatable: false,
3261 product_specific: true,
3262 binaries: ["foo"],
3263 }
3264
3265 apex_key {
3266 name: "myapex.key",
3267 public_key: "testkey.avbpubkey",
3268 private_key: "testkey.pem",
3269 }
3270
3271 cc_binary {
3272 name: "foo",
3273 product_available: true,
3274 apex_available: ["myapex"],
3275 srcs: ["foo.cpp"],
3276 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003277 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003278
3279 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003280 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003281 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3282 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3283 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3284 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3285}
3286
Jooyung Han8e5685d2020-09-21 11:02:57 +09003287func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003288 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003289 testCases := []struct {
3290 name string
3291 additionalProp string
3292 }{
3293 {"system apex with prebuilt_firmware", ""},
3294 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3295 }
3296 for _, tc := range testCases {
3297 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003298 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003299 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003300 apex {
3301 name: "myapex",
3302 key: "myapex.key",
3303 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003304 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003305 `+tc.additionalProp+`
3306 }
3307 apex_key {
3308 name: "myapex.key",
3309 public_key: "testkey.avbpubkey",
3310 private_key: "testkey.pem",
3311 }
3312 prebuilt_firmware {
3313 name: "myfirmware",
3314 src: "myfirmware.bin",
3315 filename_from_src: true,
3316 `+tc.additionalProp+`
3317 }
3318 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003319 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003320 "etc/firmware/myfirmware.bin",
3321 })
3322 })
3323 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003324}
3325
Jooyung Hanefb184e2020-06-25 17:14:25 +09003326func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003327 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003328 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003329 apex {
3330 name: "myapex",
3331 key: "myapex.key",
3332 vendor: true,
3333 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003334 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003335 }
3336
3337 apex_key {
3338 name: "myapex.key",
3339 public_key: "testkey.avbpubkey",
3340 private_key: "testkey.pem",
3341 }
3342
3343 cc_library {
3344 name: "mylib",
3345 vendor_available: true,
3346 }
3347 `)
3348
Jooyung Hana0503a52023-08-23 13:12:50 +09003349 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003350 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003351 name := apexBundle.BaseModuleName()
3352 prefix := "TARGET_"
3353 var builder strings.Builder
3354 data.Custom(&builder, name, prefix, "", data)
3355 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003356 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 +09003357}
3358
Jooyung Han2ed99d02020-06-24 23:26:26 +09003359func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003360 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003361 apex {
3362 name: "myapex",
3363 key: "myapex.key",
3364 vintf_fragments: ["fragment.xml"],
3365 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003366 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003367 }
3368 apex_key {
3369 name: "myapex.key",
3370 public_key: "testkey.avbpubkey",
3371 private_key: "testkey.pem",
3372 }
3373 cc_binary {
3374 name: "mybin",
3375 }
3376 `)
3377
Jooyung Hana0503a52023-08-23 13:12:50 +09003378 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003379 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003380 name := apexBundle.BaseModuleName()
3381 prefix := "TARGET_"
3382 var builder strings.Builder
3383 data.Custom(&builder, name, prefix, "", data)
3384 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003385 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003386 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003387}
3388
Jiyong Park16e91a02018-12-20 18:18:08 +09003389func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003390 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003391 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003392 apex {
3393 name: "myapex",
3394 key: "myapex.key",
3395 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003396 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003397 }
3398
3399 apex_key {
3400 name: "myapex.key",
3401 public_key: "testkey.avbpubkey",
3402 private_key: "testkey.pem",
3403 }
3404
3405 cc_library {
3406 name: "mylib",
3407 srcs: ["mylib.cpp"],
3408 system_shared_libs: [],
3409 stl: "none",
3410 stubs: {
3411 versions: ["1", "2", "3"],
3412 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003413 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003414 }
3415
3416 cc_binary {
3417 name: "not_in_apex",
3418 srcs: ["mylib.cpp"],
3419 static_libs: ["mylib"],
3420 static_executable: true,
3421 system_shared_libs: [],
3422 stl: "none",
3423 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003424 `)
3425
Colin Cross7113d202019-11-20 16:39:12 -08003426 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003427
3428 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003429 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003430}
Jiyong Park9335a262018-12-24 11:31:58 +09003431
3432func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003433 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003434 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003435 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003436 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003437 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003438 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003439 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003440 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003441 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003442 }
3443
3444 cc_library {
3445 name: "mylib",
3446 srcs: ["mylib.cpp"],
3447 system_shared_libs: [],
3448 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003449 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003450 }
3451
3452 apex_key {
3453 name: "myapex.key",
3454 public_key: "testkey.avbpubkey",
3455 private_key: "testkey.pem",
3456 }
3457
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003458 android_app_certificate {
3459 name: "myapex.certificate",
3460 certificate: "testkey",
3461 }
3462
3463 android_app_certificate {
3464 name: "myapex.certificate.override",
3465 certificate: "testkey.override",
3466 }
3467
Jiyong Park9335a262018-12-24 11:31:58 +09003468 `)
3469
3470 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003471 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003472
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003473 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3474 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003475 "vendor/foo/devkeys/testkey.avbpubkey")
3476 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003477 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3478 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003479 "vendor/foo/devkeys/testkey.pem")
3480 }
3481
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003482 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003483 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003484 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003485 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003486 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003487 }
3488}
Jiyong Park58e364a2019-01-19 19:24:06 +09003489
Jooyung Hanf121a652019-12-17 14:30:11 +09003490func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003491 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003492 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003493 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003494 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003495 apex {
3496 name: "myapex",
3497 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003498 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003499 }
3500 apex_key {
3501 name: "myapex.key",
3502 public_key: "testkey.avbpubkey",
3503 private_key: "testkey.pem",
3504 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003505 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003506 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3507 if actual := rule.Args["certificates"]; actual != expected {
3508 t.Errorf("certificates should be %q, not %q", expected, actual)
3509 }
3510 })
3511 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003512 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003513 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003514 apex {
3515 name: "myapex_keytest",
3516 key: "myapex.key",
3517 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003518 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003519 }
3520 apex_key {
3521 name: "myapex.key",
3522 public_key: "testkey.avbpubkey",
3523 private_key: "testkey.pem",
3524 }
3525 android_app_certificate {
3526 name: "myapex.certificate.override",
3527 certificate: "testkey.override",
3528 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003529 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003530 expected := "testkey.override.x509.pem testkey.override.pk8"
3531 if actual := rule.Args["certificates"]; actual != expected {
3532 t.Errorf("certificates should be %q, not %q", expected, actual)
3533 }
3534 })
3535 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003536 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003537 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003538 apex {
3539 name: "myapex",
3540 key: "myapex.key",
3541 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003542 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003543 }
3544 apex_key {
3545 name: "myapex.key",
3546 public_key: "testkey.avbpubkey",
3547 private_key: "testkey.pem",
3548 }
3549 android_app_certificate {
3550 name: "myapex.certificate",
3551 certificate: "testkey",
3552 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003553 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003554 expected := "testkey.x509.pem testkey.pk8"
3555 if actual := rule.Args["certificates"]; actual != expected {
3556 t.Errorf("certificates should be %q, not %q", expected, actual)
3557 }
3558 })
3559 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003560 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003561 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003562 apex {
3563 name: "myapex_keytest",
3564 key: "myapex.key",
3565 file_contexts: ":myapex-file_contexts",
3566 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003567 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003568 }
3569 apex_key {
3570 name: "myapex.key",
3571 public_key: "testkey.avbpubkey",
3572 private_key: "testkey.pem",
3573 }
3574 android_app_certificate {
3575 name: "myapex.certificate.override",
3576 certificate: "testkey.override",
3577 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003578 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003579 expected := "testkey.override.x509.pem testkey.override.pk8"
3580 if actual := rule.Args["certificates"]; actual != expected {
3581 t.Errorf("certificates should be %q, not %q", expected, actual)
3582 }
3583 })
3584 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003585 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003586 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003587 apex {
3588 name: "myapex",
3589 key: "myapex.key",
3590 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003591 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003592 }
3593 apex_key {
3594 name: "myapex.key",
3595 public_key: "testkey.avbpubkey",
3596 private_key: "testkey.pem",
3597 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003598 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003599 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3600 if actual := rule.Args["certificates"]; actual != expected {
3601 t.Errorf("certificates should be %q, not %q", expected, actual)
3602 }
3603 })
3604 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003605 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003606 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003607 apex {
3608 name: "myapex_keytest",
3609 key: "myapex.key",
3610 file_contexts: ":myapex-file_contexts",
3611 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003612 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003613 }
3614 apex_key {
3615 name: "myapex.key",
3616 public_key: "testkey.avbpubkey",
3617 private_key: "testkey.pem",
3618 }
3619 android_app_certificate {
3620 name: "myapex.certificate.override",
3621 certificate: "testkey.override",
3622 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003623 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003624 expected := "testkey.override.x509.pem testkey.override.pk8"
3625 if actual := rule.Args["certificates"]; actual != expected {
3626 t.Errorf("certificates should be %q, not %q", expected, actual)
3627 }
3628 })
3629}
3630
Jiyong Park58e364a2019-01-19 19:24:06 +09003631func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003632 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003633 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003634 apex {
3635 name: "myapex",
3636 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003637 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003638 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003639 }
3640
3641 apex {
3642 name: "otherapex",
3643 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003644 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003645 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003646 }
3647
3648 apex_key {
3649 name: "myapex.key",
3650 public_key: "testkey.avbpubkey",
3651 private_key: "testkey.pem",
3652 }
3653
3654 cc_library {
3655 name: "mylib",
3656 srcs: ["mylib.cpp"],
3657 system_shared_libs: [],
3658 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003659 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003660 "myapex",
3661 "otherapex",
3662 ],
Jooyung Han24282772020-03-21 23:20:55 +09003663 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003664 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003665 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003666 cc_library {
3667 name: "mylib2",
3668 srcs: ["mylib.cpp"],
3669 system_shared_libs: [],
3670 stl: "none",
3671 apex_available: [
3672 "myapex",
3673 "otherapex",
3674 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003675 static_libs: ["mylib3"],
3676 recovery_available: true,
3677 min_sdk_version: "29",
3678 }
3679 cc_library {
3680 name: "mylib3",
3681 srcs: ["mylib.cpp"],
3682 system_shared_libs: [],
3683 stl: "none",
3684 apex_available: [
3685 "myapex",
3686 "otherapex",
3687 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003688 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003689 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003690 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003691 `)
3692
Jooyung Hanc87a0592020-03-02 17:44:33 +09003693 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003694 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003695 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003696
Vinh Tranf9754732023-01-19 22:41:46 -05003697 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003698 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003699 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003700
Vinh Tranf9754732023-01-19 22:41:46 -05003701 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003702 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003703 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003704
Colin Crossaede88c2020-08-11 12:17:01 -07003705 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3706 // each variant defines additional macros to distinguish which apex variant it is built for
3707
3708 // non-APEX variant does not have __ANDROID_APEX__ defined
3709 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3710 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3711
Vinh Tranf9754732023-01-19 22:41:46 -05003712 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003713 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3714 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003715
Jooyung Hanc87a0592020-03-02 17:44:33 +09003716 // non-APEX variant does not have __ANDROID_APEX__ defined
3717 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3718 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3719
Vinh Tranf9754732023-01-19 22:41:46 -05003720 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003721 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003722 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003723}
Jiyong Park7e636d02019-01-28 16:16:54 +09003724
3725func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003726 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003727 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003728 apex {
3729 name: "myapex",
3730 key: "myapex.key",
3731 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003732 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003733 }
3734
3735 apex_key {
3736 name: "myapex.key",
3737 public_key: "testkey.avbpubkey",
3738 private_key: "testkey.pem",
3739 }
3740
3741 cc_library_headers {
3742 name: "mylib_headers",
3743 export_include_dirs: ["my_include"],
3744 system_shared_libs: [],
3745 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003746 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003747 }
3748
3749 cc_library {
3750 name: "mylib",
3751 srcs: ["mylib.cpp"],
3752 system_shared_libs: [],
3753 stl: "none",
3754 header_libs: ["mylib_headers"],
3755 export_header_lib_headers: ["mylib_headers"],
3756 stubs: {
3757 versions: ["1", "2", "3"],
3758 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003759 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003760 }
3761
3762 cc_library {
3763 name: "otherlib",
3764 srcs: ["mylib.cpp"],
3765 system_shared_libs: [],
3766 stl: "none",
3767 shared_libs: ["mylib"],
3768 }
3769 `)
3770
Colin Cross7113d202019-11-20 16:39:12 -08003771 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003772
3773 // Ensure that the include path of the header lib is exported to 'otherlib'
3774 ensureContains(t, cFlags, "-Imy_include")
3775}
Alex Light9670d332019-01-29 18:07:33 -08003776
Jiyong Park7cd10e32020-01-14 09:22:18 +09003777type fileInApex struct {
3778 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003779 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003780 isLink bool
3781}
3782
Jooyung Han1724d582022-12-21 10:17:44 +09003783func (f fileInApex) String() string {
3784 return f.src + ":" + f.path
3785}
3786
3787func (f fileInApex) match(expectation string) bool {
3788 parts := strings.Split(expectation, ":")
3789 if len(parts) == 1 {
3790 match, _ := path.Match(parts[0], f.path)
3791 return match
3792 }
3793 if len(parts) == 2 {
3794 matchSrc, _ := path.Match(parts[0], f.src)
3795 matchDst, _ := path.Match(parts[1], f.path)
3796 return matchSrc && matchDst
3797 }
3798 panic("invalid expected file specification: " + expectation)
3799}
3800
Jooyung Hana57af4a2020-01-23 05:36:59 +00003801func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003802 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003803 module := ctx.ModuleForTests(moduleName, variant)
3804 apexRule := module.MaybeRule("apexRule")
3805 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003806 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003807 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003808 for _, cmd := range strings.Split(copyCmds, "&&") {
3809 cmd = strings.TrimSpace(cmd)
3810 if cmd == "" {
3811 continue
3812 }
3813 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003814 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003815 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003816 switch terms[0] {
3817 case "mkdir":
3818 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003819 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003820 t.Fatal("copyCmds contains invalid cp command", cmd)
3821 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003822 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003823 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003824 isLink = false
3825 case "ln":
3826 if len(terms) != 3 && len(terms) != 4 {
3827 // ln LINK TARGET or ln -s LINK TARGET
3828 t.Fatal("copyCmds contains invalid ln command", cmd)
3829 }
3830 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003831 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003832 isLink = true
3833 default:
3834 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3835 }
3836 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003837 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003838 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003839 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 }
Jooyung Han1724d582022-12-21 10:17:44 +09003841 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003842 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003843 }
3844 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003845 return ret
3846}
3847
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003848func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003849 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003850 var failed bool
3851 var surplus []string
3852 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003853 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003854 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003855 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003856 if file.match(expected) {
3857 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003858 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003859 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003860 }
3861 }
Jooyung Han1724d582022-12-21 10:17:44 +09003862 if !matchFound {
3863 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003864 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003865 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003866
Jooyung Han31c470b2019-10-18 16:26:59 +09003867 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003868 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003869 t.Log("surplus files", surplus)
3870 failed = true
3871 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003872
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003873 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003874 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003875 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003876 if !filesMatched[expected] {
3877 missing = append(missing, expected)
3878 }
3879 }
3880 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 t.Log("missing files", missing)
3882 failed = true
3883 }
3884 if failed {
3885 t.Fail()
3886 }
3887}
3888
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003889func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3890 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3891}
3892
3893func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003894 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003895 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3896 if deapexer.Output != nil {
3897 outputs = append(outputs, deapexer.Output.String())
3898 }
3899 for _, output := range deapexer.ImplicitOutputs {
3900 outputs = append(outputs, output.String())
3901 }
3902 actualFiles := make([]fileInApex, 0, len(outputs))
3903 for _, output := range outputs {
3904 dir := "/deapexer/"
3905 pos := strings.LastIndex(output, dir)
3906 if pos == -1 {
3907 t.Fatal("Unknown deapexer output ", output)
3908 }
3909 path := output[pos+len(dir):]
3910 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3911 }
3912 assertFileListEquals(t, files, actualFiles)
3913}
3914
Jooyung Han39edb6c2019-11-06 16:53:07 +09003915func vndkLibrariesTxtFiles(vers ...string) (result string) {
3916 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003917 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003918 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003919 prebuilt_etc {
3920 name: "` + txt + `.libraries.` + v + `.txt",
3921 src: "dummy.txt",
3922 }
3923 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003924 }
3925 }
3926 return
3927}
3928
Jooyung Han344d5432019-08-23 11:17:39 +09003929func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003930 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003931 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003932 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003933 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003934 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003935 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003936 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003937 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003938 }
3939
3940 apex_key {
3941 name: "myapex.key",
3942 public_key: "testkey.avbpubkey",
3943 private_key: "testkey.pem",
3944 }
3945
Jooyung Han31c470b2019-10-18 16:26:59 +09003946 vndk_prebuilt_shared {
3947 name: "libvndk27",
3948 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003949 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003950 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003951 vndk: {
3952 enabled: true,
3953 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003954 target_arch: "arm64",
3955 arch: {
3956 arm: {
3957 srcs: ["libvndk27_arm.so"],
3958 },
3959 arm64: {
3960 srcs: ["libvndk27_arm64.so"],
3961 },
3962 },
Colin Cross2807f002021-03-02 10:15:29 -08003963 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003964 }
3965
3966 vndk_prebuilt_shared {
3967 name: "libvndk27",
3968 version: "27",
3969 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003970 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003971 vndk: {
3972 enabled: true,
3973 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003974 target_arch: "x86_64",
3975 arch: {
3976 x86: {
3977 srcs: ["libvndk27_x86.so"],
3978 },
3979 x86_64: {
3980 srcs: ["libvndk27_x86_64.so"],
3981 },
3982 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003983 }
3984 `+vndkLibrariesTxtFiles("27"),
3985 withFiles(map[string][]byte{
3986 "libvndk27_arm.so": nil,
3987 "libvndk27_arm64.so": nil,
3988 "libvndk27_x86.so": nil,
3989 "libvndk27_x86_64.so": nil,
3990 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003991
Jooyung Hana0503a52023-08-23 13:12:50 +09003992 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003993 "lib/libvndk27_arm.so",
3994 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003995 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003996 })
Jooyung Han344d5432019-08-23 11:17:39 +09003997}
3998
Jooyung Han90eee022019-10-01 20:02:42 +09003999func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004000 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004001 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004002 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004003 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004004 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004005 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004006 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004007 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004008 }
4009 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004010 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004011 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004012 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004013 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004014 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004015 }
4016 apex_key {
4017 name: "myapex.key",
4018 public_key: "testkey.avbpubkey",
4019 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004020 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004021
4022 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004023 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004024 apexManifestRule := module.Rule("apexManifestRule")
4025 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004026 }
4027
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004028 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004029 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004030}
4031
Jooyung Han344d5432019-08-23 11:17:39 +09004032func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004033 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004034 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004035 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004036 name: "com.android.vndk.v30",
4037 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004038 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004039 native_bridge_supported: true,
4040 }
4041
4042 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004043 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004044 public_key: "testkey.avbpubkey",
4045 private_key: "testkey.pem",
4046 }
4047
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004048 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004049 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004050 version: "30",
4051 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004052 srcs: ["mylib.cpp"],
4053 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004054 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004055 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004056 vndk: {
4057 enabled: true,
4058 },
Jooyung Han344d5432019-08-23 11:17:39 +09004059 }
4060 `)
4061}
4062
Jooyung Han31c470b2019-10-18 16:26:59 +09004063func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004064 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004065 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004066 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004067 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004068 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004069 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004070 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004071 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004072 }
4073
4074 apex_key {
4075 name: "myapex.key",
4076 public_key: "testkey.avbpubkey",
4077 private_key: "testkey.pem",
4078 }
4079
4080 vndk_prebuilt_shared {
4081 name: "libvndk27",
4082 version: "27",
4083 target_arch: "arm",
4084 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004085 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004086 vndk: {
4087 enabled: true,
4088 },
4089 arch: {
4090 arm: {
4091 srcs: ["libvndk27.so"],
4092 }
4093 },
4094 }
4095
4096 vndk_prebuilt_shared {
4097 name: "libvndk27",
4098 version: "27",
4099 target_arch: "arm",
4100 binder32bit: true,
4101 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004102 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004103 vndk: {
4104 enabled: true,
4105 },
4106 arch: {
4107 arm: {
4108 srcs: ["libvndk27binder32.so"],
4109 }
4110 },
Colin Cross2807f002021-03-02 10:15:29 -08004111 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004112 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004113 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004114 withFiles(map[string][]byte{
4115 "libvndk27.so": nil,
4116 "libvndk27binder32.so": nil,
4117 }),
4118 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004119 android.FixtureModifyConfig(func(config android.Config) {
4120 target := android.Target{
4121 Os: android.Android,
4122 Arch: android.Arch{
4123 ArchType: android.Arm,
4124 ArchVariant: "armv7-a-neon",
4125 Abi: []string{"armeabi-v7a"},
4126 },
4127 NativeBridge: android.NativeBridgeDisabled,
4128 NativeBridgeHostArchName: "",
4129 NativeBridgeRelativePath: "",
4130 }
4131 config.Targets[android.Android] = []android.Target{target}
4132 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004133 }),
4134 )
4135
Jooyung Hana0503a52023-08-23 13:12:50 +09004136 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004137 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004138 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004139 })
4140}
4141
Jooyung Hane1633032019-08-01 17:41:43 +09004142func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004143 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004144 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004145 apex {
4146 name: "myapex_nodep",
4147 key: "myapex.key",
4148 native_shared_libs: ["lib_nodep"],
4149 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004150 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004151 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004152 }
4153
4154 apex {
4155 name: "myapex_dep",
4156 key: "myapex.key",
4157 native_shared_libs: ["lib_dep"],
4158 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004159 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004160 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004161 }
4162
4163 apex {
4164 name: "myapex_provider",
4165 key: "myapex.key",
4166 native_shared_libs: ["libfoo"],
4167 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004168 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004169 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004170 }
4171
4172 apex {
4173 name: "myapex_selfcontained",
4174 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004175 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004176 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004177 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004178 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004179 }
4180
4181 apex_key {
4182 name: "myapex.key",
4183 public_key: "testkey.avbpubkey",
4184 private_key: "testkey.pem",
4185 }
4186
4187 cc_library {
4188 name: "lib_nodep",
4189 srcs: ["mylib.cpp"],
4190 system_shared_libs: [],
4191 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004192 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004193 }
4194
4195 cc_library {
4196 name: "lib_dep",
4197 srcs: ["mylib.cpp"],
4198 shared_libs: ["libfoo"],
4199 system_shared_libs: [],
4200 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004201 apex_available: [
4202 "myapex_dep",
4203 "myapex_provider",
4204 "myapex_selfcontained",
4205 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004206 }
4207
4208 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004209 name: "lib_dep_on_bar",
4210 srcs: ["mylib.cpp"],
4211 shared_libs: ["libbar"],
4212 system_shared_libs: [],
4213 stl: "none",
4214 apex_available: [
4215 "myapex_selfcontained",
4216 ],
4217 }
4218
4219
4220 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004221 name: "libfoo",
4222 srcs: ["mytest.cpp"],
4223 stubs: {
4224 versions: ["1"],
4225 },
4226 system_shared_libs: [],
4227 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004228 apex_available: [
4229 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004230 ],
4231 }
4232
4233 cc_library {
4234 name: "libbar",
4235 srcs: ["mytest.cpp"],
4236 stubs: {
4237 versions: ["1"],
4238 },
4239 system_shared_libs: [],
4240 stl: "none",
4241 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004242 "myapex_selfcontained",
4243 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004244 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004245
Jooyung Hane1633032019-08-01 17:41:43 +09004246 `)
4247
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004248 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004249 var provideNativeLibs, requireNativeLibs []string
4250
Jooyung Hana0503a52023-08-23 13:12:50 +09004251 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004252 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4253 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004254 ensureListEmpty(t, provideNativeLibs)
4255 ensureListEmpty(t, requireNativeLibs)
4256
Jooyung Hana0503a52023-08-23 13:12:50 +09004257 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004258 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4259 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004260 ensureListEmpty(t, provideNativeLibs)
4261 ensureListContains(t, requireNativeLibs, "libfoo.so")
4262
Jooyung Hana0503a52023-08-23 13:12:50 +09004263 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004264 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4265 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004266 ensureListContains(t, provideNativeLibs, "libfoo.so")
4267 ensureListEmpty(t, requireNativeLibs)
4268
Jooyung Hana0503a52023-08-23 13:12:50 +09004269 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004270 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4271 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004272 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004273 ensureListEmpty(t, requireNativeLibs)
4274}
4275
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004276func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004277 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004278 ctx := testApex(t, `
4279 apex {
4280 name: "myapex",
4281 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004282 native_shared_libs: ["mylib"],
4283 updatable: false,
4284 }
4285
4286 apex_key {
4287 name: "myapex.key",
4288 public_key: "testkey.avbpubkey",
4289 private_key: "testkey.pem",
4290 }
4291
4292 cc_library {
4293 name: "mylib",
4294 srcs: ["mylib.cpp"],
4295 system_shared_libs: [],
4296 stl: "none",
4297 apex_available: [
4298 "//apex_available:platform",
4299 "myapex",
4300 ],
4301 }
4302 `, android.FixtureMergeEnv(map[string]string{
4303 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4304 }))
4305
Jooyung Hana0503a52023-08-23 13:12:50 +09004306 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004307 apexManifestRule := module.Rule("apexManifestRule")
4308 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4309}
4310
Vinh Tran8f5310f2022-10-07 18:16:47 -04004311func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004312 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004313 testCases := []struct {
4314 compileMultiLibProp string
4315 containedLibs []string
4316 notContainedLibs []string
4317 }{
4318 {
4319 containedLibs: []string{
4320 "image.apex/lib64/mylib.so",
4321 "image.apex/lib/mylib.so",
4322 },
4323 compileMultiLibProp: `compile_multilib: "both",`,
4324 },
4325 {
4326 containedLibs: []string{"image.apex/lib64/mylib.so"},
4327 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4328 compileMultiLibProp: `compile_multilib: "first",`,
4329 },
4330 {
4331 containedLibs: []string{"image.apex/lib64/mylib.so"},
4332 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4333 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4334 },
4335 {
4336 containedLibs: []string{"image.apex/lib64/mylib.so"},
4337 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4338 compileMultiLibProp: `compile_multilib: "64",`,
4339 },
4340 {
4341 containedLibs: []string{"image.apex/lib/mylib.so"},
4342 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4343 compileMultiLibProp: `compile_multilib: "32",`,
4344 },
4345 }
4346 for _, testCase := range testCases {
4347 ctx := testApex(t, fmt.Sprintf(`
4348 apex {
4349 name: "myapex",
4350 key: "myapex.key",
4351 %s
4352 native_shared_libs: ["mylib"],
4353 updatable: false,
4354 }
4355 apex_key {
4356 name: "myapex.key",
4357 public_key: "testkey.avbpubkey",
4358 private_key: "testkey.pem",
4359 }
4360 cc_library {
4361 name: "mylib",
4362 srcs: ["mylib.cpp"],
4363 apex_available: [
4364 "//apex_available:platform",
4365 "myapex",
4366 ],
4367 }
4368 `, testCase.compileMultiLibProp),
4369 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004370 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004371 apexRule := module.Rule("apexRule")
4372 copyCmds := apexRule.Args["copy_commands"]
4373 for _, containedLib := range testCase.containedLibs {
4374 ensureContains(t, copyCmds, containedLib)
4375 }
4376 for _, notContainedLib := range testCase.notContainedLibs {
4377 ensureNotContains(t, copyCmds, notContainedLib)
4378 }
4379 }
4380}
4381
Alex Light0851b882019-02-07 13:20:53 -08004382func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004383 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004384 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004385 apex {
4386 name: "myapex",
4387 key: "myapex.key",
4388 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004389 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004390 }
4391
4392 apex_key {
4393 name: "myapex.key",
4394 public_key: "testkey.avbpubkey",
4395 private_key: "testkey.pem",
4396 }
4397
4398 cc_library {
4399 name: "mylib_common",
4400 srcs: ["mylib.cpp"],
4401 system_shared_libs: [],
4402 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004403 apex_available: [
4404 "//apex_available:platform",
4405 "myapex",
4406 ],
Alex Light0851b882019-02-07 13:20:53 -08004407 }
4408 `)
4409
Jooyung Hana0503a52023-08-23 13:12:50 +09004410 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004411 apexRule := module.Rule("apexRule")
4412 copyCmds := apexRule.Args["copy_commands"]
4413
4414 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4415 t.Log("Apex was a test apex!")
4416 t.Fail()
4417 }
4418 // Ensure that main rule creates an output
4419 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4420
4421 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004422 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004423
4424 // Ensure that both direct and indirect deps are copied into apex
4425 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4426
Colin Cross7113d202019-11-20 16:39:12 -08004427 // Ensure that the platform variant ends with _shared
4428 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004429
Colin Cross56a83212020-09-15 18:30:11 -07004430 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004431 t.Log("Found mylib_common not in any apex!")
4432 t.Fail()
4433 }
4434}
4435
4436func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004437 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004438 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004439 apex_test {
4440 name: "myapex",
4441 key: "myapex.key",
4442 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004443 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004444 }
4445
4446 apex_key {
4447 name: "myapex.key",
4448 public_key: "testkey.avbpubkey",
4449 private_key: "testkey.pem",
4450 }
4451
4452 cc_library {
4453 name: "mylib_common_test",
4454 srcs: ["mylib.cpp"],
4455 system_shared_libs: [],
4456 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004457 // TODO: remove //apex_available:platform
4458 apex_available: [
4459 "//apex_available:platform",
4460 "myapex",
4461 ],
Alex Light0851b882019-02-07 13:20:53 -08004462 }
4463 `)
4464
Jooyung Hana0503a52023-08-23 13:12:50 +09004465 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004466 apexRule := module.Rule("apexRule")
4467 copyCmds := apexRule.Args["copy_commands"]
4468
4469 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4470 t.Log("Apex was not a test apex!")
4471 t.Fail()
4472 }
4473 // Ensure that main rule creates an output
4474 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4475
4476 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004477 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004478
4479 // Ensure that both direct and indirect deps are copied into apex
4480 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4481
Colin Cross7113d202019-11-20 16:39:12 -08004482 // Ensure that the platform variant ends with _shared
4483 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004484}
4485
Jooyung Han85707de2023-12-01 14:21:13 +09004486func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004487 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004488 ctx := testApex(t, `
4489 apex {
4490 name: "myapex",
4491 key: "myapex.key",
4492 updatable: false,
4493 binaries: ["mybin"],
4494 }
4495 apex {
4496 name: "myvendorapex",
4497 key: "myapex.key",
4498 file_contexts: "myvendorapex_file_contexts",
4499 vendor: true,
4500 updatable: false,
4501 binaries: ["mybin"],
4502 }
4503 apex_key {
4504 name: "myapex.key",
4505 public_key: "testkey.avbpubkey",
4506 private_key: "testkey.pem",
4507 }
4508 cc_binary {
4509 name: "mybin",
4510 vendor_available: true,
4511 system_shared_libs: [],
4512 stl: "none",
4513 shared_libs: ["libz"],
4514 apex_available: ["//apex_available:anyapex"],
4515 }
4516 cc_library {
4517 name: "libz",
4518 vendor_available: true,
4519 system_shared_libs: [],
4520 stl: "none",
4521 stubs: {
4522 versions: ["28", "30"],
4523 },
4524 target: {
4525 vendor: {
4526 no_stubs: true,
4527 },
4528 },
4529 }
4530 `, withFiles(map[string][]byte{
4531 "myvendorapex_file_contexts": nil,
4532 }))
4533
4534 // libz provides stubs for core variant.
4535 {
4536 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4537 "bin/mybin",
4538 })
4539 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4540 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4541 }
4542 // libz doesn't provide stubs for vendor variant.
4543 {
4544 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4545 "bin/mybin",
4546 "lib64/libz.so",
4547 })
4548 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4549 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4550 }
4551}
4552
Alex Light9670d332019-01-29 18:07:33 -08004553func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004554 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004555 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004556 apex {
4557 name: "myapex",
4558 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004559 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004560 multilib: {
4561 first: {
4562 native_shared_libs: ["mylib_common"],
4563 }
4564 },
4565 target: {
4566 android: {
4567 multilib: {
4568 first: {
4569 native_shared_libs: ["mylib"],
4570 }
4571 }
4572 },
4573 host: {
4574 multilib: {
4575 first: {
4576 native_shared_libs: ["mylib2"],
4577 }
4578 }
4579 }
4580 }
4581 }
4582
4583 apex_key {
4584 name: "myapex.key",
4585 public_key: "testkey.avbpubkey",
4586 private_key: "testkey.pem",
4587 }
4588
4589 cc_library {
4590 name: "mylib",
4591 srcs: ["mylib.cpp"],
4592 system_shared_libs: [],
4593 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004594 // TODO: remove //apex_available:platform
4595 apex_available: [
4596 "//apex_available:platform",
4597 "myapex",
4598 ],
Alex Light9670d332019-01-29 18:07:33 -08004599 }
4600
4601 cc_library {
4602 name: "mylib_common",
4603 srcs: ["mylib.cpp"],
4604 system_shared_libs: [],
4605 stl: "none",
4606 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004607 // TODO: remove //apex_available:platform
4608 apex_available: [
4609 "//apex_available:platform",
4610 "myapex",
4611 ],
Alex Light9670d332019-01-29 18:07:33 -08004612 }
4613
4614 cc_library {
4615 name: "mylib2",
4616 srcs: ["mylib.cpp"],
4617 system_shared_libs: [],
4618 stl: "none",
4619 compile_multilib: "first",
4620 }
4621 `)
4622
Jooyung Hana0503a52023-08-23 13:12:50 +09004623 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004624 copyCmds := apexRule.Args["copy_commands"]
4625
4626 // Ensure that main rule creates an output
4627 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4628
4629 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004630 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4631 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4632 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004633
4634 // Ensure that both direct and indirect deps are copied into apex
4635 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4636 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4637 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4638
Colin Cross7113d202019-11-20 16:39:12 -08004639 // Ensure that the platform variant ends with _shared
4640 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4641 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4642 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004643}
Jiyong Park04480cf2019-02-06 00:16:29 +09004644
Jiyong Park59140302020-12-14 18:44:04 +09004645func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004646 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004647 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004648 apex {
4649 name: "myapex",
4650 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004651 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004652 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004653 arch: {
4654 arm64: {
4655 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004656 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004657 },
4658 x86_64: {
4659 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004660 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004661 },
4662 }
4663 }
4664
4665 apex_key {
4666 name: "myapex.key",
4667 public_key: "testkey.avbpubkey",
4668 private_key: "testkey.pem",
4669 }
4670
4671 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004672 name: "mylib.generic",
4673 srcs: ["mylib.cpp"],
4674 system_shared_libs: [],
4675 stl: "none",
4676 // TODO: remove //apex_available:platform
4677 apex_available: [
4678 "//apex_available:platform",
4679 "myapex",
4680 ],
4681 }
4682
4683 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004684 name: "mylib.arm64",
4685 srcs: ["mylib.cpp"],
4686 system_shared_libs: [],
4687 stl: "none",
4688 // TODO: remove //apex_available:platform
4689 apex_available: [
4690 "//apex_available:platform",
4691 "myapex",
4692 ],
4693 }
4694
4695 cc_library {
4696 name: "mylib.x64",
4697 srcs: ["mylib.cpp"],
4698 system_shared_libs: [],
4699 stl: "none",
4700 // TODO: remove //apex_available:platform
4701 apex_available: [
4702 "//apex_available:platform",
4703 "myapex",
4704 ],
4705 }
4706 `)
4707
Jooyung Hana0503a52023-08-23 13:12:50 +09004708 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004709 copyCmds := apexRule.Args["copy_commands"]
4710
4711 // Ensure that apex variant is created for the direct dep
4712 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004713 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004714 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4715
4716 // Ensure that both direct and indirect deps are copied into apex
4717 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4718 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4719}
4720
Jiyong Park04480cf2019-02-06 00:16:29 +09004721func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004722 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004723 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004724 apex {
4725 name: "myapex",
4726 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004727 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004728 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004729 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004730 }
4731
4732 apex_key {
4733 name: "myapex.key",
4734 public_key: "testkey.avbpubkey",
4735 private_key: "testkey.pem",
4736 }
4737
4738 sh_binary {
4739 name: "myscript",
4740 src: "mylib.cpp",
4741 filename: "myscript.sh",
4742 sub_dir: "script",
4743 }
4744 `)
4745
Jooyung Hana0503a52023-08-23 13:12:50 +09004746 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004747 copyCmds := apexRule.Args["copy_commands"]
4748
4749 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4750}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004751
Jooyung Han91df2082019-11-20 01:49:42 +09004752func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004753 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004754 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004755 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004756 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004757 {"", "system"},
4758 {"product_specific: true", "product"},
4759 {"soc_specific: true", "vendor"},
4760 {"proprietary: true", "vendor"},
4761 {"vendor: true", "vendor"},
4762 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004763 }
4764 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004765 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004766 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004767 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004768 apex {
4769 name: "myapex",
4770 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004771 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004772 `+tc.propName+`
4773 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004774
Jooyung Han91df2082019-11-20 01:49:42 +09004775 apex_key {
4776 name: "myapex.key",
4777 public_key: "testkey.avbpubkey",
4778 private_key: "testkey.pem",
4779 }
4780 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004781
Jooyung Hana0503a52023-08-23 13:12:50 +09004782 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004783 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004784 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004785 if actual != expected {
4786 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4787 }
Jooyung Han91df2082019-11-20 01:49:42 +09004788 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004789 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004790}
Jiyong Park67882562019-03-21 01:11:21 +09004791
Jooyung Han580eb4f2020-06-24 19:33:06 +09004792func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004793 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004794 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004795 apex {
4796 name: "myapex",
4797 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004798 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004799 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004800
Jooyung Han580eb4f2020-06-24 19:33:06 +09004801 apex_key {
4802 name: "myapex.key",
4803 public_key: "testkey.avbpubkey",
4804 private_key: "testkey.pem",
4805 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004806 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004807 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004808 rule := module.Output("file_contexts")
4809 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4810}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004811
Jooyung Han580eb4f2020-06-24 19:33:06 +09004812func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004813 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004814 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004815 apex {
4816 name: "myapex",
4817 key: "myapex.key",
4818 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004819 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004820 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004821
Jooyung Han580eb4f2020-06-24 19:33:06 +09004822 apex_key {
4823 name: "myapex.key",
4824 public_key: "testkey.avbpubkey",
4825 private_key: "testkey.pem",
4826 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004827 `, withFiles(map[string][]byte{
4828 "my_own_file_contexts": nil,
4829 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004830}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004831
Jooyung Han580eb4f2020-06-24 19:33:06 +09004832func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004833 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004834 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004835 apex {
4836 name: "myapex",
4837 key: "myapex.key",
4838 product_specific: true,
4839 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004840 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004841 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004842
Jooyung Han580eb4f2020-06-24 19:33:06 +09004843 apex_key {
4844 name: "myapex.key",
4845 public_key: "testkey.avbpubkey",
4846 private_key: "testkey.pem",
4847 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004848 `)
4849
Colin Cross1c460562021-02-16 17:55:47 -08004850 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004851 apex {
4852 name: "myapex",
4853 key: "myapex.key",
4854 product_specific: true,
4855 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004856 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004857 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004858
Jooyung Han580eb4f2020-06-24 19:33:06 +09004859 apex_key {
4860 name: "myapex.key",
4861 public_key: "testkey.avbpubkey",
4862 private_key: "testkey.pem",
4863 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004864 `, withFiles(map[string][]byte{
4865 "product_specific_file_contexts": nil,
4866 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004867 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004868 rule := module.Output("file_contexts")
4869 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4870}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004871
Jooyung Han580eb4f2020-06-24 19:33:06 +09004872func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004873 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004874 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004875 apex {
4876 name: "myapex",
4877 key: "myapex.key",
4878 product_specific: true,
4879 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004880 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004881 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004882
Jooyung Han580eb4f2020-06-24 19:33:06 +09004883 apex_key {
4884 name: "myapex.key",
4885 public_key: "testkey.avbpubkey",
4886 private_key: "testkey.pem",
4887 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004888
Jooyung Han580eb4f2020-06-24 19:33:06 +09004889 filegroup {
4890 name: "my-file-contexts",
4891 srcs: ["product_specific_file_contexts"],
4892 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004893 `, withFiles(map[string][]byte{
4894 "product_specific_file_contexts": nil,
4895 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004896 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004897 rule := module.Output("file_contexts")
4898 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004899}
4900
Jiyong Park67882562019-03-21 01:11:21 +09004901func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004902 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004903 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004904 apex_key {
4905 name: "myapex.key",
4906 public_key: ":my.avbpubkey",
4907 private_key: ":my.pem",
4908 product_specific: true,
4909 }
4910
4911 filegroup {
4912 name: "my.avbpubkey",
4913 srcs: ["testkey2.avbpubkey"],
4914 }
4915
4916 filegroup {
4917 name: "my.pem",
4918 srcs: ["testkey2.pem"],
4919 }
4920 `)
4921
4922 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4923 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004924 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004925 if actual_pubkey != expected_pubkey {
4926 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4927 }
4928 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004929 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004930 if actual_privkey != expected_privkey {
4931 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4932 }
4933}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004934
4935func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004936 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004937 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004938 prebuilt_apex {
4939 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004940 arch: {
4941 arm64: {
4942 src: "myapex-arm64.apex",
4943 },
4944 arm: {
4945 src: "myapex-arm.apex",
4946 },
4947 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004948 }
4949 `)
4950
Wei Li340ee8e2022-03-18 17:33:24 -07004951 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4952 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004953
Jiyong Parkc95714e2019-03-29 14:23:10 +09004954 expectedInput := "myapex-arm64.apex"
4955 if prebuilt.inputApex.String() != expectedInput {
4956 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4957 }
Wei Li340ee8e2022-03-18 17:33:24 -07004958 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4959 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4960 rule := testingModule.Rule("genProvenanceMetaData")
4961 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4962 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4963 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4964 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004965
4966 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4967 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004968}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004969
Paul Duffinc0609c62021-03-01 17:27:16 +00004970func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004971 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004972 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004973 prebuilt_apex {
4974 name: "myapex",
4975 }
4976 `)
4977}
4978
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004979func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004980 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004981 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004982 prebuilt_apex {
4983 name: "myapex",
4984 src: "myapex-arm.apex",
4985 filename: "notmyapex.apex",
4986 }
4987 `)
4988
Wei Li340ee8e2022-03-18 17:33:24 -07004989 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4990 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004991
4992 expected := "notmyapex.apex"
4993 if p.installFilename != expected {
4994 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4995 }
Wei Li340ee8e2022-03-18 17:33:24 -07004996 rule := testingModule.Rule("genProvenanceMetaData")
4997 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4998 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4999 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5000 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005001}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005002
Samiul Islam7c02e262021-09-08 17:48:28 +01005003func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005004 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005005 testApex(t, `
5006 apex_set {
5007 name: "com.company.android.myapex",
5008 apex_name: "com.android.myapex",
5009 set: "company-myapex.apks",
5010 filename: "com.company.android.myapex.apex"
5011 }
5012 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5013
5014 testApex(t, `
5015 apex_set {
5016 name: "com.company.android.myapex",
5017 apex_name: "com.android.myapex",
5018 set: "company-myapex.apks",
5019 filename: "com.company.android.myapex.capex"
5020 }
5021 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5022
5023 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5024 apex_set {
5025 name: "com.company.android.myapex",
5026 apex_name: "com.android.myapex",
5027 set: "company-myapex.apks",
5028 filename: "some-random-suffix"
5029 }
5030 `)
5031}
5032
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005033func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005034 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005035 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005036 prebuilt_apex {
5037 name: "myapex.prebuilt",
5038 src: "myapex-arm.apex",
5039 overrides: [
5040 "myapex",
5041 ],
5042 }
5043 `)
5044
Wei Li340ee8e2022-03-18 17:33:24 -07005045 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5046 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005047
5048 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005049 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005050 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005051 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005052 }
Wei Li340ee8e2022-03-18 17:33:24 -07005053 rule := testingModule.Rule("genProvenanceMetaData")
5054 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5055 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5056 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5057 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005058}
5059
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005060func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005061 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005062 testApex(t, `
5063 prebuilt_apex {
5064 name: "com.company.android.myapex",
5065 apex_name: "com.android.myapex",
5066 src: "company-myapex-arm.apex",
5067 }
5068 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5069
5070 testApex(t, `
5071 apex_set {
5072 name: "com.company.android.myapex",
5073 apex_name: "com.android.myapex",
5074 set: "company-myapex.apks",
5075 }
5076 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5077}
5078
5079func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005080 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005081 _ = android.GroupFixturePreparers(
5082 java.PrepareForTestWithJavaDefaultModules,
5083 PrepareForTestWithApexBuildComponents,
5084 android.FixtureWithRootAndroidBp(`
5085 platform_bootclasspath {
5086 name: "platform-bootclasspath",
5087 fragments: [
5088 {
5089 apex: "com.android.art",
5090 module: "art-bootclasspath-fragment",
5091 },
5092 ],
5093 }
5094
5095 prebuilt_apex {
5096 name: "com.company.android.art",
5097 apex_name: "com.android.art",
5098 src: "com.company.android.art-arm.apex",
5099 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5100 }
5101
5102 prebuilt_bootclasspath_fragment {
5103 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005104 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005105 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005106 hidden_api: {
5107 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5108 metadata: "my-bootclasspath-fragment/metadata.csv",
5109 index: "my-bootclasspath-fragment/index.csv",
5110 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5111 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5112 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005113 }
5114
5115 java_import {
5116 name: "core-oj",
5117 jars: ["prebuilt.jar"],
5118 }
5119 `),
5120 ).RunTest(t)
5121}
5122
Spandan Das59a4a2b2024-01-09 21:35:56 +00005123// A minimal context object for use with DexJarBuildPath
5124type moduleErrorfTestCtx struct {
5125}
5126
5127func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5128}
5129
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005130func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005131 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005132 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005133 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005134 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5135 // is disabled.
5136 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005137
5138 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5139 // file creation.
5140 java.FixtureConfigureBootJars("platform:foo"),
5141 android.FixtureModifyMockFS(func(fs android.MockFS) {
5142 fs["platform/Android.bp"] = []byte(`
5143 java_library {
5144 name: "foo",
5145 srcs: ["Test.java"],
5146 compile_dex: true,
5147 }
5148 `)
5149 fs["platform/Test.java"] = nil
5150 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005151 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005152
Paul Duffin40a3f652021-07-19 13:11:24 +01005153 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005154 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005155 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005156 var rule android.TestingBuildParams
5157
5158 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5159 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005160 }
5161
Paul Duffin40a3f652021-07-19 13:11:24 +01005162 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5163 t.Helper()
5164 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5165 var rule android.TestingBuildParams
5166
5167 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5168 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5169 }
5170
Paul Duffin89f570a2021-06-16 01:42:33 +01005171 fragment := java.ApexVariantReference{
5172 Apex: proptools.StringPtr("myapex"),
5173 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5174 }
5175
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005176 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005177 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005178 bp := `
5179 prebuilt_apex {
5180 name: "myapex",
5181 arch: {
5182 arm64: {
5183 src: "myapex-arm64.apex",
5184 },
5185 arm: {
5186 src: "myapex-arm.apex",
5187 },
5188 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005189 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5190 }
5191
5192 prebuilt_bootclasspath_fragment {
5193 name: "my-bootclasspath-fragment",
5194 contents: ["libfoo", "libbar"],
5195 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005196 hidden_api: {
5197 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5198 metadata: "my-bootclasspath-fragment/metadata.csv",
5199 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005200 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5201 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5202 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005203 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005204 }
5205
Spandan Das52c01a12024-09-20 01:09:48 +00005206 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005207 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005208 public: {
5209 jars: ["libfoo.jar"],
5210 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005211 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005212 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005213 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005214 }
Paul Duffin37856732021-02-26 14:24:15 +00005215
5216 java_sdk_library_import {
5217 name: "libbar",
5218 public: {
5219 jars: ["libbar.jar"],
5220 },
5221 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005222 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005223 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005224 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005225 `
5226
Paul Duffin89f570a2021-06-16 01:42:33 +01005227 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005228
Paul Duffin537ea3d2021-05-14 10:38:00 +01005229 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005230 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005231 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005232 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005233 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005234 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 +01005235 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005236 })
5237
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005238 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005239 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005240 bp := `
5241 apex_set {
5242 name: "myapex",
5243 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005244 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005245 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5246 }
5247
Paul Duffin89f570a2021-06-16 01:42:33 +01005248 prebuilt_bootclasspath_fragment {
5249 name: "my-bootclasspath-fragment",
5250 contents: ["libfoo", "libbar"],
5251 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005252 hidden_api: {
5253 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5254 metadata: "my-bootclasspath-fragment/metadata.csv",
5255 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005256 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5257 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5258 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005259 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005260 }
5261
Liz Kammer2dc72442023-04-20 10:10:48 -04005262 prebuilt_systemserverclasspath_fragment {
5263 name: "my-systemserverclasspath-fragment",
5264 contents: ["libbaz"],
5265 apex_available: ["myapex"],
5266 }
5267
Spandan Das52c01a12024-09-20 01:09:48 +00005268 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005269 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005270 public: {
5271 jars: ["libfoo.jar"],
5272 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005273 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005274 shared_library: false,
5275 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005276 }
5277
Spandan Das52c01a12024-09-20 01:09:48 +00005278
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005279 java_sdk_library_import {
5280 name: "libbar",
5281 public: {
5282 jars: ["libbar.jar"],
5283 },
5284 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005285 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005286 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005287 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005288
5289 java_sdk_library_import {
5290 name: "libbaz",
5291 public: {
5292 jars: ["libbaz.jar"],
5293 },
5294 apex_available: ["myapex"],
5295 shared_library: false,
5296 permitted_packages: ["baz"],
5297 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005298 `
5299
Paul Duffin89f570a2021-06-16 01:42:33 +01005300 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005301
Paul Duffin537ea3d2021-05-14 10:38:00 +01005302 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005303 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005304 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005305 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005306 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005307 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 +01005308 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005309
5310 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5311
5312 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005313 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005314 "myjavalib.myapex",
5315 "libfoo.myapex",
5316 "libbar.myapex",
5317 "libbaz.myapex",
5318 }
5319 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5320 for i, e := range mkEntries {
5321 g := e.OverrideName
5322 if w := overrideNames[i]; w != g {
5323 t.Errorf("Expected override name %q, got %q", w, g)
5324 }
5325 }
5326
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005327 })
5328
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005329 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005330 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005331 bp := `
5332 prebuilt_apex {
5333 name: "myapex",
5334 arch: {
5335 arm64: {
5336 src: "myapex-arm64.apex",
5337 },
5338 arm: {
5339 src: "myapex-arm.apex",
5340 },
5341 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005342 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5343 }
5344
5345 prebuilt_bootclasspath_fragment {
5346 name: "my-bootclasspath-fragment",
5347 contents: ["libfoo", "libbar"],
5348 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005349 hidden_api: {
5350 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5351 metadata: "my-bootclasspath-fragment/metadata.csv",
5352 index: "my-bootclasspath-fragment/index.csv",
5353 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5354 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5355 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005356 }
5357
5358 java_import {
5359 name: "libfoo",
5360 jars: ["libfoo.jar"],
5361 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005362 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005363 }
5364
5365 java_library {
5366 name: "libfoo",
5367 srcs: ["foo/bar/MyClass.java"],
5368 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005369 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005370 }
Paul Duffin37856732021-02-26 14:24:15 +00005371
5372 java_sdk_library_import {
5373 name: "libbar",
5374 public: {
5375 jars: ["libbar.jar"],
5376 },
5377 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005378 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005379 }
5380
5381 java_sdk_library {
5382 name: "libbar",
5383 srcs: ["foo/bar/MyClass.java"],
5384 unsafe_ignore_missing_latest_api: true,
5385 apex_available: ["myapex"],
5386 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005387 `
5388
5389 // In this test the source (java_library) libfoo is active since the
5390 // prebuilt (java_import) defaults to prefer:false. However the
5391 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5392 // find the dex boot jar in it. We either need to disable the source libfoo
5393 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005394 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005395 // dexbootjar check is skipped if AllowMissingDependencies is true
5396 preparerAllowMissingDeps := android.GroupFixturePreparers(
5397 preparer,
5398 android.PrepareForTestWithAllowMissingDependencies,
5399 )
5400 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005401 })
5402
5403 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005404 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005405 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005406 apex {
5407 name: "myapex",
5408 key: "myapex.key",
5409 updatable: false,
5410 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5411 }
5412
5413 apex_key {
5414 name: "myapex.key",
5415 public_key: "testkey.avbpubkey",
5416 private_key: "testkey.pem",
5417 }
5418
5419 bootclasspath_fragment {
5420 name: "my-bootclasspath-fragment",
5421 contents: ["libfoo", "libbar"],
5422 apex_available: ["myapex"],
5423 hidden_api: {
5424 split_packages: ["*"],
5425 },
5426 }
5427
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005428 prebuilt_apex {
5429 name: "myapex",
5430 arch: {
5431 arm64: {
5432 src: "myapex-arm64.apex",
5433 },
5434 arm: {
5435 src: "myapex-arm.apex",
5436 },
5437 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005438 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5439 }
5440
5441 prebuilt_bootclasspath_fragment {
5442 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005443 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005444 contents: ["libfoo", "libbar"],
5445 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005446 hidden_api: {
5447 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5448 metadata: "my-bootclasspath-fragment/metadata.csv",
5449 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005450 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5451 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5452 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005453 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005454 }
5455
Spandan Das52c01a12024-09-20 01:09:48 +00005456 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457 name: "libfoo",
5458 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005459 public: {
5460 jars: ["libfoo.jar"],
5461 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005462 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005463 shared_library: false,
5464 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 }
5466
5467 java_library {
5468 name: "libfoo",
5469 srcs: ["foo/bar/MyClass.java"],
5470 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005471 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005472 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005473 }
Paul Duffin37856732021-02-26 14:24:15 +00005474
5475 java_sdk_library_import {
5476 name: "libbar",
5477 prefer: true,
5478 public: {
5479 jars: ["libbar.jar"],
5480 },
5481 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005482 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005483 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005484 }
5485
5486 java_sdk_library {
5487 name: "libbar",
5488 srcs: ["foo/bar/MyClass.java"],
5489 unsafe_ignore_missing_latest_api: true,
5490 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005491 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005492 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005493 `
5494
Paul Duffin89f570a2021-06-16 01:42:33 +01005495 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005496
Paul Duffin537ea3d2021-05-14 10:38:00 +01005497 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005498 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005499 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005500 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005501 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005502 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 +01005503 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005504 })
5505
5506 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005507 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005508 bp := `
5509 apex {
5510 name: "myapex",
5511 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005512 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005513 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005514 }
5515
5516 apex_key {
5517 name: "myapex.key",
5518 public_key: "testkey.avbpubkey",
5519 private_key: "testkey.pem",
5520 }
5521
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005522 bootclasspath_fragment {
5523 name: "my-bootclasspath-fragment",
5524 contents: ["libfoo", "libbar"],
5525 apex_available: ["myapex"],
5526 hidden_api: {
5527 split_packages: ["*"],
5528 },
5529 }
5530
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005531 prebuilt_apex {
5532 name: "myapex",
5533 arch: {
5534 arm64: {
5535 src: "myapex-arm64.apex",
5536 },
5537 arm: {
5538 src: "myapex-arm.apex",
5539 },
5540 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005541 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5542 }
5543
5544 prebuilt_bootclasspath_fragment {
5545 name: "my-bootclasspath-fragment",
5546 contents: ["libfoo", "libbar"],
5547 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005548 hidden_api: {
5549 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5550 metadata: "my-bootclasspath-fragment/metadata.csv",
5551 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005552 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5553 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5554 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005555 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005556 }
5557
5558 java_import {
5559 name: "libfoo",
5560 jars: ["libfoo.jar"],
5561 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005562 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563 }
5564
5565 java_library {
5566 name: "libfoo",
5567 srcs: ["foo/bar/MyClass.java"],
5568 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005569 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005570 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005571 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005572 }
Paul Duffin37856732021-02-26 14:24:15 +00005573
5574 java_sdk_library_import {
5575 name: "libbar",
5576 public: {
5577 jars: ["libbar.jar"],
5578 },
5579 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005580 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005581 }
5582
5583 java_sdk_library {
5584 name: "libbar",
5585 srcs: ["foo/bar/MyClass.java"],
5586 unsafe_ignore_missing_latest_api: true,
5587 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005588 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005589 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005590 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005591 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005592 `
5593
Paul Duffin89f570a2021-06-16 01:42:33 +01005594 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005595
Paul Duffin537ea3d2021-05-14 10:38:00 +01005596 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005597 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005598 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5599 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005600 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5601 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 +01005602 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005603 })
5604
5605 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005606 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005607 bp := `
5608 apex {
5609 name: "myapex",
5610 enabled: false,
5611 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005612 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005613 }
5614
5615 apex_key {
5616 name: "myapex.key",
5617 public_key: "testkey.avbpubkey",
5618 private_key: "testkey.pem",
5619 }
5620
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005621 bootclasspath_fragment {
5622 name: "my-bootclasspath-fragment",
5623 enabled: false,
5624 contents: ["libfoo", "libbar"],
5625 apex_available: ["myapex"],
5626 hidden_api: {
5627 split_packages: ["*"],
5628 },
5629 }
5630
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005631 prebuilt_apex {
5632 name: "myapex",
5633 arch: {
5634 arm64: {
5635 src: "myapex-arm64.apex",
5636 },
5637 arm: {
5638 src: "myapex-arm.apex",
5639 },
5640 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005641 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5642 }
5643
5644 prebuilt_bootclasspath_fragment {
5645 name: "my-bootclasspath-fragment",
5646 contents: ["libfoo", "libbar"],
5647 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005648 hidden_api: {
5649 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5650 metadata: "my-bootclasspath-fragment/metadata.csv",
5651 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005652 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5653 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5654 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005655 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005656 }
5657
5658 java_import {
5659 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005660 jars: ["libfoo.jar"],
5661 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005662 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005663 }
5664
5665 java_library {
5666 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005667 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005668 srcs: ["foo/bar/MyClass.java"],
5669 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005670 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005671 }
Paul Duffin37856732021-02-26 14:24:15 +00005672
5673 java_sdk_library_import {
5674 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005675 public: {
5676 jars: ["libbar.jar"],
5677 },
5678 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005679 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005680 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005681 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005682 }
5683
5684 java_sdk_library {
5685 name: "libbar",
5686 srcs: ["foo/bar/MyClass.java"],
5687 unsafe_ignore_missing_latest_api: true,
5688 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005689 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005690 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005691 `
Cole Fausta963b942024-04-11 17:43:00 -07005692 // This test disables libbar, which causes the ComponentDepsMutator to add
5693 // deps on libbar.stubs and other sub-modules that don't exist. We can
5694 // enable AllowMissingDependencies to work around that, but enabling that
5695 // causes extra checks for missing source files to dex_bootjars, so add those
5696 // to the mock fs as well.
5697 preparer2 := android.GroupFixturePreparers(
5698 preparer,
5699 android.PrepareForTestWithAllowMissingDependencies,
5700 android.FixtureMergeMockFs(map[string][]byte{
5701 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005702 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005703 }),
5704 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005705
Cole Fausta963b942024-04-11 17:43:00 -07005706 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005707
Paul Duffin537ea3d2021-05-14 10:38:00 +01005708 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005709 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005710 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005711 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005712 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005713 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 +01005714 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005715 })
Spandan Das3a392012024-01-17 18:26:27 +00005716
Spandan Dasf2c10572024-02-27 04:49:52 +00005717 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005718 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005719 bp := `
5720 // Source
5721 apex {
5722 name: "myapex",
5723 enabled: false,
5724 key: "myapex.key",
5725 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5726 }
5727
5728 apex_key {
5729 name: "myapex.key",
5730 public_key: "testkey.avbpubkey",
5731 private_key: "testkey.pem",
5732 }
5733
5734 // Prebuilt
5735 prebuilt_apex {
5736 name: "myapex.v1",
5737 source_apex_name: "myapex",
5738 arch: {
5739 arm64: {
5740 src: "myapex-arm64.apex",
5741 },
5742 arm: {
5743 src: "myapex-arm.apex",
5744 },
5745 },
5746 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5747 prefer: true,
5748 }
5749 prebuilt_apex {
5750 name: "myapex.v2",
5751 source_apex_name: "myapex",
5752 arch: {
5753 arm64: {
5754 src: "myapex-arm64.apex",
5755 },
5756 arm: {
5757 src: "myapex-arm.apex",
5758 },
5759 },
5760 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5761 prefer: true,
5762 }
5763
5764 prebuilt_bootclasspath_fragment {
5765 name: "my-bootclasspath-fragment",
5766 contents: ["libfoo", "libbar"],
5767 apex_available: ["myapex"],
5768 hidden_api: {
5769 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5770 metadata: "my-bootclasspath-fragment/metadata.csv",
5771 index: "my-bootclasspath-fragment/index.csv",
5772 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5773 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5774 },
5775 prefer: true,
5776 }
5777
5778 java_import {
5779 name: "libfoo",
5780 jars: ["libfoo.jar"],
5781 apex_available: ["myapex"],
5782 prefer: true,
5783 }
5784 java_import {
5785 name: "libbar",
5786 jars: ["libbar.jar"],
5787 apex_available: ["myapex"],
5788 prefer: true,
5789 }
5790 `
5791
Spandan Dasf2c10572024-02-27 04:49:52 +00005792 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 +00005793 })
5794
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005795}
5796
Roland Levillain630846d2019-06-26 12:48:34 +01005797func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005798 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005799 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005800 apex_test {
5801 name: "myapex",
5802 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005803 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005804 tests: [
5805 "mytest",
5806 ],
5807 }
5808
5809 apex_key {
5810 name: "myapex.key",
5811 public_key: "testkey.avbpubkey",
5812 private_key: "testkey.pem",
5813 }
5814
Liz Kammer1c14a212020-05-12 15:26:55 -07005815 filegroup {
5816 name: "fg",
5817 srcs: [
5818 "baz",
5819 "bar/baz"
5820 ],
5821 }
5822
Roland Levillain630846d2019-06-26 12:48:34 +01005823 cc_test {
5824 name: "mytest",
5825 gtest: false,
5826 srcs: ["mytest.cpp"],
5827 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005828 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005829 system_shared_libs: [],
5830 static_executable: true,
5831 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005832 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005833 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005834
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005835 cc_library {
5836 name: "mylib",
5837 srcs: ["mylib.cpp"],
5838 system_shared_libs: [],
5839 stl: "none",
5840 }
5841
Liz Kammer5bd365f2020-05-27 15:15:11 -07005842 filegroup {
5843 name: "fg2",
5844 srcs: [
5845 "testdata/baz"
5846 ],
5847 }
Roland Levillain630846d2019-06-26 12:48:34 +01005848 `)
5849
Jooyung Hana0503a52023-08-23 13:12:50 +09005850 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005851 copyCmds := apexRule.Args["copy_commands"]
5852
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005853 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005854 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005855 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005856
Liz Kammer1c14a212020-05-12 15:26:55 -07005857 //Ensure that test data are copied into apex.
5858 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5859 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5860
Roland Levillainf89cd092019-07-29 16:22:59 +01005861 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005862 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005863 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005864 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005865 prefix := "TARGET_"
5866 var builder strings.Builder
5867 data.Custom(&builder, name, prefix, "", data)
5868 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005869 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005870 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005871}
5872
Jooyung Hand48f3c32019-08-23 11:18:57 +09005873func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005874 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005875 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5876 apex {
5877 name: "myapex",
5878 key: "myapex.key",
5879 native_shared_libs: ["libfoo"],
5880 }
5881
5882 apex_key {
5883 name: "myapex.key",
5884 public_key: "testkey.avbpubkey",
5885 private_key: "testkey.pem",
5886 }
5887
5888 cc_library {
5889 name: "libfoo",
5890 stl: "none",
5891 system_shared_libs: [],
5892 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005893 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005894 }
5895 `)
5896 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5897 apex {
5898 name: "myapex",
5899 key: "myapex.key",
5900 java_libs: ["myjar"],
5901 }
5902
5903 apex_key {
5904 name: "myapex.key",
5905 public_key: "testkey.avbpubkey",
5906 private_key: "testkey.pem",
5907 }
5908
5909 java_library {
5910 name: "myjar",
5911 srcs: ["foo/bar/MyClass.java"],
5912 sdk_version: "none",
5913 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005914 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005915 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005916 }
5917 `)
5918}
5919
Bill Peckhama41a6962021-01-11 10:58:54 -08005920func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005921 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005922 apex {
5923 name: "myapex",
5924 key: "myapex.key",
5925 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005926 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005927 }
5928
5929 apex_key {
5930 name: "myapex.key",
5931 public_key: "testkey.avbpubkey",
5932 private_key: "testkey.pem",
5933 }
5934
5935 java_import {
5936 name: "myjavaimport",
5937 apex_available: ["myapex"],
5938 jars: ["my.jar"],
5939 compile_dex: true,
5940 }
5941 `)
5942
Jooyung Hana0503a52023-08-23 13:12:50 +09005943 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005944 apexRule := module.Rule("apexRule")
5945 copyCmds := apexRule.Args["copy_commands"]
5946 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5947}
5948
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005949func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005950 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005951 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005952 apex {
5953 name: "myapex",
5954 key: "myapex.key",
5955 apps: [
5956 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005957 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005958 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005959 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005960 }
5961
5962 apex_key {
5963 name: "myapex.key",
5964 public_key: "testkey.avbpubkey",
5965 private_key: "testkey.pem",
5966 }
5967
5968 android_app {
5969 name: "AppFoo",
5970 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005971 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005972 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005973 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005974 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005975 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005976 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005977 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005978
5979 android_app {
5980 name: "AppFooPriv",
5981 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005982 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005983 system_modules: "none",
5984 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005985 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005986 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005987 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005988 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005989
5990 cc_library_shared {
5991 name: "libjni",
5992 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005993 shared_libs: ["libfoo"],
5994 stl: "none",
5995 system_shared_libs: [],
5996 apex_available: [ "myapex" ],
5997 sdk_version: "current",
5998 }
5999
6000 cc_library_shared {
6001 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006002 stl: "none",
6003 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006004 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006005 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006006 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006007 `)
6008
Jooyung Hana0503a52023-08-23 13:12:50 +09006009 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006010 apexRule := module.Rule("apexRule")
6011 copyCmds := apexRule.Args["copy_commands"]
6012
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006013 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6014 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006015 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006016
Colin Crossaede88c2020-08-11 12:17:01 -07006017 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006018 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006019 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006020 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006021 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006022 // JNI libraries including transitive deps are
6023 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006024 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006025 // ... embedded inside APK (jnilibs.zip)
6026 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6027 // ... and not directly inside the APEX
6028 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6029 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006030
6031 apexBundle := module.Module().(*apexBundle)
6032 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6033 var builder strings.Builder
6034 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6035 androidMk := builder.String()
6036 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6037 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6038 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6039 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6040 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6041 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 +01006042}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006043
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006044func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006045 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006046 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6047 for _, id := range invalidBuildIds {
6048 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6049 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6050 variables.BuildId = proptools.StringPtr(id)
6051 })
6052 testApexError(t, message, `apex {
6053 name: "myapex",
6054 key: "myapex.key",
6055 apps: ["AppFooPrebuilt"],
6056 updatable: false,
6057 }
6058
6059 apex_key {
6060 name: "myapex.key",
6061 public_key: "testkey.avbpubkey",
6062 private_key: "testkey.pem",
6063 }
6064
6065 android_app_import {
6066 name: "AppFooPrebuilt",
6067 apk: "PrebuiltAppFoo.apk",
6068 presigned: true,
6069 apex_available: ["myapex"],
6070 }
6071 `, fixture)
6072 }
6073}
6074
Dario Frenicde2a032019-10-27 00:29:22 +01006075func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006076 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006077 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006078 apex {
6079 name: "myapex",
6080 key: "myapex.key",
6081 apps: [
6082 "AppFooPrebuilt",
6083 "AppFooPrivPrebuilt",
6084 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006085 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006086 }
6087
6088 apex_key {
6089 name: "myapex.key",
6090 public_key: "testkey.avbpubkey",
6091 private_key: "testkey.pem",
6092 }
6093
6094 android_app_import {
6095 name: "AppFooPrebuilt",
6096 apk: "PrebuiltAppFoo.apk",
6097 presigned: true,
6098 dex_preopt: {
6099 enabled: false,
6100 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006101 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006102 }
6103
6104 android_app_import {
6105 name: "AppFooPrivPrebuilt",
6106 apk: "PrebuiltAppFooPriv.apk",
6107 privileged: true,
6108 presigned: true,
6109 dex_preopt: {
6110 enabled: false,
6111 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006112 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006113 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006114 }
6115 `)
6116
Jooyung Hana0503a52023-08-23 13:12:50 +09006117 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006118 apexRule := module.Rule("apexRule")
6119 copyCmds := apexRule.Args["copy_commands"]
6120
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006121 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6122 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006123}
6124
6125func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006126 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006127 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006128 apex {
6129 name: "myapex",
6130 key: "myapex.key",
6131 apps: [
6132 "AppFoo",
6133 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006134 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006135 }
6136
6137 apex_key {
6138 name: "myapex.key",
6139 public_key: "testkey.avbpubkey",
6140 private_key: "testkey.pem",
6141 }
6142
6143 android_app {
6144 name: "AppFoo",
6145 srcs: ["foo/bar/MyClass.java"],
6146 sdk_version: "none",
6147 system_modules: "none",
6148 apex_available: [ "myapex" ],
6149 }
6150
6151 android_app_import {
6152 name: "AppFoo",
6153 apk: "AppFooPrebuilt.apk",
6154 filename: "AppFooPrebuilt.apk",
6155 presigned: true,
6156 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006157 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006158 }
6159 `, withFiles(map[string][]byte{
6160 "AppFooPrebuilt.apk": nil,
6161 }))
6162
Jooyung Hana0503a52023-08-23 13:12:50 +09006163 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006164 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006165 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006166}
6167
Dario Freni6f3937c2019-12-20 22:58:03 +00006168func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006169 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006170 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006171 apex {
6172 name: "myapex",
6173 key: "myapex.key",
6174 apps: [
6175 "TesterHelpAppFoo",
6176 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006177 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006178 }
6179
6180 apex_key {
6181 name: "myapex.key",
6182 public_key: "testkey.avbpubkey",
6183 private_key: "testkey.pem",
6184 }
6185
6186 android_test_helper_app {
6187 name: "TesterHelpAppFoo",
6188 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006189 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006190 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006191 }
6192
6193 `)
6194
Jooyung Hana0503a52023-08-23 13:12:50 +09006195 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006196 apexRule := module.Rule("apexRule")
6197 copyCmds := apexRule.Args["copy_commands"]
6198
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006199 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006200}
6201
Jooyung Han18020ea2019-11-13 10:50:48 +09006202func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006203 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006204 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006205 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006206 apex {
6207 name: "myapex",
6208 key: "myapex.key",
6209 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006210 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006211 }
6212
6213 apex_key {
6214 name: "myapex.key",
6215 public_key: "testkey.avbpubkey",
6216 private_key: "testkey.pem",
6217 }
6218
6219 apex {
6220 name: "otherapex",
6221 key: "myapex.key",
6222 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006223 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006224 }
6225
6226 cc_defaults {
6227 name: "libfoo-defaults",
6228 apex_available: ["otherapex"],
6229 }
6230
6231 cc_library {
6232 name: "libfoo",
6233 defaults: ["libfoo-defaults"],
6234 stl: "none",
6235 system_shared_libs: [],
6236 }`)
6237}
6238
Paul Duffine52e66f2020-03-30 17:54:29 +01006239func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006240 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006241 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006242 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006243 apex {
6244 name: "myapex",
6245 key: "myapex.key",
6246 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006247 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006248 }
6249
6250 apex_key {
6251 name: "myapex.key",
6252 public_key: "testkey.avbpubkey",
6253 private_key: "testkey.pem",
6254 }
6255
6256 apex {
6257 name: "otherapex",
6258 key: "otherapex.key",
6259 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006260 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006261 }
6262
6263 apex_key {
6264 name: "otherapex.key",
6265 public_key: "testkey.avbpubkey",
6266 private_key: "testkey.pem",
6267 }
6268
6269 cc_library {
6270 name: "libfoo",
6271 stl: "none",
6272 system_shared_libs: [],
6273 apex_available: ["otherapex"],
6274 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006275
6276 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6277 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6278 testApex(t, `
6279 apex {
6280 name: "com.sdv.myapex",
6281 key: "myapex.key",
6282 native_shared_libs: ["libfoo"],
6283 updatable: false,
6284 product_specific: true,
6285 }
6286
6287 apex_key {
6288 name: "myapex.key",
6289 public_key: "testkey.avbpubkey",
6290 private_key: "testkey.pem",
6291 }
6292
6293 apex {
6294 name: "com.any.otherapex",
6295 key: "otherapex.key",
6296 native_shared_libs: ["libfoo"],
6297 updatable: false,
6298 }
6299
6300 apex_key {
6301 name: "otherapex.key",
6302 public_key: "testkey.avbpubkey",
6303 private_key: "testkey.pem",
6304 }
6305
6306 cc_library {
6307 name: "libfoo",
6308 stl: "none",
6309 system_shared_libs: [],
6310 apex_available: ["com.any.otherapex"],
6311 product_specific: true,
6312 }`,
6313 android.FixtureMergeMockFs(android.MockFS{
6314 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6315 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6316 }))
6317
6318 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6319 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6320 apex {
6321 name: "com.sdv.myapex",
6322 key: "myapex.key",
6323 native_shared_libs: ["libfoo"],
6324 updatable: false,
6325 }
6326
6327 apex_key {
6328 name: "myapex.key",
6329 public_key: "testkey.avbpubkey",
6330 private_key: "testkey.pem",
6331 }
6332
6333 apex {
6334 name: "com.any.otherapex",
6335 key: "otherapex.key",
6336 native_shared_libs: ["libfoo"],
6337 updatable: false,
6338 }
6339
6340 apex_key {
6341 name: "otherapex.key",
6342 public_key: "testkey.avbpubkey",
6343 private_key: "testkey.pem",
6344 }
6345
6346 cc_library {
6347 name: "libfoo",
6348 stl: "none",
6349 system_shared_libs: [],
6350 apex_available: ["com.any.otherapex"],
6351 }`,
6352 android.FixtureMergeMockFs(android.MockFS{
6353 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6354 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6355 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006356}
Jiyong Park127b40b2019-09-30 16:04:35 +09006357
Paul Duffine52e66f2020-03-30 17:54:29 +01006358func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006359 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006360 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006361 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006362.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006363.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006364.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006365.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006366.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006367.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006368 apex {
6369 name: "myapex",
6370 key: "myapex.key",
6371 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006372 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006373 }
6374
6375 apex_key {
6376 name: "myapex.key",
6377 public_key: "testkey.avbpubkey",
6378 private_key: "testkey.pem",
6379 }
6380
Jiyong Park127b40b2019-09-30 16:04:35 +09006381 cc_library {
6382 name: "libfoo",
6383 stl: "none",
6384 shared_libs: ["libbar"],
6385 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006386 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006387 }
6388
6389 cc_library {
6390 name: "libbar",
6391 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006392 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006393 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006394 apex_available: ["myapex"],
6395 }
6396
6397 cc_library {
6398 name: "libbaz",
6399 stl: "none",
6400 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006401 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006402
6403 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6404 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6405 testApex(t, `
6406 apex {
6407 name: "com.sdv.myapex",
6408 key: "myapex.key",
6409 native_shared_libs: ["libfoo"],
6410 updatable: false,
6411 product_specific: true,
6412 }
6413
6414 apex_key {
6415 name: "myapex.key",
6416 public_key: "testkey.avbpubkey",
6417 private_key: "testkey.pem",
6418 }
6419
6420 cc_library {
6421 name: "libfoo",
6422 stl: "none",
6423 shared_libs: ["libbar"],
6424 system_shared_libs: [],
6425 apex_available: ["com.sdv.myapex"],
6426 product_specific: true,
6427 }
6428
6429 cc_library {
6430 name: "libbar",
6431 stl: "none",
6432 shared_libs: ["libbaz"],
6433 system_shared_libs: [],
6434 apex_available: ["com.sdv.myapex"],
6435 product_specific: true,
6436 }
6437
6438 cc_library {
6439 name: "libbaz",
6440 stl: "none",
6441 system_shared_libs: [],
6442 product_specific: true,
6443 }`,
6444 android.FixtureMergeMockFs(android.MockFS{
6445 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6446 }))
6447
6448 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6449 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6450 apex {
6451 name: "com.sdv.myapex",
6452 key: "myapex.key",
6453 native_shared_libs: ["libfoo"],
6454 updatable: false,
6455 }
6456
6457 apex_key {
6458 name: "myapex.key",
6459 public_key: "testkey.avbpubkey",
6460 private_key: "testkey.pem",
6461 }
6462
6463 cc_library {
6464 name: "libfoo",
6465 stl: "none",
6466 shared_libs: ["libbar"],
6467 system_shared_libs: [],
6468 apex_available: ["com.sdv.myapex"],
6469 }
6470
6471 cc_library {
6472 name: "libbar",
6473 stl: "none",
6474 shared_libs: ["libbaz"],
6475 system_shared_libs: [],
6476 apex_available: ["com.sdv.myapex"],
6477 }
6478
6479 cc_library {
6480 name: "libbaz",
6481 stl: "none",
6482 system_shared_libs: [],
6483 }`,
6484 android.FixtureMergeMockFs(android.MockFS{
6485 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6486 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006487}
Jiyong Park127b40b2019-09-30 16:04:35 +09006488
Liz Kammer5f108fa2023-05-11 14:33:17 -04006489func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006490 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006491 testApex(t, `
6492 apex {
6493 name: "myapex",
6494 key: "myapex.key",
6495 native_shared_libs: ["libfoo"],
6496 updatable: false,
6497 }
6498
6499 apex_key {
6500 name: "myapex.key",
6501 public_key: "testkey.avbpubkey",
6502 private_key: "testkey.pem",
6503 }
6504
6505 cc_library {
6506 name: "libfoo",
6507 stl: "none",
6508 static_libs: ["libbar"],
6509 system_shared_libs: [],
6510 apex_available: ["myapex"],
6511 }
6512
6513 cc_library {
6514 name: "libbar",
6515 stl: "none",
6516 shared_libs: ["libbaz"],
6517 system_shared_libs: [],
6518 apex_available: ["myapex"],
6519 }
6520
6521 cc_library {
6522 name: "libbaz",
6523 stl: "none",
6524 system_shared_libs: [],
6525 }`)
6526
6527 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6528 apex {
6529 name: "myapex",
6530 key: "myapex.key",
6531 native_shared_libs: ["libfoo"],
6532 updatable: false,
6533 }
6534
6535 apex_key {
6536 name: "myapex.key",
6537 public_key: "testkey.avbpubkey",
6538 private_key: "testkey.pem",
6539 }
6540
6541 cc_library {
6542 name: "libfoo",
6543 stl: "none",
6544 static_libs: ["libbar"],
6545 system_shared_libs: [],
6546 apex_available: ["myapex"],
6547 }
6548
6549 cc_library {
6550 name: "libbar",
6551 stl: "none",
6552 system_shared_libs: [],
6553 }`)
6554}
6555
Paul Duffine52e66f2020-03-30 17:54:29 +01006556func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006557 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006558 testApexError(t, "\"otherapex\" is not a valid module name", `
6559 apex {
6560 name: "myapex",
6561 key: "myapex.key",
6562 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006563 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006564 }
6565
6566 apex_key {
6567 name: "myapex.key",
6568 public_key: "testkey.avbpubkey",
6569 private_key: "testkey.pem",
6570 }
6571
6572 cc_library {
6573 name: "libfoo",
6574 stl: "none",
6575 system_shared_libs: [],
6576 apex_available: ["otherapex"],
6577 }`)
6578
Paul Duffine52e66f2020-03-30 17:54:29 +01006579 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006580 apex {
6581 name: "myapex",
6582 key: "myapex.key",
6583 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006584 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006585 }
6586
6587 apex_key {
6588 name: "myapex.key",
6589 public_key: "testkey.avbpubkey",
6590 private_key: "testkey.pem",
6591 }
6592
6593 cc_library {
6594 name: "libfoo",
6595 stl: "none",
6596 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006597 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006598 apex_available: ["myapex"],
6599 }
6600
6601 cc_library {
6602 name: "libbar",
6603 stl: "none",
6604 system_shared_libs: [],
6605 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006606 }
6607
6608 cc_library {
6609 name: "libbaz",
6610 stl: "none",
6611 system_shared_libs: [],
6612 stubs: {
6613 versions: ["10", "20", "30"],
6614 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006615 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006616}
Jiyong Park127b40b2019-09-30 16:04:35 +09006617
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006618func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006619 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006620 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006621 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006622 testApexError(t, "expected an integer between 0-9; got -1", `
6623 apex {
6624 name: "myapex",
6625 key: "myapex.key",
6626 apex_available_name: "com.android.foo",
6627 variant_version: "-1",
6628 updatable: false,
6629 }
6630 apex_key {
6631 name: "myapex.key",
6632 public_key: "testkey.avbpubkey",
6633 private_key: "testkey.pem",
6634 }
6635 `)
6636 })
6637
6638 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006639 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006640 testApexError(t, "expected an integer between 0-9; got 10", `
6641 apex {
6642 name: "myapex",
6643 key: "myapex.key",
6644 apex_available_name: "com.android.foo",
6645 variant_version: "10",
6646 updatable: false,
6647 }
6648 apex_key {
6649 name: "myapex.key",
6650 public_key: "testkey.avbpubkey",
6651 private_key: "testkey.pem",
6652 }
6653 `)
6654 })
6655}
6656
6657func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006658 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006659 context := android.GroupFixturePreparers(
6660 android.PrepareForIntegrationTestWithAndroid,
6661 PrepareForTestWithApexBuildComponents,
6662 android.FixtureMergeMockFs(android.MockFS{
6663 "system/sepolicy/apex/foo-file_contexts": nil,
6664 "system/sepolicy/apex/bar-file_contexts": nil,
6665 }),
6666 )
6667 result := context.RunTestWithBp(t, `
6668 apex {
6669 name: "foo",
6670 key: "myapex.key",
6671 apex_available_name: "com.android.foo",
6672 variant_version: "0",
6673 updatable: false,
6674 }
6675 apex {
6676 name: "bar",
6677 key: "myapex.key",
6678 apex_available_name: "com.android.foo",
6679 variant_version: "3",
6680 updatable: false,
6681 }
6682 apex_key {
6683 name: "myapex.key",
6684 public_key: "testkey.avbpubkey",
6685 private_key: "testkey.pem",
6686 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006687 override_apex {
6688 name: "myoverrideapex",
6689 base: "bar",
6690 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006691 `)
6692
Jooyung Hana0503a52023-08-23 13:12:50 +09006693 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006694 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006695 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6696 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6697 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6698 }
6699
Jooyung Hana0503a52023-08-23 13:12:50 +09006700 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006701 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006702 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6703 barActualDefaultVersion := barManifestRule.Args["default_version"]
6704 if barActualDefaultVersion != barExpectedDefaultVersion {
6705 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6706 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006707
Spandan Das50801e22024-05-13 18:29:45 +00006708 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006709 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6710 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6711 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6712 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006713}
6714
Sam Delmericoca816532023-06-02 14:09:50 -04006715func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006716 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006717 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 -07006718 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006719 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6720 apex {
6721 name: "myapex_sminus",
6722 key: "myapex.key",
6723 apps: ["AppFoo"],
6724 apex_available_name: "myapex",
6725 updatable: false,
6726 }
6727 apex {
6728 name: "myapex",
6729 key: "myapex.key",
6730 apps: ["AppFoo"],
6731 updatable: false,
6732 }
6733 apex_key {
6734 name: "myapex.key",
6735 public_key: "testkey.avbpubkey",
6736 private_key: "testkey.pem",
6737 }
6738 android_app {
6739 name: "AppFoo",
6740 srcs: ["foo/bar/MyClass.java"],
6741 sdk_version: "none",
6742 system_modules: "none",
6743 apex_available: [ "myapex_sminus" ],
6744 }`,
6745 android.FixtureMergeMockFs(android.MockFS{
6746 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6747 }),
6748 )
6749 })
6750
6751 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 -07006752 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006753 testApex(t, `
6754 apex {
6755 name: "myapex_sminus",
6756 key: "myapex.key",
6757 apps: ["AppFoo"],
6758 apex_available_name: "myapex",
6759 updatable: false,
6760 }
6761 apex {
6762 name: "myapex",
6763 key: "myapex.key",
6764 apps: ["AppFoo"],
6765 updatable: false,
6766 }
6767 apex_key {
6768 name: "myapex.key",
6769 public_key: "testkey.avbpubkey",
6770 private_key: "testkey.pem",
6771 }
6772 android_app {
6773 name: "AppFoo",
6774 srcs: ["foo/bar/MyClass.java"],
6775 sdk_version: "none",
6776 system_modules: "none",
6777 apex_available: [ "myapex" ],
6778 }`,
6779 android.FixtureMergeMockFs(android.MockFS{
6780 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6781 }),
6782 )
6783 })
6784
6785 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006786 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006787 testApex(t, `
6788 override_apex {
6789 name: "myoverrideapex_sminus",
6790 base: "myapex_sminus",
6791 key: "myapex.key",
6792 apps: ["AppFooOverride"],
6793 }
6794 override_apex {
6795 name: "myoverrideapex",
6796 base: "myapex",
6797 key: "myapex.key",
6798 apps: ["AppFooOverride"],
6799 }
6800 apex {
6801 name: "myapex_sminus",
6802 key: "myapex.key",
6803 apps: ["AppFoo"],
6804 apex_available_name: "myapex",
6805 updatable: false,
6806 }
6807 apex {
6808 name: "myapex",
6809 key: "myapex.key",
6810 apps: ["AppFoo"],
6811 updatable: false,
6812 }
6813 apex_key {
6814 name: "myapex.key",
6815 public_key: "testkey.avbpubkey",
6816 private_key: "testkey.pem",
6817 }
6818 android_app {
6819 name: "AppFooOverride",
6820 srcs: ["foo/bar/MyClass.java"],
6821 sdk_version: "none",
6822 system_modules: "none",
6823 apex_available: [ "myapex" ],
6824 }
6825 android_app {
6826 name: "AppFoo",
6827 srcs: ["foo/bar/MyClass.java"],
6828 sdk_version: "none",
6829 system_modules: "none",
6830 apex_available: [ "myapex" ],
6831 }`,
6832 android.FixtureMergeMockFs(android.MockFS{
6833 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6834 }),
6835 )
6836 })
6837}
6838
6839func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006840 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006841 context := android.GroupFixturePreparers(
6842 android.PrepareForIntegrationTestWithAndroid,
6843 PrepareForTestWithApexBuildComponents,
6844 java.PrepareForTestWithDexpreopt,
6845 android.FixtureMergeMockFs(android.MockFS{
6846 "system/sepolicy/apex/myapex-file_contexts": nil,
6847 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6848 }),
6849 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6850 variables.BuildId = proptools.StringPtr("buildid")
6851 }),
6852 )
6853 context.RunTestWithBp(t, `
6854 override_apex {
6855 name: "myoverrideapex_sminus",
6856 base: "myapex_sminus",
6857 }
6858 override_apex {
6859 name: "myoverrideapex",
6860 base: "myapex",
6861 }
6862 apex {
6863 name: "myapex",
6864 key: "myapex.key",
6865 apps: ["AppFoo"],
6866 updatable: false,
6867 }
6868 apex {
6869 name: "myapex_sminus",
6870 apex_available_name: "myapex",
6871 key: "myapex.key",
6872 apps: ["AppFoo_sminus"],
6873 updatable: false,
6874 }
6875 apex_key {
6876 name: "myapex.key",
6877 public_key: "testkey.avbpubkey",
6878 private_key: "testkey.pem",
6879 }
6880 android_app {
6881 name: "AppFoo",
6882 srcs: ["foo/bar/MyClass.java"],
6883 sdk_version: "none",
6884 system_modules: "none",
6885 apex_available: [ "myapex" ],
6886 }
6887 android_app {
6888 name: "AppFoo_sminus",
6889 srcs: ["foo/bar/MyClass.java"],
6890 sdk_version: "none",
6891 min_sdk_version: "29",
6892 system_modules: "none",
6893 apex_available: [ "myapex" ],
6894 }`)
6895}
6896
Jiyong Park89e850a2020-04-07 16:37:39 +09006897func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006898 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006899 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006900 apex {
6901 name: "myapex",
6902 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006903 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006904 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006905 }
6906
6907 apex_key {
6908 name: "myapex.key",
6909 public_key: "testkey.avbpubkey",
6910 private_key: "testkey.pem",
6911 }
6912
6913 cc_library {
6914 name: "libfoo",
6915 stl: "none",
6916 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006917 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006918 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006919 }
6920
6921 cc_library {
6922 name: "libfoo2",
6923 stl: "none",
6924 system_shared_libs: [],
6925 shared_libs: ["libbaz"],
6926 apex_available: ["//apex_available:platform"],
6927 }
6928
6929 cc_library {
6930 name: "libbar",
6931 stl: "none",
6932 system_shared_libs: [],
6933 apex_available: ["myapex"],
6934 }
6935
6936 cc_library {
6937 name: "libbaz",
6938 stl: "none",
6939 system_shared_libs: [],
6940 apex_available: ["myapex"],
6941 stubs: {
6942 versions: ["1"],
6943 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006944 }`)
6945
Jiyong Park89e850a2020-04-07 16:37:39 +09006946 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6947 // because it depends on libbar which isn't available to platform
6948 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6949 if libfoo.NotAvailableForPlatform() != true {
6950 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6951 }
6952
6953 // libfoo2 however can be available to platform because it depends on libbaz which provides
6954 // stubs
6955 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6956 if libfoo2.NotAvailableForPlatform() == true {
6957 t.Errorf("%q should be available to platform", libfoo2.String())
6958 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006959}
Jiyong Parka90ca002019-10-07 15:47:24 +09006960
Paul Duffine52e66f2020-03-30 17:54:29 +01006961func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006962 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006963 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006964 apex {
6965 name: "myapex",
6966 key: "myapex.key",
6967 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006968 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006969 }
6970
6971 apex_key {
6972 name: "myapex.key",
6973 public_key: "testkey.avbpubkey",
6974 private_key: "testkey.pem",
6975 }
6976
6977 cc_library {
6978 name: "libfoo",
6979 stl: "none",
6980 system_shared_libs: [],
6981 apex_available: ["myapex"],
6982 static: {
6983 apex_available: ["//apex_available:platform"],
6984 },
6985 }`)
6986
Jiyong Park89e850a2020-04-07 16:37:39 +09006987 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6988 if libfooShared.NotAvailableForPlatform() != true {
6989 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6990 }
6991 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6992 if libfooStatic.NotAvailableForPlatform() != false {
6993 t.Errorf("%q should be available to platform", libfooStatic.String())
6994 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006995}
6996
Jooyung Han9a419e22024-08-16 17:14:21 +09006997func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006998 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006999
7000 for _, tc := range []struct {
7001 name string
7002 apexAvailable string
7003 expectedError string
7004 }{
7005 {
7006 name: "prefix matches correctly",
7007 apexAvailable: "com.foo.*",
7008 },
7009 {
7010 name: "prefix doesn't match",
7011 apexAvailable: "com.bar.*",
7012 expectedError: `Consider .* "com.foo\.\*"`,
7013 },
7014 {
7015 name: "short prefix",
7016 apexAvailable: "com.*",
7017 expectedError: "requires two or more components",
7018 },
7019 {
7020 name: "wildcard not in the end",
7021 apexAvailable: "com.*.foo",
7022 expectedError: "should end with .*",
7023 },
7024 {
7025 name: "wildcard in the middle",
7026 apexAvailable: "com.foo*.*",
7027 expectedError: "not allowed in the middle",
7028 },
7029 {
7030 name: "hint with prefix pattern",
7031 apexAvailable: "//apex_available:platform",
7032 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7033 },
7034 } {
7035 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007036 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007037 errorHandler := android.FixtureExpectsNoErrors
7038 if tc.expectedError != "" {
7039 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7040 }
7041 context := android.GroupFixturePreparers(
7042 prepareForApexTest,
7043 android.FixtureMergeMockFs(android.MockFS{
7044 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7045 }),
7046 ).ExtendWithErrorHandler(errorHandler)
7047
7048 context.RunTestWithBp(t, `
7049 apex {
7050 name: "com.foo.bar",
7051 key: "myapex.key",
7052 native_shared_libs: ["libfoo"],
7053 updatable: false,
7054 }
7055
7056 apex_key {
7057 name: "myapex.key",
7058 public_key: "testkey.avbpubkey",
7059 private_key: "testkey.pem",
7060 }
7061
7062 cc_library {
7063 name: "libfoo",
7064 stl: "none",
7065 system_shared_libs: [],
7066 apex_available: ["`+tc.apexAvailable+`"],
7067 }`)
7068 })
7069 }
7070 testApexError(t, `Consider adding "com.foo" to`, `
7071 apex {
7072 name: "com.foo", // too short for a partner apex
7073 key: "myapex.key",
7074 native_shared_libs: ["libfoo"],
7075 updatable: false,
7076 }
7077
7078 apex_key {
7079 name: "myapex.key",
7080 public_key: "testkey.avbpubkey",
7081 private_key: "testkey.pem",
7082 }
7083
7084 cc_library {
7085 name: "libfoo",
7086 stl: "none",
7087 system_shared_libs: [],
7088 }
7089 `)
7090}
7091
Jiyong Park5d790c32019-11-15 18:40:32 +09007092func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007093 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007094 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007095 apex {
7096 name: "myapex",
7097 key: "myapex.key",
7098 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007099 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007100 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007101 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007102 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007103 }
7104
7105 override_apex {
7106 name: "override_myapex",
7107 base: "myapex",
7108 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007109 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007110 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007111 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007112 compile_multilib: "first",
7113 multilib: {
7114 lib32: {
7115 native_shared_libs: ["mylib32"],
7116 },
7117 lib64: {
7118 native_shared_libs: ["mylib64"],
7119 },
7120 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007121 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007122 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007123 key: "mynewapex.key",
7124 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007125 }
7126
7127 apex_key {
7128 name: "myapex.key",
7129 public_key: "testkey.avbpubkey",
7130 private_key: "testkey.pem",
7131 }
7132
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007133 apex_key {
7134 name: "mynewapex.key",
7135 public_key: "testkey2.avbpubkey",
7136 private_key: "testkey2.pem",
7137 }
7138
7139 android_app_certificate {
7140 name: "myapex.certificate",
7141 certificate: "testkey",
7142 }
7143
Jiyong Park5d790c32019-11-15 18:40:32 +09007144 android_app {
7145 name: "app",
7146 srcs: ["foo/bar/MyClass.java"],
7147 package_name: "foo",
7148 sdk_version: "none",
7149 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007150 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007151 }
7152
7153 override_android_app {
7154 name: "override_app",
7155 base: "app",
7156 package_name: "bar",
7157 }
markchien7c803b82021-08-26 22:10:06 +08007158
7159 bpf {
7160 name: "bpf",
7161 srcs: ["bpf.c"],
7162 }
7163
7164 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007165 name: "overrideBpf",
7166 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007167 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007168
7169 prebuilt_etc {
7170 name: "myetc",
7171 src: "myprebuilt",
7172 }
7173
7174 prebuilt_etc {
7175 name: "override_myetc",
7176 src: "override_myprebuilt",
7177 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007178
7179 cc_library {
7180 name: "mylib32",
7181 apex_available: [ "myapex" ],
7182 }
7183
7184 cc_library {
7185 name: "mylib64",
7186 apex_available: [ "myapex" ],
7187 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007188 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007189
Jooyung Hana0503a52023-08-23 13:12:50 +09007190 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007191 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007192 if originalVariant.GetOverriddenBy() != "" {
7193 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7194 }
7195 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7196 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7197 }
7198
Spandan Das50801e22024-05-13 18:29:45 +00007199 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007200 apexRule := module.Rule("apexRule")
7201 copyCmds := apexRule.Args["copy_commands"]
7202
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007203 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7204 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007205
markchien7c803b82021-08-26 22:10:06 +08007206 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007207 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007208
Daniel Norman5a3ce132021-08-26 15:44:43 -07007209 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7210 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7211
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007212 apexBundle := module.Module().(*apexBundle)
7213 name := apexBundle.Name()
7214 if name != "override_myapex" {
7215 t.Errorf("name should be \"override_myapex\", but was %q", name)
7216 }
7217
Baligh Uddin004d7172020-02-19 21:29:28 -08007218 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7219 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7220 }
7221
Jiyong Park20bacab2020-03-03 11:45:41 +09007222 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007223 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007224 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7225
7226 signApkRule := module.Rule("signapk")
7227 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007228
Colin Crossaa255532020-07-03 13:18:24 -07007229 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007230 var builder strings.Builder
7231 data.Custom(&builder, name, "TARGET_", "", data)
7232 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007233 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7234 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007235 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007236 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007237 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007238 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007239 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007240 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007241}
7242
Albert Martineefabcf2022-03-21 20:11:16 +00007243func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007244 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007245 // Override from 29 to 31
7246 minSdkOverride31 := "31"
7247 ctx := testApex(t, `
7248 apex {
7249 name: "myapex",
7250 key: "myapex.key",
7251 native_shared_libs: ["mylib"],
7252 updatable: true,
7253 min_sdk_version: "29"
7254 }
7255
7256 override_apex {
7257 name: "override_myapex",
7258 base: "myapex",
7259 logging_parent: "com.foo.bar",
7260 package_name: "test.overridden.package"
7261 }
7262
7263 apex_key {
7264 name: "myapex.key",
7265 public_key: "testkey.avbpubkey",
7266 private_key: "testkey.pem",
7267 }
7268
7269 cc_library {
7270 name: "mylib",
7271 srcs: ["mylib.cpp"],
7272 runtime_libs: ["libbar"],
7273 system_shared_libs: [],
7274 stl: "none",
7275 apex_available: [ "myapex" ],
7276 min_sdk_version: "apex_inherit"
7277 }
7278
7279 cc_library {
7280 name: "libbar",
7281 srcs: ["mylib.cpp"],
7282 system_shared_libs: [],
7283 stl: "none",
7284 apex_available: [ "myapex" ],
7285 min_sdk_version: "apex_inherit"
7286 }
7287
7288 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7289
Jooyung Hana0503a52023-08-23 13:12:50 +09007290 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007291 copyCmds := apexRule.Args["copy_commands"]
7292
7293 // Ensure that direct non-stubs dep is always included
7294 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7295
7296 // Ensure that runtime_libs dep in included
7297 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7298
7299 // Ensure libraries target overridden min_sdk_version value
7300 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7301}
7302
7303func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007304 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007305 // Attempt to override from 31 to 29, should be a NOOP
7306 minSdkOverride29 := "29"
7307 ctx := testApex(t, `
7308 apex {
7309 name: "myapex",
7310 key: "myapex.key",
7311 native_shared_libs: ["mylib"],
7312 updatable: true,
7313 min_sdk_version: "31"
7314 }
7315
7316 override_apex {
7317 name: "override_myapex",
7318 base: "myapex",
7319 logging_parent: "com.foo.bar",
7320 package_name: "test.overridden.package"
7321 }
7322
7323 apex_key {
7324 name: "myapex.key",
7325 public_key: "testkey.avbpubkey",
7326 private_key: "testkey.pem",
7327 }
7328
7329 cc_library {
7330 name: "mylib",
7331 srcs: ["mylib.cpp"],
7332 runtime_libs: ["libbar"],
7333 system_shared_libs: [],
7334 stl: "none",
7335 apex_available: [ "myapex" ],
7336 min_sdk_version: "apex_inherit"
7337 }
7338
7339 cc_library {
7340 name: "libbar",
7341 srcs: ["mylib.cpp"],
7342 system_shared_libs: [],
7343 stl: "none",
7344 apex_available: [ "myapex" ],
7345 min_sdk_version: "apex_inherit"
7346 }
7347
7348 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7349
Jooyung Hana0503a52023-08-23 13:12:50 +09007350 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007351 copyCmds := apexRule.Args["copy_commands"]
7352
7353 // Ensure that direct non-stubs dep is always included
7354 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7355
7356 // Ensure that runtime_libs dep in included
7357 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7358
7359 // Ensure libraries target the original min_sdk_version value rather than the overridden
7360 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7361}
7362
Jooyung Han214bf372019-11-12 13:03:50 +09007363func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007364 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007365 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007366 apex {
7367 name: "myapex",
7368 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007369 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007370 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007371 }
7372
7373 apex_key {
7374 name: "myapex.key",
7375 public_key: "testkey.avbpubkey",
7376 private_key: "testkey.pem",
7377 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007378
7379 cc_library {
7380 name: "mylib",
7381 srcs: ["mylib.cpp"],
7382 stl: "libc++",
7383 system_shared_libs: [],
7384 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007385 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007386 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007387 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007388
Jooyung Hana0503a52023-08-23 13:12:50 +09007389 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007390 args := module.Rule("apexRule").Args
7391 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007392 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007393
7394 // The copies of the libraries in the apex should have one more dependency than
7395 // the ones outside the apex, namely the unwinder. Ideally we should check
7396 // the dependency names directly here but for some reason the names are blank in
7397 // this test.
7398 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007399 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007400 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7401 if len(apexImplicits) != len(nonApexImplicits)+1 {
7402 t.Errorf("%q missing unwinder dep", lib)
7403 }
7404 }
Jooyung Han214bf372019-11-12 13:03:50 +09007405}
7406
Paul Duffine05480a2021-03-08 15:07:14 +00007407var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007408 "api/current.txt": nil,
7409 "api/removed.txt": nil,
7410 "api/system-current.txt": nil,
7411 "api/system-removed.txt": nil,
7412 "api/test-current.txt": nil,
7413 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007414
Anton Hanssondff2c782020-12-21 17:10:01 +00007415 "100/public/api/foo.txt": nil,
7416 "100/public/api/foo-removed.txt": nil,
7417 "100/system/api/foo.txt": nil,
7418 "100/system/api/foo-removed.txt": nil,
7419
Paul Duffineedc5d52020-06-12 17:46:39 +01007420 // For java_sdk_library_import
7421 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007422}
7423
Jooyung Han58f26ab2019-12-18 15:34:32 +09007424func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007425 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007426 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007427 apex {
7428 name: "myapex",
7429 key: "myapex.key",
7430 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007431 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007432 }
7433
7434 apex_key {
7435 name: "myapex.key",
7436 public_key: "testkey.avbpubkey",
7437 private_key: "testkey.pem",
7438 }
7439
7440 java_sdk_library {
7441 name: "foo",
7442 srcs: ["a.java"],
7443 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007444 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007445 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007446
7447 prebuilt_apis {
7448 name: "sdk",
7449 api_dirs: ["100"],
7450 }
Paul Duffin9b879592020-05-26 13:21:35 +01007451 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007452
7453 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007454 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007455 "javalib/foo.jar",
7456 "etc/permissions/foo.xml",
7457 })
7458 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007459 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7460 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7461 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007462}
7463
Spandan Das3ee19692024-06-19 04:47:40 +00007464func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007465 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007466 ctx := testApex(t, `
7467 override_apex {
7468 name: "mycompanyapex",
7469 base: "myapex",
7470 }
7471 apex {
7472 name: "myapex",
7473 key: "myapex.key",
7474 java_libs: ["foo"],
7475 updatable: false,
7476 }
7477
7478 apex_key {
7479 name: "myapex.key",
7480 public_key: "testkey.avbpubkey",
7481 private_key: "testkey.pem",
7482 }
7483
7484 java_sdk_library {
7485 name: "foo",
7486 srcs: ["a.java"],
7487 api_packages: ["foo"],
7488 apex_available: [ "myapex" ],
7489 }
7490
7491 prebuilt_apis {
7492 name: "sdk",
7493 api_dirs: ["100"],
7494 }
7495 `, withFiles(filesForSdkLibrary))
7496
7497 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7498 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7499 // (com.android.foo), the filepath should not contain override apex name.
7500 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7501 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7502 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7503}
7504
Paul Duffin9b879592020-05-26 13:21:35 +01007505func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007506 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007507 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007508 apex {
7509 name: "myapex",
7510 key: "myapex.key",
7511 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007512 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007513 }
7514
7515 apex_key {
7516 name: "myapex.key",
7517 public_key: "testkey.avbpubkey",
7518 private_key: "testkey.pem",
7519 }
7520
7521 java_sdk_library {
7522 name: "foo",
7523 srcs: ["a.java"],
7524 api_packages: ["foo"],
7525 apex_available: ["myapex"],
7526 sdk_version: "none",
7527 system_modules: "none",
7528 }
7529
7530 java_library {
7531 name: "bar",
7532 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007533 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007534 apex_available: ["myapex"],
7535 sdk_version: "none",
7536 system_modules: "none",
7537 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007538
7539 prebuilt_apis {
7540 name: "sdk",
7541 api_dirs: ["100"],
7542 }
Paul Duffin9b879592020-05-26 13:21:35 +01007543 `, withFiles(filesForSdkLibrary))
7544
7545 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007546 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007547 "javalib/bar.jar",
7548 "javalib/foo.jar",
7549 "etc/permissions/foo.xml",
7550 })
7551
7552 // The bar library should depend on the implementation jar.
7553 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007554 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007555 t.Errorf("expected %q, found %#q", expected, actual)
7556 }
7557}
7558
7559func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007560 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007561 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007562 apex {
7563 name: "myapex",
7564 key: "myapex.key",
7565 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007566 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007567 }
7568
7569 apex_key {
7570 name: "myapex.key",
7571 public_key: "testkey.avbpubkey",
7572 private_key: "testkey.pem",
7573 }
7574
7575 java_sdk_library {
7576 name: "foo",
7577 srcs: ["a.java"],
7578 api_packages: ["foo"],
7579 apex_available: ["myapex"],
7580 sdk_version: "none",
7581 system_modules: "none",
7582 }
7583
7584 java_library {
7585 name: "bar",
7586 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007587 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007588 sdk_version: "none",
7589 system_modules: "none",
7590 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007591
7592 prebuilt_apis {
7593 name: "sdk",
7594 api_dirs: ["100"],
7595 }
Paul Duffin9b879592020-05-26 13:21:35 +01007596 `, withFiles(filesForSdkLibrary))
7597
7598 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007599 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007600 "javalib/foo.jar",
7601 "etc/permissions/foo.xml",
7602 })
7603
7604 // The bar library should depend on the stubs jar.
7605 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007606 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007607 t.Errorf("expected %q, found %#q", expected, actual)
7608 }
7609}
7610
Paul Duffineedc5d52020-06-12 17:46:39 +01007611func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007612 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007613 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007614 prebuilt_apis {
7615 name: "sdk",
7616 api_dirs: ["100"],
7617 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007618 withFiles(map[string][]byte{
7619 "apex/a.java": nil,
7620 "apex/apex_manifest.json": nil,
7621 "apex/Android.bp": []byte(`
7622 package {
7623 default_visibility: ["//visibility:private"],
7624 }
7625
7626 apex {
7627 name: "myapex",
7628 key: "myapex.key",
7629 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007630 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007631 }
7632
7633 apex_key {
7634 name: "myapex.key",
7635 public_key: "testkey.avbpubkey",
7636 private_key: "testkey.pem",
7637 }
7638
7639 java_library {
7640 name: "bar",
7641 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007642 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007643 apex_available: ["myapex"],
7644 sdk_version: "none",
7645 system_modules: "none",
7646 }
7647`),
7648 "source/a.java": nil,
7649 "source/api/current.txt": nil,
7650 "source/api/removed.txt": nil,
7651 "source/Android.bp": []byte(`
7652 package {
7653 default_visibility: ["//visibility:private"],
7654 }
7655
7656 java_sdk_library {
7657 name: "foo",
7658 visibility: ["//apex"],
7659 srcs: ["a.java"],
7660 api_packages: ["foo"],
7661 apex_available: ["myapex"],
7662 sdk_version: "none",
7663 system_modules: "none",
7664 public: {
7665 enabled: true,
7666 },
7667 }
7668`),
7669 "prebuilt/a.jar": nil,
7670 "prebuilt/Android.bp": []byte(`
7671 package {
7672 default_visibility: ["//visibility:private"],
7673 }
7674
7675 java_sdk_library_import {
7676 name: "foo",
7677 visibility: ["//apex", "//source"],
7678 apex_available: ["myapex"],
7679 prefer: true,
7680 public: {
7681 jars: ["a.jar"],
7682 },
7683 }
7684`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007685 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007686 )
7687
7688 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007689 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007690 "javalib/bar.jar",
7691 "javalib/foo.jar",
7692 "etc/permissions/foo.xml",
7693 })
7694
7695 // The bar library should depend on the implementation jar.
7696 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007697 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007698 t.Errorf("expected %q, found %#q", expected, actual)
7699 }
7700}
7701
7702func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007703 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007704 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7705 apex {
7706 name: "myapex",
7707 key: "myapex.key",
7708 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007709 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007710 }
7711
7712 apex_key {
7713 name: "myapex.key",
7714 public_key: "testkey.avbpubkey",
7715 private_key: "testkey.pem",
7716 }
7717
7718 java_sdk_library_import {
7719 name: "foo",
7720 apex_available: ["myapex"],
7721 prefer: true,
7722 public: {
7723 jars: ["a.jar"],
7724 },
7725 }
7726
7727 `, withFiles(filesForSdkLibrary))
7728}
7729
atrost6e126252020-01-27 17:01:16 +00007730func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007731 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007732 result := android.GroupFixturePreparers(
7733 prepareForApexTest,
7734 java.PrepareForTestWithPlatformCompatConfig,
7735 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007736 apex {
7737 name: "myapex",
7738 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007739 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007740 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007741 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007742 }
7743
7744 apex_key {
7745 name: "myapex.key",
7746 public_key: "testkey.avbpubkey",
7747 private_key: "testkey.pem",
7748 }
7749
7750 platform_compat_config {
7751 name: "myjar-platform-compat-config",
7752 src: ":myjar",
7753 }
7754
7755 java_library {
7756 name: "myjar",
7757 srcs: ["foo/bar/MyClass.java"],
7758 sdk_version: "none",
7759 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007760 apex_available: [ "myapex" ],
7761 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007762
7763 // Make sure that a preferred prebuilt does not affect the apex contents.
7764 prebuilt_platform_compat_config {
7765 name: "myjar-platform-compat-config",
7766 metadata: "compat-config/metadata.xml",
7767 prefer: true,
7768 }
atrost6e126252020-01-27 17:01:16 +00007769 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007770 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007771 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007772 "etc/compatconfig/myjar-platform-compat-config.xml",
7773 "javalib/myjar.jar",
7774 })
7775}
7776
Jooyung Han862c0d62022-12-21 10:15:37 +09007777func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007778 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007779 android.GroupFixturePreparers(
7780 android.PrepareForTestWithAndroidBuildComponents,
7781 PrepareForTestWithApexBuildComponents,
7782 prepareForTestWithMyapex,
7783 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7784 ).
7785 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7786 RunTestWithBp(t, `
7787 apex {
7788 name: "myapex",
7789 key: "myapex.key",
7790 prebuilts: ["foo", "bar"],
7791 updatable: false,
7792 }
7793
7794 apex_key {
7795 name: "myapex.key",
7796 public_key: "testkey.avbpubkey",
7797 private_key: "testkey.pem",
7798 }
7799
7800 prebuilt_etc {
7801 name: "foo",
7802 src: "myprebuilt",
7803 filename_from_src: true,
7804 }
7805
7806 prebuilt_etc {
7807 name: "bar",
7808 src: "myprebuilt",
7809 filename_from_src: true,
7810 }
7811 `)
7812}
7813
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007814func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007815 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007816 bp := `
7817 apex {
7818 name: "myapex",
7819 key: "myapex.key",
7820 native_shared_libs: ["libfoo"],
7821 updatable: false,
7822 unwanted_transitive_deps: ["libbar"],
7823 }
7824
7825 apex_key {
7826 name: "myapex.key",
7827 public_key: "testkey.avbpubkey",
7828 private_key: "testkey.pem",
7829 }
7830
7831 cc_library {
7832 name: "libfoo",
7833 srcs: ["foo.cpp"],
7834 shared_libs: ["libbar"],
7835 apex_available: ["myapex"],
7836 }
7837
7838 cc_library {
7839 name: "libbar",
7840 srcs: ["bar.cpp"],
7841 apex_available: ["myapex"],
7842 }`
7843 ctx := testApex(t, bp)
7844 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7845 "*/libc++.so",
7846 "*/libfoo.so",
7847 // not libbar.so
7848 })
7849}
7850
Jiyong Park479321d2019-12-16 11:47:12 +09007851func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007852 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007853 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7854 apex {
7855 name: "myapex",
7856 key: "myapex.key",
7857 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007858 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007859 }
7860
7861 apex_key {
7862 name: "myapex.key",
7863 public_key: "testkey.avbpubkey",
7864 private_key: "testkey.pem",
7865 }
7866
7867 java_library {
7868 name: "myjar",
7869 srcs: ["foo/bar/MyClass.java"],
7870 sdk_version: "none",
7871 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007872 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007873 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007874 }
7875 `)
7876}
7877
Jiyong Park7afd1072019-12-30 16:56:33 +09007878func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007879 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007880 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007881 apex {
7882 name: "myapex",
7883 key: "myapex.key",
7884 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007885 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007886 }
7887
7888 apex_key {
7889 name: "myapex.key",
7890 public_key: "testkey.avbpubkey",
7891 private_key: "testkey.pem",
7892 }
7893
7894 cc_library {
7895 name: "mylib",
7896 srcs: ["mylib.cpp"],
7897 system_shared_libs: [],
7898 stl: "none",
7899 required: ["a", "b"],
7900 host_required: ["c", "d"],
7901 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007902 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007903 }
7904 `)
7905
Jooyung Hana0503a52023-08-23 13:12:50 +09007906 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007907 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007908 name := apexBundle.BaseModuleName()
7909 prefix := "TARGET_"
7910 var builder strings.Builder
7911 data.Custom(&builder, name, prefix, "", data)
7912 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007913 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007914 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7915 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007916}
7917
Jiyong Park7cd10e32020-01-14 09:22:18 +09007918func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007919 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007920 bp := `
7921 apex {
7922 name: "myapex",
7923 key: "myapex.key",
7924 native_shared_libs: ["mylib"],
7925 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007926 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007927 }
7928
Jiyong Park9d677202020-02-19 16:29:35 +09007929 apex {
7930 name: "myapex.updatable",
7931 key: "myapex.key",
7932 native_shared_libs: ["mylib"],
7933 java_libs: ["myjar"],
7934 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007935 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007936 }
7937
Jiyong Park7cd10e32020-01-14 09:22:18 +09007938 apex_key {
7939 name: "myapex.key",
7940 public_key: "testkey.avbpubkey",
7941 private_key: "testkey.pem",
7942 }
7943
7944 cc_library {
7945 name: "mylib",
7946 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007947 shared_libs: [
7948 "myotherlib",
7949 "myotherlib_ext",
7950 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007951 system_shared_libs: [],
7952 stl: "none",
7953 apex_available: [
7954 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007955 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007956 "//apex_available:platform",
7957 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007958 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007959 }
7960
7961 cc_library {
7962 name: "myotherlib",
7963 srcs: ["mylib.cpp"],
7964 system_shared_libs: [],
7965 stl: "none",
7966 apex_available: [
7967 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007968 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007969 "//apex_available:platform",
7970 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007971 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007972 }
7973
Jiyong Parkce243632023-02-17 18:22:25 +09007974 cc_library {
7975 name: "myotherlib_ext",
7976 srcs: ["mylib.cpp"],
7977 system_shared_libs: [],
7978 system_ext_specific: true,
7979 stl: "none",
7980 apex_available: [
7981 "myapex",
7982 "myapex.updatable",
7983 "//apex_available:platform",
7984 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007985 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007986 }
7987
Jiyong Park7cd10e32020-01-14 09:22:18 +09007988 java_library {
7989 name: "myjar",
7990 srcs: ["foo/bar/MyClass.java"],
7991 sdk_version: "none",
7992 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007993 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007994 apex_available: [
7995 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007996 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007997 "//apex_available:platform",
7998 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007999 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008000 }
8001
8002 java_library {
8003 name: "myotherjar",
8004 srcs: ["foo/bar/MyClass.java"],
8005 sdk_version: "none",
8006 system_modules: "none",
8007 apex_available: [
8008 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008009 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008010 "//apex_available:platform",
8011 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008012 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008013 }
8014 `
8015
8016 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8017 for _, f := range files {
8018 if f.path == file {
8019 if f.isLink {
8020 t.Errorf("%q is not a real file", file)
8021 }
8022 return
8023 }
8024 }
8025 t.Errorf("%q is not found", file)
8026 }
8027
Jiyong Parkce243632023-02-17 18:22:25 +09008028 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008029 for _, f := range files {
8030 if f.path == file {
8031 if !f.isLink {
8032 t.Errorf("%q is not a symlink", file)
8033 }
Jiyong Parkce243632023-02-17 18:22:25 +09008034 if f.src != target {
8035 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8036 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008037 return
8038 }
8039 }
8040 t.Errorf("%q is not found", file)
8041 }
8042
Jiyong Park9d677202020-02-19 16:29:35 +09008043 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8044 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008045 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008046 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008047 ensureRealfileExists(t, files, "javalib/myjar.jar")
8048 ensureRealfileExists(t, files, "lib64/mylib.so")
8049 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008050 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008051
Jooyung Hana0503a52023-08-23 13:12:50 +09008052 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008053 ensureRealfileExists(t, files, "javalib/myjar.jar")
8054 ensureRealfileExists(t, files, "lib64/mylib.so")
8055 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008056 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008057
8058 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008059 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008060 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008061 ensureRealfileExists(t, files, "javalib/myjar.jar")
8062 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008063 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8064 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008065
Jooyung Hana0503a52023-08-23 13:12:50 +09008066 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008067 ensureRealfileExists(t, files, "javalib/myjar.jar")
8068 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008069 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8070 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008071}
8072
Yo Chiange8128052020-07-23 20:09:18 +08008073func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008074 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008075 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008076 apex {
8077 name: "myapex",
8078 key: "myapex.key",
8079 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008080 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008081 }
8082
8083 apex_key {
8084 name: "myapex.key",
8085 public_key: "testkey.avbpubkey",
8086 private_key: "testkey.pem",
8087 }
8088
8089 cc_library_shared {
8090 name: "mylib",
8091 srcs: ["mylib.cpp"],
8092 shared_libs: ["myotherlib"],
8093 system_shared_libs: [],
8094 stl: "none",
8095 apex_available: [
8096 "myapex",
8097 "//apex_available:platform",
8098 ],
8099 }
8100
8101 cc_prebuilt_library_shared {
8102 name: "myotherlib",
8103 srcs: ["prebuilt.so"],
8104 system_shared_libs: [],
8105 stl: "none",
8106 apex_available: [
8107 "myapex",
8108 "//apex_available:platform",
8109 ],
8110 }
8111 `)
8112
Jooyung Hana0503a52023-08-23 13:12:50 +09008113 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008114 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008115 var builder strings.Builder
8116 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8117 androidMk := builder.String()
8118 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008119 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008120 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8121 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8122 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008123 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008124}
8125
Jooyung Han643adc42020-02-27 13:50:06 +09008126func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008127 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008128 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008129 apex {
8130 name: "myapex",
8131 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008132 binaries: ["mybin"],
8133 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008134 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008135 }
8136
8137 apex_key {
8138 name: "myapex.key",
8139 public_key: "testkey.avbpubkey",
8140 private_key: "testkey.pem",
8141 }
8142
8143 cc_library {
8144 name: "mylib",
8145 srcs: ["mylib.cpp"],
8146 shared_libs: ["mylib2"],
8147 system_shared_libs: [],
8148 stl: "none",
8149 apex_available: [ "myapex" ],
8150 }
8151
8152 cc_library {
8153 name: "mylib2",
8154 srcs: ["mylib.cpp"],
8155 system_shared_libs: [],
8156 stl: "none",
8157 apex_available: [ "myapex" ],
8158 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008159
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008160 // Used as both a JNI library and a regular shared library.
8161 cc_library {
8162 name: "mylib3",
8163 srcs: ["mylib.cpp"],
8164 system_shared_libs: [],
8165 stl: "none",
8166 apex_available: [ "myapex" ],
8167 }
8168
8169 cc_binary {
8170 name: "mybin",
8171 srcs: ["mybin.cpp"],
8172 shared_libs: ["mylib3"],
8173 system_shared_libs: [],
8174 stl: "none",
8175 apex_available: [ "myapex" ],
8176 }
8177
Jiyong Park34d5c332022-02-24 18:02:44 +09008178 rust_ffi_shared {
8179 name: "libfoo.rust",
8180 crate_name: "foo",
8181 srcs: ["foo.rs"],
8182 shared_libs: ["libfoo.shared_from_rust"],
8183 prefer_rlib: true,
8184 apex_available: ["myapex"],
8185 }
8186
8187 cc_library_shared {
8188 name: "libfoo.shared_from_rust",
8189 srcs: ["mylib.cpp"],
8190 system_shared_libs: [],
8191 stl: "none",
8192 stubs: {
8193 versions: ["10", "11", "12"],
8194 },
8195 }
8196
Jooyung Han643adc42020-02-27 13:50:06 +09008197 `)
8198
Jooyung Hana0503a52023-08-23 13:12:50 +09008199 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008200 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008201 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008202 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008203 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008204 "lib64/mylib.so",
8205 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008206 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008207 "lib64/libfoo.rust.so",
8208 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8209 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008210 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008211
8212 // b/220397949
8213 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008214}
8215
Jooyung Han49f67012020-04-17 13:43:10 +09008216func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008217 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008218 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008219 apex {
8220 name: "myapex",
8221 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008222 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008223 }
8224 apex_key {
8225 name: "myapex.key",
8226 public_key: "testkey.avbpubkey",
8227 private_key: "testkey.pem",
8228 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008229 `,
8230 android.FixtureModifyConfig(func(config android.Config) {
8231 delete(config.Targets, android.Android)
8232 config.AndroidCommonTarget = android.Target{}
8233 }),
8234 )
Jooyung Han49f67012020-04-17 13:43:10 +09008235
8236 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8237 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8238 }
8239}
8240
Jiyong Parkbd159612020-02-28 15:22:21 +09008241func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008242 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008243 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008244 apex {
8245 name: "myapex",
8246 key: "myapex.key",
8247 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008248 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008249 }
8250
8251 apex_key {
8252 name: "myapex.key",
8253 public_key: "testkey.avbpubkey",
8254 private_key: "testkey.pem",
8255 }
8256
8257 android_app {
8258 name: "AppFoo",
8259 srcs: ["foo/bar/MyClass.java"],
8260 sdk_version: "none",
8261 system_modules: "none",
8262 apex_available: [ "myapex" ],
8263 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008264 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008265
Jooyung Hana0503a52023-08-23 13:12:50 +09008266 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008267 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008268
8269 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008270 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09008271}
8272
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008273func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008274 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008275 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008276 apex {
8277 name: "myapex",
8278 key: "myapex.key",
8279 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008280 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008281 }
8282
8283 apex_key {
8284 name: "myapex.key",
8285 public_key: "testkey.avbpubkey",
8286 private_key: "testkey.pem",
8287 }
8288
8289 android_app_set {
8290 name: "AppSet",
8291 set: "AppSet.apks",
8292 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008293 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008294 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008295 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008296 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8297 s := mod.Rule("apexRule").Args["copy_commands"]
8298 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008299 if len(copyCmds) != 4 {
8300 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008301 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008302 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8303 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008304 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8305 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008306
8307 // Ensure that canned_fs_config has an entry for the app set zip file
8308 generateFsRule := mod.Rule("generateFsConfig")
8309 cmd := generateFsRule.RuleParams.Command
8310 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008311}
8312
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008313func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008314 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008315 apex_set {
8316 name: "myapex",
8317 filename: "foo_v2.apex",
8318 sanitized: {
8319 none: { set: "myapex.apks", },
8320 hwaddress: { set: "myapex.hwasan.apks", },
8321 },
Paul Duffin24704672021-04-06 16:09:30 +01008322 }
8323 `
8324 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008325
Paul Duffin24704672021-04-06 16:09:30 +01008326 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008327 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008328
Spandan Das9d6e2092024-09-21 02:50:00 +00008329 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008330 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008331
Paul Duffin24704672021-04-06 16:09:30 +01008332 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8333
8334 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008335 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8336 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008337
8338 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008339}
8340
Pranav Guptaeba03b02022-09-27 00:27:08 +00008341func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008342 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008343 ctx := testApex(t, `
8344 apex_set {
8345 name: "myapex",
8346 set: ":myapex_apks_file",
8347 }
8348
8349 filegroup {
8350 name: "myapex_apks_file",
8351 srcs: ["myapex.apks"],
8352 }
8353 `)
8354
Spandan Das9d6e2092024-09-21 02:50:00 +00008355 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008356
8357 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008358 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008359 extractedApex := m.Output(extractorOutput)
8360
8361 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8362}
8363
Paul Duffin89f570a2021-06-16 01:42:33 +01008364func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008365 t.Helper()
8366
Paul Duffin55607122021-03-30 23:32:51 +01008367 fs := android.MockFS{
8368 "a.java": nil,
8369 "a.jar": nil,
8370 "apex_manifest.json": nil,
8371 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008372 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008373 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8374 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8375 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008376 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008377 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008378
Paul Duffin55607122021-03-30 23:32:51 +01008379 errorHandler := android.FixtureExpectsNoErrors
8380 if errmsg != "" {
8381 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008382 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008383
Paul Duffin55607122021-03-30 23:32:51 +01008384 result := android.GroupFixturePreparers(
8385 cc.PrepareForTestWithCcDefaultModules,
8386 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008387 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008388 java.PrepareForTestWithJavaSdkLibraryFiles,
8389 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008390 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008391 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008392 android.FixtureModifyMockFS(func(fs android.MockFS) {
8393 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8394 insert := ""
8395 for _, fragment := range fragments {
8396 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8397 }
8398 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8399 platform_bootclasspath {
8400 name: "platform-bootclasspath",
8401 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008402 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008403 %s
8404 ],
8405 }
8406 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008407 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008408 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008409 // Dexpreopt for boot jars requires the ART boot image profile.
8410 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8411 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008412 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008413 ).
8414 ExtendWithErrorHandler(errorHandler).
8415 RunTestWithBp(t, bp)
8416
8417 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008418}
8419
Jooyung Han548640b2020-04-27 12:10:30 +09008420func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008421 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008422 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8423 apex {
8424 name: "myapex",
8425 key: "myapex.key",
8426 updatable: true,
8427 }
8428
8429 apex_key {
8430 name: "myapex.key",
8431 public_key: "testkey.avbpubkey",
8432 private_key: "testkey.pem",
8433 }
8434 `)
8435}
8436
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008437func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008438 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008439 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8440 apex {
8441 name: "myapex",
8442 key: "myapex.key",
8443 }
8444
8445 apex_key {
8446 name: "myapex.key",
8447 public_key: "testkey.avbpubkey",
8448 private_key: "testkey.pem",
8449 }
8450 `)
8451}
8452
satayevb98371c2021-06-15 16:49:50 +01008453func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008454 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008455 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8456 apex {
8457 name: "myapex",
8458 key: "myapex.key",
8459 systemserverclasspath_fragments: [
8460 "mysystemserverclasspathfragment",
8461 ],
8462 min_sdk_version: "29",
8463 updatable: true,
8464 }
8465
8466 apex_key {
8467 name: "myapex.key",
8468 public_key: "testkey.avbpubkey",
8469 private_key: "testkey.pem",
8470 }
8471
8472 java_library {
8473 name: "foo",
8474 srcs: ["b.java"],
8475 min_sdk_version: "29",
8476 installable: true,
8477 apex_available: [
8478 "myapex",
8479 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008480 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008481 }
8482
8483 systemserverclasspath_fragment {
8484 name: "mysystemserverclasspathfragment",
8485 generate_classpaths_proto: false,
8486 contents: [
8487 "foo",
8488 ],
8489 apex_available: [
8490 "myapex",
8491 ],
8492 }
satayevabcd5972021-08-06 17:49:46 +01008493 `,
8494 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8495 )
satayevb98371c2021-06-15 16:49:50 +01008496}
8497
Paul Duffin064b70c2020-11-02 17:32:38 +00008498func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008499 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008500 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008501 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008502 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008503 fragment := java.ApexVariantReference{
8504 Apex: proptools.StringPtr("myapex"),
8505 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8506 }
8507
Paul Duffin064b70c2020-11-02 17:32:38 +00008508 testDexpreoptWithApexes(t, `
8509 prebuilt_apex {
8510 name: "myapex" ,
8511 arch: {
8512 arm64: {
8513 src: "myapex-arm64.apex",
8514 },
8515 arm: {
8516 src: "myapex-arm.apex",
8517 },
8518 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008519 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8520 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008521
Paul Duffin89f570a2021-06-16 01:42:33 +01008522 prebuilt_bootclasspath_fragment {
8523 name: "my-bootclasspath-fragment",
8524 contents: ["libfoo"],
8525 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008526 hidden_api: {
8527 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8528 metadata: "my-bootclasspath-fragment/metadata.csv",
8529 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008530 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8531 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8532 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008533 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008534 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008535
Spandan Das52c01a12024-09-20 01:09:48 +00008536 java_sdk_library_import {
8537 name: "libfoo",
8538 prefer: true,
8539 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008540 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008541 },
8542 apex_available: ["myapex"],
8543 shared_library: false,
8544 permitted_packages: ["libfoo"],
8545 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008546 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008547 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008548}
8549
Spandan Dasf14e2542021-11-12 00:01:37 +00008550func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008551 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008552 bp += `
8553 apex_key {
8554 name: "myapex.key",
8555 public_key: "testkey.avbpubkey",
8556 private_key: "testkey.pem",
8557 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008558 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008559 "lib1/src/A.java": nil,
8560 "lib2/src/B.java": nil,
8561 "system/sepolicy/apex/myapex-file_contexts": nil,
8562 }
8563
Paul Duffin45338f02021-03-30 23:07:52 +01008564 errorHandler := android.FixtureExpectsNoErrors
8565 if errmsg != "" {
8566 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008567 }
Colin Crossae8600b2020-10-29 17:09:13 -07008568
Paul Duffin45338f02021-03-30 23:07:52 +01008569 android.GroupFixturePreparers(
8570 android.PrepareForTestWithAndroidBuildComponents,
8571 java.PrepareForTestWithJavaBuildComponents,
8572 PrepareForTestWithApexBuildComponents,
8573 android.PrepareForTestWithNeverallowRules(rules),
8574 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008575 apexBootJars := make([]string, 0, len(bootJars))
8576 for _, apexBootJar := range bootJars {
8577 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008578 }
satayevd604b212021-07-21 14:23:52 +01008579 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008580 }),
8581 fs.AddToFixture(),
8582 ).
8583 ExtendWithErrorHandler(errorHandler).
8584 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008585}
8586
8587func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008588 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008589 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008590 name string
8591 expectedError string
8592 bp string
8593 bootJars []string
8594 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008595 }{
8596
8597 {
8598 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8599 expectedError: "",
8600 bp: `
8601 java_library {
8602 name: "bcp_lib1",
8603 srcs: ["lib1/src/*.java"],
8604 permitted_packages: ["foo.bar"],
8605 apex_available: ["myapex"],
8606 sdk_version: "none",
8607 system_modules: "none",
8608 }
8609 java_library {
8610 name: "nonbcp_lib2",
8611 srcs: ["lib2/src/*.java"],
8612 apex_available: ["myapex"],
8613 permitted_packages: ["a.b"],
8614 sdk_version: "none",
8615 system_modules: "none",
8616 }
8617 apex {
8618 name: "myapex",
8619 key: "myapex.key",
8620 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008621 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008622 }`,
8623 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008624 bcpPermittedPackages: map[string][]string{
8625 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008626 "foo.bar",
8627 },
8628 },
8629 },
8630 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008631 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008632 expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01008633 bp: `
8634 java_library {
8635 name: "bcp_lib1",
8636 srcs: ["lib1/src/*.java"],
8637 apex_available: ["myapex"],
8638 permitted_packages: ["foo.bar"],
8639 sdk_version: "none",
8640 system_modules: "none",
8641 }
8642 java_library {
8643 name: "bcp_lib2",
8644 srcs: ["lib2/src/*.java"],
8645 apex_available: ["myapex"],
8646 permitted_packages: ["foo.bar", "bar.baz"],
8647 sdk_version: "none",
8648 system_modules: "none",
8649 }
8650 apex {
8651 name: "myapex",
8652 key: "myapex.key",
8653 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008654 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008655 }
8656 `,
8657 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008658 bcpPermittedPackages: map[string][]string{
8659 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008660 "foo.bar",
8661 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008662 "bcp_lib2": []string{
8663 "foo.bar",
8664 },
8665 },
8666 },
8667 {
8668 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8669 expectedError: "",
8670 bp: `
8671 java_library {
8672 name: "bcp_lib_restricted",
8673 srcs: ["lib1/src/*.java"],
8674 apex_available: ["myapex"],
8675 permitted_packages: ["foo.bar"],
8676 sdk_version: "none",
8677 min_sdk_version: "29",
8678 system_modules: "none",
8679 }
8680 java_library {
8681 name: "bcp_lib_unrestricted",
8682 srcs: ["lib2/src/*.java"],
8683 apex_available: ["myapex"],
8684 permitted_packages: ["foo.bar", "bar.baz"],
8685 sdk_version: "none",
8686 min_sdk_version: "29",
8687 system_modules: "none",
8688 }
8689 apex {
8690 name: "myapex",
8691 key: "myapex.key",
8692 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8693 updatable: true,
8694 min_sdk_version: "29",
8695 }
8696 `,
8697 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8698 bcpPermittedPackages: map[string][]string{
8699 "bcp_lib1_non_updateable": []string{
8700 "foo.bar",
8701 },
8702 // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
Andrei Onea115e7e72020-06-05 21:14:03 +01008703 },
8704 },
8705 }
8706 for _, tc := range testcases {
8707 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008708 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008709 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8710 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008711 })
8712 }
8713}
8714
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008715// TODO(jungjw): Move this to proptools
8716func intPtr(i int) *int {
8717 return &i
8718}
8719
8720func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008721 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008722 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008723 apex_set {
8724 name: "myapex",
8725 set: "myapex.apks",
8726 filename: "foo_v2.apex",
8727 overrides: ["foo"],
8728 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008729 `,
8730 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8731 variables.Platform_sdk_version = intPtr(30)
8732 }),
8733 android.FixtureModifyConfig(func(config android.Config) {
8734 config.Targets[android.Android] = []android.Target{
8735 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8736 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8737 }
8738 }),
8739 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008740
Spandan Das9d6e2092024-09-21 02:50:00 +00008741 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008742
8743 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008744 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008745 actual := extractedApex.Args["abis"]
8746 expected := "ARMEABI_V7A,ARM64_V8A"
8747 if actual != expected {
8748 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8749 }
8750 actual = extractedApex.Args["sdk-version"]
8751 expected = "30"
8752 if actual != expected {
8753 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8754 }
8755
Paul Duffin6717d882021-06-15 19:09:41 +01008756 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008757 a := m.Module().(*ApexSet)
8758 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008759 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008760 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8761 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8762 }
8763}
8764
Anton Hansson805e0a52022-11-25 14:06:46 +00008765func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008766 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008767 ctx := testApex(t, `
8768 apex_set {
8769 name: "myapex",
8770 set: "myapex.apks",
8771 filename: "foo_v2.apex",
8772 overrides: ["foo"],
8773 }
8774 `,
8775 android.FixtureModifyConfig(func(config android.Config) {
8776 config.Targets[android.Android] = []android.Target{
8777 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8778 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8779 }
8780 }),
8781 )
8782
Spandan Das9d6e2092024-09-21 02:50:00 +00008783 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008784
8785 // Check extract_apks tool parameters. No native bridge arch expected
8786 extractedApex := m.Output("extracted/myapex.apks")
8787 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8788}
8789
Jiyong Park7d95a512020-05-10 15:16:24 +09008790func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008791 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008792 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8793 apex {
8794 name: "myapex",
8795 key: "myapex.key",
8796 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008797 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008798 }
8799
8800 apex_key {
8801 name: "myapex.key",
8802 public_key: "testkey.avbpubkey",
8803 private_key: "testkey.pem",
8804 }
8805
8806 cc_library {
8807 name: "mylib",
8808 srcs: ["mylib.cpp"],
8809 static_libs: ["otherlib"],
8810 system_shared_libs: [],
8811 stl: "none",
8812 apex_available: [ "myapex" ],
8813 }
8814
8815 cc_library {
8816 name: "otherlib",
8817 srcs: ["mylib.cpp"],
8818 system_shared_libs: [],
8819 stl: "none",
8820 stubs: {
8821 versions: ["1", "2", "3"],
8822 },
8823 apex_available: [ "myapex" ],
8824 }
8825 `)
8826}
8827
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008828func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008829 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008830 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008831 apex {
8832 name: "myapex",
8833 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008834 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008835 custom_sign_tool: "sign_myapex",
8836 }
8837
8838 apex_key {
8839 name: "myapex.key",
8840 public_key: "testkey.avbpubkey",
8841 private_key: "testkey.pem",
8842 }
8843 `)
8844
Jooyung Han286957d2023-10-30 16:17:56 +09008845 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008846 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008847 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 +09008848}
8849
8850func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008851 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008852 ctx := testApex(t, `
8853 apex {
8854 name: "myapex",
8855 key: "myapex.key",
8856 updatable: false,
8857 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008858 }
8859
8860 apex_key {
8861 name: "myapex.key",
8862 public_key: "testkey.avbpubkey",
8863 private_key: "testkey.pem",
8864 }
8865
8866 prebuilt_apex {
8867 name: "myapex",
8868 prefer: true,
8869 arch: {
8870 arm64: {
8871 src: "myapex-arm64.apex",
8872 },
8873 arm: {
8874 src: "myapex-arm.apex",
8875 },
8876 },
8877 }
8878
8879 apex_set {
8880 name: "myapex_set",
8881 set: "myapex.apks",
8882 filename: "myapex_set.apex",
8883 overrides: ["myapex"],
8884 }
8885 `)
8886
Colin Crossf61d03d2023-11-02 16:56:39 -07008887 content := android.ContentFromFileRuleForTests(t, ctx,
8888 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008889 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 -07008890 content = android.ContentFromFileRuleForTests(t, ctx,
8891 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008892 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 +09008893}
8894
Jooyung Han938b5932020-06-20 12:47:47 +09008895func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008896 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008897 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008898 apex {
8899 name: "myapex",
8900 key: "myapex.key",
8901 apps: ["app"],
8902 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008903 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008904 }
8905
8906 apex_key {
8907 name: "myapex.key",
8908 public_key: "testkey.avbpubkey",
8909 private_key: "testkey.pem",
8910 }
8911
8912 android_app {
8913 name: "app",
8914 srcs: ["foo/bar/MyClass.java"],
8915 package_name: "foo",
8916 sdk_version: "none",
8917 system_modules: "none",
8918 apex_available: [ "myapex" ],
8919 }
8920 `, withFiles(map[string][]byte{
8921 "sub/Android.bp": []byte(`
8922 override_apex {
8923 name: "override_myapex",
8924 base: "myapex",
8925 apps: ["override_app"],
8926 allowed_files: ":allowed",
8927 }
8928 // Overridable "path" property should be referenced indirectly
8929 filegroup {
8930 name: "allowed",
8931 srcs: ["allowed.txt"],
8932 }
8933 override_android_app {
8934 name: "override_app",
8935 base: "app",
8936 package_name: "bar",
8937 }
8938 `),
8939 }))
8940
Jooyung Hana0503a52023-08-23 13:12:50 +09008941 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008942 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8943 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8944 }
8945
Spandan Das50801e22024-05-13 18:29:45 +00008946 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008947 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8948 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8949 }
8950}
8951
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008952func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008953 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008954 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008955 apex {
8956 name: "myapex",
8957 key: "myapex.key",
8958 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008959 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008960 }
8961
8962 apex_key {
8963 name: "myapex.key",
8964 public_key: "testkey.avbpubkey",
8965 private_key: "testkey.pem",
8966 }
8967
8968 cc_library {
8969 name: "mylib",
8970 srcs: ["mylib.cpp"],
8971 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008972 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008973 },
8974 apex_available: ["myapex"],
8975 }
8976
8977 cc_prebuilt_library_shared {
8978 name: "mylib",
8979 prefer: false,
8980 srcs: ["prebuilt.so"],
8981 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008982 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008983 },
8984 apex_available: ["myapex"],
8985 }
8986 `)
8987}
8988
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008989func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008990 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008991 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008992 apex {
8993 name: "myapex",
8994 key: "myapex.key",
8995 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008996 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008997 }
8998 apex_key {
8999 name: "myapex.key",
9000 public_key: "testkey.avbpubkey",
9001 private_key: "testkey.pem",
9002 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009003 `,
9004 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9005 variables.CompressedApex = proptools.BoolPtr(true)
9006 }),
9007 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009008
Jooyung Hana0503a52023-08-23 13:12:50 +09009009 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009010 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9011
Jooyung Hana0503a52023-08-23 13:12:50 +09009012 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009013 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9014
9015 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009016 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009017 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9018
9019 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009020 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009021 var builder strings.Builder
9022 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9023 androidMk := builder.String()
9024 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9025}
9026
Jooyung Han26ec8482024-07-31 15:04:05 +09009027func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009028 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009029 for _, compressionEnabled := range []bool{true, false} {
9030 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009031 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009032 ctx := testApex(t, `
9033 apex_set {
9034 name: "com.company.android.myapex",
9035 apex_name: "com.android.myapex",
9036 set: "company-myapex.apks",
9037 }
9038 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9039 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9040 }),
9041 )
9042
9043 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9044 if compressionEnabled {
9045 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9046 } else {
9047 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9048 }
9049 })
9050 }
9051}
9052
Martin Stjernholm2856c662020-12-02 15:03:42 +00009053func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009054 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009055 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009056 apex {
9057 name: "myapex",
9058 key: "myapex.key",
9059 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009060 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009061 }
9062
9063 apex_key {
9064 name: "myapex.key",
9065 public_key: "testkey.avbpubkey",
9066 private_key: "testkey.pem",
9067 }
9068
9069 cc_library {
9070 name: "mylib",
9071 srcs: ["mylib.cpp"],
9072 apex_available: ["myapex"],
9073 shared_libs: ["otherlib"],
9074 system_shared_libs: [],
9075 }
9076
9077 cc_library {
9078 name: "otherlib",
9079 srcs: ["mylib.cpp"],
9080 stubs: {
9081 versions: ["current"],
9082 },
9083 }
9084
9085 cc_prebuilt_library_shared {
9086 name: "otherlib",
9087 prefer: true,
9088 srcs: ["prebuilt.so"],
9089 stubs: {
9090 versions: ["current"],
9091 },
9092 }
9093 `)
9094
Jooyung Hana0503a52023-08-23 13:12:50 +09009095 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009096 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009097 var builder strings.Builder
9098 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9099 androidMk := builder.String()
9100
9101 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9102 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009103 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009104}
9105
Jiyong Parke3867542020-12-03 17:28:25 +09009106func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009107 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009108 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009109 apex {
9110 name: "myapex",
9111 key: "myapex.key",
9112 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009113 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009114 }
9115
9116 apex_key {
9117 name: "myapex.key",
9118 public_key: "testkey.avbpubkey",
9119 private_key: "testkey.pem",
9120 }
9121
9122 cc_library {
9123 name: "mylib",
9124 srcs: ["mylib.cpp"],
9125 system_shared_libs: [],
9126 stl: "none",
9127 apex_available: ["myapex"],
9128 shared_libs: ["mylib2"],
9129 target: {
9130 apex: {
9131 exclude_shared_libs: ["mylib2"],
9132 },
9133 },
9134 }
9135
9136 cc_library {
9137 name: "mylib2",
9138 srcs: ["mylib.cpp"],
9139 system_shared_libs: [],
9140 stl: "none",
9141 }
9142 `)
9143
9144 // Check if mylib is linked to mylib2 for the non-apex target
9145 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9146 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9147
9148 // Make sure that the link doesn't occur for the apex target
9149 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9150 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9151
9152 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009153 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9155}
9156
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009157func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009158 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009159 bpBase := `
9160 apex {
9161 name: "myapex",
9162 key: "myapex.key",
9163 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009164 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009165 }
9166 apex_key {
9167 name: "myapex.key",
9168 public_key: "testkey.avbpubkey",
9169 private_key: "testkey.pem",
9170 }
9171 cc_library {
9172 name: "mylib",
9173 srcs: ["mylib.cpp"],
9174 apex_available: ["myapex"],
9175 shared_libs: ["stublib"],
9176 system_shared_libs: [],
9177 }
9178 apex {
9179 name: "otherapex",
9180 enabled: %s,
9181 key: "myapex.key",
9182 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009183 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009184 }
9185 `
9186
9187 stublibSourceBp := `
9188 cc_library {
9189 name: "stublib",
9190 srcs: ["mylib.cpp"],
9191 apex_available: ["otherapex"],
9192 system_shared_libs: [],
9193 stl: "none",
9194 stubs: {
9195 versions: ["1"],
9196 },
9197 }
9198 `
9199
9200 stublibPrebuiltBp := `
9201 cc_prebuilt_library_shared {
9202 name: "stublib",
9203 srcs: ["prebuilt.so"],
9204 apex_available: ["otherapex"],
9205 stubs: {
9206 versions: ["1"],
9207 },
9208 %s
9209 }
9210 `
9211
9212 tests := []struct {
9213 name string
9214 stublibBp string
9215 usePrebuilt bool
9216 modNames []string // Modules to collect AndroidMkEntries for
9217 otherApexEnabled []string
9218 }{
9219 {
9220 name: "only_source",
9221 stublibBp: stublibSourceBp,
9222 usePrebuilt: false,
9223 modNames: []string{"stublib"},
9224 otherApexEnabled: []string{"true", "false"},
9225 },
9226 {
9227 name: "source_preferred",
9228 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9229 usePrebuilt: false,
9230 modNames: []string{"stublib", "prebuilt_stublib"},
9231 otherApexEnabled: []string{"true", "false"},
9232 },
9233 {
9234 name: "prebuilt_preferred",
9235 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9236 usePrebuilt: true,
9237 modNames: []string{"stublib", "prebuilt_stublib"},
9238 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9239 },
9240 {
9241 name: "only_prebuilt",
9242 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9243 usePrebuilt: true,
9244 modNames: []string{"stublib"},
9245 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9246 },
9247 }
9248
9249 for _, test := range tests {
9250 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009251 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009252 for _, otherApexEnabled := range test.otherApexEnabled {
9253 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009254 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009255 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009256
9257 type modAndMkEntries struct {
9258 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009259 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009260 }
9261 entries := []*modAndMkEntries{}
9262
9263 // Gather shared lib modules that are installable
9264 for _, modName := range test.modNames {
9265 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9266 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9267 continue
9268 }
9269 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009270 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009271 continue
9272 }
Yu Liue70976d2024-10-15 20:45:35 +00009273 info := android.AndroidMkInfoForTest(t, ctx, mod)
9274 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9275 ents = append(ents, info.ExtraInfo...)
9276 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009277 if ent.Disabled {
9278 continue
9279 }
9280 entries = append(entries, &modAndMkEntries{
9281 mod: mod,
9282 mkEntries: ent,
9283 })
9284 }
9285 }
9286 }
9287
9288 var entry *modAndMkEntries = nil
9289 for _, ent := range entries {
9290 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9291 if entry != nil {
9292 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9293 } else {
9294 entry = ent
9295 }
9296 }
9297 }
9298
9299 if entry == nil {
9300 t.Errorf("AndroidMk entry for \"stublib\" missing")
9301 } else {
9302 isPrebuilt := entry.mod.Prebuilt() != nil
9303 if isPrebuilt != test.usePrebuilt {
9304 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9305 }
9306 if !entry.mod.IsStubs() {
9307 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9308 }
9309 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9310 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9311 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009312 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009313 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009314 if !android.InList(expected, cflags) {
9315 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9316 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009317 }
9318 })
9319 }
9320 })
9321 }
9322}
9323
Colin Crossc33e5212021-05-25 18:16:02 -07009324func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009325 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009326 bp := `
9327 apex {
9328 name: "myapex",
9329 key: "myapex.key",
9330 java_libs: ["mylib"],
9331 bootclasspath_fragments: ["mybootclasspathfragment"],
9332 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9333 updatable: false,
9334 }
9335
9336 apex_key {
9337 name: "myapex.key",
9338 public_key: "testkey.avbpubkey",
9339 private_key: "testkey.pem",
9340 }
9341
9342 java_library {
9343 name: "mylib",
9344 srcs: ["mylib.java"],
9345 apex_available: ["myapex"],
9346 compile_dex: true,
9347 }
9348
9349 bootclasspath_fragment {
9350 name: "mybootclasspathfragment",
9351 contents: ["mybootclasspathlib"],
9352 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009353 hidden_api: {
9354 split_packages: ["*"],
9355 },
Colin Crossc33e5212021-05-25 18:16:02 -07009356 }
9357
9358 java_library {
9359 name: "mybootclasspathlib",
9360 srcs: ["mybootclasspathlib.java"],
9361 apex_available: ["myapex"],
9362 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009363 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009364 }
9365
9366 systemserverclasspath_fragment {
9367 name: "mysystemserverclasspathfragment",
9368 contents: ["mysystemserverclasspathlib"],
9369 apex_available: ["myapex"],
9370 }
9371
9372 java_library {
9373 name: "mysystemserverclasspathlib",
9374 srcs: ["mysystemserverclasspathlib.java"],
9375 apex_available: ["myapex"],
9376 compile_dex: true,
9377 }
9378 `
9379
9380 result := android.GroupFixturePreparers(
9381 PrepareForTestWithApexBuildComponents,
9382 prepareForTestWithMyapex,
9383 java.PrepareForTestWithJavaDefaultModules,
9384 android.PrepareForTestWithAndroidBuildComponents,
9385 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009386 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9387 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009388 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009389 ).RunTest(t)
9390
9391 // Make sure jacoco ran on both mylib and mybootclasspathlib
9392 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9393 t.Errorf("Failed to find jacoco rule for mylib")
9394 }
9395 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9396 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9397 }
9398 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9399 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9400 }
9401}
9402
Jiyong Park192600a2021-08-03 07:52:17 +00009403func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009404 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009405 testApexError(t, `executable mybin is static`, `
9406 apex {
9407 name: "myapex",
9408 key: "myapex.key",
9409 binaries: ["mybin"],
9410 min_sdk_version: "29",
9411 }
9412
9413 apex_key {
9414 name: "myapex.key",
9415 public_key: "testkey.avbpubkey",
9416 private_key: "testkey.pem",
9417 }
9418
9419 cc_binary {
9420 name: "mybin",
9421 srcs: ["mylib.cpp"],
9422 relative_install_path: "foo/bar",
9423 static_executable: true,
9424 system_shared_libs: [],
9425 stl: "none",
9426 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009427 min_sdk_version: "29",
9428 }
9429 `)
9430
9431 testApexError(t, `executable mybin.rust is static`, `
9432 apex {
9433 name: "myapex",
9434 key: "myapex.key",
9435 binaries: ["mybin.rust"],
9436 min_sdk_version: "29",
9437 }
9438
9439 apex_key {
9440 name: "myapex.key",
9441 public_key: "testkey.avbpubkey",
9442 private_key: "testkey.pem",
9443 }
9444
9445 rust_binary {
9446 name: "mybin.rust",
9447 srcs: ["foo.rs"],
9448 static_executable: true,
9449 apex_available: ["myapex"],
9450 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009451 }
9452 `)
9453}
9454
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009455func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009456 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009457 ctx := testApex(t, `
9458 apex {
9459 name: "myapex",
9460 key: "myapex.key",
9461 updatable: false,
9462 java_libs: ["foo"],
9463 }
9464
9465 apex_key {
9466 name: "myapex.key",
9467 public_key: "testkey.avbpubkey",
9468 private_key: "testkey.pem",
9469 }
9470
9471 java_library {
9472 name: "foo",
9473 srcs: ["foo.java"],
9474 apex_available: ["myapex"],
9475 installable: true,
9476 }
9477 `,
9478 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9479 )
9480
Jooyung Hana0503a52023-08-23 13:12:50 +09009481 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009482 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9483 var builder strings.Builder
9484 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9485 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009486 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 +00009487}
9488
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009489func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009490 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009491 ctx := testApex(t, `
9492 apex {
9493 name: "myapex",
9494 key: "myapex.key",
9495 updatable: false,
9496 java_libs: ["foo"],
9497 required: ["otherapex"],
9498 }
9499
9500 apex {
9501 name: "otherapex",
9502 key: "myapex.key",
9503 updatable: false,
9504 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009505 }
9506
9507 apex_key {
9508 name: "myapex.key",
9509 public_key: "testkey.avbpubkey",
9510 private_key: "testkey.pem",
9511 }
9512
9513 java_library {
9514 name: "foo",
9515 srcs: ["foo.java"],
9516 apex_available: ["myapex", "otherapex"],
9517 installable: true,
9518 }
9519 `)
9520
Jooyung Hana0503a52023-08-23 13:12:50 +09009521 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009522 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9523 var builder strings.Builder
9524 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9525 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009526 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009527}
9528
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009529func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009530 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009531 ctx := testApex(t, `
9532 apex {
9533 name: "myapex",
9534 key: "myapex.key",
9535 updatable: false,
9536 }
9537
9538 apex_key {
9539 name: "myapex.key",
9540 public_key: "testkey.avbpubkey",
9541 private_key: "testkey.pem",
9542 }
9543 `)
9544
Jooyung Hana0503a52023-08-23 13:12:50 +09009545 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009546 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009547 data := android.AndroidMkDataForTest(t, ctx, bundle)
9548 var builder strings.Builder
9549 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9550 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009551 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009552}
9553
Jooyung Hana6d36672022-02-24 13:58:07 +09009554func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009555 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009556 for _, tc := range []struct {
9557 name string
9558 ref string
9559 expected_data []string
9560 }{
9561 {
9562 name: "test_using_output",
9563 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009564 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009565 },
9566 {
9567 name: "test_using_apex",
9568 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009569 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009570 },
9571 } {
9572 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009573 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009574 ctx := testApex(t, `
9575 apex {
9576 name: "myapex",
9577 key: "myapex.key",
9578 compressible: true,
9579 updatable: false,
9580 }
9581
9582 apex_key {
9583 name: "myapex.key",
9584 public_key: "testkey.avbpubkey",
9585 private_key: "testkey.pem",
9586 }
9587
9588 java_test {
9589 name: "`+tc.name+`",
9590 srcs: ["a.java"],
9591 data: ["`+tc.ref+`"],
9592 }
9593 `,
9594 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9595 variables.CompressedApex = proptools.BoolPtr(true)
9596 }))
9597 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9598 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9599 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9600 })
9601 }
9602}
9603
satayev758968a2021-12-06 11:42:40 +00009604func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009605 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009606 preparer := android.GroupFixturePreparers(
9607 PrepareForTestWithApexBuildComponents,
9608 prepareForTestWithMyapex,
9609 java.PrepareForTestWithJavaSdkLibraryFiles,
9610 java.PrepareForTestWithJavaDefaultModules,
9611 android.PrepareForTestWithAndroidBuildComponents,
9612 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9613 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9614 )
9615
9616 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9617 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009618 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009619 preparer.RunTestWithBp(t, `
9620 apex {
9621 name: "myapex",
9622 key: "myapex.key",
9623 bootclasspath_fragments: ["mybootclasspathfragment"],
9624 min_sdk_version: "30",
9625 updatable: false,
9626 }
9627
9628 apex_key {
9629 name: "myapex.key",
9630 public_key: "testkey.avbpubkey",
9631 private_key: "testkey.pem",
9632 }
9633
9634 bootclasspath_fragment {
9635 name: "mybootclasspathfragment",
9636 contents: ["mybootclasspathlib"],
9637 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009638 hidden_api: {
9639 split_packages: ["*"],
9640 },
satayev758968a2021-12-06 11:42:40 +00009641 }
9642
9643 java_sdk_library {
9644 name: "mybootclasspathlib",
9645 srcs: ["mybootclasspathlib.java"],
9646 apex_available: ["myapex"],
9647 compile_dex: true,
9648 unsafe_ignore_missing_latest_api: true,
9649 min_sdk_version: "31",
9650 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009651 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009652 }
9653
9654 java_library {
9655 name: "util",
9656 srcs: ["a.java"],
9657 apex_available: ["myapex"],
9658 min_sdk_version: "31",
9659 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009660 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009661 }
9662
9663 java_library {
9664 name: "another_util",
9665 srcs: ["a.java"],
9666 min_sdk_version: "31",
9667 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009668 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009669 }
9670 `)
9671 })
9672
9673 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9674 t.Run("systemserverclasspath_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 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
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 systemserverclasspath_fragment {
9692 name: "mysystemserverclasspathfragment",
9693 contents: ["mysystemserverclasspathlib"],
9694 apex_available: ["myapex"],
9695 }
9696
9697 java_sdk_library {
9698 name: "mysystemserverclasspathlib",
9699 srcs: ["mysystemserverclasspathlib.java"],
9700 apex_available: ["myapex"],
9701 compile_dex: true,
9702 min_sdk_version: "32",
9703 unsafe_ignore_missing_latest_api: true,
9704 static_libs: ["util"],
9705 }
9706
9707 java_library {
9708 name: "util",
9709 srcs: ["a.java"],
9710 apex_available: ["myapex"],
9711 min_sdk_version: "31",
9712 static_libs: ["another_util"],
9713 }
9714
9715 java_library {
9716 name: "another_util",
9717 srcs: ["a.java"],
9718 min_sdk_version: "31",
9719 apex_available: ["myapex"],
9720 }
9721 `)
9722 })
9723
9724 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009725 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009726 preparer.
satayev758968a2021-12-06 11:42:40 +00009727 RunTestWithBp(t, `
9728 apex {
9729 name: "myapex",
9730 key: "myapex.key",
9731 bootclasspath_fragments: ["mybootclasspathfragment"],
9732 min_sdk_version: "30",
9733 updatable: false,
9734 }
9735
9736 apex_key {
9737 name: "myapex.key",
9738 public_key: "testkey.avbpubkey",
9739 private_key: "testkey.pem",
9740 }
9741
9742 bootclasspath_fragment {
9743 name: "mybootclasspathfragment",
9744 contents: ["mybootclasspathlib"],
9745 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009746 hidden_api: {
9747 split_packages: ["*"],
9748 },
satayev758968a2021-12-06 11:42:40 +00009749 }
9750
9751 java_sdk_library {
9752 name: "mybootclasspathlib",
9753 srcs: ["mybootclasspathlib.java"],
9754 apex_available: ["myapex"],
9755 compile_dex: true,
9756 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009757 sdk_version: "current",
9758 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009759 }
9760 `)
9761 })
9762
9763 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009764 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009765 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9766 RunTestWithBp(t, `
9767 apex {
9768 name: "myapex",
9769 key: "myapex.key",
9770 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9771 min_sdk_version: "30",
9772 updatable: false,
9773 }
9774
9775 apex_key {
9776 name: "myapex.key",
9777 public_key: "testkey.avbpubkey",
9778 private_key: "testkey.pem",
9779 }
9780
9781 systemserverclasspath_fragment {
9782 name: "mysystemserverclasspathfragment",
9783 contents: ["mysystemserverclasspathlib"],
9784 apex_available: ["myapex"],
9785 }
9786
9787 java_sdk_library {
9788 name: "mysystemserverclasspathlib",
9789 srcs: ["mysystemserverclasspathlib.java"],
9790 apex_available: ["myapex"],
9791 compile_dex: true,
9792 unsafe_ignore_missing_latest_api: true,
9793 }
9794 `)
9795 })
9796}
9797
Jiakai Zhang6decef92022-01-12 17:56:19 +00009798// Verifies that the APEX depends on all the Make modules in the list.
9799func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9800 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9801 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009802 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009803 }
9804}
9805
9806// Verifies that the APEX does not depend on any of the Make modules in the list.
9807func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9808 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9809 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009810 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009811 }
9812}
9813
Cole Faust24e25c02024-01-19 14:12:17 -08009814func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009815 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009816 bpTemplate := `
9817 apex {
9818 name: "myapex",
9819 key: "myapex.key",
9820 java_libs: ["myjavalib"],
9821 updatable: %v,
9822 min_sdk_version: "29",
9823 }
9824 apex_key {
9825 name: "myapex.key",
9826 }
9827 java_library {
9828 name: "myjavalib",
9829 srcs: ["MyClass.java"],
9830 apex_available: [ "myapex" ],
9831 lint: {
9832 strict_updatability_linting: %v,
9833 %s
9834 },
9835 sdk_version: "current",
9836 min_sdk_version: "29",
9837 }
9838 `
9839 fs := android.MockFS{
9840 "lint-baseline.xml": nil,
9841 }
9842
9843 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009844 testCaseName string
9845 apexUpdatable bool
9846 javaStrictUpdtabilityLint bool
9847 lintFileExists bool
9848 disallowedFlagExpectedOnApex bool
9849 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009850 }{
9851 {
Colin Cross87427352024-09-25 15:41:19 -07009852 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9853 apexUpdatable: true,
9854 javaStrictUpdtabilityLint: true,
9855 lintFileExists: false,
9856 disallowedFlagExpectedOnApex: false,
9857 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009858 },
9859 {
Colin Cross87427352024-09-25 15:41:19 -07009860 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9861 apexUpdatable: false,
9862 javaStrictUpdtabilityLint: false,
9863 lintFileExists: true,
9864 disallowedFlagExpectedOnApex: false,
9865 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009866 },
9867 {
Colin Cross87427352024-09-25 15:41:19 -07009868 testCaseName: "non-updatable apex respects strict updatability of javalib",
9869 apexUpdatable: false,
9870 javaStrictUpdtabilityLint: true,
9871 lintFileExists: true,
9872 disallowedFlagExpectedOnApex: false,
9873 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009874 },
9875 {
Colin Cross87427352024-09-25 15:41:19 -07009876 testCaseName: "updatable apex checks strict updatability of javalib",
9877 apexUpdatable: true,
9878 javaStrictUpdtabilityLint: false,
9879 lintFileExists: true,
9880 disallowedFlagExpectedOnApex: true,
9881 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009882 },
9883 }
9884
9885 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009886 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009887 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009888 fixtures := []android.FixturePreparer{}
9889 baselineProperty := ""
9890 if testCase.lintFileExists {
9891 fixtures = append(fixtures, fs.AddToFixture())
9892 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9893 }
9894 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009895
Colin Cross87427352024-09-25 15:41:19 -07009896 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009897
Colin Cross87427352024-09-25 15:41:19 -07009898 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9899 if expectStrictUpdatability {
9900 if m.Rule == nil {
9901 t.Errorf("expected strict updatability check rule on %s", name)
9902 } else {
9903 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9904 m.RuleParams.Command, "--disallowed_issues NewApi")
9905 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9906 m.Inputs.Strings(), "lint-baseline.xml")
9907 }
9908 } else {
9909 if m.Rule != nil {
9910 t.Errorf("expected no strict updatability check rule on %s", name)
9911 }
9912 }
9913 }
9914
9915 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9916 apex := result.ModuleForTests("myapex", "android_common_myapex")
9917 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9918 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9919
9920 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9921 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9922 })
Cole Faust24e25c02024-01-19 14:12:17 -08009923 }
9924}
9925
Cole Faust24e25c02024-01-19 14:12:17 -08009926// checks transtive deps of an apex coming from bootclasspath_fragment
9927func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009928 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009929 bp := `
9930 apex {
9931 name: "myapex",
9932 key: "myapex.key",
9933 bootclasspath_fragments: ["mybootclasspathfragment"],
9934 updatable: true,
9935 min_sdk_version: "29",
9936 }
9937 apex_key {
9938 name: "myapex.key",
9939 }
9940 bootclasspath_fragment {
9941 name: "mybootclasspathfragment",
9942 contents: ["myjavalib"],
9943 apex_available: ["myapex"],
9944 hidden_api: {
9945 split_packages: ["*"],
9946 },
9947 }
9948 java_library {
9949 name: "myjavalib",
9950 srcs: ["MyClass.java"],
9951 apex_available: [ "myapex" ],
9952 sdk_version: "current",
9953 min_sdk_version: "29",
9954 compile_dex: true,
9955 lint: {
9956 baseline_filename: "lint-baseline.xml",
9957 }
9958 }
9959 `
9960 fs := android.MockFS{
9961 "lint-baseline.xml": nil,
9962 }
9963
9964 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -07009965 apex := result.ModuleForTests("myapex", "android_common_myapex")
9966 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
9967 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
9968 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
9969 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
9970 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -08009971}
Spandan Das66773252022-01-15 00:23:18 +00009972
Jihoon Kang784c0052024-06-25 22:15:39 +00009973func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009974 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +00009975 bp := `
9976 apex {
9977 name: "myapex",
9978 key: "myapex.key",
9979 bootclasspath_fragments: ["mybootclasspathfragment"],
9980 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009981 java_libs: [
9982 "jacocoagent",
9983 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009984 }
9985 apex_key {
9986 name: "myapex.key",
9987 }
9988 bootclasspath_fragment {
9989 name: "mybootclasspathfragment",
9990 contents: ["foo"],
9991 apex_available: ["myapex"],
9992 hidden_api: {
9993 split_packages: ["*"],
9994 },
9995 }
9996 java_sdk_library {
9997 name: "foo",
9998 srcs: ["MyClass.java"],
9999 apex_available: [ "myapex" ],
10000 sdk_version: "current",
10001 min_sdk_version: "29",
10002 compile_dex: true,
10003 }
10004 `
10005 fs := android.MockFS{
10006 "lint-baseline.xml": nil,
10007 }
10008
10009 result := android.GroupFixturePreparers(
10010 prepareForApexTest,
10011 java.PrepareForTestWithJavaSdkLibraryFiles,
10012 java.PrepareForTestWithJacocoInstrumentation,
10013 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010014 android.FixtureMergeMockFs(fs),
10015 ).RunTestWithBp(t, bp)
10016
10017 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10018 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10019 android.AssertStringDoesContain(t,
10020 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10021 lintReportInputs, "foo.impl")
10022}
10023
Spandan Das42e89502022-05-06 22:12:55 +000010024// updatable apexes should propagate updatable=true to its apps
10025func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010026 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010027 bp := `
10028 apex {
10029 name: "myapex",
10030 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010031 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010032 apps: [
10033 "myapp",
10034 ],
10035 min_sdk_version: "30",
10036 }
10037 apex_key {
10038 name: "myapex.key",
10039 }
10040 android_app {
10041 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010042 apex_available: [
10043 "myapex",
10044 ],
10045 sdk_version: "current",
10046 min_sdk_version: "30",
10047 }
10048 `
Colin Cross99939e92024-10-01 16:02:46 -070010049 _ = android.GroupFixturePreparers(
10050 prepareForApexTest,
10051 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10052 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010053}
10054
Jingwen Chendea7a642023-03-28 11:30:50 +000010055func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010056 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010057 ctx := testApex(t, `
10058 apex {
10059 name: "myapex",
10060 key: "myapex.key",
10061 updatable: false,
10062 }
10063
10064 apex_key {
10065 name: "myapex.key",
10066 public_key: "testkey.avbpubkey",
10067 private_key: "testkey.pem",
10068 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010069 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010070 generateFsRule := mod.Rule("generateFsConfig")
10071 cmd := generateFsRule.RuleParams.Command
10072
10073 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10074}
10075
10076func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010077 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010078 ctx := testApex(t, `
10079 apex {
10080 name: "myapex",
10081 key: "myapex.key",
10082 canned_fs_config: "my_config",
10083 updatable: false,
10084 }
10085
10086 apex_key {
10087 name: "myapex.key",
10088 public_key: "testkey.avbpubkey",
10089 private_key: "testkey.pem",
10090 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010091 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010092 generateFsRule := mod.Rule("generateFsConfig")
10093 cmd := generateFsRule.RuleParams.Command
10094
10095 // Ensure that canned_fs_config has "cat my_config" at the end
10096 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10097}
Spandan Das20fce2d2023-04-12 17:21:39 +000010098
10099func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010100 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010101 testCases := []struct {
10102 desc string
10103 hasStubs bool
10104 apexAvailable string
10105 expectedError string
10106 }{
10107 {
10108 desc: "non-stub library can have multiple apex_available",
10109 hasStubs: false,
10110 apexAvailable: `["myapex", "otherapex"]`,
10111 },
10112 {
10113 desc: "stub library should not be available to anyapex",
10114 hasStubs: true,
10115 apexAvailable: `["//apex_available:anyapex"]`,
10116 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10117 },
10118 {
10119 desc: "stub library should not be available to multiple apexes",
10120 hasStubs: true,
10121 apexAvailable: `["myapex", "otherapex"]`,
10122 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10123 },
10124 {
10125 desc: "stub library can be available to a core apex and a test apex",
10126 hasStubs: true,
10127 apexAvailable: `["myapex", "test_myapex"]`,
10128 },
10129 }
10130 bpTemplate := `
10131 cc_library {
10132 name: "libfoo",
10133 %v
10134 apex_available: %v,
10135 }
10136 apex {
10137 name: "myapex",
10138 key: "apex.key",
10139 updatable: false,
10140 native_shared_libs: ["libfoo"],
10141 }
10142 apex {
10143 name: "otherapex",
10144 key: "apex.key",
10145 updatable: false,
10146 }
10147 apex_test {
10148 name: "test_myapex",
10149 key: "apex.key",
10150 updatable: false,
10151 native_shared_libs: ["libfoo"],
10152 }
10153 apex_key {
10154 name: "apex.key",
10155 }
10156 `
10157 for _, tc := range testCases {
10158 stubs := ""
10159 if tc.hasStubs {
10160 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10161 }
10162 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10163 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10164 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10165 })
10166 if tc.expectedError == "" {
10167 testApex(t, bp, mockFsFixturePreparer)
10168 } else {
10169 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10170 }
10171 }
10172}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010173
10174func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010175 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010176 context := android.GroupFixturePreparers(
10177 android.PrepareForIntegrationTestWithAndroid,
10178 cc.PrepareForIntegrationTestWithCc,
10179 PrepareForTestWithApexBuildComponents,
10180 prepareForTestWithMyapex,
10181 filesystem.PrepareForTestWithFilesystemBuildComponents,
10182 )
10183 result := context.RunTestWithBp(t, `
10184 android_system_image {
10185 name: "myfilesystem",
10186 deps: [
10187 "libfoo",
10188 ],
10189 linker_config_src: "linker.config.json",
10190 }
10191
10192 cc_library {
10193 name: "libfoo",
10194 shared_libs: [
10195 "libbar",
10196 ],
10197 stl: "none",
10198 }
10199
10200 cc_library {
10201 name: "libbar",
10202 stl: "none",
10203 apex_available: ["myapex"],
10204 }
10205
10206 apex {
10207 name: "myapex",
10208 native_shared_libs: ["libbar"],
10209 key: "myapex.key",
10210 updatable: false,
10211 }
10212
10213 apex_key {
10214 name: "myapex.key",
10215 public_key: "testkey.avbpubkey",
10216 private_key: "testkey.pem",
10217 }
10218 `)
10219
Cole Faust3b806d32024-03-11 15:15:03 -070010220 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010221 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10222 inputs.Strings(),
10223 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10224}
Yu Liueae7b362023-11-16 17:05:47 -080010225
10226var apex_default_bp = `
10227 apex_key {
10228 name: "myapex.key",
10229 public_key: "testkey.avbpubkey",
10230 private_key: "testkey.pem",
10231 }
10232
10233 filegroup {
10234 name: "myapex.manifest",
10235 srcs: ["apex_manifest.json"],
10236 }
10237
10238 filegroup {
10239 name: "myapex.androidmanifest",
10240 srcs: ["AndroidManifest.xml"],
10241 }
10242`
10243
10244func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010245 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010246 ctx := testApex(t, apex_default_bp+`
10247 apex {
10248 name: "myapex",
10249 manifest: ":myapex.manifest",
10250 androidManifest: ":myapex.androidmanifest",
10251 key: "myapex.key",
10252 java_libs: [
10253 "my_java_library_foo",
10254 "my_java_library_bar",
10255 ],
10256 updatable: false,
10257 }
10258
10259 java_library {
10260 name: "my_java_library_foo",
10261 srcs: ["foo/bar/MyClass.java"],
10262 sdk_version: "none",
10263 system_modules: "none",
10264 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010265 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010266 "myapex",
10267 ],
10268 }
10269
10270 java_library {
10271 name: "my_java_library_bar",
10272 srcs: ["foo/bar/MyClass.java"],
10273 sdk_version: "none",
10274 system_modules: "none",
10275 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010276 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010277 "myapex",
10278 ],
10279 }
10280
10281 aconfig_declarations {
10282 name: "my_aconfig_declarations_foo",
10283 package: "com.example.package",
10284 container: "myapex",
10285 srcs: ["foo.aconfig"],
10286 }
10287
10288 java_aconfig_library {
10289 name: "my_java_aconfig_library_foo",
10290 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010291 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010292 "myapex",
10293 ],
10294 }
10295
10296 aconfig_declarations {
10297 name: "my_aconfig_declarations_bar",
10298 package: "com.example.package",
10299 container: "myapex",
10300 srcs: ["bar.aconfig"],
10301 }
10302
10303 java_aconfig_library {
10304 name: "my_java_aconfig_library_bar",
10305 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010306 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010307 "myapex",
10308 ],
10309 }
10310 `)
10311
10312 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10313 s := mod.Rule("apexRule").Args["copy_commands"]
10314 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010315 if len(copyCmds) != 14 {
10316 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010317 }
10318
Jooyung Hana3fddf42024-09-03 13:22:21 +090010319 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10320 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10321 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10322 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010323 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010324
Yu Liubba555e2024-02-17 00:36:42 +000010325 inputs := []string{
10326 "my_aconfig_declarations_foo/intermediate.pb",
10327 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010328 }
Yu Liubba555e2024-02-17 00:36:42 +000010329 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10330 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10331 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10332 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010333 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010334}
10335
10336func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010337 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010338 ctx := testApex(t, apex_default_bp+`
10339 apex {
10340 name: "myapex",
10341 manifest: ":myapex.manifest",
10342 androidManifest: ":myapex.androidmanifest",
10343 key: "myapex.key",
10344 java_libs: [
10345 "my_java_library_foo",
10346 ],
10347 native_shared_libs: [
10348 "my_cc_library_bar",
10349 ],
10350 binaries: [
10351 "my_cc_binary_baz",
10352 ],
10353 updatable: false,
10354 }
10355
10356 java_library {
10357 name: "my_java_library_foo",
10358 srcs: ["foo/bar/MyClass.java"],
10359 sdk_version: "none",
10360 system_modules: "none",
10361 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010362 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010363 "myapex",
10364 ],
10365 }
10366
10367 cc_library {
10368 name: "my_cc_library_bar",
10369 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010370 static_libs: [
10371 "my_cc_aconfig_library_bar",
10372 "my_cc_aconfig_library_baz",
10373 ],
Yu Liueae7b362023-11-16 17:05:47 -080010374 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010375 "myapex",
10376 ],
10377 }
10378
10379 cc_binary {
10380 name: "my_cc_binary_baz",
10381 srcs: ["foo/bar/MyClass.cc"],
10382 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010383 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010384 "myapex",
10385 ],
10386 }
10387
10388 aconfig_declarations {
10389 name: "my_aconfig_declarations_foo",
10390 package: "com.example.package",
10391 container: "myapex",
10392 srcs: ["foo.aconfig"],
10393 }
10394
10395 java_aconfig_library {
10396 name: "my_java_aconfig_library_foo",
10397 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010398 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010399 "myapex",
10400 ],
10401 }
10402
10403 aconfig_declarations {
10404 name: "my_aconfig_declarations_bar",
10405 package: "com.example.package",
10406 container: "myapex",
10407 srcs: ["bar.aconfig"],
10408 }
10409
10410 cc_aconfig_library {
10411 name: "my_cc_aconfig_library_bar",
10412 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010413 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010414 "myapex",
10415 ],
10416 }
10417
10418 aconfig_declarations {
10419 name: "my_aconfig_declarations_baz",
10420 package: "com.example.package",
10421 container: "myapex",
10422 srcs: ["baz.aconfig"],
10423 }
10424
10425 cc_aconfig_library {
10426 name: "my_cc_aconfig_library_baz",
10427 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010428 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010429 "myapex",
10430 ],
10431 }
10432
10433 cc_library {
10434 name: "server_configurable_flags",
10435 srcs: ["server_configurable_flags.cc"],
10436 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010437 cc_library {
10438 name: "libbase",
10439 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010440 apex_available: [
10441 "myapex",
10442 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010443 }
10444 cc_library {
10445 name: "libaconfig_storage_read_api_cc",
10446 srcs: ["libaconfig_storage_read_api_cc.cc"],
10447 }
Yu Liueae7b362023-11-16 17:05:47 -080010448 `)
10449
10450 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10451 s := mod.Rule("apexRule").Args["copy_commands"]
10452 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010453 if len(copyCmds) != 18 {
10454 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010455 }
10456
Jooyung Hana3fddf42024-09-03 13:22:21 +090010457 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10458 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10459 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10460 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010461 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010462
Yu Liubba555e2024-02-17 00:36:42 +000010463 inputs := []string{
10464 "my_aconfig_declarations_foo/intermediate.pb",
10465 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10466 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010467 }
Yu Liubba555e2024-02-17 00:36:42 +000010468 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10469 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10470 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10471 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010472 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010473}
10474
Yu Liucec0e412023-11-30 16:45:50 -080010475func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010476 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010477 ctx := testApex(t, apex_default_bp+`
10478 apex {
10479 name: "myapex",
10480 manifest: ":myapex.manifest",
10481 androidManifest: ":myapex.androidmanifest",
10482 key: "myapex.key",
10483 native_shared_libs: [
10484 "libmy_rust_library",
10485 ],
10486 binaries: [
10487 "my_rust_binary",
10488 ],
10489 rust_dyn_libs: [
10490 "libmy_rust_dylib",
10491 ],
10492 updatable: false,
10493 }
10494
10495 rust_library {
10496 name: "libflags_rust", // test mock
10497 crate_name: "flags_rust",
10498 srcs: ["lib.rs"],
10499 apex_available: [
10500 "myapex",
10501 ],
10502 }
10503
10504 rust_library {
10505 name: "liblazy_static", // test mock
10506 crate_name: "lazy_static",
10507 srcs: ["src/lib.rs"],
10508 apex_available: [
10509 "myapex",
10510 ],
10511 }
10512
Ted Bauer02d475c2024-03-27 20:56:26 +000010513 rust_library {
10514 name: "libaconfig_storage_read_api", // test mock
10515 crate_name: "aconfig_storage_read_api",
10516 srcs: ["src/lib.rs"],
10517 apex_available: [
10518 "myapex",
10519 ],
10520 }
10521
Ted Bauer6ef40db2024-03-29 14:04:10 +000010522 rust_library {
10523 name: "liblogger", // test mock
10524 crate_name: "logger",
10525 srcs: ["src/lib.rs"],
10526 apex_available: [
10527 "myapex",
10528 ],
10529 }
10530
10531 rust_library {
10532 name: "liblog_rust", // test mock
10533 crate_name: "log_rust",
10534 srcs: ["src/lib.rs"],
10535 apex_available: [
10536 "myapex",
10537 ],
10538 }
10539
Yu Liucec0e412023-11-30 16:45:50 -080010540 rust_ffi_shared {
10541 name: "libmy_rust_library",
10542 srcs: ["src/lib.rs"],
10543 rustlibs: ["libmy_rust_aconfig_library_foo"],
10544 crate_name: "my_rust_library",
10545 apex_available: [
10546 "myapex",
10547 ],
10548 }
10549
10550 rust_library_dylib {
10551 name: "libmy_rust_dylib",
10552 srcs: ["foo/bar/MyClass.rs"],
10553 rustlibs: ["libmy_rust_aconfig_library_bar"],
10554 crate_name: "my_rust_dylib",
10555 apex_available: [
10556 "myapex",
10557 ],
10558 }
10559
10560 rust_binary {
10561 name: "my_rust_binary",
10562 srcs: ["foo/bar/MyClass.rs"],
10563 rustlibs: [
10564 "libmy_rust_aconfig_library_baz",
10565 "libmy_rust_dylib",
10566 ],
10567 apex_available: [
10568 "myapex",
10569 ],
10570 }
10571
10572 aconfig_declarations {
10573 name: "my_aconfig_declarations_foo",
10574 package: "com.example.package",
10575 container: "myapex",
10576 srcs: ["foo.aconfig"],
10577 }
10578
10579 aconfig_declarations {
10580 name: "my_aconfig_declarations_bar",
10581 package: "com.example.package",
10582 container: "myapex",
10583 srcs: ["bar.aconfig"],
10584 }
10585
10586 aconfig_declarations {
10587 name: "my_aconfig_declarations_baz",
10588 package: "com.example.package",
10589 container: "myapex",
10590 srcs: ["baz.aconfig"],
10591 }
10592
10593 rust_aconfig_library {
10594 name: "libmy_rust_aconfig_library_foo",
10595 aconfig_declarations: "my_aconfig_declarations_foo",
10596 crate_name: "my_rust_aconfig_library_foo",
10597 apex_available: [
10598 "myapex",
10599 ],
10600 }
10601
10602 rust_aconfig_library {
10603 name: "libmy_rust_aconfig_library_bar",
10604 aconfig_declarations: "my_aconfig_declarations_bar",
10605 crate_name: "my_rust_aconfig_library_bar",
10606 apex_available: [
10607 "myapex",
10608 ],
10609 }
10610
10611 rust_aconfig_library {
10612 name: "libmy_rust_aconfig_library_baz",
10613 aconfig_declarations: "my_aconfig_declarations_baz",
10614 crate_name: "my_rust_aconfig_library_baz",
10615 apex_available: [
10616 "myapex",
10617 ],
10618 }
10619 `)
10620
10621 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10622 s := mod.Rule("apexRule").Args["copy_commands"]
10623 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010624 if len(copyCmds) != 38 {
10625 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010626 }
10627
Jooyung Hana3fddf42024-09-03 13:22:21 +090010628 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10629 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10630 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10631 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010632 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010633
Yu Liubba555e2024-02-17 00:36:42 +000010634 inputs := []string{
10635 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010636 "my_aconfig_declarations_bar/intermediate.pb",
10637 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010638 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10639 }
10640 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10641 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10642 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10643 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010644 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010645}
10646
10647func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10648 aconfigRule := mod.Description(desc)
10649 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010650 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010651 if len(aconfigArgs) != len(inputs) {
10652 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010653 }
Yu Liucec0e412023-11-30 16:45:50 -080010654
Yu Liubba555e2024-02-17 00:36:42 +000010655 ensureEquals(t, container, aconfigRule.Args["container"])
10656 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10657
10658 buildParams := aconfigRule.BuildParams
10659 for _, input := range inputs {
10660 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10661 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010662 }
Yu Liubba555e2024-02-17 00:36:42 +000010663
10664 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010665}
10666
Yu Liueae7b362023-11-16 17:05:47 -080010667func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010668 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010669 ctx := testApex(t, apex_default_bp+`
10670 apex {
10671 name: "myapex",
10672 manifest: ":myapex.manifest",
10673 androidManifest: ":myapex.androidmanifest",
10674 key: "myapex.key",
10675 java_libs: [
10676 "my_java_library_foo",
10677 "other_java_library_bar",
10678 ],
10679 updatable: false,
10680 }
10681
10682 java_library {
10683 name: "my_java_library_foo",
10684 srcs: ["foo/bar/MyClass.java"],
10685 sdk_version: "none",
10686 system_modules: "none",
10687 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010688 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010689 "myapex",
10690 ],
10691 }
10692
10693 java_library {
10694 name: "other_java_library_bar",
10695 srcs: ["foo/bar/MyClass.java"],
10696 sdk_version: "none",
10697 system_modules: "none",
10698 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010699 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010700 "myapex",
10701 ],
10702 }
10703
10704 aconfig_declarations {
10705 name: "my_aconfig_declarations_foo",
10706 package: "com.example.package",
10707 container: "myapex",
10708 srcs: ["foo.aconfig"],
10709 }
10710
10711 java_aconfig_library {
10712 name: "my_java_aconfig_library_foo",
10713 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010714 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010715 "myapex",
10716 ],
10717 }
10718
10719 aconfig_declarations {
10720 name: "other_aconfig_declarations_bar",
10721 package: "com.example.package",
10722 container: "otherapex",
10723 srcs: ["bar.aconfig"],
10724 }
10725
10726 java_aconfig_library {
10727 name: "other_java_aconfig_library_bar",
10728 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010729 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010730 "myapex",
10731 ],
10732 }
10733 `)
10734
10735 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10736 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10737 s := " " + combineAconfigRule.Args["cache_files"]
10738 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10739 if len(aconfigArgs) != 1 {
10740 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10741 }
10742 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10743
10744 buildParams := combineAconfigRule.BuildParams
10745 if len(buildParams.Inputs) != 1 {
10746 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10747 }
10748 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10749 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10750}
10751
10752func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010753 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010754 ctx := testApex(t, apex_default_bp+`
10755 apex {
10756 name: "myapex",
10757 manifest: ":myapex.manifest",
10758 androidManifest: ":myapex.androidmanifest",
10759 key: "myapex.key",
10760 java_libs: [
10761 "my_java_library_foo",
10762 "my_java_library_bar",
10763 ],
10764 updatable: false,
10765 }
10766
10767 java_library {
10768 name: "my_java_library_foo",
10769 srcs: ["foo/bar/MyClass.java"],
10770 sdk_version: "none",
10771 system_modules: "none",
10772 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010773 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010774 "myapex",
10775 ],
10776 }
10777
10778 java_library {
10779 name: "my_java_library_bar",
10780 srcs: ["foo/bar/MyClass.java"],
10781 sdk_version: "none",
10782 system_modules: "none",
10783 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010784 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010785 "myapex",
10786 ],
10787 }
10788
10789 aconfig_declarations {
10790 name: "my_aconfig_declarations_foo",
10791 package: "com.example.package",
10792 container: "myapex",
10793 srcs: ["foo.aconfig"],
10794 }
10795
10796 java_aconfig_library {
10797 name: "my_java_aconfig_library_foo",
10798 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010799 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010800 "myapex",
10801 ],
10802 }
10803
10804 java_aconfig_library {
10805 name: "my_java_aconfig_library_bar",
10806 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010807 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010808 "myapex",
10809 ],
10810 }
10811 `)
10812
10813 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10814 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10815 s := " " + combineAconfigRule.Args["cache_files"]
10816 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10817 if len(aconfigArgs) != 1 {
10818 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10819 }
10820 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10821
10822 buildParams := combineAconfigRule.BuildParams
10823 if len(buildParams.Inputs) != 1 {
10824 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10825 }
10826 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10827 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10828}
Spandan Das5be63332023-12-13 00:06:32 +000010829
10830// Test that the boot jars come from the _selected_ apex prebuilt
10831// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10832func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010833 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010834 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10835 t.Helper()
10836 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10837 foundLibfooJar := false
10838 base := stem + ".jar"
10839 for _, output := range s.AllOutputs() {
10840 if filepath.Base(output) == base {
10841 foundLibfooJar = true
10842 buildRule := s.Output(output)
10843 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10844 }
10845 }
10846 if !foundLibfooJar {
10847 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10848 }
10849 }
10850
Spandan Das64c9e0c2023-12-20 20:13:34 +000010851 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10852 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10853 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10854 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10855 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10856 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)
10857 }
10858
10859 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10860 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10861 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10862 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10863 }
10864
Spandan Das5be63332023-12-13 00:06:32 +000010865 bp := `
10866 // Source APEX.
10867
10868 java_library {
10869 name: "framework-foo",
10870 srcs: ["foo.java"],
10871 installable: true,
10872 apex_available: [
10873 "com.android.foo",
10874 ],
10875 }
10876
10877 bootclasspath_fragment {
10878 name: "foo-bootclasspath-fragment",
10879 contents: ["framework-foo"],
10880 apex_available: [
10881 "com.android.foo",
10882 ],
10883 hidden_api: {
10884 split_packages: ["*"],
10885 },
10886 }
10887
10888 apex_key {
10889 name: "com.android.foo.key",
10890 public_key: "com.android.foo.avbpubkey",
10891 private_key: "com.android.foo.pem",
10892 }
10893
10894 apex {
10895 name: "com.android.foo",
10896 key: "com.android.foo.key",
10897 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10898 updatable: false,
10899 }
10900
10901 // Prebuilt APEX.
10902
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010903 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010904 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010905 public: {
10906 jars: ["foo.jar"],
10907 },
Spandan Das5be63332023-12-13 00:06:32 +000010908 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010909 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010910 }
10911
10912 prebuilt_bootclasspath_fragment {
10913 name: "foo-bootclasspath-fragment",
10914 contents: ["framework-foo"],
10915 hidden_api: {
10916 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10917 metadata: "my-bootclasspath-fragment/metadata.csv",
10918 index: "my-bootclasspath-fragment/index.csv",
10919 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10920 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10921 },
10922 apex_available: [
10923 "com.android.foo",
10924 ],
10925 }
10926
10927 prebuilt_apex {
10928 name: "com.android.foo",
10929 apex_name: "com.android.foo",
10930 src: "com.android.foo-arm.apex",
10931 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10932 }
10933
10934 // Another Prebuilt ART APEX
10935 prebuilt_apex {
10936 name: "com.android.foo.v2",
10937 apex_name: "com.android.foo", // Used to determine the API domain
10938 src: "com.android.foo-arm.apex",
10939 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10940 }
10941
10942 // APEX contribution modules
10943
10944 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010945 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010946 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010947 contents: ["com.android.foo"],
10948 }
10949
10950 apex_contributions {
10951 name: "foo.prebuilt.contributions",
10952 api_domain: "com.android.foo",
10953 contents: ["prebuilt_com.android.foo"],
10954 }
10955
10956 apex_contributions {
10957 name: "foo.prebuilt.v2.contributions",
10958 api_domain: "com.android.foo",
10959 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010960 }
10961 `
10962
10963 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010964 desc string
10965 selectedApexContributions string
10966 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010967 }{
10968 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010969 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10970 selectedApexContributions: "foo.source.contributions",
10971 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010972 },
10973 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010974 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10975 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010976 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 +000010977 },
10978 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010979 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10980 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010981 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 +000010982 },
10983 }
10984
10985 fragment := java.ApexVariantReference{
10986 Apex: proptools.StringPtr("com.android.foo"),
10987 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10988 }
10989
10990 for _, tc := range testCases {
10991 preparer := android.GroupFixturePreparers(
10992 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10993 android.FixtureMergeMockFs(map[string][]byte{
10994 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10995 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010996 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10997 // file creation.
10998 java.FixtureConfigureBootJars("platform:foo"),
10999 android.FixtureModifyMockFS(func(fs android.MockFS) {
11000 fs["platform/Android.bp"] = []byte(`
11001 java_library {
11002 name: "foo",
11003 srcs: ["Test.java"],
11004 compile_dex: true,
11005 }
11006 `)
11007 fs["platform/Test.java"] = nil
11008 }),
11009
Colin Crossa66b4632024-08-08 15:50:47 -070011010 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011011 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011012 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011013 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011014 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11015 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011016 }
11017}
Spandan Das3576e762024-01-03 18:57:03 +000011018
11019// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11020// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11021func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011022 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011023 // for a mainline module family, check that only the flagged soong module is visible to make
11024 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11025 variation := func(moduleName string) string {
11026 ret := "android_common_com.android.foo"
11027 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011028 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011029 }
11030 return ret
11031 }
11032
11033 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11034 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11035
11036 for _, hiddenModuleName := range hiddenModuleNames {
11037 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11038 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11039
11040 }
11041 }
11042
11043 bp := `
11044 apex_key {
11045 name: "com.android.foo.key",
11046 public_key: "com.android.foo.avbpubkey",
11047 private_key: "com.android.foo.pem",
11048 }
11049
11050 // AOSP source apex
11051 apex {
11052 name: "com.android.foo",
11053 key: "com.android.foo.key",
11054 updatable: false,
11055 }
11056
11057 // Google source apex
11058 override_apex {
11059 name: "com.google.android.foo",
11060 base: "com.android.foo",
11061 key: "com.android.foo.key",
11062 }
11063
11064 // Prebuilt Google APEX.
11065
11066 prebuilt_apex {
11067 name: "com.google.android.foo",
11068 apex_name: "com.android.foo",
11069 src: "com.android.foo-arm.apex",
11070 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11071 }
11072
11073 // Another Prebuilt Google APEX
11074 prebuilt_apex {
11075 name: "com.google.android.foo.v2",
11076 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011077 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011078 src: "com.android.foo-arm.apex",
11079 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11080 }
11081
11082 // APEX contribution modules
11083
11084 apex_contributions {
11085 name: "foo.source.contributions",
11086 api_domain: "com.android.foo",
11087 contents: ["com.google.android.foo"],
11088 }
11089
11090 apex_contributions {
11091 name: "foo.prebuilt.contributions",
11092 api_domain: "com.android.foo",
11093 contents: ["prebuilt_com.google.android.foo"],
11094 }
11095
11096 apex_contributions {
11097 name: "foo.prebuilt.v2.contributions",
11098 api_domain: "com.android.foo",
11099 contents: ["prebuilt_com.google.android.foo.v2"],
11100 }
11101
11102 // This is an incompatible module because it selects multiple versions of the same mainline module
11103 apex_contributions {
11104 name: "foo.prebuilt.duplicate.contributions",
11105 api_domain: "com.android.foo",
11106 contents: [
11107 "prebuilt_com.google.android.foo",
11108 "prebuilt_com.google.android.foo.v2",
11109 ],
11110 }
11111 `
11112
11113 testCases := []struct {
11114 desc string
11115 selectedApexContributions string
11116 expectedVisibleModuleName string
11117 expectedHiddenModuleNames []string
11118 expectedError string
11119 }{
11120 {
11121 desc: "Source apex is selected, prebuilts should be hidden from make",
11122 selectedApexContributions: "foo.source.contributions",
11123 expectedVisibleModuleName: "com.google.android.foo",
11124 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11125 },
11126 {
11127 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11128 selectedApexContributions: "foo.prebuilt.contributions",
11129 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11130 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11131 },
11132 {
11133 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11134 selectedApexContributions: "foo.prebuilt.v2.contributions",
11135 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11136 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11137 },
11138 {
11139 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11140 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11141 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11142 },
11143 }
11144
11145 for _, tc := range testCases {
11146 preparer := android.GroupFixturePreparers(
11147 android.FixtureMergeMockFs(map[string][]byte{
11148 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11149 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011150 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011151 )
11152 if tc.expectedError != "" {
11153 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11154 testApex(t, bp, preparer)
11155 return
11156 }
11157 ctx := testApex(t, bp, preparer)
11158
Spandan Das3576e762024-01-03 18:57:03 +000011159 // Check that
11160 // 1. The contents of the selected apex_contributions are visible to make
11161 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11162 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11163 }
11164}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011165
Spandan Das85bd4622024-08-01 00:51:20 +000011166// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11167func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011168 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011169 // for a mainline module family, check that only the flagged soong module is visible to make
11170 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11171 variation := func(moduleName string) string {
11172 ret := "android_common_com.android.adservices"
11173 if moduleName == "com.google.android.foo" {
11174 ret = "android_common_com.google.android.foo_com.google.android.foo"
11175 }
11176 return ret
11177 }
11178
11179 for _, visibleModuleName := range visibleModuleNames {
11180 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11181 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11182 }
11183
11184 for _, hiddenModuleName := range hiddenModuleNames {
11185 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11186 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11187
11188 }
11189 }
11190
11191 bp := `
11192 apex_key {
11193 name: "com.android.adservices.key",
11194 public_key: "com.android.adservices.avbpubkey",
11195 private_key: "com.android.adservices.pem",
11196 }
11197
11198 // AOSP source apex
11199 apex {
11200 name: "com.android.adservices",
11201 key: "com.android.adservices.key",
11202 updatable: false,
11203 }
11204
11205 // Prebuilt Google APEX.
11206
11207 prebuilt_apex {
11208 name: "com.google.android.adservices",
11209 apex_name: "com.android.adservices",
11210 src: "com.android.foo-arm.apex",
11211 }
11212
11213 // Another Prebuilt Google APEX
11214 prebuilt_apex {
11215 name: "com.google.android.adservices.v2",
11216 apex_name: "com.android.adservices",
11217 src: "com.android.foo-arm.apex",
11218 }
11219
11220 // APEX contribution modules
11221
11222
11223 apex_contributions {
11224 name: "adservices.prebuilt.contributions",
11225 api_domain: "com.android.adservices",
11226 contents: ["prebuilt_com.google.android.adservices"],
11227 }
11228
11229 apex_contributions {
11230 name: "adservices.prebuilt.v2.contributions",
11231 api_domain: "com.android.adservices",
11232 contents: ["prebuilt_com.google.android.adservices.v2"],
11233 }
11234 `
11235
11236 testCases := []struct {
11237 desc string
11238 selectedApexContributions string
11239 expectedVisibleModuleNames []string
11240 expectedHiddenModuleNames []string
11241 }{
11242 {
11243 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11244 selectedApexContributions: "",
11245 expectedVisibleModuleNames: []string{"com.android.adservices"},
11246 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11247 },
11248 {
11249 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11250 selectedApexContributions: "adservices.prebuilt.contributions",
11251 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11252 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11253 },
11254 {
11255 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11256 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11257 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11258 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11259 },
11260 }
11261
11262 for _, tc := range testCases {
11263 preparer := android.GroupFixturePreparers(
11264 android.FixtureMergeMockFs(map[string][]byte{
11265 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11266 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011267 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011268 )
11269 ctx := testApex(t, bp, preparer)
11270
11271 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11272 }
11273}
11274
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011275func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011276 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011277 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11278 for _, moduleName := range moduleNames {
11279 ret += fmt.Sprintf(`
11280 aconfig_declarations {
11281 name: "%[1]s",
11282 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011283 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011284 srcs: [
11285 "%[1]s.aconfig",
11286 ],
11287 }
11288 java_aconfig_library {
11289 name: "%[1]s-lib",
11290 aconfig_declarations: "%[1]s",
11291 }
11292 `, moduleName)
11293 }
11294 return ret
11295 }
11296
11297 result := android.GroupFixturePreparers(
11298 prepareForApexTest,
11299 java.PrepareForTestWithJavaSdkLibraryFiles,
11300 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011301 ).RunTestWithBp(t, `
11302 java_library {
11303 name: "baz-java-lib",
11304 static_libs: [
11305 "baz-lib",
11306 ],
11307 }
11308 filegroup {
11309 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011310 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011311 ":qux-lib{.generated_srcjars}",
11312 ],
11313 }
11314 filegroup {
11315 name: "qux-another-filegroup",
11316 srcs: [
11317 ":qux-filegroup",
11318 ],
11319 }
11320 java_library {
11321 name: "quux-java-lib",
11322 srcs: [
11323 "a.java",
11324 ],
11325 libs: [
11326 "quux-lib",
11327 ],
11328 }
11329 java_sdk_library {
11330 name: "foo",
11331 srcs: [
11332 ":qux-another-filegroup",
11333 ],
11334 api_packages: ["foo"],
11335 system: {
11336 enabled: true,
11337 },
11338 module_lib: {
11339 enabled: true,
11340 },
11341 test: {
11342 enabled: true,
11343 },
11344 static_libs: [
11345 "bar-lib",
11346 ],
11347 libs: [
11348 "baz-java-lib",
11349 "quux-java-lib",
11350 ],
11351 aconfig_declarations: [
11352 "bar",
11353 ],
11354 }
11355 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11356
11357 m := result.ModuleForTests("foo.stubs.source", "android_common")
11358 outDir := "out/soong/.intermediates"
11359
11360 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11361 // textproto files
11362 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11363
11364 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11365 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11366 // to aconfig.
11367 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11368 "passed as an input",
11369 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11370
11371 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11372 // to metalava as classpath. Thus the cache file provided by the associated
11373 // aconfig_declarations module "baz" should be passed to aconfig.
11374 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11375 "java_aconfig_library passed as an input",
11376 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11377
11378 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11379 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11380 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11381 "input",
11382 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11383
11384 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11385 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11386 // aconfig_declarations module "quux" should not be passed to aconfig.
11387 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11388 "depend on java_aconfig_library not passed as an input",
11389 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11390}
Cole Faust7c991b42024-05-15 11:17:55 -070011391
11392func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011393 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011394 ctx := testApex(t, `
11395 apex {
11396 name: "myapex",
11397 key: "myapex.key",
11398 prebuilts: ["myetc", "myetc2"],
11399 min_sdk_version: "29",
11400 }
11401 apex_key {
11402 name: "myapex.key",
11403 public_key: "testkey.avbpubkey",
11404 private_key: "testkey.pem",
11405 }
11406
11407 prebuilt_etc {
11408 name: "myetc",
11409 src: "myprebuilt",
11410 filename: "myfilename",
11411 }
11412 prebuilt_etc {
11413 name: "myetc2",
11414 sub_dir: "mysubdir",
11415 src: "myprebuilt",
11416 filename: "myfilename",
11417 }
11418 `, withFiles(android.MockFS{
11419 "packages/modules/common/build/allowed_deps.txt": nil,
11420 }))
11421
11422 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11423 data := android.AndroidMkDataForTest(t, ctx, ab)
11424 var builder strings.Builder
11425 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11426 androidMk := builder.String()
11427
11428 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11429 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11430}
Spandan Das50801e22024-05-13 18:29:45 +000011431
11432func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011433 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011434 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11435 args := module.Rule("apexRule").Args
11436 optFlags := args["opt_flags"]
11437 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11438 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11439 }
11440 }
11441
11442 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11443 t.Helper()
11444 found := false
11445 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11446 if dep == wantDep {
11447 found = true
11448 }
11449 })
11450 if !found {
11451 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11452 }
11453 }
11454
11455 ctx := testApex(t, `
11456 apex {
11457 name: "com.android.apex30",
11458 min_sdk_version: "30",
11459 key: "apex30.key",
11460 java_libs: ["javalib"],
11461 }
11462
11463 java_library {
11464 name: "javalib",
11465 srcs: ["A.java"],
11466 apex_available: ["com.android.apex30"],
11467 min_sdk_version: "30",
11468 sdk_version: "current",
11469 }
11470
11471 override_apex {
11472 name: "com.mycompany.android.apex30",
11473 base: "com.android.apex30",
11474 }
11475
11476 override_apex {
11477 name: "com.mycompany.android.apex31",
11478 base: "com.android.apex30",
11479 min_sdk_version: "31",
11480 }
11481
11482 apex_key {
11483 name: "apex30.key",
11484 public_key: "testkey.avbpubkey",
11485 private_key: "testkey.pem",
11486 }
11487
11488 `, android.FixtureMergeMockFs(android.MockFS{
11489 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11490 }),
11491 )
11492
11493 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11494 checkMinSdkVersion(t, baseModule, "30")
11495
11496 // Override module, but uses same min_sdk_version
11497 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11498 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11499 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11500 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11501
11502 // Override module, uses different min_sdk_version
11503 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11504 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11505 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11506 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11507}
Spandan Das0b28fa02024-05-28 23:40:17 +000011508
11509func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011510 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011511 context := android.GroupFixturePreparers(
11512 android.PrepareForIntegrationTestWithAndroid,
11513 PrepareForTestWithApexBuildComponents,
11514 android.FixtureMergeMockFs(android.MockFS{
11515 "system/sepolicy/apex/foo-file_contexts": nil,
11516 }),
11517 )
11518 res := context.RunTestWithBp(t, `
11519 apex {
11520 name: "foo",
11521 key: "myapex.key",
11522 apex_available_name: "com.android.foo",
11523 variant_version: "0",
11524 updatable: false,
11525 }
11526 apex_key {
11527 name: "myapex.key",
11528 public_key: "testkey.avbpubkey",
11529 private_key: "testkey.pem",
11530 }
11531 prebuilt_apex {
11532 name: "foo",
11533 src: "foo.apex",
11534 prefer: true,
11535 }
11536 override_apex {
11537 name: "myoverrideapex",
11538 base: "foo",
11539 }
11540 `)
11541
11542 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11543}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011544
11545func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011546 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011547 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`, `
11548 apex {
11549 name: "myapex",
11550 key: "myapex.key",
11551 updatable: true,
11552 min_sdk_version: "current",
11553 }
11554
11555 apex_key {
11556 name: "myapex.key",
11557 public_key: "testkey.avbpubkey",
11558 private_key: "testkey.pem",
11559 }
11560 `)
11561}
Spandan Das2f68f192024-07-22 19:25:50 +000011562
11563func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011564 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011565 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11566 result := android.GroupFixturePreparers(
11567 prepareForApexTest,
11568 android.PrepareForTestWithAndroidMk,
11569 android.PrepareForTestWithMakevars,
11570 android.FixtureMergeMockFs(fs),
11571 ).RunTest(t)
11572
11573 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011574 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011575
11576 installRules := result.InstallMakeRulesForTesting(t)
11577
11578 var installedlibRule *android.InstallMakeRule
11579 for i, rule := range installRules {
11580 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11581 if installedlibRule != nil {
11582 t.Errorf("Duplicate install rules for %s", rule.Target)
11583 }
11584 installedlibRule = &installRules[i]
11585 }
11586 }
11587 if installedlibRule == nil {
11588 t.Errorf("No install rule found for installedlib")
11589 return
11590 }
11591
11592 if expectLibfooOnSystemLib {
11593 android.AssertStringListContains(t,
11594 "installedlib doesn't have install dependency on libfoo impl",
11595 installedlibRule.OrderOnlyDeps,
11596 "out/target/product/test_device/system/lib/libfoo.so")
11597 } else {
11598 android.AssertStringListDoesNotContain(t,
11599 "installedlib has install dependency on libfoo stub",
11600 installedlibRule.Deps,
11601 "out/target/product/test_device/system/lib/libfoo.so")
11602 android.AssertStringListDoesNotContain(t,
11603 "installedlib has order-only install dependency on libfoo stub",
11604 installedlibRule.OrderOnlyDeps,
11605 "out/target/product/test_device/system/lib/libfoo.so")
11606 }
11607 }
11608
11609 prebuiltLibfooBp := []byte(`
11610 cc_prebuilt_library {
11611 name: "libfoo",
11612 prefer: true,
11613 srcs: ["libfoo.so"],
11614 stubs: {
11615 versions: ["1"],
11616 },
11617 apex_available: ["apexfoo"],
11618 }
11619 `)
11620
11621 apexfooBp := []byte(`
11622 apex {
11623 name: "apexfoo",
11624 key: "apexfoo.key",
11625 native_shared_libs: ["libfoo"],
11626 updatable: false,
11627 compile_multilib: "both",
11628 }
11629 apex_key {
11630 name: "apexfoo.key",
11631 public_key: "testkey.avbpubkey",
11632 private_key: "testkey.pem",
11633 }
11634 `)
11635
11636 installedlibBp := []byte(`
11637 cc_library {
11638 name: "installedlib",
11639 shared_libs: ["libfoo"],
11640 }
11641 `)
11642
11643 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011644 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011645 testFunc(
11646 t,
11647 /*expectLibfooOnSystemLib=*/ false,
11648 android.MockFS{
11649 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11650 "apexfoo/Android.bp": apexfooBp,
11651 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11652 "Android.bp": installedlibBp,
11653 },
11654 )
11655 })
11656
11657 disabledSourceLibfooBp := []byte(`
11658 cc_library {
11659 name: "libfoo",
11660 enabled: false,
11661 stubs: {
11662 versions: ["1"],
11663 },
11664 apex_available: ["apexfoo"],
11665 }
11666 `)
11667
11668 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011669 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011670 testFunc(
11671 t,
11672 /*expectLibfooOnSystemLib=*/ false,
11673 android.MockFS{
11674 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11675 "impl/Android.bp": disabledSourceLibfooBp,
11676 "apexfoo/Android.bp": apexfooBp,
11677 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11678 "Android.bp": installedlibBp,
11679 },
11680 )
11681 })
11682}
Jihoon Kange246bb72024-09-18 22:26:22 +000011683
11684func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011685 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011686 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11687 // in libs of android_app and java_library does not lead to class loader context device/host
11688 // path mismatch errors.
11689 android.GroupFixturePreparers(
11690 prepareForApexTest,
11691 android.PrepareForIntegrationTestWithAndroid,
11692 PrepareForTestWithApexBuildComponents,
11693 android.FixtureModifyEnv(func(env map[string]string) {
11694 env["DISABLE_CONTAINER_CHECK"] = "true"
11695 }),
11696 withFiles(filesForSdkLibrary),
11697 android.FixtureMergeMockFs(android.MockFS{
11698 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11699 }),
11700 ).RunTestWithBp(t, `
11701 apex {
11702 name: "com.android.foo30",
11703 key: "myapex.key",
11704 updatable: true,
11705 bootclasspath_fragments: [
11706 "foo-bootclasspath-fragment",
11707 ],
11708 java_libs: [
11709 "bar",
11710 ],
11711 apps: [
11712 "bar-app",
11713 ],
11714 min_sdk_version: "30",
11715 }
11716 apex_key {
11717 name: "myapex.key",
11718 public_key: "testkey.avbpubkey",
11719 private_key: "testkey.pem",
11720 }
11721 bootclasspath_fragment {
11722 name: "foo-bootclasspath-fragment",
11723 contents: [
11724 "framework-foo",
11725 ],
11726 apex_available: [
11727 "com.android.foo30",
11728 ],
11729 hidden_api: {
11730 split_packages: ["*"]
11731 },
11732 }
11733
11734 java_sdk_library {
11735 name: "framework-foo",
11736 srcs: [
11737 "A.java"
11738 ],
11739 unsafe_ignore_missing_latest_api: true,
11740 apex_available: [
11741 "com.android.foo30",
11742 ],
11743 compile_dex: true,
11744 sdk_version: "core_current",
11745 shared_library: false,
11746 }
11747
11748 java_library {
11749 name: "bar",
11750 srcs: [
11751 "A.java"
11752 ],
11753 libs: [
11754 "framework-foo.impl",
11755 ],
11756 apex_available: [
11757 "com.android.foo30",
11758 ],
11759 sdk_version: "core_current",
11760 }
11761
11762 java_library {
11763 name: "baz",
11764 srcs: [
11765 "A.java"
11766 ],
11767 libs: [
11768 "bar",
11769 ],
11770 sdk_version: "core_current",
11771 }
11772
11773 android_app {
11774 name: "bar-app",
11775 srcs: [
11776 "A.java"
11777 ],
11778 libs: [
11779 "baz",
11780 "framework-foo.impl",
11781 ],
11782 apex_available: [
11783 "com.android.foo30",
11784 ],
11785 sdk_version: "core_current",
11786 min_sdk_version: "30",
11787 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011788 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011789 }
11790 `)
11791}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011792
11793// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11794func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011795 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011796 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11797 apex {
11798 name: "myapex",
11799 key: "myapex.key",
11800 systemserverclasspath_fragments: [
11801 "mysystemserverclasspathfragment",
11802 ],
11803 min_sdk_version: "29",
11804 updatable: true,
11805 system_ext_specific: true,
11806 }
11807
11808 apex_key {
11809 name: "myapex.key",
11810 public_key: "testkey.avbpubkey",
11811 private_key: "testkey.pem",
11812 }
11813
11814 java_library {
11815 name: "foo",
11816 srcs: ["b.java"],
11817 min_sdk_version: "29",
11818 installable: true,
11819 apex_available: [
11820 "myapex",
11821 ],
11822 sdk_version: "current",
11823 }
11824
11825 systemserverclasspath_fragment {
11826 name: "mysystemserverclasspathfragment",
11827 contents: [
11828 "foo",
11829 ],
11830 apex_available: [
11831 "myapex",
11832 ],
11833 }
11834 `,
11835 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11836 )
11837}
Spandan Das72d86c62024-10-15 19:27:41 +000011838
11839// partitions should not package the artifacts that are included inside the apex.
11840func TestFilesystemWithApexDeps(t *testing.T) {
11841 t.Parallel()
11842 result := testApex(t, `
11843 android_filesystem {
11844 name: "myfilesystem",
11845 deps: ["myapex"],
11846 }
11847 apex {
11848 name: "myapex",
11849 key: "myapex.key",
11850 binaries: ["binfoo"],
11851 native_shared_libs: ["libfoo"],
11852 apps: ["appfoo"],
11853 updatable: false,
11854 }
11855 apex_key {
11856 name: "myapex.key",
11857 }
11858 cc_binary {
11859 name: "binfoo",
11860 apex_available: ["myapex"],
11861 }
11862 cc_library {
11863 name: "libfoo",
11864 apex_available: ["myapex"],
11865 }
11866 android_app {
11867 name: "appfoo",
11868 sdk_version: "current",
11869 apex_available: ["myapex"],
11870 }
11871 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11872
11873 partition := result.ModuleForTests("myfilesystem", "android_common")
11874 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11875 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11876}
Colin Crossb614cd42024-10-11 12:52:21 -070011877
11878func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11879 t.Parallel()
11880
11881 extractDepenencyPathFromErrors := func(errs []error) []string {
11882 i := slices.IndexFunc(errs, func(err error) bool {
11883 return strings.Contains(err.Error(), "dependency path:")
11884 })
11885 if i < 0 {
11886 return nil
11887 }
11888 var dependencyPath []string
11889 for _, err := range errs[i+1:] {
11890 s := err.Error()
11891 lastSpace := strings.LastIndexByte(s, ' ')
11892 if lastSpace >= 0 {
11893 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11894 }
11895 }
11896 return dependencyPath
11897 }
11898
11899 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11900 return func(t *testing.T, result *android.TestResult) {
11901 t.Helper()
11902 if len(result.Errs) == 0 {
11903 t.Fatalf("expected errors")
11904 }
11905 t.Log("found errors:")
11906 for _, err := range result.Errs {
11907 t.Log(err)
11908 }
11909 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11910 t.Fatalf("expected error %q, got %q", w, g)
11911 }
11912 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11913 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11914 t.Errorf("expected dependency path %q, got %q", w, g)
11915 }
11916 }
11917 }
11918
11919 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11920 return func(bp *bpmodify.Blueprint) {
11921 m := bp.ModulesByName(module)
11922 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11923 if err != nil {
11924 panic(err)
11925 }
11926 props.AddStringToList(lib)
11927 }
11928 }
11929
11930 bpTemplate := `
11931 apex {
11932 name: "myapex",
11933 key: "myapex.key",
11934 native_shared_libs: ["mylib"],
11935 rust_dyn_libs: ["libmyrust"],
11936 binaries: ["mybin", "myrustbin"],
11937 jni_libs: ["libjni"],
11938 apps: ["myapp"],
11939 updatable: false,
11940 }
11941
11942 apex {
11943 name: "otherapex",
11944 key: "myapex.key",
11945 native_shared_libs: ["libotherapex"],
11946 updatable: false,
11947 }
11948
11949 apex_key {
11950 name: "myapex.key",
11951 public_key: "testkey.avbpubkey",
11952 private_key: "testkey.pem",
11953 }
11954
11955 cc_library {
11956 name: "mylib",
11957 srcs: ["foo.cpp"],
11958 apex_available: ["myapex"],
11959 }
11960
11961 cc_binary {
11962 name: "mybin",
11963 srcs: ["foo.cpp"],
11964 apex_available: ["myapex"],
11965 }
11966
11967 rust_library {
11968 name: "libmyrust",
11969 crate_name: "myrust",
11970 srcs: ["src/lib.rs"],
11971 rustlibs: ["libmyrust_transitive_dylib"],
11972 rlibs: ["libmyrust_transitive_rlib"],
11973 apex_available: ["myapex"],
11974 }
11975
11976 rust_library{
11977 name: "libmyrust_transitive_dylib",
11978 crate_name: "myrust_transitive_dylib",
11979 srcs: ["src/lib.rs"],
11980 apex_available: ["myapex"],
11981 }
11982
11983 rust_library {
11984 name: "libmyrust_transitive_rlib",
11985 crate_name: "myrust_transitive_rlib",
11986 srcs: ["src/lib.rs"],
11987 apex_available: ["myapex"],
11988 }
11989
11990 rust_binary {
11991 name: "myrustbin",
11992 srcs: ["src/main.rs"],
11993 apex_available: ["myapex"],
11994 }
11995
11996 cc_library {
11997 name: "libbar",
11998 sdk_version: "current",
11999 srcs: ["bar.cpp"],
12000 apex_available: ["myapex"],
12001 stl: "none",
12002 }
12003
12004 android_app {
12005 name: "myapp",
12006 jni_libs: ["libembeddedjni"],
12007 use_embedded_native_libs: true,
12008 sdk_version: "current",
12009 apex_available: ["myapex"],
12010 }
12011
12012 cc_library {
12013 name: "libembeddedjni",
12014 sdk_version: "current",
12015 srcs: ["bar.cpp"],
12016 apex_available: ["myapex"],
12017 stl: "none",
12018 }
12019
12020 cc_library {
12021 name: "libjni",
12022 sdk_version: "current",
12023 srcs: ["bar.cpp"],
12024 apex_available: ["myapex"],
12025 stl: "none",
12026 }
12027
12028 cc_library {
12029 name: "libotherapex",
12030 sdk_version: "current",
12031 srcs: ["otherapex.cpp"],
12032 apex_available: ["otherapex"],
12033 stubs: {
12034 symbol_file: "libotherapex.map.txt",
12035 versions: ["1", "2", "3"],
12036 },
12037 stl: "none",
12038 }
12039
12040 cc_library {
12041 name: "libplatform",
12042 sdk_version: "current",
12043 srcs: ["libplatform.cpp"],
12044 stubs: {
12045 symbol_file: "libplatform.map.txt",
12046 versions: ["1", "2", "3"],
12047 },
12048 stl: "none",
12049 system_shared_libs: [],
12050 }
12051 `
12052
12053 testCases := []struct {
12054 name string
12055 bpModifier func(bp *bpmodify.Blueprint)
12056 dependencyPath []string
12057 }{
12058 {
12059 name: "library dependency in other apex",
12060 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12061 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12062 },
12063 {
12064 name: "transitive library dependency in other apex",
12065 bpModifier: func(bp *bpmodify.Blueprint) {
12066 addToSharedLibs("mylib", "libbar")(bp)
12067 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12068 },
12069 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12070 },
12071 {
12072 name: "library dependency in platform",
12073 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12074 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12075 },
12076 {
12077 name: "jni library dependency in other apex",
12078 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12079 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12080 },
12081 {
12082 name: "transitive jni library dependency in other apex",
12083 bpModifier: func(bp *bpmodify.Blueprint) {
12084 addToSharedLibs("libjni", "libbar")(bp)
12085 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12086 },
12087 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12088 },
12089 {
12090 name: "jni library dependency in platform",
12091 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12092 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12093 },
12094 {
12095 name: "transitive jni library dependency in platform",
12096 bpModifier: func(bp *bpmodify.Blueprint) {
12097 addToSharedLibs("libjni", "libbar")(bp)
12098 addToSharedLibs("libbar", "libplatform#impl")(bp)
12099 },
12100 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12101 },
12102 // TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
12103 // JNI libraries even if they came from another apex.
12104 //{
12105 // name: "app jni library dependency in other apex",
12106 // bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12107 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12108 //},
12109 //{
12110 // name: "transitive app jni library dependency in other apex",
12111 // bpModifier: func(bp *bpmodify.Blueprint) {
12112 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12113 // addToSharedLibs("libbar", "libotherapex#impl")(bp)
12114 // },
12115 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12116 //},
12117 //{
12118 // name: "app jni library dependency in platform",
12119 // bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12120 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12121 //},
12122 //{
12123 // name: "transitive app jni library dependency in platform",
12124 // bpModifier: func(bp *bpmodify.Blueprint) {
12125 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12126 // addToSharedLibs("libbar", "libplatform#impl")(bp)
12127 // },
12128 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12129 //},
12130 {
12131 name: "binary dependency in other apex",
12132 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12133 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12134 },
12135 {
12136 name: "transitive binary dependency in other apex",
12137 bpModifier: func(bp *bpmodify.Blueprint) {
12138 addToSharedLibs("mybin", "libbar")(bp)
12139 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12140 },
12141 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12142 },
12143 {
12144 name: "binary dependency in platform",
12145 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12146 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12147 },
12148 {
12149 name: "transitive binary dependency in platform",
12150 bpModifier: func(bp *bpmodify.Blueprint) {
12151 addToSharedLibs("mybin", "libbar")(bp)
12152 addToSharedLibs("libbar", "libplatform#impl")(bp)
12153 },
12154 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12155 },
12156
12157 {
12158 name: "rust library dependency in other apex",
12159 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12160 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12161 },
12162 {
12163 name: "transitive rust library dependency in other apex",
12164 bpModifier: func(bp *bpmodify.Blueprint) {
12165 addToSharedLibs("libmyrust", "libbar")(bp)
12166 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12167 },
12168 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12169 },
12170 {
12171 name: "rust library dependency in platform",
12172 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12173 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12174 },
12175 {
12176 name: "transitive rust library dependency in platform",
12177 bpModifier: func(bp *bpmodify.Blueprint) {
12178 addToSharedLibs("libmyrust", "libbar")(bp)
12179 addToSharedLibs("libbar", "libplatform#impl")(bp)
12180 },
12181 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12182 },
12183 {
12184 name: "transitive rust library dylib dependency in other apex",
12185 bpModifier: func(bp *bpmodify.Blueprint) {
12186 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12187 },
12188 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12189 },
12190 {
12191 name: "transitive rust library dylib dependency in platform",
12192 bpModifier: func(bp *bpmodify.Blueprint) {
12193 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12194 },
12195 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12196 },
12197 {
12198 name: "transitive rust library rlib dependency in other apex",
12199 bpModifier: func(bp *bpmodify.Blueprint) {
12200 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12201 },
12202 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12203 },
12204 {
12205 name: "transitive rust library rlib dependency in platform",
12206 bpModifier: func(bp *bpmodify.Blueprint) {
12207 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12208 },
12209 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12210 },
12211 {
12212 name: "rust binary dependency in other apex",
12213 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12214 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12215 },
12216 {
12217 name: "transitive rust binary dependency in other apex",
12218 bpModifier: func(bp *bpmodify.Blueprint) {
12219 addToSharedLibs("myrustbin", "libbar")(bp)
12220 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12221 },
12222 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12223 },
12224 {
12225 name: "rust binary dependency in platform",
12226 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12227 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12228 },
12229 {
12230 name: "transitive rust binary dependency in platform",
12231 bpModifier: func(bp *bpmodify.Blueprint) {
12232 addToSharedLibs("myrustbin", "libbar")(bp)
12233 addToSharedLibs("libbar", "libplatform#impl")(bp)
12234 },
12235 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12236 },
12237 }
12238
12239 for _, testCase := range testCases {
12240 t.Run(testCase.name, func(t *testing.T) {
12241 t.Parallel()
12242 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12243 if err != nil {
12244 t.Fatal(err)
12245 }
12246 if testCase.bpModifier != nil {
12247 func() {
12248 defer func() {
12249 if r := recover(); r != nil {
12250 t.Fatalf("panic in bpModifier: %v", r)
12251 }
12252 }()
12253 testCase.bpModifier(bp)
12254 }()
12255 }
12256 android.GroupFixturePreparers(
12257 android.PrepareForTestWithAndroidBuildComponents,
12258 cc.PrepareForTestWithCcBuildComponents,
12259 java.PrepareForTestWithDexpreopt,
12260 rust.PrepareForTestWithRustDefaultModules,
12261 PrepareForTestWithApexBuildComponents,
12262 prepareForTestWithMyapex,
12263 prepareForTestWithOtherapex,
12264 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12265 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12266 }),
12267 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12268 RunTestWithBp(t, bp.String())
12269 })
12270 }
12271}