blob: 5b5fe5ff1673e390262c1938982ec08d93b8a08b [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Jooyung Han35155c42020-02-06 17:33:20 +090087// withNativeBridgeTargets sets configuration with targets including:
88// - X86_64 (primary)
89// - X86 (secondary)
90// - Arm64 on X86_64 (native bridge)
91// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000092var withNativeBridgeEnabled = android.FixtureModifyConfig(
93 func(config android.Config) {
94 config.Targets[android.Android] = []android.Target{
95 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
96 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
97 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
98 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
99 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
103 }
104 },
105)
106
107func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
108 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
109 variables.ManifestPackageNameOverrides = specs
110 })
Jooyung Han35155c42020-02-06 17:33:20 +0900111}
112
Albert Martineefabcf2022-03-21 20:11:16 +0000113func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
116 })
117}
118
Paul Duffin810f33d2021-03-09 14:12:32 +0000119var withBinder32bit = android.FixtureModifyProductVariables(
120 func(variables android.FixtureProductVariables) {
121 variables.Binder32bit = proptools.BoolPtr(true)
122 },
123)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withUnbundledBuild = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Unbundled_build = proptools.BoolPtr(true)
128 },
129)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900130
Paul Duffin284165a2021-03-29 01:50:31 +0100131// Legacy preparer used for running tests within the apex package.
132//
133// This includes everything that was needed to run any test in the apex package prior to the
134// introduction of the test fixtures. Tests that are being converted to use fixtures directly
135// rather than through the testApex...() methods should avoid using this and instead use the
136// various preparers directly, using android.GroupFixturePreparers(...) to group them when
137// necessary.
138//
139// deprecated
140var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000141 // General preparers in alphabetical order as test infrastructure will enforce correct
142 // registration order.
143 android.PrepareForTestWithAndroidBuildComponents,
144 bpf.PrepareForTestWithBpf,
145 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100146 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000147 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
148 rust.PrepareForTestWithRustDefaultModules,
149 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800150 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000151
152 PrepareForTestWithApexBuildComponents,
153
154 // Additional apex test specific preparers.
155 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
156 filegroup {
157 name: "myapex-file_contexts",
158 srcs: [
159 "apex/myapex-file_contexts",
160 ],
161 }
162 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000163 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000164 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 "a.java": nil,
166 "PrebuiltAppFoo.apk": nil,
167 "PrebuiltAppFooPriv.apk": nil,
168 "apex_manifest.json": nil,
169 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
171 "system/sepolicy/apex/myapex2-file_contexts": nil,
172 "system/sepolicy/apex/otherapex-file_contexts": nil,
173 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
174 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700175 "mylib.cpp": nil,
176 "mytest.cpp": nil,
177 "mytest1.cpp": nil,
178 "mytest2.cpp": nil,
179 "mytest3.cpp": nil,
180 "myprebuilt": nil,
181 "my_include": nil,
182 "foo/bar/MyClass.java": nil,
183 "prebuilt.jar": nil,
184 "prebuilt.so": nil,
185 "vendor/foo/devkeys/test.x509.pem": nil,
186 "vendor/foo/devkeys/test.pk8": nil,
187 "testkey.x509.pem": nil,
188 "testkey.pk8": nil,
189 "testkey.override.x509.pem": nil,
190 "testkey.override.pk8": nil,
191 "vendor/foo/devkeys/testkey.avbpubkey": nil,
192 "vendor/foo/devkeys/testkey.pem": nil,
193 "NOTICE": nil,
194 "custom_notice": nil,
195 "custom_notice_for_static_lib": nil,
196 "testkey2.avbpubkey": nil,
197 "testkey2.pem": nil,
198 "myapex-arm64.apex": nil,
199 "myapex-arm.apex": nil,
200 "myapex.apks": nil,
201 "frameworks/base/api/current.txt": nil,
202 "framework/aidl/a.aidl": nil,
203 "dummy.txt": nil,
204 "baz": nil,
205 "bar/baz": nil,
206 "testdata/baz": nil,
207 "AppSet.apks": nil,
208 "foo.rs": nil,
209 "libfoo.jar": nil,
210 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000211 },
212 ),
213
214 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000215 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
216 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
217 variables.Platform_sdk_codename = proptools.StringPtr("Q")
218 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000219 // "Tiramisu" needs to be in the next line for compatibility with soong code,
220 // not because of these tests specifically (it's not used by the tests)
221 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000222 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000223 }),
224)
225
Paul Duffin52bfaa42021-03-23 23:40:12 +0000226var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
227 "system/sepolicy/apex/myapex-file_contexts": nil,
228})
229
Colin Crossb614cd42024-10-11 12:52:21 -0700230var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/otherapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900268 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jooyung Hana3fddf42024-09-03 13:22:21 +0900279func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
280 t.Helper()
281 p := regexp.MustCompile(expectedRex)
282 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
283 t.Errorf("%q is not found in %v", expectedRex, result)
284 }
285}
286
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if !android.InList(expected, result) {
290 t.Errorf("%q is not found in %v", expected, result)
291 }
292}
293
294func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900295 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900296 if android.InList(notExpected, result) {
297 t.Errorf("%q is found in %v", notExpected, result)
298 }
299}
300
Jooyung Hane1633032019-08-01 17:41:43 +0900301func ensureListEmpty(t *testing.T, result []string) {
302 t.Helper()
303 if len(result) > 0 {
304 t.Errorf("%q is expected to be empty", result)
305 }
306}
307
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000308func ensureListNotEmpty(t *testing.T, result []string) {
309 t.Helper()
310 if len(result) == 0 {
311 t.Errorf("%q is expected to be not empty", result)
312 }
313}
314
Jiyong Park25fc6a92018-11-18 18:02:45 +0900315// Minimal test
316func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700317 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800318 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900319 apex_defaults {
320 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900321 manifest: ":myapex.manifest",
322 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900324 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900325 native_shared_libs: [
326 "mylib",
327 "libfoo.ffi",
328 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900329 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800330 multilib: {
331 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900332 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800333 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900334 },
Jiyong Park77acec62020-06-01 21:39:15 +0900335 java_libs: [
336 "myjar",
337 "myjar_dex",
338 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000339 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900340 }
341
Jiyong Park30ca9372019-02-07 16:27:23 +0900342 apex {
343 name: "myapex",
344 defaults: ["myapex-defaults"],
345 }
346
Jiyong Park25fc6a92018-11-18 18:02:45 +0900347 apex_key {
348 name: "myapex.key",
349 public_key: "testkey.avbpubkey",
350 private_key: "testkey.pem",
351 }
352
Jiyong Park809bb722019-02-13 21:33:49 +0900353 filegroup {
354 name: "myapex.manifest",
355 srcs: ["apex_manifest.json"],
356 }
357
358 filegroup {
359 name: "myapex.androidmanifest",
360 srcs: ["AndroidManifest.xml"],
361 }
362
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 cc_library {
364 name: "mylib",
365 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900366 shared_libs: [
367 "mylib2",
368 "libbar.ffi",
369 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900370 system_shared_libs: [],
371 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000372 // TODO: remove //apex_available:platform
373 apex_available: [
374 "//apex_available:platform",
375 "myapex",
376 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900377 }
378
Alex Light3d673592019-01-18 14:37:31 -0800379 cc_binary {
380 name: "foo",
381 srcs: ["mylib.cpp"],
382 compile_multilib: "both",
383 multilib: {
384 lib32: {
385 suffix: "32",
386 },
387 lib64: {
388 suffix: "64",
389 },
390 },
391 symlinks: ["foo_link_"],
392 symlink_preferred_arch: true,
393 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800394 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900395 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700396 }
397
Jiyong Park99644e92020-11-17 22:21:02 +0900398 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000399 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900400 srcs: ["foo.rs"],
401 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700402 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900403 apex_available: ["myapex"],
404 }
405
406 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000407 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900408 srcs: ["foo.rs"],
409 crate_name: "foo",
410 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900411 shared_libs: ["libfoo.shared_from_rust"],
412 }
413
414 cc_library_shared {
415 name: "libfoo.shared_from_rust",
416 srcs: ["mylib.cpp"],
417 system_shared_libs: [],
418 stl: "none",
419 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900420 }
421
422 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000423 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900424 srcs: ["foo.rs"],
425 crate_name: "foo",
426 apex_available: ["myapex"],
427 }
428
Colin Cross49f1a8f2024-10-23 13:04:15 -0700429 rust_library_dylib {
430 name: "libfoo.transitive.dylib.rust",
431 srcs: ["foo.rs"],
432 crate_name: "foo",
433 apex_available: ["myapex"],
434 }
435
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900436 rust_ffi_shared {
437 name: "libfoo.ffi",
438 srcs: ["foo.rs"],
439 crate_name: "foo",
440 apex_available: ["myapex"],
441 }
442
443 rust_ffi_shared {
444 name: "libbar.ffi",
445 srcs: ["foo.rs"],
446 crate_name: "bar",
447 apex_available: ["myapex"],
448 }
449
Paul Duffindddd5462020-04-07 15:25:44 +0100450 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900451 name: "mylib2",
452 srcs: ["mylib.cpp"],
453 system_shared_libs: [],
454 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900455 static_libs: ["libstatic"],
456 // TODO: remove //apex_available:platform
457 apex_available: [
458 "//apex_available:platform",
459 "myapex",
460 ],
461 }
462
Paul Duffindddd5462020-04-07 15:25:44 +0100463 cc_prebuilt_library_shared {
464 name: "mylib2",
465 srcs: ["prebuilt.so"],
466 // TODO: remove //apex_available:platform
467 apex_available: [
468 "//apex_available:platform",
469 "myapex",
470 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700471 }
Paul Duffindddd5462020-04-07 15:25:44 +0100472
Jiyong Park9918e1a2020-03-17 19:16:40 +0900473 cc_library_static {
474 name: "libstatic",
475 srcs: ["mylib.cpp"],
476 system_shared_libs: [],
477 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000478 // TODO: remove //apex_available:platform
479 apex_available: [
480 "//apex_available:platform",
481 "myapex",
482 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900483 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484
485 java_library {
486 name: "myjar",
487 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900488 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 sdk_version: "none",
490 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900492 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800498 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900499 }
500
Jiyong Park77acec62020-06-01 21:39:15 +0900501 dex_import {
502 name: "myjar_dex",
503 jars: ["prebuilt.jar"],
504 apex_available: [
505 "//apex_available:platform",
506 "myapex",
507 ],
508 }
509
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 java_library {
511 name: "myotherjar",
512 srcs: ["foo/bar/MyClass.java"],
513 sdk_version: "none",
514 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900515 // TODO: remove //apex_available:platform
516 apex_available: [
517 "//apex_available:platform",
518 "myapex",
519 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900520 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900521
522 java_library {
523 name: "mysharedjar",
524 srcs: ["foo/bar/MyClass.java"],
525 sdk_version: "none",
526 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900527 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900528 `)
529
Jooyung Hana0503a52023-08-23 13:12:50 +0900530 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900531
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900532 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900533 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700534 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900535 var builder strings.Builder
536 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
537
538 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000539 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900540 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
541
Jiyong Park42cca6c2019-04-01 11:15:50 +0900542 optFlags := apexRule.Args["opt_flags"]
543 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700544 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900545 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900546
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547 copyCmds := apexRule.Args["copy_commands"]
548
549 // Ensure that main rule creates an output
550 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
551
552 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900558
559 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700560 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
561 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
563 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700564 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900567
568 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800569 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
570 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900571 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900572 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900573 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700574 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900575 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
576 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900577 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900578 // .. but not for java libs
579 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900580 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800581
Colin Cross7113d202019-11-20 16:39:12 -0800582 // Ensure that the platform variant ends with _shared or _common
583 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
584 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900585 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
586 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900587 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
588
589 // Ensure that dynamic dependency to java libs are not included
590 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800591
592 // Ensure that all symlinks are present.
593 found_foo_link_64 := false
594 found_foo := false
595 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900596 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800597 if strings.HasSuffix(cmd, "bin/foo") {
598 found_foo = true
599 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
600 found_foo_link_64 = true
601 }
602 }
603 }
604 good := found_foo && found_foo_link_64
605 if !good {
606 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
607 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900608
Colin Crossf61d03d2023-11-02 16:56:39 -0700609 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
610 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100612 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
613 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
614 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100615
Colin Crossf61d03d2023-11-02 16:56:39 -0700616 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
617 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100618 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100619 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
620 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
621 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800622}
623
Jooyung Hanf21c7972019-12-16 22:32:06 +0900624func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700625 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800626 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900627 apex_defaults {
628 name: "myapex-defaults",
629 key: "myapex.key",
630 prebuilts: ["myetc"],
631 native_shared_libs: ["mylib"],
632 java_libs: ["myjar"],
633 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900634 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800635 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000636 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900637 }
638
639 prebuilt_etc {
640 name: "myetc",
641 src: "myprebuilt",
642 }
643
644 apex {
645 name: "myapex",
646 defaults: ["myapex-defaults"],
647 }
648
649 apex_key {
650 name: "myapex.key",
651 public_key: "testkey.avbpubkey",
652 private_key: "testkey.pem",
653 }
654
655 cc_library {
656 name: "mylib",
657 system_shared_libs: [],
658 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000659 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900660 }
661
662 java_library {
663 name: "myjar",
664 srcs: ["foo/bar/MyClass.java"],
665 sdk_version: "none",
666 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000667 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800668 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900669 }
670
671 android_app {
672 name: "AppFoo",
673 srcs: ["foo/bar/MyClass.java"],
674 sdk_version: "none",
675 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000676 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900678
679 runtime_resource_overlay {
680 name: "rro",
681 theme: "blue",
682 }
683
markchien2f59ec92020-09-02 16:23:38 +0800684 bpf {
685 name: "bpf",
686 srcs: ["bpf.c", "bpf2.c"],
687 }
688
Ken Chenfad7f9d2021-11-10 22:02:57 +0800689 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800690 name: "netdTest",
691 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800692 sub_dir: "netd",
693 }
694
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900696 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900697 "etc/myetc",
698 "javalib/myjar.jar",
699 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000700 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900701 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800702 "etc/bpf/bpf.o",
703 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800704 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900705 })
706}
707
Jooyung Han01a3ee22019-11-02 02:52:25 +0900708func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700709 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800710 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900711 apex {
712 name: "myapex",
713 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000714 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900715 }
716
717 apex_key {
718 name: "myapex.key",
719 public_key: "testkey.avbpubkey",
720 private_key: "testkey.pem",
721 }
722 `)
723
Jooyung Hana0503a52023-08-23 13:12:50 +0900724 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900725 args := module.Rule("apexRule").Args
726 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
727 t.Error("manifest should be apex_manifest.pb, but " + manifest)
728 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900729}
730
Liz Kammer4854a7d2021-05-27 14:28:27 -0400731func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700732 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400733 ctx := testApex(t, `
734 apex_defaults {
735 name: "my_defaults",
736 key: "myapex.key",
737 product_specific: true,
738 file_contexts: ":my-file-contexts",
739 updatable: false,
740 }
741 apex {
742 name: "myapex_30",
743 min_sdk_version: "30",
744 defaults: ["my_defaults"],
745 }
746
747 apex {
748 name: "myapex_current",
749 min_sdk_version: "current",
750 defaults: ["my_defaults"],
751 }
752
753 apex {
754 name: "myapex_none",
755 defaults: ["my_defaults"],
756 }
757
758 apex_key {
759 name: "myapex.key",
760 public_key: "testkey.avbpubkey",
761 private_key: "testkey.pem",
762 }
763
764 filegroup {
765 name: "my-file-contexts",
766 srcs: ["product_specific_file_contexts"],
767 }
768 `, withFiles(map[string][]byte{
769 "product_specific_file_contexts": nil,
770 }), android.FixtureModifyProductVariables(
771 func(variables android.FixtureProductVariables) {
772 variables.Unbundled_build = proptools.BoolPtr(true)
773 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
774 }), android.FixtureMergeEnv(map[string]string{
775 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
776 }))
777
778 testCases := []struct {
779 module string
780 minSdkVersion string
781 }{
782 {
783 module: "myapex_30",
784 minSdkVersion: "30",
785 },
786 {
787 module: "myapex_current",
788 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
789 },
790 {
791 module: "myapex_none",
792 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
793 },
794 }
795 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900796 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400797 args := module.Rule("apexRule").Args
798 optFlags := args["opt_flags"]
799 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
800 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
801 }
802 }
803}
804
Jihoon Kang842b9992024-02-08 01:41:51 +0000805func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700806 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000807 ctx := testApex(t, `
808 apex_defaults {
809 name: "my_defaults",
810 key: "myapex.key",
811 product_specific: true,
812 file_contexts: ":my-file-contexts",
813 updatable: false,
814 }
815 apex {
816 name: "myapex_30",
817 min_sdk_version: "30",
818 defaults: ["my_defaults"],
819 }
820
821 apex {
822 name: "myapex_current",
823 min_sdk_version: "current",
824 defaults: ["my_defaults"],
825 }
826
827 apex {
828 name: "myapex_none",
829 defaults: ["my_defaults"],
830 }
831
832 apex_key {
833 name: "myapex.key",
834 public_key: "testkey.avbpubkey",
835 private_key: "testkey.pem",
836 }
837
838 filegroup {
839 name: "my-file-contexts",
840 srcs: ["product_specific_file_contexts"],
841 }
842 `, withFiles(map[string][]byte{
843 "product_specific_file_contexts": nil,
844 }), android.FixtureModifyProductVariables(
845 func(variables android.FixtureProductVariables) {
846 variables.Unbundled_build = proptools.BoolPtr(true)
847 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
848 }), android.FixtureMergeEnv(map[string]string{
849 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
850 }))
851
852 testCases := []struct {
853 module string
854 minSdkVersion string
855 }{
856 {
857 module: "myapex_30",
858 minSdkVersion: "30",
859 },
860 {
861 module: "myapex_current",
862 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
863 },
864 {
865 module: "myapex_none",
866 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
867 },
868 }
869 for _, tc := range testCases {
870 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
871 args := module.Rule("apexRule").Args
872 optFlags := args["opt_flags"]
873 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
874 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
875 }
876 }
877}
878
Jooyung Hanaf730952023-02-28 14:13:38 +0900879func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700880 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900881 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900882 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900883 if vendor {
884 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900885 }
886 ctx := testApex(t, `
887 apex {
888 name: "myapex",
889 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900891 `+prop+`
892 }
893
894 apex_key {
895 name: "myapex.key",
896 public_key: "testkey.avbpubkey",
897 private_key: "testkey.pem",
898 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900899 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900900
Jooyung Hana0503a52023-08-23 13:12:50 +0900901 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900902 if vendor {
903 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
904 rule.RuleParams.Command,
905 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900906 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900907 android.AssertStringDoesContain(t, "should force-label as system_file",
908 rule.RuleParams.Command,
909 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900910 }
911 }
912}
913
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700915 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800916 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 apex {
918 name: "myapex",
919 key: "myapex.key",
920 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900921 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000922 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 }
924
925 apex_key {
926 name: "myapex.key",
927 public_key: "testkey.avbpubkey",
928 private_key: "testkey.pem",
929 }
930
931 cc_library {
932 name: "mylib",
933 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800934 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 system_shared_libs: [],
936 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000937 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938 }
939
940 cc_library {
941 name: "mylib2",
942 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900943 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900944 system_shared_libs: [],
945 stl: "none",
946 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000947 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900948 versions: ["1", "2", "3"],
949 },
950 }
951
952 cc_library {
953 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900954 srcs: ["mylib.cpp"],
955 shared_libs: ["mylib4"],
956 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957 stl: "none",
958 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000959 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960 versions: ["10", "11", "12"],
961 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000962 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900964
965 cc_library {
966 name: "mylib4",
967 srcs: ["mylib.cpp"],
968 system_shared_libs: [],
969 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000970 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900971 }
Jiyong Park105dc322021-06-11 17:22:09 +0900972
Spandan Das357ffcc2024-07-24 18:07:48 +0000973 cc_prebuilt_library_shared {
974 name: "my_prebuilt_platform_lib",
975 stubs: {
976 symbol_file: "my_prebuilt_platform_lib.map.txt",
977 versions: ["1", "2", "3"],
978 },
979 srcs: ["foo.so"],
980 }
981
982 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
983 cc_prebuilt_library_shared {
984 name: "my_prebuilt_platform_stub_only_lib",
985 stubs: {
986 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
987 versions: ["1", "2", "3"],
988 }
989 }
990
Jiyong Park105dc322021-06-11 17:22:09 +0900991 rust_binary {
992 name: "foo.rust",
993 srcs: ["foo.rs"],
994 shared_libs: ["libfoo.shared_from_rust"],
995 prefer_rlib: true,
996 apex_available: ["myapex"],
997 }
998
999 cc_library_shared {
1000 name: "libfoo.shared_from_rust",
1001 srcs: ["mylib.cpp"],
1002 system_shared_libs: [],
1003 stl: "none",
1004 stubs: {
1005 versions: ["10", "11", "12"],
1006 },
1007 }
1008
Jiyong Park25fc6a92018-11-18 18:02:45 +09001009 `)
1010
Jooyung Hana0503a52023-08-23 13:12:50 +09001011 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012 copyCmds := apexRule.Args["copy_commands"]
1013
1014 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001015 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001016
1017 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001018 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001019
1020 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001021 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001022
Colin Crossaede88c2020-08-11 12:17:01 -07001023 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001024
1025 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001026 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001027 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001028 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001029
Colin Crossea91a172024-11-05 16:14:05 -08001030 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001031 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001032 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001033 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001034
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001035 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1036 // is replaced by sharing of "cFlags" in cc/builder.go.
1037 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1038 // module variable representing "cflags". So it was not detected by ensureNotContains.
1039 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1040 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1041 // including the original cflags's "-include mylib.h".
1042 //
Jiyong Park64379952018-12-13 18:37:29 +09001043 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001044 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1045 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001046
Jiyong Park85cc35a2022-07-17 11:30:47 +09001047 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1048 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1049 // Ensure that genstub for apex-provided lib is invoked with --apex
1050 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001051
Jooyung Hana0503a52023-08-23 13:12:50 +09001052 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001053 "lib64/mylib.so",
1054 "lib64/mylib3.so",
1055 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001056 "bin/foo.rust",
1057 "lib64/libc++.so", // by the implicit dependency from foo.rust
1058 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001059 })
Jiyong Park105dc322021-06-11 17:22:09 +09001060
1061 // Ensure that stub dependency from a rust module is not included
1062 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1063 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001064 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001065 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1066 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001067
Jooyung Hana0503a52023-08-23 13:12:50 +09001068 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001069 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001070
1071 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1072 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1073 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1074 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1075 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1076 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1077
1078 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1079 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1080 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1081 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1082 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1083 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001084}
1085
Jooyung Han20348752023-12-05 15:23:56 +09001086func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001087 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001088 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 vendor: true,
1093 updatable: false,
1094 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1095 }
1096
1097 apex_key {
1098 name: "myapex.key",
1099 public_key: "testkey.avbpubkey",
1100 private_key: "testkey.pem",
1101 }
1102
1103 cc_library {
1104 name: "libbar",
1105 srcs: ["mylib.cpp"],
1106 llndk: {
1107 symbol_file: "libbar.map.txt",
1108 }
1109 }
1110 `)
1111}
1112
Jiyong Park1bc84122021-06-22 20:23:05 +09001113func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001114 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001115 ctx := testApex(t, `
1116 apex {
1117 name: "myapex",
1118 key: "myapex.key",
1119 native_shared_libs: ["mylib"],
1120 binaries: ["foo.rust"],
1121 updatable: false,
1122 platform_apis: true,
1123 }
1124
1125 apex_key {
1126 name: "myapex.key",
1127 public_key: "testkey.avbpubkey",
1128 private_key: "testkey.pem",
1129 }
1130
1131 cc_library {
1132 name: "mylib",
1133 srcs: ["mylib.cpp"],
1134 shared_libs: ["mylib2"],
1135 system_shared_libs: [],
1136 stl: "none",
1137 apex_available: [ "myapex" ],
1138 }
1139
1140 cc_library {
1141 name: "mylib2",
1142 srcs: ["mylib.cpp"],
1143 cflags: ["-include mylib.h"],
1144 system_shared_libs: [],
1145 stl: "none",
1146 stubs: {
1147 versions: ["1", "2", "3"],
1148 },
1149 }
1150
1151 rust_binary {
1152 name: "foo.rust",
1153 srcs: ["foo.rs"],
1154 shared_libs: ["libfoo.shared_from_rust"],
1155 prefer_rlib: true,
1156 apex_available: ["myapex"],
1157 }
1158
1159 cc_library_shared {
1160 name: "libfoo.shared_from_rust",
1161 srcs: ["mylib.cpp"],
1162 system_shared_libs: [],
1163 stl: "none",
1164 stubs: {
1165 versions: ["10", "11", "12"],
1166 },
1167 }
1168 `)
1169
Jooyung Hana0503a52023-08-23 13:12:50 +09001170 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001171 copyCmds := apexRule.Args["copy_commands"]
1172
1173 // Ensure that indirect stubs dep is not included
1174 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1175 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1176
1177 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1178 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001179 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001180 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1181 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001182 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001183 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1184 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1185}
1186
Colin Cross7812fd32020-09-25 12:35:10 -07001187func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1188 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001189 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001190 apex {
1191 name: "myapex",
1192 key: "myapex.key",
1193 native_shared_libs: ["mylib", "mylib3"],
1194 min_sdk_version: "29",
1195 }
1196
1197 apex_key {
1198 name: "myapex.key",
1199 public_key: "testkey.avbpubkey",
1200 private_key: "testkey.pem",
1201 }
1202
1203 cc_library {
1204 name: "mylib",
1205 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001206 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001207 system_shared_libs: [],
1208 stl: "none",
1209 apex_available: [ "myapex" ],
1210 min_sdk_version: "28",
1211 }
1212
1213 cc_library {
1214 name: "mylib2",
1215 srcs: ["mylib.cpp"],
1216 cflags: ["-include mylib.h"],
1217 system_shared_libs: [],
1218 stl: "none",
1219 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001220 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001221 versions: ["28", "29", "30", "current"],
1222 },
1223 min_sdk_version: "28",
1224 }
1225
1226 cc_library {
1227 name: "mylib3",
1228 srcs: ["mylib.cpp"],
1229 shared_libs: ["mylib4"],
1230 system_shared_libs: [],
1231 stl: "none",
1232 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001233 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001234 versions: ["28", "29", "30", "current"],
1235 },
1236 apex_available: [ "myapex" ],
1237 min_sdk_version: "28",
1238 }
1239
1240 cc_library {
1241 name: "mylib4",
1242 srcs: ["mylib.cpp"],
1243 system_shared_libs: [],
1244 stl: "none",
1245 apex_available: [ "myapex" ],
1246 min_sdk_version: "28",
1247 }
1248 `)
1249
Jooyung Hana0503a52023-08-23 13:12:50 +09001250 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001251 copyCmds := apexRule.Args["copy_commands"]
1252
1253 // Ensure that direct non-stubs dep is always included
1254 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1255
1256 // Ensure that indirect stubs dep is not included
1257 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1258
1259 // Ensure that direct stubs dep is included
1260 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1261
1262 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1263
Jiyong Park55549df2021-02-26 23:57:23 +09001264 // Ensure that mylib is linking with the latest version of stub for mylib2
1265 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001266 // ... and not linking to the non-stub (impl) variant of mylib2
1267 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1268
Colin Crossea91a172024-11-05 16:14:05 -08001269 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001270 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1271 // .. and not linking to the stubs variant of mylib3
1272 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1273
1274 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001275 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001276 ensureNotContains(t, mylib2Cflags, "-include ")
1277
Jiyong Park85cc35a2022-07-17 11:30:47 +09001278 // Ensure that genstub is invoked with --systemapi
1279 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001280
Jooyung Hana0503a52023-08-23 13:12:50 +09001281 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001282 "lib64/mylib.so",
1283 "lib64/mylib3.so",
1284 "lib64/mylib4.so",
1285 })
1286}
1287
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001288func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1289 t.Parallel()
1290 // myapex (Z)
1291 // mylib -----------------.
1292 // |
1293 // otherapex (29) |
1294 // libstub's versions: 29 Z current
1295 // |
1296 // <platform> |
1297 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001298 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001299 apex {
1300 name: "myapex",
1301 key: "myapex.key",
1302 native_shared_libs: ["mylib"],
1303 min_sdk_version: "Z", // non-final
1304 }
1305
1306 cc_library {
1307 name: "mylib",
1308 srcs: ["mylib.cpp"],
1309 shared_libs: ["libstub"],
1310 apex_available: ["myapex"],
1311 min_sdk_version: "Z",
1312 }
1313
1314 apex_key {
1315 name: "myapex.key",
1316 public_key: "testkey.avbpubkey",
1317 private_key: "testkey.pem",
1318 }
1319
1320 apex {
1321 name: "otherapex",
1322 key: "myapex.key",
1323 native_shared_libs: ["libstub"],
1324 min_sdk_version: "29",
1325 }
1326
1327 cc_library {
1328 name: "libstub",
1329 srcs: ["mylib.cpp"],
1330 stubs: {
1331 versions: ["29", "Z", "current"],
1332 },
1333 apex_available: ["otherapex"],
1334 min_sdk_version: "29",
1335 }
1336
1337 // platform module depending on libstub from otherapex should use the latest stub("current")
1338 cc_library {
1339 name: "libplatform",
1340 srcs: ["mylib.cpp"],
1341 shared_libs: ["libstub"],
1342 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001343 `,
1344 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1345 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1346 variables.Platform_sdk_final = proptools.BoolPtr(false)
1347 variables.Platform_version_active_codenames = []string{"Z"}
1348 }),
1349 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001350
Jiyong Park55549df2021-02-26 23:57:23 +09001351 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001352 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001353 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001354 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001355 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001356
1357 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1358 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1359 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1360 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1361 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1362}
1363
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001364func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001365 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001366 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001367 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001368 name: "myapex2",
1369 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001370 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001371 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001372 }
1373
1374 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001375 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001376 public_key: "testkey.avbpubkey",
1377 private_key: "testkey.pem",
1378 }
1379
1380 cc_library {
1381 name: "mylib",
1382 srcs: ["mylib.cpp"],
1383 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001384 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001385 system_shared_libs: [],
1386 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001387 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001388 }
1389
1390 cc_library {
1391 name: "libfoo",
1392 srcs: ["mylib.cpp"],
1393 shared_libs: ["libbar"],
1394 system_shared_libs: [],
1395 stl: "none",
1396 stubs: {
1397 versions: ["10", "20", "30"],
1398 },
1399 }
1400
1401 cc_library {
1402 name: "libbar",
1403 srcs: ["mylib.cpp"],
1404 system_shared_libs: [],
1405 stl: "none",
1406 }
1407
Jiyong Park678c8812020-02-07 17:25:49 +09001408 cc_library_static {
1409 name: "libbaz",
1410 srcs: ["mylib.cpp"],
1411 system_shared_libs: [],
1412 stl: "none",
1413 apex_available: [ "myapex2" ],
1414 }
1415
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001416 `)
1417
Jooyung Hana0503a52023-08-23 13:12:50 +09001418 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001419 copyCmds := apexRule.Args["copy_commands"]
1420
1421 // Ensure that direct non-stubs dep is always included
1422 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1423
1424 // Ensure that indirect stubs dep is not included
1425 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1426
1427 // Ensure that dependency of stubs is not included
1428 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1429
Colin Crossaede88c2020-08-11 12:17:01 -07001430 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001431
1432 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001433 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001434 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001435 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001436
Jiyong Park3ff16992019-12-27 14:11:47 +09001437 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001438
1439 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1440 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001441
Colin Crossf61d03d2023-11-02 16:56:39 -07001442 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1443 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001444 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001445
Colin Crossf61d03d2023-11-02 16:56:39 -07001446 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1447 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001448 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001449}
1450
Jooyung Hand3639552019-08-09 12:57:43 +09001451func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001452 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001453 /*
1454 myapex
1455 |
1456 v (runtime_libs)
1457 mylib ------+------> libfoo [provides stub]
1458 |
1459 `------> libbar
1460 */
Colin Cross1c460562021-02-16 17:55:47 -08001461 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001462 apex {
1463 name: "myapex",
1464 key: "myapex.key",
1465 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001466 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001467 }
1468
1469 apex_key {
1470 name: "myapex.key",
1471 public_key: "testkey.avbpubkey",
1472 private_key: "testkey.pem",
1473 }
1474
1475 cc_library {
1476 name: "mylib",
1477 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001478 static_libs: ["libstatic"],
1479 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001480 runtime_libs: ["libfoo", "libbar"],
1481 system_shared_libs: [],
1482 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001483 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001484 }
1485
1486 cc_library {
1487 name: "libfoo",
1488 srcs: ["mylib.cpp"],
1489 system_shared_libs: [],
1490 stl: "none",
1491 stubs: {
1492 versions: ["10", "20", "30"],
1493 },
1494 }
1495
1496 cc_library {
1497 name: "libbar",
1498 srcs: ["mylib.cpp"],
1499 system_shared_libs: [],
1500 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001501 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001502 }
1503
Liz Kammer5f108fa2023-05-11 14:33:17 -04001504 cc_library {
1505 name: "libstatic",
1506 srcs: ["mylib.cpp"],
1507 system_shared_libs: [],
1508 stl: "none",
1509 apex_available: [ "myapex" ],
1510 runtime_libs: ["libstatic_to_runtime"],
1511 }
1512
1513 cc_library {
1514 name: "libshared",
1515 srcs: ["mylib.cpp"],
1516 system_shared_libs: [],
1517 stl: "none",
1518 apex_available: [ "myapex" ],
1519 runtime_libs: ["libshared_to_runtime"],
1520 }
1521
1522 cc_library {
1523 name: "libstatic_to_runtime",
1524 srcs: ["mylib.cpp"],
1525 system_shared_libs: [],
1526 stl: "none",
1527 apex_available: [ "myapex" ],
1528 }
1529
1530 cc_library {
1531 name: "libshared_to_runtime",
1532 srcs: ["mylib.cpp"],
1533 system_shared_libs: [],
1534 stl: "none",
1535 apex_available: [ "myapex" ],
1536 }
Jooyung Hand3639552019-08-09 12:57:43 +09001537 `)
1538
Jooyung Hana0503a52023-08-23 13:12:50 +09001539 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001540 copyCmds := apexRule.Args["copy_commands"]
1541
1542 // Ensure that direct non-stubs dep is always included
1543 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1544
1545 // Ensure that indirect stubs dep is not included
1546 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1547
1548 // Ensure that runtime_libs dep in included
1549 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001550 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1551 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1552
1553 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001554
Jooyung Hana0503a52023-08-23 13:12:50 +09001555 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001556 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1557 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001558}
1559
Paul Duffina02cae32021-03-09 01:44:06 +00001560var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1561 cc.PrepareForTestWithCcBuildComponents,
1562 PrepareForTestWithApexBuildComponents,
1563 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001564 apex {
1565 name: "com.android.runtime",
1566 key: "com.android.runtime.key",
1567 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001568 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001569 }
1570
1571 apex_key {
1572 name: "com.android.runtime.key",
1573 public_key: "testkey.avbpubkey",
1574 private_key: "testkey.pem",
1575 }
Paul Duffina02cae32021-03-09 01:44:06 +00001576 `),
1577 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1578)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001579
Paul Duffina02cae32021-03-09 01:44:06 +00001580func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001581 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001582 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 cc_library {
1584 name: "libc",
1585 no_libcrt: true,
1586 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001587 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588 stl: "none",
1589 system_shared_libs: [],
1590 stubs: { versions: ["1"] },
1591 apex_available: ["com.android.runtime"],
1592
1593 sanitize: {
1594 hwaddress: true,
1595 }
1596 }
1597
1598 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001599 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600 no_libcrt: true,
1601 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001602 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001603 stl: "none",
1604 system_shared_libs: [],
1605 srcs: [""],
1606 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001607 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001608
1609 sanitize: {
1610 never: true,
1611 },
Spandan Das4de7b492023-05-05 21:13:01 +00001612 apex_available: [
1613 "//apex_available:anyapex",
1614 "//apex_available:platform",
1615 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001616 } `)
1617 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001618
Jooyung Hana0503a52023-08-23 13:12:50 +09001619 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001620 "lib64/bionic/libc.so",
1621 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1622 })
1623
Colin Cross4c4c1be2022-02-10 11:41:18 -08001624 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001625
1626 installed := hwasan.Description("install libclang_rt.hwasan")
1627 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1628
1629 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1630 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1631 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1632}
1633
1634func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001635 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001636 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001637 prepareForTestOfRuntimeApexWithHwasan,
1638 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1639 variables.SanitizeDevice = []string{"hwaddress"}
1640 }),
1641 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001642 cc_library {
1643 name: "libc",
1644 no_libcrt: true,
1645 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001646 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001647 stl: "none",
1648 system_shared_libs: [],
1649 stubs: { versions: ["1"] },
1650 apex_available: ["com.android.runtime"],
1651 }
1652
1653 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001654 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001655 no_libcrt: true,
1656 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001657 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001658 stl: "none",
1659 system_shared_libs: [],
1660 srcs: [""],
1661 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001662 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001663
1664 sanitize: {
1665 never: true,
1666 },
Spandan Das4de7b492023-05-05 21:13:01 +00001667 apex_available: [
1668 "//apex_available:anyapex",
1669 "//apex_available:platform",
1670 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001671 }
Paul Duffina02cae32021-03-09 01:44:06 +00001672 `)
1673 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001674
Jooyung Hana0503a52023-08-23 13:12:50 +09001675 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001676 "lib64/bionic/libc.so",
1677 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1678 })
1679
Colin Cross4c4c1be2022-02-10 11:41:18 -08001680 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001681
1682 installed := hwasan.Description("install libclang_rt.hwasan")
1683 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1684
1685 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1686 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1687 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1688}
1689
Jooyung Han61b66e92020-03-21 14:21:46 +00001690func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001691 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001692 testcases := []struct {
1693 name string
1694 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001695 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001696 shouldLink string
1697 shouldNotLink []string
1698 }{
1699 {
Jiyong Park55549df2021-02-26 23:57:23 +09001700 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001701 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001702 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001703 shouldLink: "current",
1704 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001705 },
1706 {
Jiyong Park55549df2021-02-26 23:57:23 +09001707 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001708 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001709 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001710 shouldLink: "current",
1711 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 },
1713 }
1714 for _, tc := range testcases {
1715 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001716 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001717 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001718 apex {
1719 name: "myapex",
1720 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001721 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001722 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001723 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001725
Jooyung Han61b66e92020-03-21 14:21:46 +00001726 apex_key {
1727 name: "myapex.key",
1728 public_key: "testkey.avbpubkey",
1729 private_key: "testkey.pem",
1730 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001731
Jooyung Han61b66e92020-03-21 14:21:46 +00001732 cc_library {
1733 name: "mylib",
1734 srcs: ["mylib.cpp"],
1735 vendor_available: true,
1736 shared_libs: ["libbar"],
1737 system_shared_libs: [],
1738 stl: "none",
1739 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001740 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001741 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001742
Jooyung Han61b66e92020-03-21 14:21:46 +00001743 cc_library {
1744 name: "libbar",
1745 srcs: ["mylib.cpp"],
1746 system_shared_libs: [],
1747 stl: "none",
1748 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001749 llndk: {
1750 symbol_file: "libbar.map.txt",
1751 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001752 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001753 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001754 withUnbundledBuild,
1755 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001756
Jooyung Han61b66e92020-03-21 14:21:46 +00001757 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001758 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001759 "lib64/mylib.so",
1760 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001761
Jooyung Han61b66e92020-03-21 14:21:46 +00001762 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001763 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001764 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1765 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001766
Steven Moreland2c4000c2021-04-27 02:08:49 +00001767 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1768 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001769 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001770 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001771 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001772
Steven Moreland2c4000c2021-04-27 02:08:49 +00001773 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001774 ver := tc.shouldLink
1775 if tc.shouldLink == "current" {
1776 ver = strconv.Itoa(android.FutureApiLevelInt)
1777 }
1778 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001779 })
1780 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001781}
1782
Jiyong Park25fc6a92018-11-18 18:02:45 +09001783func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001784 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001785 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 apex {
1787 name: "myapex",
1788 key: "myapex.key",
1789 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001790 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 }
1792
1793 apex_key {
1794 name: "myapex.key",
1795 public_key: "testkey.avbpubkey",
1796 private_key: "testkey.pem",
1797 }
1798
1799 cc_library {
1800 name: "mylib",
1801 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001802 system_shared_libs: ["libc"],
1803 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001805 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001806 }
1807
1808 cc_library_shared {
1809 name: "mylib_shared",
1810 srcs: ["mylib.cpp"],
1811 shared_libs: ["libdl#27"],
1812 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001813 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814 }
1815
1816 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001817 name: "libBootstrap",
1818 srcs: ["mylib.cpp"],
1819 stl: "none",
1820 bootstrap: true,
1821 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822 `)
1823
Jooyung Hana0503a52023-08-23 13:12:50 +09001824 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001825 copyCmds := apexRule.Args["copy_commands"]
1826
1827 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001828 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001829 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1830 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831
1832 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001833 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001834
Colin Crossaede88c2020-08-11 12:17:01 -07001835 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1836 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1837 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001838
1839 // For dependency to libc
1840 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001841 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001842 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001843 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001844 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001845 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1846 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001847
1848 // For dependency to libm
1849 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001850 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001851 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001852 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001853 // ... and is not compiling with the stub
1854 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1855 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1856
1857 // For dependency to libdl
1858 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001859 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001860 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001861 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1862 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001863 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001864 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001865 // ... Cflags from stub is correctly exported to mylib
1866 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1867 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001868
1869 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001870 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1871 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1872 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1873 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001874}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001875
Jooyung Han749dc692020-04-15 11:03:39 +09001876func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001877 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001878 // there are three links between liba --> libz.
1879 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001880 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001881 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001882 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001883 apex {
1884 name: "myapex",
1885 key: "myapex.key",
1886 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001887 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001888 }
1889
1890 apex {
1891 name: "otherapex",
1892 key: "myapex.key",
1893 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001894 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001895 }
1896
1897 apex_key {
1898 name: "myapex.key",
1899 public_key: "testkey.avbpubkey",
1900 private_key: "testkey.pem",
1901 }
1902
1903 cc_library {
1904 name: "libx",
1905 shared_libs: ["liba"],
1906 system_shared_libs: [],
1907 stl: "none",
1908 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001909 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001910 }
1911
1912 cc_library {
1913 name: "liby",
1914 shared_libs: ["liba"],
1915 system_shared_libs: [],
1916 stl: "none",
1917 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001918 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001919 }
1920
1921 cc_library {
1922 name: "liba",
1923 shared_libs: ["libz"],
1924 system_shared_libs: [],
1925 stl: "none",
1926 apex_available: [
1927 "//apex_available:anyapex",
1928 "//apex_available:platform",
1929 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001930 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001931 }
1932
1933 cc_library {
1934 name: "libz",
1935 system_shared_libs: [],
1936 stl: "none",
1937 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001938 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001939 },
1940 }
Jooyung Han749dc692020-04-15 11:03:39 +09001941 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001942
1943 expectLink := func(from, from_variant, to, to_variant string) {
1944 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1945 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1946 }
1947 expectNoLink := func(from, from_variant, to, to_variant string) {
1948 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1949 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1950 }
1951 // platform liba is linked to non-stub version
1952 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001953 // liba in myapex is linked to current
1954 expectLink("liba", "shared_apex29", "libz", "shared_current")
1955 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001956 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001957 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001958 // liba in otherapex is linked to current
1959 expectLink("liba", "shared_apex30", "libz", "shared_current")
1960 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001961 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1962 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001963}
1964
Jooyung Hanaed150d2020-04-02 01:41:41 +09001965func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001966 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001967 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001968 apex {
1969 name: "myapex",
1970 key: "myapex.key",
1971 native_shared_libs: ["libx"],
1972 min_sdk_version: "R",
1973 }
1974
1975 apex_key {
1976 name: "myapex.key",
1977 public_key: "testkey.avbpubkey",
1978 private_key: "testkey.pem",
1979 }
1980
1981 cc_library {
1982 name: "libx",
1983 shared_libs: ["libz"],
1984 system_shared_libs: [],
1985 stl: "none",
1986 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001987 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001988 }
1989
1990 cc_library {
1991 name: "libz",
1992 system_shared_libs: [],
1993 stl: "none",
1994 stubs: {
1995 versions: ["29", "R"],
1996 },
1997 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001998 `,
1999 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2000 variables.Platform_version_active_codenames = []string{"R"}
2001 }),
2002 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002003
2004 expectLink := func(from, from_variant, to, to_variant string) {
2005 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2006 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2007 }
2008 expectNoLink := func(from, from_variant, to, to_variant string) {
2009 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2010 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2011 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002012 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2013 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002014 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2015 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002016}
2017
Jooyung Han4c4da062021-06-23 10:23:16 +09002018func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002019 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002020 testApex(t, `
2021 apex {
2022 name: "myapex",
2023 key: "myapex.key",
2024 java_libs: ["libx"],
2025 min_sdk_version: "S",
2026 }
2027
2028 apex_key {
2029 name: "myapex.key",
2030 public_key: "testkey.avbpubkey",
2031 private_key: "testkey.pem",
2032 }
2033
2034 java_library {
2035 name: "libx",
2036 srcs: ["a.java"],
2037 apex_available: [ "myapex" ],
2038 sdk_version: "current",
2039 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002040 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002041 }
2042 `,
2043 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2044 variables.Platform_version_active_codenames = []string{"S"}
2045 variables.Platform_sdk_codename = proptools.StringPtr("S")
2046 }),
2047 )
2048}
2049
Jooyung Han749dc692020-04-15 11:03:39 +09002050func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002051 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002052 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
2056 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002057 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002058 }
2059
2060 apex_key {
2061 name: "myapex.key",
2062 public_key: "testkey.avbpubkey",
2063 private_key: "testkey.pem",
2064 }
2065
2066 cc_library {
2067 name: "libx",
2068 shared_libs: ["libz"],
2069 system_shared_libs: [],
2070 stl: "none",
2071 apex_available: [ "myapex" ],
2072 }
2073
2074 cc_library {
2075 name: "libz",
2076 system_shared_libs: [],
2077 stl: "none",
2078 stubs: {
2079 versions: ["1", "2"],
2080 },
2081 }
2082 `)
2083
2084 expectLink := func(from, from_variant, to, to_variant string) {
2085 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2086 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2087 }
2088 expectNoLink := func(from, from_variant, to, to_variant string) {
2089 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2090 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2091 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002092 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002093 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002094 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002095 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002096}
2097
Jooyung Handfc864c2023-03-20 18:19:07 +09002098func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002099 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002100 ctx := testApex(t, `
2101 apex {
2102 name: "myapex",
2103 key: "myapex.key",
2104 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002105 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002106 vendor: true,
2107 min_sdk_version: "29",
2108 }
2109
2110 apex_key {
2111 name: "myapex.key",
2112 public_key: "testkey.avbpubkey",
2113 private_key: "testkey.pem",
2114 }
2115
2116 cc_library {
2117 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002118 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002119 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002120 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002121 shared_libs: ["libbar"],
2122 }
2123
2124 cc_library {
2125 name: "libbar",
2126 stubs: { versions: ["29", "30"] },
2127 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002128 }
2129 `)
2130
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002131 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002132
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002133 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002134
2135 // Ensure that mylib links with "current" LLNDK
2136 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002137 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002138
2139 // Ensure that mylib is targeting 29
2140 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2141 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2142
2143 // Ensure that the correct variant of crtbegin_so is used.
2144 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2145 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002146
2147 // Ensure that the crtbegin_so used by the APEX is targeting 29
2148 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2149 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2150}
2151
Jooyung Han4495f842023-04-25 16:39:59 +09002152func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002153 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002154 ctx := testApex(t, `
2155 apex {
2156 name: "myapex",
2157 key: "myapex.key",
2158 updatable: true,
2159 native_shared_libs: [
2160 "mylib",
2161 "yourlib",
2162 ],
2163 min_sdk_version: "29",
2164 }
2165
2166 apex {
2167 name: "myapex2",
2168 key: "myapex.key",
2169 updatable: false,
2170 native_shared_libs: ["yourlib"],
2171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "mylib",
2181 srcs: ["mylib.cpp"],
2182 shared_libs: ["libbar"],
2183 min_sdk_version: "29",
2184 apex_available: ["myapex"],
2185 }
2186
2187 cc_library {
2188 name: "libbar",
2189 stubs: { versions: ["29", "30"] },
2190 }
2191
2192 cc_library {
2193 name: "yourlib",
2194 srcs: ["mylib.cpp"],
2195 min_sdk_version: "29",
2196 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2197 }
2198 `, withFiles(android.MockFS{
2199 "packages/modules/common/build/allowed_deps.txt": nil,
2200 }))
2201
2202 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2203 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2204 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002205 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002206 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002207 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002208
Jooyung Hana0503a52023-08-23 13:12:50 +09002209 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002210 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2211 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002212 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2213 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2214 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2215 flatlist, "mylib:(minSdkVersion:29)")
2216 android.AssertStringListContains(t, "track platform-available lib",
2217 flatlist, "yourlib(minSdkVersion:29)")
2218}
2219
Nouby Mohamed8609a552024-09-04 22:19:51 +00002220func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002221 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002222 ctx := testApex(t, `
2223 apex {
2224 name: "myapex",
2225 key: "myapex.key",
2226 updatable: true,
2227 native_shared_libs: [
2228 "mylib",
2229 "yourlib",
2230 ],
2231 min_sdk_version: "29",
2232 }
2233
2234 apex {
2235 name: "myapex2",
2236 key: "myapex.key",
2237 updatable: false,
2238 native_shared_libs: ["yourlib"],
2239 }
2240
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246
2247 cc_library {
2248 name: "mylib",
2249 srcs: ["mylib.cpp"],
2250 shared_libs: ["libbar"],
2251 min_sdk_version: "29",
2252 apex_available: ["myapex"],
2253 }
2254
2255 cc_library {
2256 name: "libbar",
2257 stubs: { versions: ["29", "30"] },
2258 }
2259
2260 cc_library {
2261 name: "yourlib",
2262 srcs: ["mylib.cpp"],
2263 min_sdk_version: "29",
2264 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2265 }
2266 `, withFiles(android.MockFS{
2267 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2268 }),
2269 android.FixtureModifyProductVariables(
2270 func(variables android.FixtureProductVariables) {
2271 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2272 },
2273 ))
2274
2275 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2276 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2277 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2278 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2279 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2280 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2281
2282 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2283 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2284 myapex.Output("depsinfo/flatlist.txt")), "\n")
2285 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2286 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2287 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2288 flatlist, "mylib:(minSdkVersion:29)")
2289 android.AssertStringListContains(t, "track platform-available lib",
2290 flatlist, "yourlib(minSdkVersion:29)")
2291}
2292
2293func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002294 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002295 ctx := testApex(t, `
2296 apex {
2297 name: "myapex",
2298 key: "myapex.key",
2299 updatable: true,
2300 native_shared_libs: [
2301 "mylib",
2302 "yourlib",
2303 ],
2304 min_sdk_version: "29",
2305 }
2306
2307 apex {
2308 name: "myapex2",
2309 key: "myapex.key",
2310 updatable: false,
2311 native_shared_libs: ["yourlib"],
2312 }
2313
2314 apex_key {
2315 name: "myapex.key",
2316 public_key: "testkey.avbpubkey",
2317 private_key: "testkey.pem",
2318 }
2319
2320 cc_library {
2321 name: "mylib",
2322 srcs: ["mylib.cpp"],
2323 shared_libs: ["libbar"],
2324 min_sdk_version: "29",
2325 apex_available: ["myapex"],
2326 }
2327
2328 cc_library {
2329 name: "libbar",
2330 stubs: { versions: ["29", "30"] },
2331 }
2332
2333 cc_library {
2334 name: "yourlib",
2335 srcs: ["mylib.cpp"],
2336 min_sdk_version: "29",
2337 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2338 }
2339 `, withFiles(android.MockFS{
2340 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2341 "packages/modules/common/build/allowed_deps.txt": nil,
2342 }),
2343 android.FixtureModifyProductVariables(
2344 func(variables android.FixtureProductVariables) {
2345 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2346 },
2347 ))
2348
2349 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2350 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2351 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2352 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2353 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2354 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2355
2356 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2357 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2358 myapex.Output("depsinfo/flatlist.txt")), "\n")
2359 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2360 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2361 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2362 flatlist, "mylib:(minSdkVersion:29)")
2363 android.AssertStringListContains(t, "track platform-available lib",
2364 flatlist, "yourlib(minSdkVersion:29)")
2365}
2366
Jooyung Han4495f842023-04-25 16:39:59 +09002367func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002368 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002369 ctx := testApex(t, `
2370 apex {
2371 name: "myapex",
2372 key: "myapex.key",
2373 updatable: true,
2374 min_sdk_version: "29",
2375 }
2376
2377 apex_key {
2378 name: "myapex.key",
2379 public_key: "testkey.avbpubkey",
2380 private_key: "testkey.pem",
2381 }
2382 `)
2383 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2384 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2385 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2386 }
2387}
2388
Jooyung Han03b51852020-02-26 22:45:42 +09002389func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002390 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002391 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002392 apex {
2393 name: "myapex",
2394 key: "myapex.key",
2395 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002396 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002397 }
2398
2399 apex_key {
2400 name: "myapex.key",
2401 public_key: "testkey.avbpubkey",
2402 private_key: "testkey.pem",
2403 }
2404
2405 cc_library {
2406 name: "libx",
2407 system_shared_libs: [],
2408 stl: "none",
2409 apex_available: [ "myapex" ],
2410 stubs: {
2411 versions: ["1", "2"],
2412 },
2413 }
2414
2415 cc_library {
2416 name: "libz",
2417 shared_libs: ["libx"],
2418 system_shared_libs: [],
2419 stl: "none",
2420 }
2421 `)
2422
2423 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002424 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002425 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2426 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2427 }
2428 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002429 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002430 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2431 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2432 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002433 expectLink("libz", "shared", "libx", "shared_current")
2434 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002435 expectNoLink("libz", "shared", "libz", "shared_1")
2436 expectNoLink("libz", "shared", "libz", "shared")
2437}
2438
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002439var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2440 func(variables android.FixtureProductVariables) {
2441 variables.SanitizeDevice = []string{"hwaddress"}
2442 },
2443)
2444
Jooyung Han75568392020-03-20 04:29:24 +09002445func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002446 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002447 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002448 apex {
2449 name: "myapex",
2450 key: "myapex.key",
2451 native_shared_libs: ["libx"],
2452 min_sdk_version: "29",
2453 }
2454
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460
2461 cc_library {
2462 name: "libx",
2463 shared_libs: ["libbar"],
2464 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002465 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002466 }
2467
2468 cc_library {
2469 name: "libbar",
2470 stubs: {
2471 versions: ["29", "30"],
2472 },
2473 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002474 `,
2475 prepareForTestWithSantitizeHwaddress,
2476 )
Jooyung Han03b51852020-02-26 22:45:42 +09002477 expectLink := func(from, from_variant, to, to_variant string) {
2478 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2479 libFlags := ld.Args["libFlags"]
2480 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2481 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002482 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002483}
2484
Jooyung Han75568392020-03-20 04:29:24 +09002485func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002486 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002487 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002488 apex {
2489 name: "myapex",
2490 key: "myapex.key",
2491 native_shared_libs: ["libx"],
2492 min_sdk_version: "29",
2493 }
2494
2495 apex_key {
2496 name: "myapex.key",
2497 public_key: "testkey.avbpubkey",
2498 private_key: "testkey.pem",
2499 }
2500
2501 cc_library {
2502 name: "libx",
2503 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002504 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002505 }
Jooyung Han75568392020-03-20 04:29:24 +09002506 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002507
2508 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002509 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002510 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002511 // note that platform variant is not.
2512 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002513 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002514}
2515
Jooyung Han749dc692020-04-15 11:03:39 +09002516func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002517 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002518 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002522 native_shared_libs: ["mylib"],
2523 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002524 }
2525
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
Jooyung Han749dc692020-04-15 11:03:39 +09002531
2532 cc_library {
2533 name: "mylib",
2534 srcs: ["mylib.cpp"],
2535 system_shared_libs: [],
2536 stl: "none",
2537 apex_available: [
2538 "myapex",
2539 ],
2540 min_sdk_version: "30",
2541 }
2542 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002543
2544 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2545 apex {
2546 name: "myapex",
2547 key: "myapex.key",
2548 native_shared_libs: ["libfoo.ffi"],
2549 min_sdk_version: "29",
2550 }
2551
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557
2558 rust_ffi_shared {
2559 name: "libfoo.ffi",
2560 srcs: ["foo.rs"],
2561 crate_name: "foo",
2562 apex_available: [
2563 "myapex",
2564 ],
2565 min_sdk_version: "30",
2566 }
2567 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002568
2569 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2570 apex {
2571 name: "myapex",
2572 key: "myapex.key",
2573 java_libs: ["libfoo"],
2574 min_sdk_version: "29",
2575 }
2576
2577 apex_key {
2578 name: "myapex.key",
2579 public_key: "testkey.avbpubkey",
2580 private_key: "testkey.pem",
2581 }
2582
2583 java_import {
2584 name: "libfoo",
2585 jars: ["libfoo.jar"],
2586 apex_available: [
2587 "myapex",
2588 ],
2589 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002590 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002591 }
2592 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002593
2594 // Skip check for modules compiling against core API surface
2595 testApex(t, `
2596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
2599 java_libs: ["libfoo"],
2600 min_sdk_version: "29",
2601 }
2602
2603 apex_key {
2604 name: "myapex.key",
2605 public_key: "testkey.avbpubkey",
2606 private_key: "testkey.pem",
2607 }
2608
2609 java_library {
2610 name: "libfoo",
2611 srcs: ["Foo.java"],
2612 apex_available: [
2613 "myapex",
2614 ],
2615 // Compile against core API surface
2616 sdk_version: "core_current",
2617 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002618 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002619 }
2620 `)
2621
Jooyung Han749dc692020-04-15 11:03:39 +09002622}
2623
2624func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002625 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002626 testApex(t, `
2627 apex {
2628 name: "myapex",
2629 key: "myapex.key",
2630 native_shared_libs: ["libfoo"],
2631 java_libs: ["libbar"],
2632 min_sdk_version: "29",
2633 }
2634
2635 apex_key {
2636 name: "myapex.key",
2637 public_key: "testkey.avbpubkey",
2638 private_key: "testkey.pem",
2639 }
2640
2641 cc_library {
2642 name: "libfoo",
2643 srcs: ["mylib.cpp"],
2644 shared_libs: ["libfoo_dep"],
2645 apex_available: ["myapex"],
2646 min_sdk_version: "29",
2647 }
2648
2649 cc_library {
2650 name: "libfoo_dep",
2651 srcs: ["mylib.cpp"],
2652 apex_available: ["myapex"],
2653 min_sdk_version: "29",
2654 }
2655
2656 java_library {
2657 name: "libbar",
2658 sdk_version: "current",
2659 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002660 static_libs: [
2661 "libbar_dep",
2662 "libbar_import_dep",
2663 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002664 apex_available: ["myapex"],
2665 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002666 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002667 }
2668
2669 java_library {
2670 name: "libbar_dep",
2671 sdk_version: "current",
2672 srcs: ["a.java"],
2673 apex_available: ["myapex"],
2674 min_sdk_version: "29",
2675 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002676
2677 java_import {
2678 name: "libbar_import_dep",
2679 jars: ["libbar.jar"],
2680 apex_available: ["myapex"],
2681 min_sdk_version: "29",
2682 }
Jooyung Han03b51852020-02-26 22:45:42 +09002683 `)
2684}
2685
Colin Cross8ca61c12022-10-06 21:00:14 -07002686func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002687 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002688 // Tests that an apex dependency with min_sdk_version higher than the
2689 // min_sdk_version of the apex is allowed as long as the dependency's
2690 // min_sdk_version is less than or equal to the api level that the
2691 // architecture was introduced in. In this case, arm64 didn't exist
2692 // until api level 21, so the arm64 code will never need to run on
2693 // an api level 20 device, even if other architectures of the apex
2694 // will.
2695 testApex(t, `
2696 apex {
2697 name: "myapex",
2698 key: "myapex.key",
2699 native_shared_libs: ["libfoo"],
2700 min_sdk_version: "20",
2701 }
2702
2703 apex_key {
2704 name: "myapex.key",
2705 public_key: "testkey.avbpubkey",
2706 private_key: "testkey.pem",
2707 }
2708
2709 cc_library {
2710 name: "libfoo",
2711 srcs: ["mylib.cpp"],
2712 apex_available: ["myapex"],
2713 min_sdk_version: "21",
2714 stl: "none",
2715 }
2716 `)
2717}
2718
Artur Satayev8cf899a2020-04-15 17:29:42 +01002719func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002720 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002721 testCases := []struct {
2722 name string
2723 expectedError string
2724 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002725 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002726 }{
2727 {
2728 name: "Non-updatable apex with non-stable dep",
2729 bp: `
2730 apex {
2731 name: "myapex",
2732 java_libs: ["myjar"],
2733 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002734 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002735 }
2736 apex_key {
2737 name: "myapex.key",
2738 public_key: "testkey.avbpubkey",
2739 private_key: "testkey.pem",
2740 }
2741 java_library {
2742 name: "myjar",
2743 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002744 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002745 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002746 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002747 }
2748 `,
2749 },
2750 {
2751 name: "Updatable apex with stable dep",
2752 bp: `
2753 apex {
2754 name: "myapex",
2755 java_libs: ["myjar"],
2756 key: "myapex.key",
2757 updatable: true,
2758 min_sdk_version: "29",
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }
2765 java_library {
2766 name: "myjar",
2767 srcs: ["foo/bar/MyClass.java"],
2768 sdk_version: "current",
2769 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002770 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002771 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002772 }
2773 `,
2774 },
2775 {
2776 name: "Updatable apex with non-stable dep",
2777 expectedError: "cannot depend on \"myjar\"",
2778 bp: `
2779 apex {
2780 name: "myapex",
2781 java_libs: ["myjar"],
2782 key: "myapex.key",
2783 updatable: true,
2784 }
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790 java_library {
2791 name: "myjar",
2792 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002793 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002794 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002795 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002796 }
2797 `,
2798 },
2799 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002800 name: "Updatable apex with non-stable legacy core platform dep",
2801 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2802 bp: `
2803 apex {
2804 name: "myapex",
2805 java_libs: ["myjar-uses-legacy"],
2806 key: "myapex.key",
2807 updatable: true,
2808 }
2809 apex_key {
2810 name: "myapex.key",
2811 public_key: "testkey.avbpubkey",
2812 private_key: "testkey.pem",
2813 }
2814 java_library {
2815 name: "myjar-uses-legacy",
2816 srcs: ["foo/bar/MyClass.java"],
2817 sdk_version: "core_platform",
2818 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002819 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002820 }
2821 `,
2822 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2823 },
2824 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002825 name: "Updatable apex with non-stable transitive dep",
2826 // This is not actually detecting that the transitive dependency is unstable, rather it is
2827 // detecting that the transitive dependency is building against a wider API surface than the
2828 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002829 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002830 bp: `
2831 apex {
2832 name: "myapex",
2833 java_libs: ["myjar"],
2834 key: "myapex.key",
2835 updatable: true,
2836 }
2837 apex_key {
2838 name: "myapex.key",
2839 public_key: "testkey.avbpubkey",
2840 private_key: "testkey.pem",
2841 }
2842 java_library {
2843 name: "myjar",
2844 srcs: ["foo/bar/MyClass.java"],
2845 sdk_version: "current",
2846 apex_available: ["myapex"],
2847 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002848 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002849 }
2850 java_library {
2851 name: "transitive-jar",
2852 srcs: ["foo/bar/MyClass.java"],
2853 sdk_version: "core_platform",
2854 apex_available: ["myapex"],
2855 }
2856 `,
2857 },
2858 }
2859
2860 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002861 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2862 continue
2863 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002864 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002865 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002866 errorHandler := android.FixtureExpectsNoErrors
2867 if test.expectedError != "" {
2868 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002869 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002870 android.GroupFixturePreparers(
2871 java.PrepareForTestWithJavaDefaultModules,
2872 PrepareForTestWithApexBuildComponents,
2873 prepareForTestWithMyapex,
2874 android.OptionalFixturePreparer(test.preparer),
2875 ).
2876 ExtendWithErrorHandler(errorHandler).
2877 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002878 })
2879 }
2880}
2881
Jooyung Han749dc692020-04-15 11:03:39 +09002882func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2883 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2884 apex {
2885 name: "myapex",
2886 key: "myapex.key",
2887 native_shared_libs: ["mylib"],
2888 min_sdk_version: "29",
2889 }
2890
2891 apex_key {
2892 name: "myapex.key",
2893 public_key: "testkey.avbpubkey",
2894 private_key: "testkey.pem",
2895 }
2896
2897 cc_library {
2898 name: "mylib",
2899 srcs: ["mylib.cpp"],
2900 shared_libs: ["mylib2"],
2901 system_shared_libs: [],
2902 stl: "none",
2903 apex_available: [
2904 "myapex",
2905 ],
2906 min_sdk_version: "29",
2907 }
2908
2909 // indirect part of the apex
2910 cc_library {
2911 name: "mylib2",
2912 srcs: ["mylib.cpp"],
2913 system_shared_libs: [],
2914 stl: "none",
2915 apex_available: [
2916 "myapex",
2917 ],
2918 min_sdk_version: "30",
2919 }
2920 `)
2921}
2922
2923func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002924 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002925 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2926 apex {
2927 name: "myapex",
2928 key: "myapex.key",
2929 apps: ["AppFoo"],
2930 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002931 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002932 }
2933
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }
2939
2940 android_app {
2941 name: "AppFoo",
2942 srcs: ["foo/bar/MyClass.java"],
2943 sdk_version: "current",
2944 min_sdk_version: "29",
2945 system_modules: "none",
2946 stl: "none",
2947 static_libs: ["bar"],
2948 apex_available: [ "myapex" ],
2949 }
2950
2951 java_library {
2952 name: "bar",
2953 sdk_version: "current",
2954 srcs: ["a.java"],
2955 apex_available: [ "myapex" ],
2956 }
2957 `)
2958}
2959
2960func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002961 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002962 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002963 apex {
2964 name: "myapex",
2965 key: "myapex.key",
2966 native_shared_libs: ["mylib"],
2967 min_sdk_version: "29",
2968 }
2969
2970 apex_key {
2971 name: "myapex.key",
2972 public_key: "testkey.avbpubkey",
2973 private_key: "testkey.pem",
2974 }
2975
Colin Crossea91a172024-11-05 16:14:05 -08002976 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002977 cc_library {
2978 name: "mylib",
2979 srcs: ["mylib.cpp"],
2980 shared_libs: ["mylib2"],
2981 system_shared_libs: [],
2982 stl: "none",
2983 apex_available: ["myapex", "otherapex"],
2984 min_sdk_version: "29",
2985 }
2986
2987 cc_library {
2988 name: "mylib2",
2989 srcs: ["mylib.cpp"],
2990 system_shared_libs: [],
2991 stl: "none",
2992 apex_available: ["otherapex"],
2993 stubs: { versions: ["29", "30"] },
2994 min_sdk_version: "30",
2995 }
2996
2997 apex {
2998 name: "otherapex",
2999 key: "myapex.key",
3000 native_shared_libs: ["mylib", "mylib2"],
3001 min_sdk_version: "30",
3002 }
3003 `)
3004 expectLink := func(from, from_variant, to, to_variant string) {
3005 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3006 libFlags := ld.Args["libFlags"]
3007 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3008 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003009 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003010 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003011}
3012
Jooyung Haned124c32021-01-26 11:43:46 +09003013func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003014 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003015 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3016 func(variables android.FixtureProductVariables) {
3017 variables.Platform_sdk_codename = proptools.StringPtr("S")
3018 variables.Platform_version_active_codenames = []string{"S"}
3019 },
3020 )
Jooyung Haned124c32021-01-26 11:43:46 +09003021 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3022 apex {
3023 name: "myapex",
3024 key: "myapex.key",
3025 native_shared_libs: ["libfoo"],
3026 min_sdk_version: "S",
3027 }
3028 apex_key {
3029 name: "myapex.key",
3030 public_key: "testkey.avbpubkey",
3031 private_key: "testkey.pem",
3032 }
3033 cc_library {
3034 name: "libfoo",
3035 shared_libs: ["libbar"],
3036 apex_available: ["myapex"],
3037 min_sdk_version: "29",
3038 }
3039 cc_library {
3040 name: "libbar",
3041 apex_available: ["myapex"],
3042 }
3043 `, withSAsActiveCodeNames)
3044}
3045
3046func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003047 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003048 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3049 variables.Platform_sdk_codename = proptools.StringPtr("S")
3050 variables.Platform_version_active_codenames = []string{"S", "T"}
3051 })
Colin Cross1c460562021-02-16 17:55:47 -08003052 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003053 apex {
3054 name: "myapex",
3055 key: "myapex.key",
3056 native_shared_libs: ["libfoo"],
3057 min_sdk_version: "S",
3058 }
3059 apex_key {
3060 name: "myapex.key",
3061 public_key: "testkey.avbpubkey",
3062 private_key: "testkey.pem",
3063 }
3064 cc_library {
3065 name: "libfoo",
3066 shared_libs: ["libbar"],
3067 apex_available: ["myapex"],
3068 min_sdk_version: "S",
3069 }
3070 cc_library {
3071 name: "libbar",
3072 stubs: {
3073 symbol_file: "libbar.map.txt",
3074 versions: ["30", "S", "T"],
3075 },
3076 }
3077 `, withSAsActiveCodeNames)
3078
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003079 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003080 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3081 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003082 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003083}
3084
Jiyong Park7c2ee712018-12-07 00:42:25 +09003085func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003086 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003087 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003088 apex {
3089 name: "myapex",
3090 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003091 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003092 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003093 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003094 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003095 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003096 }
3097
3098 apex_key {
3099 name: "myapex.key",
3100 public_key: "testkey.avbpubkey",
3101 private_key: "testkey.pem",
3102 }
3103
3104 prebuilt_etc {
3105 name: "myetc",
3106 src: "myprebuilt",
3107 sub_dir: "foo/bar",
3108 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003109
3110 cc_library {
3111 name: "mylib",
3112 srcs: ["mylib.cpp"],
3113 relative_install_path: "foo/bar",
3114 system_shared_libs: [],
3115 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003116 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003117 }
3118
3119 cc_binary {
3120 name: "mybin",
3121 srcs: ["mylib.cpp"],
3122 relative_install_path: "foo/bar",
3123 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003124 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003125 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003126 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003127
3128 rust_binary {
3129 name: "mybin.rust",
3130 srcs: ["foo.rs"],
3131 relative_install_path: "rust_subdir",
3132 apex_available: [ "myapex" ],
3133 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003134 `)
3135
Jooyung Hana0503a52023-08-23 13:12:50 +09003136 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003137 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003138
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003139 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003140 ensureContains(t, cmd, "/etc ")
3141 ensureContains(t, cmd, "/etc/foo ")
3142 ensureContains(t, cmd, "/etc/foo/bar ")
3143 ensureContains(t, cmd, "/lib64 ")
3144 ensureContains(t, cmd, "/lib64/foo ")
3145 ensureContains(t, cmd, "/lib64/foo/bar ")
3146 ensureContains(t, cmd, "/lib ")
3147 ensureContains(t, cmd, "/lib/foo ")
3148 ensureContains(t, cmd, "/lib/foo/bar ")
3149 ensureContains(t, cmd, "/bin ")
3150 ensureContains(t, cmd, "/bin/foo ")
3151 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003152 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003153}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003154
Jooyung Han35155c42020-02-06 17:33:20 +09003155func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003156 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003157 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003158 apex {
3159 name: "myapex",
3160 key: "myapex.key",
3161 multilib: {
3162 both: {
3163 native_shared_libs: ["mylib"],
3164 binaries: ["mybin"],
3165 },
3166 },
3167 compile_multilib: "both",
3168 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003169 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003170 }
3171
3172 apex_key {
3173 name: "myapex.key",
3174 public_key: "testkey.avbpubkey",
3175 private_key: "testkey.pem",
3176 }
3177
3178 cc_library {
3179 name: "mylib",
3180 relative_install_path: "foo/bar",
3181 system_shared_libs: [],
3182 stl: "none",
3183 apex_available: [ "myapex" ],
3184 native_bridge_supported: true,
3185 }
3186
3187 cc_binary {
3188 name: "mybin",
3189 relative_install_path: "foo/bar",
3190 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003191 stl: "none",
3192 apex_available: [ "myapex" ],
3193 native_bridge_supported: true,
3194 compile_multilib: "both", // default is "first" for binary
3195 multilib: {
3196 lib64: {
3197 suffix: "64",
3198 },
3199 },
3200 }
3201 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003202 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003203 "bin/foo/bar/mybin",
3204 "bin/foo/bar/mybin64",
3205 "bin/arm/foo/bar/mybin",
3206 "bin/arm64/foo/bar/mybin64",
3207 "lib/foo/bar/mylib.so",
3208 "lib/arm/foo/bar/mylib.so",
3209 "lib64/foo/bar/mylib.so",
3210 "lib64/arm64/foo/bar/mylib.so",
3211 })
3212}
3213
Jooyung Han85d61762020-06-24 23:50:26 +09003214func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003215 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003216 result := android.GroupFixturePreparers(
3217 prepareForApexTest,
3218 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3219 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003220 apex {
3221 name: "myapex",
3222 key: "myapex.key",
3223 binaries: ["mybin"],
3224 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003225 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003226 }
3227 apex_key {
3228 name: "myapex.key",
3229 public_key: "testkey.avbpubkey",
3230 private_key: "testkey.pem",
3231 }
3232 cc_binary {
3233 name: "mybin",
3234 vendor: true,
3235 shared_libs: ["libfoo"],
3236 }
3237 cc_library {
3238 name: "libfoo",
3239 proprietary: true,
3240 }
3241 `)
3242
Jooyung Hana0503a52023-08-23 13:12:50 +09003243 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003244 "bin/mybin",
3245 "lib64/libfoo.so",
3246 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3247 "lib64/libc++.so",
3248 })
3249
Jooyung Hana0503a52023-08-23 13:12:50 +09003250 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003251 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003252 name := apexBundle.BaseModuleName()
3253 prefix := "TARGET_"
3254 var builder strings.Builder
3255 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003256 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003257 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003258 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003259
Jooyung Hana0503a52023-08-23 13:12:50 +09003260 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003261 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3262 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003263}
3264
Justin Yun13decfb2021-03-08 19:25:55 +09003265func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003266 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003267 ctx := testApex(t, `
3268 apex {
3269 name: "myapex",
3270 key: "myapex.key",
3271 updatable: false,
3272 product_specific: true,
3273 binaries: ["foo"],
3274 }
3275
3276 apex_key {
3277 name: "myapex.key",
3278 public_key: "testkey.avbpubkey",
3279 private_key: "testkey.pem",
3280 }
3281
3282 cc_binary {
3283 name: "foo",
3284 product_available: true,
3285 apex_available: ["myapex"],
3286 srcs: ["foo.cpp"],
3287 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003288 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003289
3290 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003291 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003292 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3293 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3294 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3295 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3296}
3297
Jooyung Han8e5685d2020-09-21 11:02:57 +09003298func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003299 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003300 testCases := []struct {
3301 name string
3302 additionalProp string
3303 }{
3304 {"system apex with prebuilt_firmware", ""},
3305 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3306 }
3307 for _, tc := range testCases {
3308 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003309 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003310 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003311 apex {
3312 name: "myapex",
3313 key: "myapex.key",
3314 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003315 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003316 `+tc.additionalProp+`
3317 }
3318 apex_key {
3319 name: "myapex.key",
3320 public_key: "testkey.avbpubkey",
3321 private_key: "testkey.pem",
3322 }
3323 prebuilt_firmware {
3324 name: "myfirmware",
3325 src: "myfirmware.bin",
3326 filename_from_src: true,
3327 `+tc.additionalProp+`
3328 }
3329 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003330 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003331 "etc/firmware/myfirmware.bin",
3332 })
3333 })
3334 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003335}
3336
Jooyung Hanefb184e2020-06-25 17:14:25 +09003337func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003338 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003339 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003340 apex {
3341 name: "myapex",
3342 key: "myapex.key",
3343 vendor: true,
3344 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003345 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003346 }
3347
3348 apex_key {
3349 name: "myapex.key",
3350 public_key: "testkey.avbpubkey",
3351 private_key: "testkey.pem",
3352 }
3353
3354 cc_library {
3355 name: "mylib",
3356 vendor_available: true,
3357 }
3358 `)
3359
Jooyung Hana0503a52023-08-23 13:12:50 +09003360 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003361 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003362 name := apexBundle.BaseModuleName()
3363 prefix := "TARGET_"
3364 var builder strings.Builder
3365 data.Custom(&builder, name, prefix, "", data)
3366 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003367 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003368}
3369
Jooyung Han2ed99d02020-06-24 23:26:26 +09003370func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003371 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003372 apex {
3373 name: "myapex",
3374 key: "myapex.key",
3375 vintf_fragments: ["fragment.xml"],
3376 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003377 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003378 }
3379 apex_key {
3380 name: "myapex.key",
3381 public_key: "testkey.avbpubkey",
3382 private_key: "testkey.pem",
3383 }
3384 cc_binary {
3385 name: "mybin",
3386 }
3387 `)
3388
Jooyung Hana0503a52023-08-23 13:12:50 +09003389 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003390 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003391 name := apexBundle.BaseModuleName()
3392 prefix := "TARGET_"
3393 var builder strings.Builder
3394 data.Custom(&builder, name, prefix, "", data)
3395 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003396 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003397 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003398}
3399
Jiyong Park16e91a02018-12-20 18:18:08 +09003400func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003401 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003402 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003403 apex {
3404 name: "myapex",
3405 key: "myapex.key",
3406 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003407 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003408 }
3409
3410 apex_key {
3411 name: "myapex.key",
3412 public_key: "testkey.avbpubkey",
3413 private_key: "testkey.pem",
3414 }
3415
3416 cc_library {
3417 name: "mylib",
3418 srcs: ["mylib.cpp"],
3419 system_shared_libs: [],
3420 stl: "none",
3421 stubs: {
3422 versions: ["1", "2", "3"],
3423 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003424 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003425 }
3426
3427 cc_binary {
3428 name: "not_in_apex",
3429 srcs: ["mylib.cpp"],
3430 static_libs: ["mylib"],
3431 static_executable: true,
3432 system_shared_libs: [],
3433 stl: "none",
3434 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003435 `)
3436
Colin Cross7113d202019-11-20 16:39:12 -08003437 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003438
3439 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003440 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003441}
Jiyong Park9335a262018-12-24 11:31:58 +09003442
3443func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003444 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003445 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003446 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003447 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003448 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003449 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003450 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003451 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003452 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003453 }
3454
3455 cc_library {
3456 name: "mylib",
3457 srcs: ["mylib.cpp"],
3458 system_shared_libs: [],
3459 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003460 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003461 }
3462
3463 apex_key {
3464 name: "myapex.key",
3465 public_key: "testkey.avbpubkey",
3466 private_key: "testkey.pem",
3467 }
3468
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003469 android_app_certificate {
3470 name: "myapex.certificate",
3471 certificate: "testkey",
3472 }
3473
3474 android_app_certificate {
3475 name: "myapex.certificate.override",
3476 certificate: "testkey.override",
3477 }
3478
Jiyong Park9335a262018-12-24 11:31:58 +09003479 `)
3480
3481 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003482 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003483
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003484 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3485 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003486 "vendor/foo/devkeys/testkey.avbpubkey")
3487 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003488 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3489 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003490 "vendor/foo/devkeys/testkey.pem")
3491 }
3492
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003493 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003494 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003495 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003496 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003497 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003498 }
3499}
Jiyong Park58e364a2019-01-19 19:24:06 +09003500
Jooyung Hanf121a652019-12-17 14:30:11 +09003501func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003502 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003503 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003504 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003505 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003506 apex {
3507 name: "myapex",
3508 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003509 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003510 }
3511 apex_key {
3512 name: "myapex.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003516 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003517 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3518 if actual := rule.Args["certificates"]; actual != expected {
3519 t.Errorf("certificates should be %q, not %q", expected, actual)
3520 }
3521 })
3522 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003523 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003524 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003525 apex {
3526 name: "myapex_keytest",
3527 key: "myapex.key",
3528 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003529 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003530 }
3531 apex_key {
3532 name: "myapex.key",
3533 public_key: "testkey.avbpubkey",
3534 private_key: "testkey.pem",
3535 }
3536 android_app_certificate {
3537 name: "myapex.certificate.override",
3538 certificate: "testkey.override",
3539 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003540 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003541 expected := "testkey.override.x509.pem testkey.override.pk8"
3542 if actual := rule.Args["certificates"]; actual != expected {
3543 t.Errorf("certificates should be %q, not %q", expected, actual)
3544 }
3545 })
3546 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003547 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003548 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003549 apex {
3550 name: "myapex",
3551 key: "myapex.key",
3552 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003553 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003554 }
3555 apex_key {
3556 name: "myapex.key",
3557 public_key: "testkey.avbpubkey",
3558 private_key: "testkey.pem",
3559 }
3560 android_app_certificate {
3561 name: "myapex.certificate",
3562 certificate: "testkey",
3563 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003564 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003565 expected := "testkey.x509.pem testkey.pk8"
3566 if actual := rule.Args["certificates"]; actual != expected {
3567 t.Errorf("certificates should be %q, not %q", expected, actual)
3568 }
3569 })
3570 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003571 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003572 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003573 apex {
3574 name: "myapex_keytest",
3575 key: "myapex.key",
3576 file_contexts: ":myapex-file_contexts",
3577 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003578 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003579 }
3580 apex_key {
3581 name: "myapex.key",
3582 public_key: "testkey.avbpubkey",
3583 private_key: "testkey.pem",
3584 }
3585 android_app_certificate {
3586 name: "myapex.certificate.override",
3587 certificate: "testkey.override",
3588 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003589 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003590 expected := "testkey.override.x509.pem testkey.override.pk8"
3591 if actual := rule.Args["certificates"]; actual != expected {
3592 t.Errorf("certificates should be %q, not %q", expected, actual)
3593 }
3594 })
3595 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003596 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003597 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003598 apex {
3599 name: "myapex",
3600 key: "myapex.key",
3601 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003602 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003603 }
3604 apex_key {
3605 name: "myapex.key",
3606 public_key: "testkey.avbpubkey",
3607 private_key: "testkey.pem",
3608 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003609 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003610 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3611 if actual := rule.Args["certificates"]; actual != expected {
3612 t.Errorf("certificates should be %q, not %q", expected, actual)
3613 }
3614 })
3615 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003616 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003617 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003618 apex {
3619 name: "myapex_keytest",
3620 key: "myapex.key",
3621 file_contexts: ":myapex-file_contexts",
3622 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003623 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003624 }
3625 apex_key {
3626 name: "myapex.key",
3627 public_key: "testkey.avbpubkey",
3628 private_key: "testkey.pem",
3629 }
3630 android_app_certificate {
3631 name: "myapex.certificate.override",
3632 certificate: "testkey.override",
3633 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003634 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003635 expected := "testkey.override.x509.pem testkey.override.pk8"
3636 if actual := rule.Args["certificates"]; actual != expected {
3637 t.Errorf("certificates should be %q, not %q", expected, actual)
3638 }
3639 })
3640}
3641
Jiyong Park58e364a2019-01-19 19:24:06 +09003642func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003643 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003644 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003645 apex {
3646 name: "myapex",
3647 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003648 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003649 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003650 }
3651
3652 apex {
3653 name: "otherapex",
3654 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003655 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003656 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003657 }
3658
3659 apex_key {
3660 name: "myapex.key",
3661 public_key: "testkey.avbpubkey",
3662 private_key: "testkey.pem",
3663 }
3664
3665 cc_library {
3666 name: "mylib",
3667 srcs: ["mylib.cpp"],
3668 system_shared_libs: [],
3669 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003670 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003671 "myapex",
3672 "otherapex",
3673 ],
Jooyung Han24282772020-03-21 23:20:55 +09003674 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003675 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003676 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003677 cc_library {
3678 name: "mylib2",
3679 srcs: ["mylib.cpp"],
3680 system_shared_libs: [],
3681 stl: "none",
3682 apex_available: [
3683 "myapex",
3684 "otherapex",
3685 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003686 static_libs: ["mylib3"],
3687 recovery_available: true,
3688 min_sdk_version: "29",
3689 }
3690 cc_library {
3691 name: "mylib3",
3692 srcs: ["mylib.cpp"],
3693 system_shared_libs: [],
3694 stl: "none",
3695 apex_available: [
3696 "myapex",
3697 "otherapex",
3698 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003699 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003700 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003701 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003702 `)
3703
Jooyung Hanc87a0592020-03-02 17:44:33 +09003704 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003705 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003706 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003707
Vinh Tranf9754732023-01-19 22:41:46 -05003708 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003709 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003710 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003711
Vinh Tranf9754732023-01-19 22:41:46 -05003712 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003713 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003714 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003715
Colin Crossaede88c2020-08-11 12:17:01 -07003716 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3717 // each variant defines additional macros to distinguish which apex variant it is built for
3718
3719 // non-APEX variant does not have __ANDROID_APEX__ defined
3720 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3721 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3722
Vinh Tranf9754732023-01-19 22:41:46 -05003723 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003724 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3725 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003726
Jooyung Hanc87a0592020-03-02 17:44:33 +09003727 // non-APEX variant does not have __ANDROID_APEX__ defined
3728 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3729 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3730
Vinh Tranf9754732023-01-19 22:41:46 -05003731 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003732 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003733 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003734}
Jiyong Park7e636d02019-01-28 16:16:54 +09003735
3736func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003737 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003738 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003739 apex {
3740 name: "myapex",
3741 key: "myapex.key",
3742 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003743 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003744 }
3745
3746 apex_key {
3747 name: "myapex.key",
3748 public_key: "testkey.avbpubkey",
3749 private_key: "testkey.pem",
3750 }
3751
3752 cc_library_headers {
3753 name: "mylib_headers",
3754 export_include_dirs: ["my_include"],
3755 system_shared_libs: [],
3756 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003757 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003758 }
3759
3760 cc_library {
3761 name: "mylib",
3762 srcs: ["mylib.cpp"],
3763 system_shared_libs: [],
3764 stl: "none",
3765 header_libs: ["mylib_headers"],
3766 export_header_lib_headers: ["mylib_headers"],
3767 stubs: {
3768 versions: ["1", "2", "3"],
3769 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003770 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003771 }
3772
3773 cc_library {
3774 name: "otherlib",
3775 srcs: ["mylib.cpp"],
3776 system_shared_libs: [],
3777 stl: "none",
3778 shared_libs: ["mylib"],
3779 }
3780 `)
3781
Colin Cross7113d202019-11-20 16:39:12 -08003782 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003783
3784 // Ensure that the include path of the header lib is exported to 'otherlib'
3785 ensureContains(t, cFlags, "-Imy_include")
3786}
Alex Light9670d332019-01-29 18:07:33 -08003787
Jiyong Park7cd10e32020-01-14 09:22:18 +09003788type fileInApex struct {
3789 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003790 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003791 isLink bool
3792}
3793
Jooyung Han1724d582022-12-21 10:17:44 +09003794func (f fileInApex) String() string {
3795 return f.src + ":" + f.path
3796}
3797
3798func (f fileInApex) match(expectation string) bool {
3799 parts := strings.Split(expectation, ":")
3800 if len(parts) == 1 {
3801 match, _ := path.Match(parts[0], f.path)
3802 return match
3803 }
3804 if len(parts) == 2 {
3805 matchSrc, _ := path.Match(parts[0], f.src)
3806 matchDst, _ := path.Match(parts[1], f.path)
3807 return matchSrc && matchDst
3808 }
3809 panic("invalid expected file specification: " + expectation)
3810}
3811
Jooyung Hana57af4a2020-01-23 05:36:59 +00003812func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003813 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003814 module := ctx.ModuleForTests(moduleName, variant)
3815 apexRule := module.MaybeRule("apexRule")
3816 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003817 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003818 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003819 for _, cmd := range strings.Split(copyCmds, "&&") {
3820 cmd = strings.TrimSpace(cmd)
3821 if cmd == "" {
3822 continue
3823 }
3824 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003825 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003826 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003827 switch terms[0] {
3828 case "mkdir":
3829 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003830 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003831 t.Fatal("copyCmds contains invalid cp command", cmd)
3832 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003833 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003834 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003835 isLink = false
3836 case "ln":
3837 if len(terms) != 3 && len(terms) != 4 {
3838 // ln LINK TARGET or ln -s LINK TARGET
3839 t.Fatal("copyCmds contains invalid ln command", cmd)
3840 }
3841 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003842 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003843 isLink = true
3844 default:
3845 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3846 }
3847 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003848 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003850 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 }
Jooyung Han1724d582022-12-21 10:17:44 +09003852 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003853 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003854 }
3855 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003856 return ret
3857}
3858
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003859func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003860 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003861 var failed bool
3862 var surplus []string
3863 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003864 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003865 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003866 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003867 if file.match(expected) {
3868 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003869 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003870 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003871 }
3872 }
Jooyung Han1724d582022-12-21 10:17:44 +09003873 if !matchFound {
3874 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003875 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003876 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003877
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003879 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 t.Log("surplus files", surplus)
3881 failed = true
3882 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003883
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003884 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003886 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003887 if !filesMatched[expected] {
3888 missing = append(missing, expected)
3889 }
3890 }
3891 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003892 t.Log("missing files", missing)
3893 failed = true
3894 }
3895 if failed {
3896 t.Fail()
3897 }
3898}
3899
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003900func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3901 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3902}
3903
3904func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003905 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003906 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3907 if deapexer.Output != nil {
3908 outputs = append(outputs, deapexer.Output.String())
3909 }
3910 for _, output := range deapexer.ImplicitOutputs {
3911 outputs = append(outputs, output.String())
3912 }
3913 actualFiles := make([]fileInApex, 0, len(outputs))
3914 for _, output := range outputs {
3915 dir := "/deapexer/"
3916 pos := strings.LastIndex(output, dir)
3917 if pos == -1 {
3918 t.Fatal("Unknown deapexer output ", output)
3919 }
3920 path := output[pos+len(dir):]
3921 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3922 }
3923 assertFileListEquals(t, files, actualFiles)
3924}
3925
Jooyung Han39edb6c2019-11-06 16:53:07 +09003926func vndkLibrariesTxtFiles(vers ...string) (result string) {
3927 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003928 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003929 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003930 prebuilt_etc {
3931 name: "` + txt + `.libraries.` + v + `.txt",
3932 src: "dummy.txt",
3933 }
3934 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003935 }
3936 }
3937 return
3938}
3939
Jooyung Han344d5432019-08-23 11:17:39 +09003940func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003942 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003943 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003944 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003945 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003946 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003947 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003948 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003949 }
3950
3951 apex_key {
3952 name: "myapex.key",
3953 public_key: "testkey.avbpubkey",
3954 private_key: "testkey.pem",
3955 }
3956
Jooyung Han31c470b2019-10-18 16:26:59 +09003957 vndk_prebuilt_shared {
3958 name: "libvndk27",
3959 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 vndk: {
3963 enabled: true,
3964 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003965 target_arch: "arm64",
3966 arch: {
3967 arm: {
3968 srcs: ["libvndk27_arm.so"],
3969 },
3970 arm64: {
3971 srcs: ["libvndk27_arm64.so"],
3972 },
3973 },
Colin Cross2807f002021-03-02 10:15:29 -08003974 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003975 }
3976
3977 vndk_prebuilt_shared {
3978 name: "libvndk27",
3979 version: "27",
3980 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003981 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003982 vndk: {
3983 enabled: true,
3984 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 target_arch: "x86_64",
3986 arch: {
3987 x86: {
3988 srcs: ["libvndk27_x86.so"],
3989 },
3990 x86_64: {
3991 srcs: ["libvndk27_x86_64.so"],
3992 },
3993 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003994 }
3995 `+vndkLibrariesTxtFiles("27"),
3996 withFiles(map[string][]byte{
3997 "libvndk27_arm.so": nil,
3998 "libvndk27_arm64.so": nil,
3999 "libvndk27_x86.so": nil,
4000 "libvndk27_x86_64.so": nil,
4001 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004002
Jooyung Hana0503a52023-08-23 13:12:50 +09004003 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004004 "lib/libvndk27_arm.so",
4005 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004006 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004007 })
Jooyung Han344d5432019-08-23 11:17:39 +09004008}
4009
Jooyung Han90eee022019-10-01 20:02:42 +09004010func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004011 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004012 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004013 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004014 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004015 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004016 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004017 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004018 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004019 }
4020 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004021 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004022 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004023 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004024 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004025 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004026 }
4027 apex_key {
4028 name: "myapex.key",
4029 public_key: "testkey.avbpubkey",
4030 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004031 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004032
4033 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004034 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004035 apexManifestRule := module.Rule("apexManifestRule")
4036 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004037 }
4038
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004039 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004040 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004041}
4042
Jooyung Han344d5432019-08-23 11:17:39 +09004043func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004044 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004045 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004046 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004047 name: "com.android.vndk.v30",
4048 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004049 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004050 native_bridge_supported: true,
4051 }
4052
4053 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004054 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004055 public_key: "testkey.avbpubkey",
4056 private_key: "testkey.pem",
4057 }
4058
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004059 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004060 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004061 version: "30",
4062 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004063 srcs: ["mylib.cpp"],
4064 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004065 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004066 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004067 vndk: {
4068 enabled: true,
4069 },
Jooyung Han344d5432019-08-23 11:17:39 +09004070 }
4071 `)
4072}
4073
Jooyung Han31c470b2019-10-18 16:26:59 +09004074func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004075 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004076 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004077 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004078 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004079 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004080 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004081 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004082 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004083 }
4084
4085 apex_key {
4086 name: "myapex.key",
4087 public_key: "testkey.avbpubkey",
4088 private_key: "testkey.pem",
4089 }
4090
4091 vndk_prebuilt_shared {
4092 name: "libvndk27",
4093 version: "27",
4094 target_arch: "arm",
4095 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004096 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004097 vndk: {
4098 enabled: true,
4099 },
4100 arch: {
4101 arm: {
4102 srcs: ["libvndk27.so"],
4103 }
4104 },
4105 }
4106
4107 vndk_prebuilt_shared {
4108 name: "libvndk27",
4109 version: "27",
4110 target_arch: "arm",
4111 binder32bit: true,
4112 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004113 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004114 vndk: {
4115 enabled: true,
4116 },
4117 arch: {
4118 arm: {
4119 srcs: ["libvndk27binder32.so"],
4120 }
4121 },
Colin Cross2807f002021-03-02 10:15:29 -08004122 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004123 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004124 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 withFiles(map[string][]byte{
4126 "libvndk27.so": nil,
4127 "libvndk27binder32.so": nil,
4128 }),
4129 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004130 android.FixtureModifyConfig(func(config android.Config) {
4131 target := android.Target{
4132 Os: android.Android,
4133 Arch: android.Arch{
4134 ArchType: android.Arm,
4135 ArchVariant: "armv7-a-neon",
4136 Abi: []string{"armeabi-v7a"},
4137 },
4138 NativeBridge: android.NativeBridgeDisabled,
4139 NativeBridgeHostArchName: "",
4140 NativeBridgeRelativePath: "",
4141 }
4142 config.Targets[android.Android] = []android.Target{target}
4143 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 }),
4145 )
4146
Jooyung Hana0503a52023-08-23 13:12:50 +09004147 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004148 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004149 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004150 })
4151}
4152
Jooyung Hane1633032019-08-01 17:41:43 +09004153func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004154 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004155 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004156 apex {
4157 name: "myapex_nodep",
4158 key: "myapex.key",
4159 native_shared_libs: ["lib_nodep"],
4160 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004161 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004162 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004163 }
4164
4165 apex {
4166 name: "myapex_dep",
4167 key: "myapex.key",
4168 native_shared_libs: ["lib_dep"],
4169 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004170 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004171 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004172 }
4173
4174 apex {
4175 name: "myapex_provider",
4176 key: "myapex.key",
4177 native_shared_libs: ["libfoo"],
4178 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004179 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004180 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004181 }
4182
4183 apex {
4184 name: "myapex_selfcontained",
4185 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004186 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004187 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004188 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004189 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004190 }
4191
4192 apex_key {
4193 name: "myapex.key",
4194 public_key: "testkey.avbpubkey",
4195 private_key: "testkey.pem",
4196 }
4197
4198 cc_library {
4199 name: "lib_nodep",
4200 srcs: ["mylib.cpp"],
4201 system_shared_libs: [],
4202 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004203 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004204 }
4205
4206 cc_library {
4207 name: "lib_dep",
4208 srcs: ["mylib.cpp"],
4209 shared_libs: ["libfoo"],
4210 system_shared_libs: [],
4211 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004212 apex_available: [
4213 "myapex_dep",
4214 "myapex_provider",
4215 "myapex_selfcontained",
4216 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004217 }
4218
4219 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004220 name: "lib_dep_on_bar",
4221 srcs: ["mylib.cpp"],
4222 shared_libs: ["libbar"],
4223 system_shared_libs: [],
4224 stl: "none",
4225 apex_available: [
4226 "myapex_selfcontained",
4227 ],
4228 }
4229
4230
4231 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004232 name: "libfoo",
4233 srcs: ["mytest.cpp"],
4234 stubs: {
4235 versions: ["1"],
4236 },
4237 system_shared_libs: [],
4238 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004239 apex_available: [
4240 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004241 ],
4242 }
4243
4244 cc_library {
4245 name: "libbar",
4246 srcs: ["mytest.cpp"],
4247 stubs: {
4248 versions: ["1"],
4249 },
4250 system_shared_libs: [],
4251 stl: "none",
4252 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004253 "myapex_selfcontained",
4254 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004255 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004256
Jooyung Hane1633032019-08-01 17:41:43 +09004257 `)
4258
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004259 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004260 var provideNativeLibs, requireNativeLibs []string
4261
Jooyung Hana0503a52023-08-23 13:12:50 +09004262 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004263 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4264 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004265 ensureListEmpty(t, provideNativeLibs)
4266 ensureListEmpty(t, requireNativeLibs)
4267
Jooyung Hana0503a52023-08-23 13:12:50 +09004268 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004269 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4270 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004271 ensureListEmpty(t, provideNativeLibs)
4272 ensureListContains(t, requireNativeLibs, "libfoo.so")
4273
Jooyung Hana0503a52023-08-23 13:12:50 +09004274 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004275 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4276 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004277 ensureListContains(t, provideNativeLibs, "libfoo.so")
4278 ensureListEmpty(t, requireNativeLibs)
4279
Jooyung Hana0503a52023-08-23 13:12:50 +09004280 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004281 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4282 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004283 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004284 ensureListEmpty(t, requireNativeLibs)
4285}
4286
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004287func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004288 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004289 ctx := testApex(t, `
4290 apex {
4291 name: "myapex",
4292 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004293 native_shared_libs: ["mylib"],
4294 updatable: false,
4295 }
4296
4297 apex_key {
4298 name: "myapex.key",
4299 public_key: "testkey.avbpubkey",
4300 private_key: "testkey.pem",
4301 }
4302
4303 cc_library {
4304 name: "mylib",
4305 srcs: ["mylib.cpp"],
4306 system_shared_libs: [],
4307 stl: "none",
4308 apex_available: [
4309 "//apex_available:platform",
4310 "myapex",
4311 ],
4312 }
4313 `, android.FixtureMergeEnv(map[string]string{
4314 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4315 }))
4316
Jooyung Hana0503a52023-08-23 13:12:50 +09004317 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004318 apexManifestRule := module.Rule("apexManifestRule")
4319 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4320}
4321
Vinh Tran8f5310f2022-10-07 18:16:47 -04004322func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004323 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004324 testCases := []struct {
4325 compileMultiLibProp string
4326 containedLibs []string
4327 notContainedLibs []string
4328 }{
4329 {
4330 containedLibs: []string{
4331 "image.apex/lib64/mylib.so",
4332 "image.apex/lib/mylib.so",
4333 },
4334 compileMultiLibProp: `compile_multilib: "both",`,
4335 },
4336 {
4337 containedLibs: []string{"image.apex/lib64/mylib.so"},
4338 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4339 compileMultiLibProp: `compile_multilib: "first",`,
4340 },
4341 {
4342 containedLibs: []string{"image.apex/lib64/mylib.so"},
4343 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4344 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4345 },
4346 {
4347 containedLibs: []string{"image.apex/lib64/mylib.so"},
4348 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4349 compileMultiLibProp: `compile_multilib: "64",`,
4350 },
4351 {
4352 containedLibs: []string{"image.apex/lib/mylib.so"},
4353 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4354 compileMultiLibProp: `compile_multilib: "32",`,
4355 },
4356 }
4357 for _, testCase := range testCases {
4358 ctx := testApex(t, fmt.Sprintf(`
4359 apex {
4360 name: "myapex",
4361 key: "myapex.key",
4362 %s
4363 native_shared_libs: ["mylib"],
4364 updatable: false,
4365 }
4366 apex_key {
4367 name: "myapex.key",
4368 public_key: "testkey.avbpubkey",
4369 private_key: "testkey.pem",
4370 }
4371 cc_library {
4372 name: "mylib",
4373 srcs: ["mylib.cpp"],
4374 apex_available: [
4375 "//apex_available:platform",
4376 "myapex",
4377 ],
4378 }
4379 `, testCase.compileMultiLibProp),
4380 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004381 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004382 apexRule := module.Rule("apexRule")
4383 copyCmds := apexRule.Args["copy_commands"]
4384 for _, containedLib := range testCase.containedLibs {
4385 ensureContains(t, copyCmds, containedLib)
4386 }
4387 for _, notContainedLib := range testCase.notContainedLibs {
4388 ensureNotContains(t, copyCmds, notContainedLib)
4389 }
4390 }
4391}
4392
Alex Light0851b882019-02-07 13:20:53 -08004393func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004394 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004395 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004396 apex {
4397 name: "myapex",
4398 key: "myapex.key",
4399 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004400 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004401 }
4402
4403 apex_key {
4404 name: "myapex.key",
4405 public_key: "testkey.avbpubkey",
4406 private_key: "testkey.pem",
4407 }
4408
4409 cc_library {
4410 name: "mylib_common",
4411 srcs: ["mylib.cpp"],
4412 system_shared_libs: [],
4413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004414 apex_available: [
4415 "//apex_available:platform",
4416 "myapex",
4417 ],
Alex Light0851b882019-02-07 13:20:53 -08004418 }
4419 `)
4420
Jooyung Hana0503a52023-08-23 13:12:50 +09004421 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004422 apexRule := module.Rule("apexRule")
4423 copyCmds := apexRule.Args["copy_commands"]
4424
4425 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4426 t.Log("Apex was a test apex!")
4427 t.Fail()
4428 }
4429 // Ensure that main rule creates an output
4430 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4431
4432 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004433 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004434
4435 // Ensure that both direct and indirect deps are copied into apex
4436 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4437
Colin Cross7113d202019-11-20 16:39:12 -08004438 // Ensure that the platform variant ends with _shared
4439 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004440
Colin Cross56a83212020-09-15 18:30:11 -07004441 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004442 t.Log("Found mylib_common not in any apex!")
4443 t.Fail()
4444 }
4445}
4446
4447func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004448 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004449 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004450 apex_test {
4451 name: "myapex",
4452 key: "myapex.key",
4453 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004454 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004455 }
4456
4457 apex_key {
4458 name: "myapex.key",
4459 public_key: "testkey.avbpubkey",
4460 private_key: "testkey.pem",
4461 }
4462
4463 cc_library {
4464 name: "mylib_common_test",
4465 srcs: ["mylib.cpp"],
4466 system_shared_libs: [],
4467 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004468 // TODO: remove //apex_available:platform
4469 apex_available: [
4470 "//apex_available:platform",
4471 "myapex",
4472 ],
Alex Light0851b882019-02-07 13:20:53 -08004473 }
4474 `)
4475
Jooyung Hana0503a52023-08-23 13:12:50 +09004476 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004477 apexRule := module.Rule("apexRule")
4478 copyCmds := apexRule.Args["copy_commands"]
4479
4480 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4481 t.Log("Apex was not a test apex!")
4482 t.Fail()
4483 }
4484 // Ensure that main rule creates an output
4485 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4486
4487 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004488 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004489
4490 // Ensure that both direct and indirect deps are copied into apex
4491 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4492
Colin Cross7113d202019-11-20 16:39:12 -08004493 // Ensure that the platform variant ends with _shared
4494 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004495}
4496
Jooyung Han85707de2023-12-01 14:21:13 +09004497func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004498 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004499 ctx := testApex(t, `
4500 apex {
4501 name: "myapex",
4502 key: "myapex.key",
4503 updatable: false,
4504 binaries: ["mybin"],
4505 }
4506 apex {
4507 name: "myvendorapex",
4508 key: "myapex.key",
4509 file_contexts: "myvendorapex_file_contexts",
4510 vendor: true,
4511 updatable: false,
4512 binaries: ["mybin"],
4513 }
4514 apex_key {
4515 name: "myapex.key",
4516 public_key: "testkey.avbpubkey",
4517 private_key: "testkey.pem",
4518 }
4519 cc_binary {
4520 name: "mybin",
4521 vendor_available: true,
4522 system_shared_libs: [],
4523 stl: "none",
4524 shared_libs: ["libz"],
4525 apex_available: ["//apex_available:anyapex"],
4526 }
4527 cc_library {
4528 name: "libz",
4529 vendor_available: true,
4530 system_shared_libs: [],
4531 stl: "none",
4532 stubs: {
4533 versions: ["28", "30"],
4534 },
4535 target: {
4536 vendor: {
4537 no_stubs: true,
4538 },
4539 },
4540 }
4541 `, withFiles(map[string][]byte{
4542 "myvendorapex_file_contexts": nil,
4543 }))
4544
4545 // libz provides stubs for core variant.
4546 {
4547 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4548 "bin/mybin",
4549 })
4550 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4551 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4552 }
4553 // libz doesn't provide stubs for vendor variant.
4554 {
4555 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4556 "bin/mybin",
4557 "lib64/libz.so",
4558 })
4559 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4560 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4561 }
4562}
4563
Alex Light9670d332019-01-29 18:07:33 -08004564func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004565 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004566 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004567 apex {
4568 name: "myapex",
4569 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004570 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004571 multilib: {
4572 first: {
4573 native_shared_libs: ["mylib_common"],
4574 }
4575 },
4576 target: {
4577 android: {
4578 multilib: {
4579 first: {
4580 native_shared_libs: ["mylib"],
4581 }
4582 }
4583 },
4584 host: {
4585 multilib: {
4586 first: {
4587 native_shared_libs: ["mylib2"],
4588 }
4589 }
4590 }
4591 }
4592 }
4593
4594 apex_key {
4595 name: "myapex.key",
4596 public_key: "testkey.avbpubkey",
4597 private_key: "testkey.pem",
4598 }
4599
4600 cc_library {
4601 name: "mylib",
4602 srcs: ["mylib.cpp"],
4603 system_shared_libs: [],
4604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004605 // TODO: remove //apex_available:platform
4606 apex_available: [
4607 "//apex_available:platform",
4608 "myapex",
4609 ],
Alex Light9670d332019-01-29 18:07:33 -08004610 }
4611
4612 cc_library {
4613 name: "mylib_common",
4614 srcs: ["mylib.cpp"],
4615 system_shared_libs: [],
4616 stl: "none",
4617 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004618 // TODO: remove //apex_available:platform
4619 apex_available: [
4620 "//apex_available:platform",
4621 "myapex",
4622 ],
Alex Light9670d332019-01-29 18:07:33 -08004623 }
4624
4625 cc_library {
4626 name: "mylib2",
4627 srcs: ["mylib.cpp"],
4628 system_shared_libs: [],
4629 stl: "none",
4630 compile_multilib: "first",
4631 }
4632 `)
4633
Jooyung Hana0503a52023-08-23 13:12:50 +09004634 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004635 copyCmds := apexRule.Args["copy_commands"]
4636
4637 // Ensure that main rule creates an output
4638 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4639
4640 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004641 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4642 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4643 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004644
4645 // Ensure that both direct and indirect deps are copied into apex
4646 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4647 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4648 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4649
Colin Cross7113d202019-11-20 16:39:12 -08004650 // Ensure that the platform variant ends with _shared
4651 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4652 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4653 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004654}
Jiyong Park04480cf2019-02-06 00:16:29 +09004655
Jiyong Park59140302020-12-14 18:44:04 +09004656func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004657 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004658 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004659 apex {
4660 name: "myapex",
4661 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004662 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004663 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004664 arch: {
4665 arm64: {
4666 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004667 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004668 },
4669 x86_64: {
4670 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004671 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004672 },
4673 }
4674 }
4675
4676 apex_key {
4677 name: "myapex.key",
4678 public_key: "testkey.avbpubkey",
4679 private_key: "testkey.pem",
4680 }
4681
4682 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004683 name: "mylib.generic",
4684 srcs: ["mylib.cpp"],
4685 system_shared_libs: [],
4686 stl: "none",
4687 // TODO: remove //apex_available:platform
4688 apex_available: [
4689 "//apex_available:platform",
4690 "myapex",
4691 ],
4692 }
4693
4694 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004695 name: "mylib.arm64",
4696 srcs: ["mylib.cpp"],
4697 system_shared_libs: [],
4698 stl: "none",
4699 // TODO: remove //apex_available:platform
4700 apex_available: [
4701 "//apex_available:platform",
4702 "myapex",
4703 ],
4704 }
4705
4706 cc_library {
4707 name: "mylib.x64",
4708 srcs: ["mylib.cpp"],
4709 system_shared_libs: [],
4710 stl: "none",
4711 // TODO: remove //apex_available:platform
4712 apex_available: [
4713 "//apex_available:platform",
4714 "myapex",
4715 ],
4716 }
4717 `)
4718
Jooyung Hana0503a52023-08-23 13:12:50 +09004719 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004720 copyCmds := apexRule.Args["copy_commands"]
4721
4722 // Ensure that apex variant is created for the direct dep
4723 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004724 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004725 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4726
4727 // Ensure that both direct and indirect deps are copied into apex
4728 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4729 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4730}
4731
Jiyong Park04480cf2019-02-06 00:16:29 +09004732func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004733 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004734 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004735 apex {
4736 name: "myapex",
4737 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004738 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004739 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004740 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004741 }
4742
4743 apex_key {
4744 name: "myapex.key",
4745 public_key: "testkey.avbpubkey",
4746 private_key: "testkey.pem",
4747 }
4748
4749 sh_binary {
4750 name: "myscript",
4751 src: "mylib.cpp",
4752 filename: "myscript.sh",
4753 sub_dir: "script",
4754 }
4755 `)
4756
Jooyung Hana0503a52023-08-23 13:12:50 +09004757 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004758 copyCmds := apexRule.Args["copy_commands"]
4759
4760 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4761}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004762
Jooyung Han91df2082019-11-20 01:49:42 +09004763func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004764 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004765 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004766 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004767 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004768 {"", "system"},
4769 {"product_specific: true", "product"},
4770 {"soc_specific: true", "vendor"},
4771 {"proprietary: true", "vendor"},
4772 {"vendor: true", "vendor"},
4773 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004774 }
4775 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004776 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004777 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004778 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004779 apex {
4780 name: "myapex",
4781 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004782 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004783 `+tc.propName+`
4784 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004785
Jooyung Han91df2082019-11-20 01:49:42 +09004786 apex_key {
4787 name: "myapex.key",
4788 public_key: "testkey.avbpubkey",
4789 private_key: "testkey.pem",
4790 }
4791 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004792
Jooyung Hana0503a52023-08-23 13:12:50 +09004793 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004794 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004795 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004796 if actual != expected {
4797 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4798 }
Jooyung Han91df2082019-11-20 01:49:42 +09004799 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004800 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004801}
Jiyong Park67882562019-03-21 01:11:21 +09004802
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004804 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004805 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004806 apex {
4807 name: "myapex",
4808 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004809 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004810 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004811
Jooyung Han580eb4f2020-06-24 19:33:06 +09004812 apex_key {
4813 name: "myapex.key",
4814 public_key: "testkey.avbpubkey",
4815 private_key: "testkey.pem",
4816 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004817 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004818 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004819 rule := module.Output("file_contexts")
4820 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4821}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822
Jooyung Han580eb4f2020-06-24 19:33:06 +09004823func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004824 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004825 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004826 apex {
4827 name: "myapex",
4828 key: "myapex.key",
4829 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004830 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004831 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004832
Jooyung Han580eb4f2020-06-24 19:33:06 +09004833 apex_key {
4834 name: "myapex.key",
4835 public_key: "testkey.avbpubkey",
4836 private_key: "testkey.pem",
4837 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004838 `, withFiles(map[string][]byte{
4839 "my_own_file_contexts": nil,
4840 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004841}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004842
Jooyung Han580eb4f2020-06-24 19:33:06 +09004843func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004844 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004845 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004846 apex {
4847 name: "myapex",
4848 key: "myapex.key",
4849 product_specific: true,
4850 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004851 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004852 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004853
Jooyung Han580eb4f2020-06-24 19:33:06 +09004854 apex_key {
4855 name: "myapex.key",
4856 public_key: "testkey.avbpubkey",
4857 private_key: "testkey.pem",
4858 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004859 `)
4860
Colin Cross1c460562021-02-16 17:55:47 -08004861 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004862 apex {
4863 name: "myapex",
4864 key: "myapex.key",
4865 product_specific: true,
4866 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004867 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004868 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004869
Jooyung Han580eb4f2020-06-24 19:33:06 +09004870 apex_key {
4871 name: "myapex.key",
4872 public_key: "testkey.avbpubkey",
4873 private_key: "testkey.pem",
4874 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004875 `, withFiles(map[string][]byte{
4876 "product_specific_file_contexts": nil,
4877 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004878 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004879 rule := module.Output("file_contexts")
4880 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4881}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004882
Jooyung Han580eb4f2020-06-24 19:33:06 +09004883func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004884 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004885 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004886 apex {
4887 name: "myapex",
4888 key: "myapex.key",
4889 product_specific: true,
4890 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004891 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004892 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004893
Jooyung Han580eb4f2020-06-24 19:33:06 +09004894 apex_key {
4895 name: "myapex.key",
4896 public_key: "testkey.avbpubkey",
4897 private_key: "testkey.pem",
4898 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004899
Jooyung Han580eb4f2020-06-24 19:33:06 +09004900 filegroup {
4901 name: "my-file-contexts",
4902 srcs: ["product_specific_file_contexts"],
4903 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004904 `, withFiles(map[string][]byte{
4905 "product_specific_file_contexts": nil,
4906 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004907 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004908 rule := module.Output("file_contexts")
4909 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004910}
4911
Jiyong Park67882562019-03-21 01:11:21 +09004912func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004913 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004914 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004915 apex_key {
4916 name: "myapex.key",
4917 public_key: ":my.avbpubkey",
4918 private_key: ":my.pem",
4919 product_specific: true,
4920 }
4921
4922 filegroup {
4923 name: "my.avbpubkey",
4924 srcs: ["testkey2.avbpubkey"],
4925 }
4926
4927 filegroup {
4928 name: "my.pem",
4929 srcs: ["testkey2.pem"],
4930 }
4931 `)
4932
4933 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4934 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004935 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004936 if actual_pubkey != expected_pubkey {
4937 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4938 }
4939 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004940 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004941 if actual_privkey != expected_privkey {
4942 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4943 }
4944}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004945
4946func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004947 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004948 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004949 prebuilt_apex {
4950 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004951 arch: {
4952 arm64: {
4953 src: "myapex-arm64.apex",
4954 },
4955 arm: {
4956 src: "myapex-arm.apex",
4957 },
4958 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004959 }
4960 `)
4961
Wei Li340ee8e2022-03-18 17:33:24 -07004962 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4963 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004964
Jiyong Parkc95714e2019-03-29 14:23:10 +09004965 expectedInput := "myapex-arm64.apex"
4966 if prebuilt.inputApex.String() != expectedInput {
4967 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4968 }
Wei Li340ee8e2022-03-18 17:33:24 -07004969 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4970 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4971 rule := testingModule.Rule("genProvenanceMetaData")
4972 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4973 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4974 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4975 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004976
4977 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4978 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004979}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004980
Paul Duffinc0609c62021-03-01 17:27:16 +00004981func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004982 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004983 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004984 prebuilt_apex {
4985 name: "myapex",
4986 }
4987 `)
4988}
4989
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004990func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004992 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004993 prebuilt_apex {
4994 name: "myapex",
4995 src: "myapex-arm.apex",
4996 filename: "notmyapex.apex",
4997 }
4998 `)
4999
Wei Li340ee8e2022-03-18 17:33:24 -07005000 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5001 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005002
5003 expected := "notmyapex.apex"
5004 if p.installFilename != expected {
5005 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5006 }
Wei Li340ee8e2022-03-18 17:33:24 -07005007 rule := testingModule.Rule("genProvenanceMetaData")
5008 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5009 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5010 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5011 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005012}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005013
Samiul Islam7c02e262021-09-08 17:48:28 +01005014func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005015 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005016 testApex(t, `
5017 apex_set {
5018 name: "com.company.android.myapex",
5019 apex_name: "com.android.myapex",
5020 set: "company-myapex.apks",
5021 filename: "com.company.android.myapex.apex"
5022 }
5023 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5024
5025 testApex(t, `
5026 apex_set {
5027 name: "com.company.android.myapex",
5028 apex_name: "com.android.myapex",
5029 set: "company-myapex.apks",
5030 filename: "com.company.android.myapex.capex"
5031 }
5032 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5033
5034 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5035 apex_set {
5036 name: "com.company.android.myapex",
5037 apex_name: "com.android.myapex",
5038 set: "company-myapex.apks",
5039 filename: "some-random-suffix"
5040 }
5041 `)
5042}
5043
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005044func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005045 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005046 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005047 prebuilt_apex {
5048 name: "myapex.prebuilt",
5049 src: "myapex-arm.apex",
5050 overrides: [
5051 "myapex",
5052 ],
5053 }
5054 `)
5055
Wei Li340ee8e2022-03-18 17:33:24 -07005056 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5057 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005058
5059 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005060 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005061 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005062 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005063 }
Wei Li340ee8e2022-03-18 17:33:24 -07005064 rule := testingModule.Rule("genProvenanceMetaData")
5065 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5066 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5067 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5068 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005069}
5070
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005071func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005072 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005073 testApex(t, `
5074 prebuilt_apex {
5075 name: "com.company.android.myapex",
5076 apex_name: "com.android.myapex",
5077 src: "company-myapex-arm.apex",
5078 }
5079 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5080
5081 testApex(t, `
5082 apex_set {
5083 name: "com.company.android.myapex",
5084 apex_name: "com.android.myapex",
5085 set: "company-myapex.apks",
5086 }
5087 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5088}
5089
5090func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005091 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005092 _ = android.GroupFixturePreparers(
5093 java.PrepareForTestWithJavaDefaultModules,
5094 PrepareForTestWithApexBuildComponents,
5095 android.FixtureWithRootAndroidBp(`
5096 platform_bootclasspath {
5097 name: "platform-bootclasspath",
5098 fragments: [
5099 {
5100 apex: "com.android.art",
5101 module: "art-bootclasspath-fragment",
5102 },
5103 ],
5104 }
5105
5106 prebuilt_apex {
5107 name: "com.company.android.art",
5108 apex_name: "com.android.art",
5109 src: "com.company.android.art-arm.apex",
5110 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5111 }
5112
5113 prebuilt_bootclasspath_fragment {
5114 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005115 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005116 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005117 hidden_api: {
5118 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5119 metadata: "my-bootclasspath-fragment/metadata.csv",
5120 index: "my-bootclasspath-fragment/index.csv",
5121 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5122 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5123 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005124 }
5125
5126 java_import {
5127 name: "core-oj",
5128 jars: ["prebuilt.jar"],
5129 }
5130 `),
5131 ).RunTest(t)
5132}
5133
Spandan Das59a4a2b2024-01-09 21:35:56 +00005134// A minimal context object for use with DexJarBuildPath
5135type moduleErrorfTestCtx struct {
5136}
5137
5138func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5139}
5140
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005141func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005142 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005143 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005144 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005145 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5146 // is disabled.
5147 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005148
5149 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5150 // file creation.
5151 java.FixtureConfigureBootJars("platform:foo"),
5152 android.FixtureModifyMockFS(func(fs android.MockFS) {
5153 fs["platform/Android.bp"] = []byte(`
5154 java_library {
5155 name: "foo",
5156 srcs: ["Test.java"],
5157 compile_dex: true,
5158 }
5159 `)
5160 fs["platform/Test.java"] = nil
5161 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005162 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005163
Paul Duffin40a3f652021-07-19 13:11:24 +01005164 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005165 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005166 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005167 var rule android.TestingBuildParams
5168
5169 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5170 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005171 }
5172
Paul Duffin40a3f652021-07-19 13:11:24 +01005173 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5174 t.Helper()
5175 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5176 var rule android.TestingBuildParams
5177
5178 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5179 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5180 }
5181
Paul Duffin89f570a2021-06-16 01:42:33 +01005182 fragment := java.ApexVariantReference{
5183 Apex: proptools.StringPtr("myapex"),
5184 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5185 }
5186
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005187 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005188 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005189 bp := `
5190 prebuilt_apex {
5191 name: "myapex",
5192 arch: {
5193 arm64: {
5194 src: "myapex-arm64.apex",
5195 },
5196 arm: {
5197 src: "myapex-arm.apex",
5198 },
5199 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005200 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5201 }
5202
5203 prebuilt_bootclasspath_fragment {
5204 name: "my-bootclasspath-fragment",
5205 contents: ["libfoo", "libbar"],
5206 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005207 hidden_api: {
5208 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5209 metadata: "my-bootclasspath-fragment/metadata.csv",
5210 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005211 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5212 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5213 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005214 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005215 }
5216
Spandan Das52c01a12024-09-20 01:09:48 +00005217 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005218 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005219 public: {
5220 jars: ["libfoo.jar"],
5221 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005222 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005223 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005224 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005225 }
Paul Duffin37856732021-02-26 14:24:15 +00005226
5227 java_sdk_library_import {
5228 name: "libbar",
5229 public: {
5230 jars: ["libbar.jar"],
5231 },
5232 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005233 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005234 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005235 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005236 `
5237
Paul Duffin89f570a2021-06-16 01:42:33 +01005238 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005239
Paul Duffin537ea3d2021-05-14 10:38:00 +01005240 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005241 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005242 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005243 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005244 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005245 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005246 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005247 })
5248
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005249 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005250 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005251 bp := `
5252 apex_set {
5253 name: "myapex",
5254 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005255 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005256 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5257 }
5258
Paul Duffin89f570a2021-06-16 01:42:33 +01005259 prebuilt_bootclasspath_fragment {
5260 name: "my-bootclasspath-fragment",
5261 contents: ["libfoo", "libbar"],
5262 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005263 hidden_api: {
5264 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5265 metadata: "my-bootclasspath-fragment/metadata.csv",
5266 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005267 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5268 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5269 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005270 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005271 }
5272
Liz Kammer2dc72442023-04-20 10:10:48 -04005273 prebuilt_systemserverclasspath_fragment {
5274 name: "my-systemserverclasspath-fragment",
5275 contents: ["libbaz"],
5276 apex_available: ["myapex"],
5277 }
5278
Spandan Das52c01a12024-09-20 01:09:48 +00005279 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005280 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005281 public: {
5282 jars: ["libfoo.jar"],
5283 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005284 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005285 shared_library: false,
5286 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005287 }
5288
Spandan Das52c01a12024-09-20 01:09:48 +00005289
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005290 java_sdk_library_import {
5291 name: "libbar",
5292 public: {
5293 jars: ["libbar.jar"],
5294 },
5295 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005296 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005297 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005298 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005299
5300 java_sdk_library_import {
5301 name: "libbaz",
5302 public: {
5303 jars: ["libbaz.jar"],
5304 },
5305 apex_available: ["myapex"],
5306 shared_library: false,
5307 permitted_packages: ["baz"],
5308 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005309 `
5310
Paul Duffin89f570a2021-06-16 01:42:33 +01005311 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005312
Paul Duffin537ea3d2021-05-14 10:38:00 +01005313 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005314 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005315 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005316 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005317 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005318 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005319 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005320
5321 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5322
5323 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005324 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005325 "myjavalib.myapex",
5326 "libfoo.myapex",
5327 "libbar.myapex",
5328 "libbaz.myapex",
5329 }
5330 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5331 for i, e := range mkEntries {
5332 g := e.OverrideName
5333 if w := overrideNames[i]; w != g {
5334 t.Errorf("Expected override name %q, got %q", w, g)
5335 }
5336 }
5337
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005338 })
5339
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005340 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005341 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005342 bp := `
5343 prebuilt_apex {
5344 name: "myapex",
5345 arch: {
5346 arm64: {
5347 src: "myapex-arm64.apex",
5348 },
5349 arm: {
5350 src: "myapex-arm.apex",
5351 },
5352 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005353 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5354 }
5355
5356 prebuilt_bootclasspath_fragment {
5357 name: "my-bootclasspath-fragment",
5358 contents: ["libfoo", "libbar"],
5359 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005360 hidden_api: {
5361 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5362 metadata: "my-bootclasspath-fragment/metadata.csv",
5363 index: "my-bootclasspath-fragment/index.csv",
5364 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5365 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5366 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005367 }
5368
5369 java_import {
5370 name: "libfoo",
5371 jars: ["libfoo.jar"],
5372 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005373 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374 }
5375
5376 java_library {
5377 name: "libfoo",
5378 srcs: ["foo/bar/MyClass.java"],
5379 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005380 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005381 }
Paul Duffin37856732021-02-26 14:24:15 +00005382
5383 java_sdk_library_import {
5384 name: "libbar",
5385 public: {
5386 jars: ["libbar.jar"],
5387 },
5388 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005389 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005390 }
5391
5392 java_sdk_library {
5393 name: "libbar",
5394 srcs: ["foo/bar/MyClass.java"],
5395 unsafe_ignore_missing_latest_api: true,
5396 apex_available: ["myapex"],
5397 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005398 `
5399
5400 // In this test the source (java_library) libfoo is active since the
5401 // prebuilt (java_import) defaults to prefer:false. However the
5402 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5403 // find the dex boot jar in it. We either need to disable the source libfoo
5404 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005405 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005406 // dexbootjar check is skipped if AllowMissingDependencies is true
5407 preparerAllowMissingDeps := android.GroupFixturePreparers(
5408 preparer,
5409 android.PrepareForTestWithAllowMissingDependencies,
5410 )
5411 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 })
5413
5414 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005415 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005416 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005417 apex {
5418 name: "myapex",
5419 key: "myapex.key",
5420 updatable: false,
5421 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5422 }
5423
5424 apex_key {
5425 name: "myapex.key",
5426 public_key: "testkey.avbpubkey",
5427 private_key: "testkey.pem",
5428 }
5429
5430 bootclasspath_fragment {
5431 name: "my-bootclasspath-fragment",
5432 contents: ["libfoo", "libbar"],
5433 apex_available: ["myapex"],
5434 hidden_api: {
5435 split_packages: ["*"],
5436 },
5437 }
5438
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005439 prebuilt_apex {
5440 name: "myapex",
5441 arch: {
5442 arm64: {
5443 src: "myapex-arm64.apex",
5444 },
5445 arm: {
5446 src: "myapex-arm.apex",
5447 },
5448 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005449 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5450 }
5451
5452 prebuilt_bootclasspath_fragment {
5453 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005454 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005455 contents: ["libfoo", "libbar"],
5456 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005457 hidden_api: {
5458 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5459 metadata: "my-bootclasspath-fragment/metadata.csv",
5460 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005461 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5462 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5463 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005464 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 }
5466
Spandan Das52c01a12024-09-20 01:09:48 +00005467 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 name: "libfoo",
5469 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005470 public: {
5471 jars: ["libfoo.jar"],
5472 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005473 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005474 shared_library: false,
5475 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005476 }
5477
5478 java_library {
5479 name: "libfoo",
5480 srcs: ["foo/bar/MyClass.java"],
5481 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005482 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005483 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 }
Paul Duffin37856732021-02-26 14:24:15 +00005485
5486 java_sdk_library_import {
5487 name: "libbar",
5488 prefer: true,
5489 public: {
5490 jars: ["libbar.jar"],
5491 },
5492 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005493 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005494 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005495 }
5496
5497 java_sdk_library {
5498 name: "libbar",
5499 srcs: ["foo/bar/MyClass.java"],
5500 unsafe_ignore_missing_latest_api: true,
5501 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005502 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005503 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005504 `
5505
Paul Duffin89f570a2021-06-16 01:42:33 +01005506 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005507
Paul Duffin537ea3d2021-05-14 10:38:00 +01005508 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005509 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005510 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005511 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005512 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005513 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005514 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005515 })
5516
5517 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005518 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005519 bp := `
5520 apex {
5521 name: "myapex",
5522 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005523 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005524 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005525 }
5526
5527 apex_key {
5528 name: "myapex.key",
5529 public_key: "testkey.avbpubkey",
5530 private_key: "testkey.pem",
5531 }
5532
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005533 bootclasspath_fragment {
5534 name: "my-bootclasspath-fragment",
5535 contents: ["libfoo", "libbar"],
5536 apex_available: ["myapex"],
5537 hidden_api: {
5538 split_packages: ["*"],
5539 },
5540 }
5541
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005542 prebuilt_apex {
5543 name: "myapex",
5544 arch: {
5545 arm64: {
5546 src: "myapex-arm64.apex",
5547 },
5548 arm: {
5549 src: "myapex-arm.apex",
5550 },
5551 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005552 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5553 }
5554
5555 prebuilt_bootclasspath_fragment {
5556 name: "my-bootclasspath-fragment",
5557 contents: ["libfoo", "libbar"],
5558 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005559 hidden_api: {
5560 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5561 metadata: "my-bootclasspath-fragment/metadata.csv",
5562 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005563 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5564 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5565 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005566 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005567 }
5568
5569 java_import {
5570 name: "libfoo",
5571 jars: ["libfoo.jar"],
5572 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005573 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 }
5575
5576 java_library {
5577 name: "libfoo",
5578 srcs: ["foo/bar/MyClass.java"],
5579 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005580 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005581 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005582 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005583 }
Paul Duffin37856732021-02-26 14:24:15 +00005584
5585 java_sdk_library_import {
5586 name: "libbar",
5587 public: {
5588 jars: ["libbar.jar"],
5589 },
5590 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005591 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005592 }
5593
5594 java_sdk_library {
5595 name: "libbar",
5596 srcs: ["foo/bar/MyClass.java"],
5597 unsafe_ignore_missing_latest_api: true,
5598 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005599 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005600 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005601 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005602 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005603 `
5604
Paul Duffin89f570a2021-06-16 01:42:33 +01005605 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005606
Paul Duffin537ea3d2021-05-14 10:38:00 +01005607 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005608 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005609 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5610 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005611 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5612 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005613 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005614 })
5615
5616 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005617 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005618 bp := `
5619 apex {
5620 name: "myapex",
5621 enabled: false,
5622 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005623 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005624 }
5625
5626 apex_key {
5627 name: "myapex.key",
5628 public_key: "testkey.avbpubkey",
5629 private_key: "testkey.pem",
5630 }
5631
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005632 bootclasspath_fragment {
5633 name: "my-bootclasspath-fragment",
5634 enabled: false,
5635 contents: ["libfoo", "libbar"],
5636 apex_available: ["myapex"],
5637 hidden_api: {
5638 split_packages: ["*"],
5639 },
5640 }
5641
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005642 prebuilt_apex {
5643 name: "myapex",
5644 arch: {
5645 arm64: {
5646 src: "myapex-arm64.apex",
5647 },
5648 arm: {
5649 src: "myapex-arm.apex",
5650 },
5651 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005652 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5653 }
5654
5655 prebuilt_bootclasspath_fragment {
5656 name: "my-bootclasspath-fragment",
5657 contents: ["libfoo", "libbar"],
5658 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005659 hidden_api: {
5660 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5661 metadata: "my-bootclasspath-fragment/metadata.csv",
5662 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005663 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5664 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5665 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005666 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005667 }
5668
5669 java_import {
5670 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005671 jars: ["libfoo.jar"],
5672 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005673 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005674 }
5675
5676 java_library {
5677 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005678 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005679 srcs: ["foo/bar/MyClass.java"],
5680 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005681 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 }
Paul Duffin37856732021-02-26 14:24:15 +00005683
5684 java_sdk_library_import {
5685 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005686 public: {
5687 jars: ["libbar.jar"],
5688 },
5689 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005690 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005691 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005692 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005693 }
5694
5695 java_sdk_library {
5696 name: "libbar",
5697 srcs: ["foo/bar/MyClass.java"],
5698 unsafe_ignore_missing_latest_api: true,
5699 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005700 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005701 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005702 `
Cole Fausta963b942024-04-11 17:43:00 -07005703 // This test disables libbar, which causes the ComponentDepsMutator to add
5704 // deps on libbar.stubs and other sub-modules that don't exist. We can
5705 // enable AllowMissingDependencies to work around that, but enabling that
5706 // causes extra checks for missing source files to dex_bootjars, so add those
5707 // to the mock fs as well.
5708 preparer2 := android.GroupFixturePreparers(
5709 preparer,
5710 android.PrepareForTestWithAllowMissingDependencies,
5711 android.FixtureMergeMockFs(map[string][]byte{
5712 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005713 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005714 }),
5715 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005716
Cole Fausta963b942024-04-11 17:43:00 -07005717 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005718
Paul Duffin537ea3d2021-05-14 10:38:00 +01005719 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005720 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005721 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005722 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005723 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005724 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005725 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005726 })
Spandan Das3a392012024-01-17 18:26:27 +00005727
Spandan Dasf2c10572024-02-27 04:49:52 +00005728 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005729 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005730 bp := `
5731 // Source
5732 apex {
5733 name: "myapex",
5734 enabled: false,
5735 key: "myapex.key",
5736 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5737 }
5738
5739 apex_key {
5740 name: "myapex.key",
5741 public_key: "testkey.avbpubkey",
5742 private_key: "testkey.pem",
5743 }
5744
5745 // Prebuilt
5746 prebuilt_apex {
5747 name: "myapex.v1",
5748 source_apex_name: "myapex",
5749 arch: {
5750 arm64: {
5751 src: "myapex-arm64.apex",
5752 },
5753 arm: {
5754 src: "myapex-arm.apex",
5755 },
5756 },
5757 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5758 prefer: true,
5759 }
5760 prebuilt_apex {
5761 name: "myapex.v2",
5762 source_apex_name: "myapex",
5763 arch: {
5764 arm64: {
5765 src: "myapex-arm64.apex",
5766 },
5767 arm: {
5768 src: "myapex-arm.apex",
5769 },
5770 },
5771 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5772 prefer: true,
5773 }
5774
5775 prebuilt_bootclasspath_fragment {
5776 name: "my-bootclasspath-fragment",
5777 contents: ["libfoo", "libbar"],
5778 apex_available: ["myapex"],
5779 hidden_api: {
5780 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5781 metadata: "my-bootclasspath-fragment/metadata.csv",
5782 index: "my-bootclasspath-fragment/index.csv",
5783 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5784 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5785 },
5786 prefer: true,
5787 }
5788
5789 java_import {
5790 name: "libfoo",
5791 jars: ["libfoo.jar"],
5792 apex_available: ["myapex"],
5793 prefer: true,
5794 }
5795 java_import {
5796 name: "libbar",
5797 jars: ["libbar.jar"],
5798 apex_available: ["myapex"],
5799 prefer: true,
5800 }
5801 `
5802
Spandan Dasf2c10572024-02-27 04:49:52 +00005803 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00005804 })
5805
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005806}
5807
Roland Levillain630846d2019-06-26 12:48:34 +01005808func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005809 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005810 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005811 apex_test {
5812 name: "myapex",
5813 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005814 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005815 tests: [
5816 "mytest",
5817 ],
5818 }
5819
5820 apex_key {
5821 name: "myapex.key",
5822 public_key: "testkey.avbpubkey",
5823 private_key: "testkey.pem",
5824 }
5825
Liz Kammer1c14a212020-05-12 15:26:55 -07005826 filegroup {
5827 name: "fg",
5828 srcs: [
5829 "baz",
5830 "bar/baz"
5831 ],
5832 }
5833
Roland Levillain630846d2019-06-26 12:48:34 +01005834 cc_test {
5835 name: "mytest",
5836 gtest: false,
5837 srcs: ["mytest.cpp"],
5838 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005839 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005840 system_shared_libs: [],
5841 static_executable: true,
5842 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005843 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005844 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005845
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005846 cc_library {
5847 name: "mylib",
5848 srcs: ["mylib.cpp"],
5849 system_shared_libs: [],
5850 stl: "none",
5851 }
5852
Liz Kammer5bd365f2020-05-27 15:15:11 -07005853 filegroup {
5854 name: "fg2",
5855 srcs: [
5856 "testdata/baz"
5857 ],
5858 }
Roland Levillain630846d2019-06-26 12:48:34 +01005859 `)
5860
Jooyung Hana0503a52023-08-23 13:12:50 +09005861 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005862 copyCmds := apexRule.Args["copy_commands"]
5863
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005864 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005865 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005866 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005867
Liz Kammer1c14a212020-05-12 15:26:55 -07005868 //Ensure that test data are copied into apex.
5869 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5870 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5871
Roland Levillainf89cd092019-07-29 16:22:59 +01005872 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005873 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005874 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005875 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005876 prefix := "TARGET_"
5877 var builder strings.Builder
5878 data.Custom(&builder, name, prefix, "", data)
5879 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005880 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005881 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005882}
5883
Jooyung Hand48f3c32019-08-23 11:18:57 +09005884func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005885 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005886 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5887 apex {
5888 name: "myapex",
5889 key: "myapex.key",
5890 native_shared_libs: ["libfoo"],
5891 }
5892
5893 apex_key {
5894 name: "myapex.key",
5895 public_key: "testkey.avbpubkey",
5896 private_key: "testkey.pem",
5897 }
5898
5899 cc_library {
5900 name: "libfoo",
5901 stl: "none",
5902 system_shared_libs: [],
5903 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005904 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005905 }
5906 `)
5907 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5908 apex {
5909 name: "myapex",
5910 key: "myapex.key",
5911 java_libs: ["myjar"],
5912 }
5913
5914 apex_key {
5915 name: "myapex.key",
5916 public_key: "testkey.avbpubkey",
5917 private_key: "testkey.pem",
5918 }
5919
5920 java_library {
5921 name: "myjar",
5922 srcs: ["foo/bar/MyClass.java"],
5923 sdk_version: "none",
5924 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005925 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005926 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005927 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005928 }
5929 `)
5930}
5931
Bill Peckhama41a6962021-01-11 10:58:54 -08005932func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005933 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005934 apex {
5935 name: "myapex",
5936 key: "myapex.key",
5937 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005938 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005939 }
5940
5941 apex_key {
5942 name: "myapex.key",
5943 public_key: "testkey.avbpubkey",
5944 private_key: "testkey.pem",
5945 }
5946
5947 java_import {
5948 name: "myjavaimport",
5949 apex_available: ["myapex"],
5950 jars: ["my.jar"],
5951 compile_dex: true,
5952 }
5953 `)
5954
Jooyung Hana0503a52023-08-23 13:12:50 +09005955 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005956 apexRule := module.Rule("apexRule")
5957 copyCmds := apexRule.Args["copy_commands"]
5958 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5959}
5960
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005961func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005962 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005963 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005964 apex {
5965 name: "myapex",
5966 key: "myapex.key",
5967 apps: [
5968 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005969 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005970 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005971 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005972 }
5973
5974 apex_key {
5975 name: "myapex.key",
5976 public_key: "testkey.avbpubkey",
5977 private_key: "testkey.pem",
5978 }
5979
5980 android_app {
5981 name: "AppFoo",
5982 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005983 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005984 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005985 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005986 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005987 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005988 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005989 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005990
5991 android_app {
5992 name: "AppFooPriv",
5993 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005994 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005995 system_modules: "none",
5996 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005997 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005998 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005999 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006000 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006001
6002 cc_library_shared {
6003 name: "libjni",
6004 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006005 shared_libs: ["libfoo"],
6006 stl: "none",
6007 system_shared_libs: [],
6008 apex_available: [ "myapex" ],
6009 sdk_version: "current",
6010 }
6011
6012 cc_library_shared {
6013 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006014 stl: "none",
6015 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006016 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006017 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006018 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006019 `)
6020
Jooyung Hana0503a52023-08-23 13:12:50 +09006021 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006022 apexRule := module.Rule("apexRule")
6023 copyCmds := apexRule.Args["copy_commands"]
6024
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006025 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6026 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006027 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006028
Colin Crossaede88c2020-08-11 12:17:01 -07006029 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006030 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006031 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006032 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006033 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006034 // JNI libraries including transitive deps are
6035 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006036 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006037 // ... embedded inside APK (jnilibs.zip)
6038 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6039 // ... and not directly inside the APEX
6040 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6041 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006042
6043 apexBundle := module.Module().(*apexBundle)
6044 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6045 var builder strings.Builder
6046 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6047 androidMk := builder.String()
6048 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6049 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6050 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6051 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6052 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6053 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006054}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006055
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006056func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006057 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006058 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6059 for _, id := range invalidBuildIds {
6060 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6061 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6062 variables.BuildId = proptools.StringPtr(id)
6063 })
6064 testApexError(t, message, `apex {
6065 name: "myapex",
6066 key: "myapex.key",
6067 apps: ["AppFooPrebuilt"],
6068 updatable: false,
6069 }
6070
6071 apex_key {
6072 name: "myapex.key",
6073 public_key: "testkey.avbpubkey",
6074 private_key: "testkey.pem",
6075 }
6076
6077 android_app_import {
6078 name: "AppFooPrebuilt",
6079 apk: "PrebuiltAppFoo.apk",
6080 presigned: true,
6081 apex_available: ["myapex"],
6082 }
6083 `, fixture)
6084 }
6085}
6086
Dario Frenicde2a032019-10-27 00:29:22 +01006087func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006088 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006089 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006090 apex {
6091 name: "myapex",
6092 key: "myapex.key",
6093 apps: [
6094 "AppFooPrebuilt",
6095 "AppFooPrivPrebuilt",
6096 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006097 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006098 }
6099
6100 apex_key {
6101 name: "myapex.key",
6102 public_key: "testkey.avbpubkey",
6103 private_key: "testkey.pem",
6104 }
6105
6106 android_app_import {
6107 name: "AppFooPrebuilt",
6108 apk: "PrebuiltAppFoo.apk",
6109 presigned: true,
6110 dex_preopt: {
6111 enabled: false,
6112 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006113 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006114 }
6115
6116 android_app_import {
6117 name: "AppFooPrivPrebuilt",
6118 apk: "PrebuiltAppFooPriv.apk",
6119 privileged: true,
6120 presigned: true,
6121 dex_preopt: {
6122 enabled: false,
6123 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006124 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006125 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006126 }
6127 `)
6128
Jooyung Hana0503a52023-08-23 13:12:50 +09006129 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006130 apexRule := module.Rule("apexRule")
6131 copyCmds := apexRule.Args["copy_commands"]
6132
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006133 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6134 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006135}
6136
6137func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006139 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006140 apex {
6141 name: "myapex",
6142 key: "myapex.key",
6143 apps: [
6144 "AppFoo",
6145 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006146 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006147 }
6148
6149 apex_key {
6150 name: "myapex.key",
6151 public_key: "testkey.avbpubkey",
6152 private_key: "testkey.pem",
6153 }
6154
6155 android_app {
6156 name: "AppFoo",
6157 srcs: ["foo/bar/MyClass.java"],
6158 sdk_version: "none",
6159 system_modules: "none",
6160 apex_available: [ "myapex" ],
6161 }
6162
6163 android_app_import {
6164 name: "AppFoo",
6165 apk: "AppFooPrebuilt.apk",
6166 filename: "AppFooPrebuilt.apk",
6167 presigned: true,
6168 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006169 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006170 }
6171 `, withFiles(map[string][]byte{
6172 "AppFooPrebuilt.apk": nil,
6173 }))
6174
Jooyung Hana0503a52023-08-23 13:12:50 +09006175 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006176 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006177 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006178}
6179
Dario Freni6f3937c2019-12-20 22:58:03 +00006180func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006181 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006182 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006183 apex {
6184 name: "myapex",
6185 key: "myapex.key",
6186 apps: [
6187 "TesterHelpAppFoo",
6188 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006189 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006190 }
6191
6192 apex_key {
6193 name: "myapex.key",
6194 public_key: "testkey.avbpubkey",
6195 private_key: "testkey.pem",
6196 }
6197
6198 android_test_helper_app {
6199 name: "TesterHelpAppFoo",
6200 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006201 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006202 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006203 }
6204
6205 `)
6206
Jooyung Hana0503a52023-08-23 13:12:50 +09006207 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006208 apexRule := module.Rule("apexRule")
6209 copyCmds := apexRule.Args["copy_commands"]
6210
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006211 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006212}
6213
Jooyung Han18020ea2019-11-13 10:50:48 +09006214func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006215 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006216 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006217 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006218 apex {
6219 name: "myapex",
6220 key: "myapex.key",
6221 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006222 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006223 }
6224
6225 apex_key {
6226 name: "myapex.key",
6227 public_key: "testkey.avbpubkey",
6228 private_key: "testkey.pem",
6229 }
6230
6231 apex {
6232 name: "otherapex",
6233 key: "myapex.key",
6234 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006235 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006236 }
6237
6238 cc_defaults {
6239 name: "libfoo-defaults",
6240 apex_available: ["otherapex"],
6241 }
6242
6243 cc_library {
6244 name: "libfoo",
6245 defaults: ["libfoo-defaults"],
6246 stl: "none",
6247 system_shared_libs: [],
6248 }`)
6249}
6250
Paul Duffine52e66f2020-03-30 17:54:29 +01006251func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006252 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006253 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006254 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006255 apex {
6256 name: "myapex",
6257 key: "myapex.key",
6258 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006259 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006260 }
6261
6262 apex_key {
6263 name: "myapex.key",
6264 public_key: "testkey.avbpubkey",
6265 private_key: "testkey.pem",
6266 }
6267
6268 apex {
6269 name: "otherapex",
6270 key: "otherapex.key",
6271 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006272 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006273 }
6274
6275 apex_key {
6276 name: "otherapex.key",
6277 public_key: "testkey.avbpubkey",
6278 private_key: "testkey.pem",
6279 }
6280
6281 cc_library {
6282 name: "libfoo",
6283 stl: "none",
6284 system_shared_libs: [],
6285 apex_available: ["otherapex"],
6286 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006287
6288 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6289 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6290 testApex(t, `
6291 apex {
6292 name: "com.sdv.myapex",
6293 key: "myapex.key",
6294 native_shared_libs: ["libfoo"],
6295 updatable: false,
6296 product_specific: true,
6297 }
6298
6299 apex_key {
6300 name: "myapex.key",
6301 public_key: "testkey.avbpubkey",
6302 private_key: "testkey.pem",
6303 }
6304
6305 apex {
6306 name: "com.any.otherapex",
6307 key: "otherapex.key",
6308 native_shared_libs: ["libfoo"],
6309 updatable: false,
6310 }
6311
6312 apex_key {
6313 name: "otherapex.key",
6314 public_key: "testkey.avbpubkey",
6315 private_key: "testkey.pem",
6316 }
6317
6318 cc_library {
6319 name: "libfoo",
6320 stl: "none",
6321 system_shared_libs: [],
6322 apex_available: ["com.any.otherapex"],
6323 product_specific: true,
6324 }`,
6325 android.FixtureMergeMockFs(android.MockFS{
6326 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6327 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6328 }))
6329
6330 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6331 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6332 apex {
6333 name: "com.sdv.myapex",
6334 key: "myapex.key",
6335 native_shared_libs: ["libfoo"],
6336 updatable: false,
6337 }
6338
6339 apex_key {
6340 name: "myapex.key",
6341 public_key: "testkey.avbpubkey",
6342 private_key: "testkey.pem",
6343 }
6344
6345 apex {
6346 name: "com.any.otherapex",
6347 key: "otherapex.key",
6348 native_shared_libs: ["libfoo"],
6349 updatable: false,
6350 }
6351
6352 apex_key {
6353 name: "otherapex.key",
6354 public_key: "testkey.avbpubkey",
6355 private_key: "testkey.pem",
6356 }
6357
6358 cc_library {
6359 name: "libfoo",
6360 stl: "none",
6361 system_shared_libs: [],
6362 apex_available: ["com.any.otherapex"],
6363 }`,
6364 android.FixtureMergeMockFs(android.MockFS{
6365 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6366 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6367 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006368}
Jiyong Park127b40b2019-09-30 16:04:35 +09006369
Paul Duffine52e66f2020-03-30 17:54:29 +01006370func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006371 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006372 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006373 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006374.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006375.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006376.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006377.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006378.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006379.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006380 apex {
6381 name: "myapex",
6382 key: "myapex.key",
6383 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006384 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006385 }
6386
6387 apex_key {
6388 name: "myapex.key",
6389 public_key: "testkey.avbpubkey",
6390 private_key: "testkey.pem",
6391 }
6392
Jiyong Park127b40b2019-09-30 16:04:35 +09006393 cc_library {
6394 name: "libfoo",
6395 stl: "none",
6396 shared_libs: ["libbar"],
6397 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006398 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006399 }
6400
6401 cc_library {
6402 name: "libbar",
6403 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006404 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006405 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006406 apex_available: ["myapex"],
6407 }
6408
6409 cc_library {
6410 name: "libbaz",
6411 stl: "none",
6412 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006413 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006414
6415 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6416 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6417 testApex(t, `
6418 apex {
6419 name: "com.sdv.myapex",
6420 key: "myapex.key",
6421 native_shared_libs: ["libfoo"],
6422 updatable: false,
6423 product_specific: true,
6424 }
6425
6426 apex_key {
6427 name: "myapex.key",
6428 public_key: "testkey.avbpubkey",
6429 private_key: "testkey.pem",
6430 }
6431
6432 cc_library {
6433 name: "libfoo",
6434 stl: "none",
6435 shared_libs: ["libbar"],
6436 system_shared_libs: [],
6437 apex_available: ["com.sdv.myapex"],
6438 product_specific: true,
6439 }
6440
6441 cc_library {
6442 name: "libbar",
6443 stl: "none",
6444 shared_libs: ["libbaz"],
6445 system_shared_libs: [],
6446 apex_available: ["com.sdv.myapex"],
6447 product_specific: true,
6448 }
6449
6450 cc_library {
6451 name: "libbaz",
6452 stl: "none",
6453 system_shared_libs: [],
6454 product_specific: true,
6455 }`,
6456 android.FixtureMergeMockFs(android.MockFS{
6457 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6458 }))
6459
6460 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6461 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6462 apex {
6463 name: "com.sdv.myapex",
6464 key: "myapex.key",
6465 native_shared_libs: ["libfoo"],
6466 updatable: false,
6467 }
6468
6469 apex_key {
6470 name: "myapex.key",
6471 public_key: "testkey.avbpubkey",
6472 private_key: "testkey.pem",
6473 }
6474
6475 cc_library {
6476 name: "libfoo",
6477 stl: "none",
6478 shared_libs: ["libbar"],
6479 system_shared_libs: [],
6480 apex_available: ["com.sdv.myapex"],
6481 }
6482
6483 cc_library {
6484 name: "libbar",
6485 stl: "none",
6486 shared_libs: ["libbaz"],
6487 system_shared_libs: [],
6488 apex_available: ["com.sdv.myapex"],
6489 }
6490
6491 cc_library {
6492 name: "libbaz",
6493 stl: "none",
6494 system_shared_libs: [],
6495 }`,
6496 android.FixtureMergeMockFs(android.MockFS{
6497 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6498 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006499}
Jiyong Park127b40b2019-09-30 16:04:35 +09006500
Liz Kammer5f108fa2023-05-11 14:33:17 -04006501func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006502 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006503 testApex(t, `
6504 apex {
6505 name: "myapex",
6506 key: "myapex.key",
6507 native_shared_libs: ["libfoo"],
6508 updatable: false,
6509 }
6510
6511 apex_key {
6512 name: "myapex.key",
6513 public_key: "testkey.avbpubkey",
6514 private_key: "testkey.pem",
6515 }
6516
6517 cc_library {
6518 name: "libfoo",
6519 stl: "none",
6520 static_libs: ["libbar"],
6521 system_shared_libs: [],
6522 apex_available: ["myapex"],
6523 }
6524
6525 cc_library {
6526 name: "libbar",
6527 stl: "none",
6528 shared_libs: ["libbaz"],
6529 system_shared_libs: [],
6530 apex_available: ["myapex"],
6531 }
6532
6533 cc_library {
6534 name: "libbaz",
6535 stl: "none",
6536 system_shared_libs: [],
6537 }`)
6538
6539 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6540 apex {
6541 name: "myapex",
6542 key: "myapex.key",
6543 native_shared_libs: ["libfoo"],
6544 updatable: false,
6545 }
6546
6547 apex_key {
6548 name: "myapex.key",
6549 public_key: "testkey.avbpubkey",
6550 private_key: "testkey.pem",
6551 }
6552
6553 cc_library {
6554 name: "libfoo",
6555 stl: "none",
6556 static_libs: ["libbar"],
6557 system_shared_libs: [],
6558 apex_available: ["myapex"],
6559 }
6560
6561 cc_library {
6562 name: "libbar",
6563 stl: "none",
6564 system_shared_libs: [],
6565 }`)
6566}
6567
Paul Duffine52e66f2020-03-30 17:54:29 +01006568func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006569 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006570 testApexError(t, "\"otherapex\" is not a valid module name", `
6571 apex {
6572 name: "myapex",
6573 key: "myapex.key",
6574 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006575 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006576 }
6577
6578 apex_key {
6579 name: "myapex.key",
6580 public_key: "testkey.avbpubkey",
6581 private_key: "testkey.pem",
6582 }
6583
6584 cc_library {
6585 name: "libfoo",
6586 stl: "none",
6587 system_shared_libs: [],
6588 apex_available: ["otherapex"],
6589 }`)
6590
Paul Duffine52e66f2020-03-30 17:54:29 +01006591 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006592 apex {
6593 name: "myapex",
6594 key: "myapex.key",
6595 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006596 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006597 }
6598
6599 apex_key {
6600 name: "myapex.key",
6601 public_key: "testkey.avbpubkey",
6602 private_key: "testkey.pem",
6603 }
6604
6605 cc_library {
6606 name: "libfoo",
6607 stl: "none",
6608 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006609 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006610 apex_available: ["myapex"],
6611 }
6612
6613 cc_library {
6614 name: "libbar",
6615 stl: "none",
6616 system_shared_libs: [],
6617 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006618 }
6619
6620 cc_library {
6621 name: "libbaz",
6622 stl: "none",
6623 system_shared_libs: [],
6624 stubs: {
6625 versions: ["10", "20", "30"],
6626 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006627 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006628}
Jiyong Park127b40b2019-09-30 16:04:35 +09006629
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006630func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006631 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006632 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006633 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006634 testApexError(t, "expected an integer between 0-9; got -1", `
6635 apex {
6636 name: "myapex",
6637 key: "myapex.key",
6638 apex_available_name: "com.android.foo",
6639 variant_version: "-1",
6640 updatable: false,
6641 }
6642 apex_key {
6643 name: "myapex.key",
6644 public_key: "testkey.avbpubkey",
6645 private_key: "testkey.pem",
6646 }
6647 `)
6648 })
6649
6650 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006651 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006652 testApexError(t, "expected an integer between 0-9; got 10", `
6653 apex {
6654 name: "myapex",
6655 key: "myapex.key",
6656 apex_available_name: "com.android.foo",
6657 variant_version: "10",
6658 updatable: false,
6659 }
6660 apex_key {
6661 name: "myapex.key",
6662 public_key: "testkey.avbpubkey",
6663 private_key: "testkey.pem",
6664 }
6665 `)
6666 })
6667}
6668
6669func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006670 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006671 context := android.GroupFixturePreparers(
6672 android.PrepareForIntegrationTestWithAndroid,
6673 PrepareForTestWithApexBuildComponents,
6674 android.FixtureMergeMockFs(android.MockFS{
6675 "system/sepolicy/apex/foo-file_contexts": nil,
6676 "system/sepolicy/apex/bar-file_contexts": nil,
6677 }),
6678 )
6679 result := context.RunTestWithBp(t, `
6680 apex {
6681 name: "foo",
6682 key: "myapex.key",
6683 apex_available_name: "com.android.foo",
6684 variant_version: "0",
6685 updatable: false,
6686 }
6687 apex {
6688 name: "bar",
6689 key: "myapex.key",
6690 apex_available_name: "com.android.foo",
6691 variant_version: "3",
6692 updatable: false,
6693 }
6694 apex_key {
6695 name: "myapex.key",
6696 public_key: "testkey.avbpubkey",
6697 private_key: "testkey.pem",
6698 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006699 override_apex {
6700 name: "myoverrideapex",
6701 base: "bar",
6702 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006703 `)
6704
Jooyung Hana0503a52023-08-23 13:12:50 +09006705 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006706 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006707 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6708 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6709 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6710 }
6711
Jooyung Hana0503a52023-08-23 13:12:50 +09006712 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006713 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006714 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6715 barActualDefaultVersion := barManifestRule.Args["default_version"]
6716 if barActualDefaultVersion != barExpectedDefaultVersion {
6717 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6718 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006719
Spandan Das50801e22024-05-13 18:29:45 +00006720 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006721 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6722 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6723 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6724 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006725}
6726
Sam Delmericoca816532023-06-02 14:09:50 -04006727func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006728 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006729 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006730 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006731 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6732 apex {
6733 name: "myapex_sminus",
6734 key: "myapex.key",
6735 apps: ["AppFoo"],
6736 apex_available_name: "myapex",
6737 updatable: false,
6738 }
6739 apex {
6740 name: "myapex",
6741 key: "myapex.key",
6742 apps: ["AppFoo"],
6743 updatable: false,
6744 }
6745 apex_key {
6746 name: "myapex.key",
6747 public_key: "testkey.avbpubkey",
6748 private_key: "testkey.pem",
6749 }
6750 android_app {
6751 name: "AppFoo",
6752 srcs: ["foo/bar/MyClass.java"],
6753 sdk_version: "none",
6754 system_modules: "none",
6755 apex_available: [ "myapex_sminus" ],
6756 }`,
6757 android.FixtureMergeMockFs(android.MockFS{
6758 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6759 }),
6760 )
6761 })
6762
6763 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006764 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006765 testApex(t, `
6766 apex {
6767 name: "myapex_sminus",
6768 key: "myapex.key",
6769 apps: ["AppFoo"],
6770 apex_available_name: "myapex",
6771 updatable: false,
6772 }
6773 apex {
6774 name: "myapex",
6775 key: "myapex.key",
6776 apps: ["AppFoo"],
6777 updatable: false,
6778 }
6779 apex_key {
6780 name: "myapex.key",
6781 public_key: "testkey.avbpubkey",
6782 private_key: "testkey.pem",
6783 }
6784 android_app {
6785 name: "AppFoo",
6786 srcs: ["foo/bar/MyClass.java"],
6787 sdk_version: "none",
6788 system_modules: "none",
6789 apex_available: [ "myapex" ],
6790 }`,
6791 android.FixtureMergeMockFs(android.MockFS{
6792 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6793 }),
6794 )
6795 })
6796
6797 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006798 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006799 testApex(t, `
6800 override_apex {
6801 name: "myoverrideapex_sminus",
6802 base: "myapex_sminus",
6803 key: "myapex.key",
6804 apps: ["AppFooOverride"],
6805 }
6806 override_apex {
6807 name: "myoverrideapex",
6808 base: "myapex",
6809 key: "myapex.key",
6810 apps: ["AppFooOverride"],
6811 }
6812 apex {
6813 name: "myapex_sminus",
6814 key: "myapex.key",
6815 apps: ["AppFoo"],
6816 apex_available_name: "myapex",
6817 updatable: false,
6818 }
6819 apex {
6820 name: "myapex",
6821 key: "myapex.key",
6822 apps: ["AppFoo"],
6823 updatable: false,
6824 }
6825 apex_key {
6826 name: "myapex.key",
6827 public_key: "testkey.avbpubkey",
6828 private_key: "testkey.pem",
6829 }
6830 android_app {
6831 name: "AppFooOverride",
6832 srcs: ["foo/bar/MyClass.java"],
6833 sdk_version: "none",
6834 system_modules: "none",
6835 apex_available: [ "myapex" ],
6836 }
6837 android_app {
6838 name: "AppFoo",
6839 srcs: ["foo/bar/MyClass.java"],
6840 sdk_version: "none",
6841 system_modules: "none",
6842 apex_available: [ "myapex" ],
6843 }`,
6844 android.FixtureMergeMockFs(android.MockFS{
6845 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6846 }),
6847 )
6848 })
6849}
6850
6851func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006852 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006853 context := android.GroupFixturePreparers(
6854 android.PrepareForIntegrationTestWithAndroid,
6855 PrepareForTestWithApexBuildComponents,
6856 java.PrepareForTestWithDexpreopt,
6857 android.FixtureMergeMockFs(android.MockFS{
6858 "system/sepolicy/apex/myapex-file_contexts": nil,
6859 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6860 }),
6861 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6862 variables.BuildId = proptools.StringPtr("buildid")
6863 }),
6864 )
6865 context.RunTestWithBp(t, `
6866 override_apex {
6867 name: "myoverrideapex_sminus",
6868 base: "myapex_sminus",
6869 }
6870 override_apex {
6871 name: "myoverrideapex",
6872 base: "myapex",
6873 }
6874 apex {
6875 name: "myapex",
6876 key: "myapex.key",
6877 apps: ["AppFoo"],
6878 updatable: false,
6879 }
6880 apex {
6881 name: "myapex_sminus",
6882 apex_available_name: "myapex",
6883 key: "myapex.key",
6884 apps: ["AppFoo_sminus"],
6885 updatable: false,
6886 }
6887 apex_key {
6888 name: "myapex.key",
6889 public_key: "testkey.avbpubkey",
6890 private_key: "testkey.pem",
6891 }
6892 android_app {
6893 name: "AppFoo",
6894 srcs: ["foo/bar/MyClass.java"],
6895 sdk_version: "none",
6896 system_modules: "none",
6897 apex_available: [ "myapex" ],
6898 }
6899 android_app {
6900 name: "AppFoo_sminus",
6901 srcs: ["foo/bar/MyClass.java"],
6902 sdk_version: "none",
6903 min_sdk_version: "29",
6904 system_modules: "none",
6905 apex_available: [ "myapex" ],
6906 }`)
6907}
6908
Jiyong Park89e850a2020-04-07 16:37:39 +09006909func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006910 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006911 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006912 apex {
6913 name: "myapex",
6914 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006915 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006916 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006917 }
6918
6919 apex_key {
6920 name: "myapex.key",
6921 public_key: "testkey.avbpubkey",
6922 private_key: "testkey.pem",
6923 }
6924
6925 cc_library {
6926 name: "libfoo",
6927 stl: "none",
6928 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006929 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006930 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006931 }
6932
6933 cc_library {
6934 name: "libfoo2",
6935 stl: "none",
6936 system_shared_libs: [],
6937 shared_libs: ["libbaz"],
6938 apex_available: ["//apex_available:platform"],
6939 }
6940
6941 cc_library {
6942 name: "libbar",
6943 stl: "none",
6944 system_shared_libs: [],
6945 apex_available: ["myapex"],
6946 }
6947
6948 cc_library {
6949 name: "libbaz",
6950 stl: "none",
6951 system_shared_libs: [],
6952 apex_available: ["myapex"],
6953 stubs: {
6954 versions: ["1"],
6955 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006956 }`)
6957
Jiyong Park89e850a2020-04-07 16:37:39 +09006958 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6959 // because it depends on libbar which isn't available to platform
6960 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6961 if libfoo.NotAvailableForPlatform() != true {
6962 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6963 }
6964
6965 // libfoo2 however can be available to platform because it depends on libbaz which provides
6966 // stubs
6967 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6968 if libfoo2.NotAvailableForPlatform() == true {
6969 t.Errorf("%q should be available to platform", libfoo2.String())
6970 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006971}
Jiyong Parka90ca002019-10-07 15:47:24 +09006972
Paul Duffine52e66f2020-03-30 17:54:29 +01006973func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006974 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006975 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006976 apex {
6977 name: "myapex",
6978 key: "myapex.key",
6979 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006980 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006981 }
6982
6983 apex_key {
6984 name: "myapex.key",
6985 public_key: "testkey.avbpubkey",
6986 private_key: "testkey.pem",
6987 }
6988
6989 cc_library {
6990 name: "libfoo",
6991 stl: "none",
6992 system_shared_libs: [],
6993 apex_available: ["myapex"],
6994 static: {
6995 apex_available: ["//apex_available:platform"],
6996 },
6997 }`)
6998
Jiyong Park89e850a2020-04-07 16:37:39 +09006999 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7000 if libfooShared.NotAvailableForPlatform() != true {
7001 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7002 }
7003 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7004 if libfooStatic.NotAvailableForPlatform() != false {
7005 t.Errorf("%q should be available to platform", libfooStatic.String())
7006 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007007}
7008
Jooyung Han9a419e22024-08-16 17:14:21 +09007009func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007010 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007011
7012 for _, tc := range []struct {
7013 name string
7014 apexAvailable string
7015 expectedError string
7016 }{
7017 {
7018 name: "prefix matches correctly",
7019 apexAvailable: "com.foo.*",
7020 },
7021 {
7022 name: "prefix doesn't match",
7023 apexAvailable: "com.bar.*",
7024 expectedError: `Consider .* "com.foo\.\*"`,
7025 },
7026 {
7027 name: "short prefix",
7028 apexAvailable: "com.*",
7029 expectedError: "requires two or more components",
7030 },
7031 {
7032 name: "wildcard not in the end",
7033 apexAvailable: "com.*.foo",
7034 expectedError: "should end with .*",
7035 },
7036 {
7037 name: "wildcard in the middle",
7038 apexAvailable: "com.foo*.*",
7039 expectedError: "not allowed in the middle",
7040 },
7041 {
7042 name: "hint with prefix pattern",
7043 apexAvailable: "//apex_available:platform",
7044 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7045 },
7046 } {
7047 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007048 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007049 errorHandler := android.FixtureExpectsNoErrors
7050 if tc.expectedError != "" {
7051 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7052 }
7053 context := android.GroupFixturePreparers(
7054 prepareForApexTest,
7055 android.FixtureMergeMockFs(android.MockFS{
7056 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7057 }),
7058 ).ExtendWithErrorHandler(errorHandler)
7059
7060 context.RunTestWithBp(t, `
7061 apex {
7062 name: "com.foo.bar",
7063 key: "myapex.key",
7064 native_shared_libs: ["libfoo"],
7065 updatable: false,
7066 }
7067
7068 apex_key {
7069 name: "myapex.key",
7070 public_key: "testkey.avbpubkey",
7071 private_key: "testkey.pem",
7072 }
7073
7074 cc_library {
7075 name: "libfoo",
7076 stl: "none",
7077 system_shared_libs: [],
7078 apex_available: ["`+tc.apexAvailable+`"],
7079 }`)
7080 })
7081 }
7082 testApexError(t, `Consider adding "com.foo" to`, `
7083 apex {
7084 name: "com.foo", // too short for a partner apex
7085 key: "myapex.key",
7086 native_shared_libs: ["libfoo"],
7087 updatable: false,
7088 }
7089
7090 apex_key {
7091 name: "myapex.key",
7092 public_key: "testkey.avbpubkey",
7093 private_key: "testkey.pem",
7094 }
7095
7096 cc_library {
7097 name: "libfoo",
7098 stl: "none",
7099 system_shared_libs: [],
7100 }
7101 `)
7102}
7103
Jiyong Park5d790c32019-11-15 18:40:32 +09007104func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007105 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007106 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007107 apex {
7108 name: "myapex",
7109 key: "myapex.key",
7110 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007111 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007112 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007113 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007114 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007115 }
7116
7117 override_apex {
7118 name: "override_myapex",
7119 base: "myapex",
7120 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007121 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007122 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007123 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007124 compile_multilib: "first",
7125 multilib: {
7126 lib32: {
7127 native_shared_libs: ["mylib32"],
7128 },
7129 lib64: {
7130 native_shared_libs: ["mylib64"],
7131 },
7132 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007133 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007134 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007135 key: "mynewapex.key",
7136 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007137 }
7138
7139 apex_key {
7140 name: "myapex.key",
7141 public_key: "testkey.avbpubkey",
7142 private_key: "testkey.pem",
7143 }
7144
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007145 apex_key {
7146 name: "mynewapex.key",
7147 public_key: "testkey2.avbpubkey",
7148 private_key: "testkey2.pem",
7149 }
7150
7151 android_app_certificate {
7152 name: "myapex.certificate",
7153 certificate: "testkey",
7154 }
7155
Jiyong Park5d790c32019-11-15 18:40:32 +09007156 android_app {
7157 name: "app",
7158 srcs: ["foo/bar/MyClass.java"],
7159 package_name: "foo",
7160 sdk_version: "none",
7161 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007162 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007163 }
7164
7165 override_android_app {
7166 name: "override_app",
7167 base: "app",
7168 package_name: "bar",
7169 }
markchien7c803b82021-08-26 22:10:06 +08007170
7171 bpf {
7172 name: "bpf",
7173 srcs: ["bpf.c"],
7174 }
7175
7176 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007177 name: "overrideBpf",
7178 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007179 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007180
7181 prebuilt_etc {
7182 name: "myetc",
7183 src: "myprebuilt",
7184 }
7185
7186 prebuilt_etc {
7187 name: "override_myetc",
7188 src: "override_myprebuilt",
7189 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007190
7191 cc_library {
7192 name: "mylib32",
7193 apex_available: [ "myapex" ],
7194 }
7195
7196 cc_library {
7197 name: "mylib64",
7198 apex_available: [ "myapex" ],
7199 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007200 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007201
Jooyung Hana0503a52023-08-23 13:12:50 +09007202 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007203 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007204 if originalVariant.GetOverriddenBy() != "" {
7205 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7206 }
7207 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7208 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7209 }
7210
Spandan Das50801e22024-05-13 18:29:45 +00007211 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007212 apexRule := module.Rule("apexRule")
7213 copyCmds := apexRule.Args["copy_commands"]
7214
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007215 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7216 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007217
markchien7c803b82021-08-26 22:10:06 +08007218 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007219 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007220
Daniel Norman5a3ce132021-08-26 15:44:43 -07007221 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7222 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7223
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007224 apexBundle := module.Module().(*apexBundle)
7225 name := apexBundle.Name()
7226 if name != "override_myapex" {
7227 t.Errorf("name should be \"override_myapex\", but was %q", name)
7228 }
7229
Baligh Uddin004d7172020-02-19 21:29:28 -08007230 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7231 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7232 }
7233
Jiyong Park20bacab2020-03-03 11:45:41 +09007234 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007235 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007236 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7237
7238 signApkRule := module.Rule("signapk")
7239 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007240
Colin Crossaa255532020-07-03 13:18:24 -07007241 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007242 var builder strings.Builder
7243 data.Custom(&builder, name, "TARGET_", "", data)
7244 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007245 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7246 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007247 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007248 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007249 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007250 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007251 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007252 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007253}
7254
Albert Martineefabcf2022-03-21 20:11:16 +00007255func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007256 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007257 // Override from 29 to 31
7258 minSdkOverride31 := "31"
7259 ctx := testApex(t, `
7260 apex {
7261 name: "myapex",
7262 key: "myapex.key",
7263 native_shared_libs: ["mylib"],
7264 updatable: true,
7265 min_sdk_version: "29"
7266 }
7267
7268 override_apex {
7269 name: "override_myapex",
7270 base: "myapex",
7271 logging_parent: "com.foo.bar",
7272 package_name: "test.overridden.package"
7273 }
7274
7275 apex_key {
7276 name: "myapex.key",
7277 public_key: "testkey.avbpubkey",
7278 private_key: "testkey.pem",
7279 }
7280
7281 cc_library {
7282 name: "mylib",
7283 srcs: ["mylib.cpp"],
7284 runtime_libs: ["libbar"],
7285 system_shared_libs: [],
7286 stl: "none",
7287 apex_available: [ "myapex" ],
7288 min_sdk_version: "apex_inherit"
7289 }
7290
7291 cc_library {
7292 name: "libbar",
7293 srcs: ["mylib.cpp"],
7294 system_shared_libs: [],
7295 stl: "none",
7296 apex_available: [ "myapex" ],
7297 min_sdk_version: "apex_inherit"
7298 }
7299
7300 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7301
Jooyung Hana0503a52023-08-23 13:12:50 +09007302 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007303 copyCmds := apexRule.Args["copy_commands"]
7304
7305 // Ensure that direct non-stubs dep is always included
7306 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7307
7308 // Ensure that runtime_libs dep in included
7309 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7310
7311 // Ensure libraries target overridden min_sdk_version value
7312 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7313}
7314
7315func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007316 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007317 // Attempt to override from 31 to 29, should be a NOOP
7318 minSdkOverride29 := "29"
7319 ctx := testApex(t, `
7320 apex {
7321 name: "myapex",
7322 key: "myapex.key",
7323 native_shared_libs: ["mylib"],
7324 updatable: true,
7325 min_sdk_version: "31"
7326 }
7327
7328 override_apex {
7329 name: "override_myapex",
7330 base: "myapex",
7331 logging_parent: "com.foo.bar",
7332 package_name: "test.overridden.package"
7333 }
7334
7335 apex_key {
7336 name: "myapex.key",
7337 public_key: "testkey.avbpubkey",
7338 private_key: "testkey.pem",
7339 }
7340
7341 cc_library {
7342 name: "mylib",
7343 srcs: ["mylib.cpp"],
7344 runtime_libs: ["libbar"],
7345 system_shared_libs: [],
7346 stl: "none",
7347 apex_available: [ "myapex" ],
7348 min_sdk_version: "apex_inherit"
7349 }
7350
7351 cc_library {
7352 name: "libbar",
7353 srcs: ["mylib.cpp"],
7354 system_shared_libs: [],
7355 stl: "none",
7356 apex_available: [ "myapex" ],
7357 min_sdk_version: "apex_inherit"
7358 }
7359
7360 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7361
Jooyung Hana0503a52023-08-23 13:12:50 +09007362 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007363 copyCmds := apexRule.Args["copy_commands"]
7364
7365 // Ensure that direct non-stubs dep is always included
7366 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7367
7368 // Ensure that runtime_libs dep in included
7369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7370
7371 // Ensure libraries target the original min_sdk_version value rather than the overridden
7372 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7373}
7374
Jooyung Han214bf372019-11-12 13:03:50 +09007375func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007376 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007377 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007378 apex {
7379 name: "myapex",
7380 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007381 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007382 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007383 }
7384
7385 apex_key {
7386 name: "myapex.key",
7387 public_key: "testkey.avbpubkey",
7388 private_key: "testkey.pem",
7389 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007390
7391 cc_library {
7392 name: "mylib",
7393 srcs: ["mylib.cpp"],
7394 stl: "libc++",
7395 system_shared_libs: [],
7396 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007397 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007398 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007399 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007400
Jooyung Hana0503a52023-08-23 13:12:50 +09007401 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007402 args := module.Rule("apexRule").Args
7403 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007404 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007405
7406 // The copies of the libraries in the apex should have one more dependency than
7407 // the ones outside the apex, namely the unwinder. Ideally we should check
7408 // the dependency names directly here but for some reason the names are blank in
7409 // this test.
7410 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007411 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007412 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7413 if len(apexImplicits) != len(nonApexImplicits)+1 {
7414 t.Errorf("%q missing unwinder dep", lib)
7415 }
7416 }
Jooyung Han214bf372019-11-12 13:03:50 +09007417}
7418
Paul Duffine05480a2021-03-08 15:07:14 +00007419var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007420 "api/current.txt": nil,
7421 "api/removed.txt": nil,
7422 "api/system-current.txt": nil,
7423 "api/system-removed.txt": nil,
7424 "api/test-current.txt": nil,
7425 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007426
Anton Hanssondff2c782020-12-21 17:10:01 +00007427 "100/public/api/foo.txt": nil,
7428 "100/public/api/foo-removed.txt": nil,
7429 "100/system/api/foo.txt": nil,
7430 "100/system/api/foo-removed.txt": nil,
7431
Paul Duffineedc5d52020-06-12 17:46:39 +01007432 // For java_sdk_library_import
7433 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007434}
7435
Jooyung Han58f26ab2019-12-18 15:34:32 +09007436func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007437 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007438 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007439 apex {
7440 name: "myapex",
7441 key: "myapex.key",
7442 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007443 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007444 }
7445
7446 apex_key {
7447 name: "myapex.key",
7448 public_key: "testkey.avbpubkey",
7449 private_key: "testkey.pem",
7450 }
7451
7452 java_sdk_library {
7453 name: "foo",
7454 srcs: ["a.java"],
7455 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007456 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007457 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007458
7459 prebuilt_apis {
7460 name: "sdk",
7461 api_dirs: ["100"],
7462 }
Paul Duffin9b879592020-05-26 13:21:35 +01007463 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007464
7465 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007466 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007467 "javalib/foo.jar",
7468 "etc/permissions/foo.xml",
7469 })
7470 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007471 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7472 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7473 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007474}
7475
Spandan Das3ee19692024-06-19 04:47:40 +00007476func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007477 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007478 ctx := testApex(t, `
7479 override_apex {
7480 name: "mycompanyapex",
7481 base: "myapex",
7482 }
7483 apex {
7484 name: "myapex",
7485 key: "myapex.key",
7486 java_libs: ["foo"],
7487 updatable: false,
7488 }
7489
7490 apex_key {
7491 name: "myapex.key",
7492 public_key: "testkey.avbpubkey",
7493 private_key: "testkey.pem",
7494 }
7495
7496 java_sdk_library {
7497 name: "foo",
7498 srcs: ["a.java"],
7499 api_packages: ["foo"],
7500 apex_available: [ "myapex" ],
7501 }
7502
7503 prebuilt_apis {
7504 name: "sdk",
7505 api_dirs: ["100"],
7506 }
7507 `, withFiles(filesForSdkLibrary))
7508
7509 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7510 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7511 // (com.android.foo), the filepath should not contain override apex name.
7512 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7513 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7514 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7515}
7516
Paul Duffin9b879592020-05-26 13:21:35 +01007517func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007518 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007519 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007520 apex {
7521 name: "myapex",
7522 key: "myapex.key",
7523 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007524 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007525 }
7526
7527 apex_key {
7528 name: "myapex.key",
7529 public_key: "testkey.avbpubkey",
7530 private_key: "testkey.pem",
7531 }
7532
7533 java_sdk_library {
7534 name: "foo",
7535 srcs: ["a.java"],
7536 api_packages: ["foo"],
7537 apex_available: ["myapex"],
7538 sdk_version: "none",
7539 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007540 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007541 }
7542
7543 java_library {
7544 name: "bar",
7545 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007546 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007547 apex_available: ["myapex"],
7548 sdk_version: "none",
7549 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007550 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007551 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007552
7553 prebuilt_apis {
7554 name: "sdk",
7555 api_dirs: ["100"],
7556 }
Paul Duffin9b879592020-05-26 13:21:35 +01007557 `, withFiles(filesForSdkLibrary))
7558
7559 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007560 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007561 "javalib/bar.jar",
7562 "javalib/foo.jar",
7563 "etc/permissions/foo.xml",
7564 })
7565
7566 // The bar library should depend on the implementation jar.
7567 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007568 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007569 t.Errorf("expected %q, found %#q", expected, actual)
7570 }
7571}
7572
7573func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007574 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007575 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007576 apex {
7577 name: "myapex",
7578 key: "myapex.key",
7579 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007580 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007581 }
7582
7583 apex_key {
7584 name: "myapex.key",
7585 public_key: "testkey.avbpubkey",
7586 private_key: "testkey.pem",
7587 }
7588
7589 java_sdk_library {
7590 name: "foo",
7591 srcs: ["a.java"],
7592 api_packages: ["foo"],
7593 apex_available: ["myapex"],
7594 sdk_version: "none",
7595 system_modules: "none",
7596 }
7597
7598 java_library {
7599 name: "bar",
7600 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007601 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007602 sdk_version: "none",
7603 system_modules: "none",
7604 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007605
7606 prebuilt_apis {
7607 name: "sdk",
7608 api_dirs: ["100"],
7609 }
Paul Duffin9b879592020-05-26 13:21:35 +01007610 `, withFiles(filesForSdkLibrary))
7611
7612 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007613 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007614 "javalib/foo.jar",
7615 "etc/permissions/foo.xml",
7616 })
7617
7618 // The bar library should depend on the stubs jar.
7619 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007620 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007621 t.Errorf("expected %q, found %#q", expected, actual)
7622 }
7623}
7624
Paul Duffineedc5d52020-06-12 17:46:39 +01007625func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007626 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007627 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007628 prebuilt_apis {
7629 name: "sdk",
7630 api_dirs: ["100"],
7631 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007632 withFiles(map[string][]byte{
7633 "apex/a.java": nil,
7634 "apex/apex_manifest.json": nil,
7635 "apex/Android.bp": []byte(`
7636 package {
7637 default_visibility: ["//visibility:private"],
7638 }
7639
7640 apex {
7641 name: "myapex",
7642 key: "myapex.key",
7643 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007644 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007645 }
7646
7647 apex_key {
7648 name: "myapex.key",
7649 public_key: "testkey.avbpubkey",
7650 private_key: "testkey.pem",
7651 }
7652
7653 java_library {
7654 name: "bar",
7655 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007656 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007657 apex_available: ["myapex"],
7658 sdk_version: "none",
7659 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007660 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007661 }
7662`),
7663 "source/a.java": nil,
7664 "source/api/current.txt": nil,
7665 "source/api/removed.txt": nil,
7666 "source/Android.bp": []byte(`
7667 package {
7668 default_visibility: ["//visibility:private"],
7669 }
7670
7671 java_sdk_library {
7672 name: "foo",
7673 visibility: ["//apex"],
7674 srcs: ["a.java"],
7675 api_packages: ["foo"],
7676 apex_available: ["myapex"],
7677 sdk_version: "none",
7678 system_modules: "none",
7679 public: {
7680 enabled: true,
7681 },
Colin Crosse4f34882024-11-14 12:26:00 -08007682 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007683 }
7684`),
7685 "prebuilt/a.jar": nil,
7686 "prebuilt/Android.bp": []byte(`
7687 package {
7688 default_visibility: ["//visibility:private"],
7689 }
7690
7691 java_sdk_library_import {
7692 name: "foo",
7693 visibility: ["//apex", "//source"],
7694 apex_available: ["myapex"],
7695 prefer: true,
7696 public: {
7697 jars: ["a.jar"],
7698 },
Colin Crosse4f34882024-11-14 12:26:00 -08007699 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007700 }
7701`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007702 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007703 )
7704
7705 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007706 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007707 "javalib/bar.jar",
7708 "javalib/foo.jar",
7709 "etc/permissions/foo.xml",
7710 })
7711
7712 // The bar library should depend on the implementation jar.
7713 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007714 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007715 t.Errorf("expected %q, found %#q", expected, actual)
7716 }
7717}
7718
7719func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007720 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007721 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7722 apex {
7723 name: "myapex",
7724 key: "myapex.key",
7725 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007726 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007727 }
7728
7729 apex_key {
7730 name: "myapex.key",
7731 public_key: "testkey.avbpubkey",
7732 private_key: "testkey.pem",
7733 }
7734
7735 java_sdk_library_import {
7736 name: "foo",
7737 apex_available: ["myapex"],
7738 prefer: true,
7739 public: {
7740 jars: ["a.jar"],
7741 },
7742 }
7743
7744 `, withFiles(filesForSdkLibrary))
7745}
7746
atrost6e126252020-01-27 17:01:16 +00007747func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007748 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007749 result := android.GroupFixturePreparers(
7750 prepareForApexTest,
7751 java.PrepareForTestWithPlatformCompatConfig,
7752 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007753 apex {
7754 name: "myapex",
7755 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007756 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007757 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007758 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007759 }
7760
7761 apex_key {
7762 name: "myapex.key",
7763 public_key: "testkey.avbpubkey",
7764 private_key: "testkey.pem",
7765 }
7766
7767 platform_compat_config {
7768 name: "myjar-platform-compat-config",
7769 src: ":myjar",
7770 }
7771
7772 java_library {
7773 name: "myjar",
7774 srcs: ["foo/bar/MyClass.java"],
7775 sdk_version: "none",
7776 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007777 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007778 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007779 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007780
7781 // Make sure that a preferred prebuilt does not affect the apex contents.
7782 prebuilt_platform_compat_config {
7783 name: "myjar-platform-compat-config",
7784 metadata: "compat-config/metadata.xml",
7785 prefer: true,
7786 }
atrost6e126252020-01-27 17:01:16 +00007787 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007788 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007789 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007790 "etc/compatconfig/myjar-platform-compat-config.xml",
7791 "javalib/myjar.jar",
7792 })
7793}
7794
Jooyung Han862c0d62022-12-21 10:15:37 +09007795func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007796 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007797 android.GroupFixturePreparers(
7798 android.PrepareForTestWithAndroidBuildComponents,
7799 PrepareForTestWithApexBuildComponents,
7800 prepareForTestWithMyapex,
7801 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7802 ).
7803 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7804 RunTestWithBp(t, `
7805 apex {
7806 name: "myapex",
7807 key: "myapex.key",
7808 prebuilts: ["foo", "bar"],
7809 updatable: false,
7810 }
7811
7812 apex_key {
7813 name: "myapex.key",
7814 public_key: "testkey.avbpubkey",
7815 private_key: "testkey.pem",
7816 }
7817
7818 prebuilt_etc {
7819 name: "foo",
7820 src: "myprebuilt",
7821 filename_from_src: true,
7822 }
7823
7824 prebuilt_etc {
7825 name: "bar",
7826 src: "myprebuilt",
7827 filename_from_src: true,
7828 }
7829 `)
7830}
7831
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007832func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007833 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007834 bp := `
7835 apex {
7836 name: "myapex",
7837 key: "myapex.key",
7838 native_shared_libs: ["libfoo"],
7839 updatable: false,
7840 unwanted_transitive_deps: ["libbar"],
7841 }
7842
7843 apex_key {
7844 name: "myapex.key",
7845 public_key: "testkey.avbpubkey",
7846 private_key: "testkey.pem",
7847 }
7848
7849 cc_library {
7850 name: "libfoo",
7851 srcs: ["foo.cpp"],
7852 shared_libs: ["libbar"],
7853 apex_available: ["myapex"],
7854 }
7855
7856 cc_library {
7857 name: "libbar",
7858 srcs: ["bar.cpp"],
7859 apex_available: ["myapex"],
7860 }`
7861 ctx := testApex(t, bp)
7862 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7863 "*/libc++.so",
7864 "*/libfoo.so",
7865 // not libbar.so
7866 })
7867}
7868
Jiyong Park479321d2019-12-16 11:47:12 +09007869func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007870 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007871 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7872 apex {
7873 name: "myapex",
7874 key: "myapex.key",
7875 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007876 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007877 }
7878
7879 apex_key {
7880 name: "myapex.key",
7881 public_key: "testkey.avbpubkey",
7882 private_key: "testkey.pem",
7883 }
7884
7885 java_library {
7886 name: "myjar",
7887 srcs: ["foo/bar/MyClass.java"],
7888 sdk_version: "none",
7889 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007890 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007891 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007892 }
7893 `)
7894}
7895
Jiyong Park7afd1072019-12-30 16:56:33 +09007896func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007897 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007898 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007899 apex {
7900 name: "myapex",
7901 key: "myapex.key",
7902 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007903 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007904 }
7905
7906 apex_key {
7907 name: "myapex.key",
7908 public_key: "testkey.avbpubkey",
7909 private_key: "testkey.pem",
7910 }
7911
7912 cc_library {
7913 name: "mylib",
7914 srcs: ["mylib.cpp"],
7915 system_shared_libs: [],
7916 stl: "none",
7917 required: ["a", "b"],
7918 host_required: ["c", "d"],
7919 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007920 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007921 }
7922 `)
7923
Jooyung Hana0503a52023-08-23 13:12:50 +09007924 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007925 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007926 name := apexBundle.BaseModuleName()
7927 prefix := "TARGET_"
7928 var builder strings.Builder
7929 data.Custom(&builder, name, prefix, "", data)
7930 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007931 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007932 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7933 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007934}
7935
Jiyong Park7cd10e32020-01-14 09:22:18 +09007936func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007937 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007938 bp := `
7939 apex {
7940 name: "myapex",
7941 key: "myapex.key",
7942 native_shared_libs: ["mylib"],
7943 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007944 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007945 }
7946
Jiyong Park9d677202020-02-19 16:29:35 +09007947 apex {
7948 name: "myapex.updatable",
7949 key: "myapex.key",
7950 native_shared_libs: ["mylib"],
7951 java_libs: ["myjar"],
7952 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007953 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007954 }
7955
Jiyong Park7cd10e32020-01-14 09:22:18 +09007956 apex_key {
7957 name: "myapex.key",
7958 public_key: "testkey.avbpubkey",
7959 private_key: "testkey.pem",
7960 }
7961
7962 cc_library {
7963 name: "mylib",
7964 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007965 shared_libs: [
7966 "myotherlib",
7967 "myotherlib_ext",
7968 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007969 system_shared_libs: [],
7970 stl: "none",
7971 apex_available: [
7972 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007973 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007974 "//apex_available:platform",
7975 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007976 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007977 }
7978
7979 cc_library {
7980 name: "myotherlib",
7981 srcs: ["mylib.cpp"],
7982 system_shared_libs: [],
7983 stl: "none",
7984 apex_available: [
7985 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007986 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007987 "//apex_available:platform",
7988 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007989 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007990 }
7991
Jiyong Parkce243632023-02-17 18:22:25 +09007992 cc_library {
7993 name: "myotherlib_ext",
7994 srcs: ["mylib.cpp"],
7995 system_shared_libs: [],
7996 system_ext_specific: true,
7997 stl: "none",
7998 apex_available: [
7999 "myapex",
8000 "myapex.updatable",
8001 "//apex_available:platform",
8002 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008003 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008004 }
8005
Jiyong Park7cd10e32020-01-14 09:22:18 +09008006 java_library {
8007 name: "myjar",
8008 srcs: ["foo/bar/MyClass.java"],
8009 sdk_version: "none",
8010 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008011 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008012 apex_available: [
8013 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008014 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008015 "//apex_available:platform",
8016 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008017 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008018 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008019 }
8020
8021 java_library {
8022 name: "myotherjar",
8023 srcs: ["foo/bar/MyClass.java"],
8024 sdk_version: "none",
8025 system_modules: "none",
8026 apex_available: [
8027 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008028 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008029 "//apex_available:platform",
8030 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008031 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008032 }
8033 `
8034
8035 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8036 for _, f := range files {
8037 if f.path == file {
8038 if f.isLink {
8039 t.Errorf("%q is not a real file", file)
8040 }
8041 return
8042 }
8043 }
8044 t.Errorf("%q is not found", file)
8045 }
8046
Jiyong Parkce243632023-02-17 18:22:25 +09008047 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008048 for _, f := range files {
8049 if f.path == file {
8050 if !f.isLink {
8051 t.Errorf("%q is not a symlink", file)
8052 }
Jiyong Parkce243632023-02-17 18:22:25 +09008053 if f.src != target {
8054 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8055 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008056 return
8057 }
8058 }
8059 t.Errorf("%q is not found", file)
8060 }
8061
Jiyong Park9d677202020-02-19 16:29:35 +09008062 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8063 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008064 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008065 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008066 ensureRealfileExists(t, files, "javalib/myjar.jar")
8067 ensureRealfileExists(t, files, "lib64/mylib.so")
8068 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008069 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008070
Jooyung Hana0503a52023-08-23 13:12:50 +09008071 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008072 ensureRealfileExists(t, files, "javalib/myjar.jar")
8073 ensureRealfileExists(t, files, "lib64/mylib.so")
8074 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008075 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008076
8077 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008078 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008079 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008080 ensureRealfileExists(t, files, "javalib/myjar.jar")
8081 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008082 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8083 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008084
Jooyung Hana0503a52023-08-23 13:12:50 +09008085 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008086 ensureRealfileExists(t, files, "javalib/myjar.jar")
8087 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008088 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8089 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008090}
8091
Yo Chiange8128052020-07-23 20:09:18 +08008092func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008093 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008094 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008095 apex {
8096 name: "myapex",
8097 key: "myapex.key",
8098 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008099 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008100 }
8101
8102 apex_key {
8103 name: "myapex.key",
8104 public_key: "testkey.avbpubkey",
8105 private_key: "testkey.pem",
8106 }
8107
8108 cc_library_shared {
8109 name: "mylib",
8110 srcs: ["mylib.cpp"],
8111 shared_libs: ["myotherlib"],
8112 system_shared_libs: [],
8113 stl: "none",
8114 apex_available: [
8115 "myapex",
8116 "//apex_available:platform",
8117 ],
8118 }
8119
8120 cc_prebuilt_library_shared {
8121 name: "myotherlib",
8122 srcs: ["prebuilt.so"],
8123 system_shared_libs: [],
8124 stl: "none",
8125 apex_available: [
8126 "myapex",
8127 "//apex_available:platform",
8128 ],
8129 }
8130 `)
8131
Jooyung Hana0503a52023-08-23 13:12:50 +09008132 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008133 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008134 var builder strings.Builder
8135 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8136 androidMk := builder.String()
8137 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008138 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008139 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8140 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8141 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008142 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008143}
8144
Jooyung Han643adc42020-02-27 13:50:06 +09008145func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008146 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008147 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008148 apex {
8149 name: "myapex",
8150 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008151 binaries: ["mybin"],
8152 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008153 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008154 }
8155
8156 apex_key {
8157 name: "myapex.key",
8158 public_key: "testkey.avbpubkey",
8159 private_key: "testkey.pem",
8160 }
8161
8162 cc_library {
8163 name: "mylib",
8164 srcs: ["mylib.cpp"],
8165 shared_libs: ["mylib2"],
8166 system_shared_libs: [],
8167 stl: "none",
8168 apex_available: [ "myapex" ],
8169 }
8170
8171 cc_library {
8172 name: "mylib2",
8173 srcs: ["mylib.cpp"],
8174 system_shared_libs: [],
8175 stl: "none",
8176 apex_available: [ "myapex" ],
8177 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008178
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008179 // Used as both a JNI library and a regular shared library.
8180 cc_library {
8181 name: "mylib3",
8182 srcs: ["mylib.cpp"],
8183 system_shared_libs: [],
8184 stl: "none",
8185 apex_available: [ "myapex" ],
8186 }
8187
8188 cc_binary {
8189 name: "mybin",
8190 srcs: ["mybin.cpp"],
8191 shared_libs: ["mylib3"],
8192 system_shared_libs: [],
8193 stl: "none",
8194 apex_available: [ "myapex" ],
8195 }
8196
Jiyong Park34d5c332022-02-24 18:02:44 +09008197 rust_ffi_shared {
8198 name: "libfoo.rust",
8199 crate_name: "foo",
8200 srcs: ["foo.rs"],
8201 shared_libs: ["libfoo.shared_from_rust"],
8202 prefer_rlib: true,
8203 apex_available: ["myapex"],
8204 }
8205
8206 cc_library_shared {
8207 name: "libfoo.shared_from_rust",
8208 srcs: ["mylib.cpp"],
8209 system_shared_libs: [],
8210 stl: "none",
8211 stubs: {
8212 versions: ["10", "11", "12"],
8213 },
8214 }
8215
Jooyung Han643adc42020-02-27 13:50:06 +09008216 `)
8217
Jooyung Hana0503a52023-08-23 13:12:50 +09008218 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008219 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008220 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008221 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008222 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008223 "lib64/mylib.so",
8224 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008225 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008226 "lib64/libfoo.rust.so",
8227 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8228 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008229 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008230
8231 // b/220397949
8232 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008233}
8234
Jooyung Han49f67012020-04-17 13:43:10 +09008235func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008236 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008237 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008238 apex {
8239 name: "myapex",
8240 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008241 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008242 }
8243 apex_key {
8244 name: "myapex.key",
8245 public_key: "testkey.avbpubkey",
8246 private_key: "testkey.pem",
8247 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008248 `,
8249 android.FixtureModifyConfig(func(config android.Config) {
8250 delete(config.Targets, android.Android)
8251 config.AndroidCommonTarget = android.Target{}
8252 }),
8253 )
Jooyung Han49f67012020-04-17 13:43:10 +09008254
8255 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8256 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8257 }
8258}
8259
Jiyong Parkbd159612020-02-28 15:22:21 +09008260func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008261 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008262 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008263 apex {
8264 name: "myapex",
8265 key: "myapex.key",
8266 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008267 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008268 }
8269
8270 apex_key {
8271 name: "myapex.key",
8272 public_key: "testkey.avbpubkey",
8273 private_key: "testkey.pem",
8274 }
8275
8276 android_app {
8277 name: "AppFoo",
8278 srcs: ["foo/bar/MyClass.java"],
8279 sdk_version: "none",
8280 system_modules: "none",
8281 apex_available: [ "myapex" ],
8282 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008283 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008284
Jooyung Hana0503a52023-08-23 13:12:50 +09008285 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008286 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008287
8288 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008289 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 +09008290}
8291
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008292func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008293 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008294 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008295 apex {
8296 name: "myapex",
8297 key: "myapex.key",
8298 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008299 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008300 }
8301
8302 apex_key {
8303 name: "myapex.key",
8304 public_key: "testkey.avbpubkey",
8305 private_key: "testkey.pem",
8306 }
8307
8308 android_app_set {
8309 name: "AppSet",
8310 set: "AppSet.apks",
8311 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008312 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008313 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008314 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008315 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8316 s := mod.Rule("apexRule").Args["copy_commands"]
8317 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008318 if len(copyCmds) != 4 {
8319 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008320 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008321 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8322 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008323 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8324 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008325
8326 // Ensure that canned_fs_config has an entry for the app set zip file
8327 generateFsRule := mod.Rule("generateFsConfig")
8328 cmd := generateFsRule.RuleParams.Command
8329 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008330}
8331
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008332func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008333 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008334 apex_set {
8335 name: "myapex",
8336 filename: "foo_v2.apex",
8337 sanitized: {
8338 none: { set: "myapex.apks", },
8339 hwaddress: { set: "myapex.hwasan.apks", },
8340 },
Paul Duffin24704672021-04-06 16:09:30 +01008341 }
8342 `
8343 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008344
Paul Duffin24704672021-04-06 16:09:30 +01008345 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008346 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008347
Spandan Das9d6e2092024-09-21 02:50:00 +00008348 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008349 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008350
Paul Duffin24704672021-04-06 16:09:30 +01008351 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8352
8353 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008354 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8355 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008356
8357 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008358}
8359
Pranav Guptaeba03b02022-09-27 00:27:08 +00008360func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008361 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008362 ctx := testApex(t, `
8363 apex_set {
8364 name: "myapex",
8365 set: ":myapex_apks_file",
8366 }
8367
8368 filegroup {
8369 name: "myapex_apks_file",
8370 srcs: ["myapex.apks"],
8371 }
8372 `)
8373
Spandan Das9d6e2092024-09-21 02:50:00 +00008374 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008375
8376 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008377 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008378 extractedApex := m.Output(extractorOutput)
8379
8380 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8381}
8382
Paul Duffin89f570a2021-06-16 01:42:33 +01008383func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008384 t.Helper()
8385
Paul Duffin55607122021-03-30 23:32:51 +01008386 fs := android.MockFS{
8387 "a.java": nil,
8388 "a.jar": nil,
8389 "apex_manifest.json": nil,
8390 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008391 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008392 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8393 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8394 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008395 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008396 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008397
Paul Duffin55607122021-03-30 23:32:51 +01008398 errorHandler := android.FixtureExpectsNoErrors
8399 if errmsg != "" {
8400 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008401 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008402
Paul Duffin55607122021-03-30 23:32:51 +01008403 result := android.GroupFixturePreparers(
8404 cc.PrepareForTestWithCcDefaultModules,
8405 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008406 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008407 java.PrepareForTestWithJavaSdkLibraryFiles,
8408 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008409 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008410 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008411 android.FixtureModifyMockFS(func(fs android.MockFS) {
8412 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8413 insert := ""
8414 for _, fragment := range fragments {
8415 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8416 }
8417 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8418 platform_bootclasspath {
8419 name: "platform-bootclasspath",
8420 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008421 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008422 %s
8423 ],
8424 }
8425 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008426 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008427 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008428 // Dexpreopt for boot jars requires the ART boot image profile.
8429 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8430 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008431 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008432 ).
8433 ExtendWithErrorHandler(errorHandler).
8434 RunTestWithBp(t, bp)
8435
8436 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008437}
8438
Jooyung Han548640b2020-04-27 12:10:30 +09008439func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008440 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008441 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8442 apex {
8443 name: "myapex",
8444 key: "myapex.key",
8445 updatable: true,
8446 }
8447
8448 apex_key {
8449 name: "myapex.key",
8450 public_key: "testkey.avbpubkey",
8451 private_key: "testkey.pem",
8452 }
8453 `)
8454}
8455
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008456func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008457 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008458 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8459 apex {
8460 name: "myapex",
8461 key: "myapex.key",
8462 }
8463
8464 apex_key {
8465 name: "myapex.key",
8466 public_key: "testkey.avbpubkey",
8467 private_key: "testkey.pem",
8468 }
8469 `)
8470}
8471
satayevb98371c2021-06-15 16:49:50 +01008472func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008473 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008474 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8475 apex {
8476 name: "myapex",
8477 key: "myapex.key",
8478 systemserverclasspath_fragments: [
8479 "mysystemserverclasspathfragment",
8480 ],
8481 min_sdk_version: "29",
8482 updatable: true,
8483 }
8484
8485 apex_key {
8486 name: "myapex.key",
8487 public_key: "testkey.avbpubkey",
8488 private_key: "testkey.pem",
8489 }
8490
8491 java_library {
8492 name: "foo",
8493 srcs: ["b.java"],
8494 min_sdk_version: "29",
8495 installable: true,
8496 apex_available: [
8497 "myapex",
8498 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008499 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008500 }
8501
8502 systemserverclasspath_fragment {
8503 name: "mysystemserverclasspathfragment",
8504 generate_classpaths_proto: false,
8505 contents: [
8506 "foo",
8507 ],
8508 apex_available: [
8509 "myapex",
8510 ],
8511 }
satayevabcd5972021-08-06 17:49:46 +01008512 `,
8513 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8514 )
satayevb98371c2021-06-15 16:49:50 +01008515}
8516
Paul Duffin064b70c2020-11-02 17:32:38 +00008517func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008518 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008519 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008520 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008521 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008522 fragment := java.ApexVariantReference{
8523 Apex: proptools.StringPtr("myapex"),
8524 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8525 }
8526
Paul Duffin064b70c2020-11-02 17:32:38 +00008527 testDexpreoptWithApexes(t, `
8528 prebuilt_apex {
8529 name: "myapex" ,
8530 arch: {
8531 arm64: {
8532 src: "myapex-arm64.apex",
8533 },
8534 arm: {
8535 src: "myapex-arm.apex",
8536 },
8537 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008538 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8539 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008540
Paul Duffin89f570a2021-06-16 01:42:33 +01008541 prebuilt_bootclasspath_fragment {
8542 name: "my-bootclasspath-fragment",
8543 contents: ["libfoo"],
8544 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008545 hidden_api: {
8546 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8547 metadata: "my-bootclasspath-fragment/metadata.csv",
8548 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008549 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8550 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8551 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008552 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008553 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008554
Spandan Das52c01a12024-09-20 01:09:48 +00008555 java_sdk_library_import {
8556 name: "libfoo",
8557 prefer: true,
8558 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008559 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008560 },
8561 apex_available: ["myapex"],
8562 shared_library: false,
8563 permitted_packages: ["libfoo"],
8564 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008565 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008566 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008567}
8568
Spandan Dasf14e2542021-11-12 00:01:37 +00008569func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008570 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008571 bp += `
8572 apex_key {
8573 name: "myapex.key",
8574 public_key: "testkey.avbpubkey",
8575 private_key: "testkey.pem",
8576 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008577 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008578 "lib1/src/A.java": nil,
8579 "lib2/src/B.java": nil,
8580 "system/sepolicy/apex/myapex-file_contexts": nil,
8581 }
8582
Paul Duffin45338f02021-03-30 23:07:52 +01008583 errorHandler := android.FixtureExpectsNoErrors
8584 if errmsg != "" {
8585 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008586 }
Colin Crossae8600b2020-10-29 17:09:13 -07008587
Paul Duffin45338f02021-03-30 23:07:52 +01008588 android.GroupFixturePreparers(
8589 android.PrepareForTestWithAndroidBuildComponents,
8590 java.PrepareForTestWithJavaBuildComponents,
8591 PrepareForTestWithApexBuildComponents,
8592 android.PrepareForTestWithNeverallowRules(rules),
8593 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008594 apexBootJars := make([]string, 0, len(bootJars))
8595 for _, apexBootJar := range bootJars {
8596 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008597 }
satayevd604b212021-07-21 14:23:52 +01008598 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008599 }),
8600 fs.AddToFixture(),
8601 ).
8602 ExtendWithErrorHandler(errorHandler).
8603 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008604}
8605
8606func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008607 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008608 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008609 name string
8610 expectedError string
8611 bp string
8612 bootJars []string
8613 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008614 }{
8615
8616 {
8617 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8618 expectedError: "",
8619 bp: `
8620 java_library {
8621 name: "bcp_lib1",
8622 srcs: ["lib1/src/*.java"],
8623 permitted_packages: ["foo.bar"],
8624 apex_available: ["myapex"],
8625 sdk_version: "none",
8626 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008627 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008628 }
8629 java_library {
8630 name: "nonbcp_lib2",
8631 srcs: ["lib2/src/*.java"],
8632 apex_available: ["myapex"],
8633 permitted_packages: ["a.b"],
8634 sdk_version: "none",
8635 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008636 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008637 }
8638 apex {
8639 name: "myapex",
8640 key: "myapex.key",
8641 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008642 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008643 }`,
8644 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008645 bcpPermittedPackages: map[string][]string{
8646 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008647 "foo.bar",
8648 },
8649 },
8650 },
8651 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008652 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008653 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 +01008654 bp: `
8655 java_library {
8656 name: "bcp_lib1",
8657 srcs: ["lib1/src/*.java"],
8658 apex_available: ["myapex"],
8659 permitted_packages: ["foo.bar"],
8660 sdk_version: "none",
8661 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008662 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008663 }
8664 java_library {
8665 name: "bcp_lib2",
8666 srcs: ["lib2/src/*.java"],
8667 apex_available: ["myapex"],
8668 permitted_packages: ["foo.bar", "bar.baz"],
8669 sdk_version: "none",
8670 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008671 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008672 }
8673 apex {
8674 name: "myapex",
8675 key: "myapex.key",
8676 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008677 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008678 }
8679 `,
8680 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008681 bcpPermittedPackages: map[string][]string{
8682 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008683 "foo.bar",
8684 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008685 "bcp_lib2": []string{
8686 "foo.bar",
8687 },
8688 },
8689 },
8690 {
8691 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8692 expectedError: "",
8693 bp: `
8694 java_library {
8695 name: "bcp_lib_restricted",
8696 srcs: ["lib1/src/*.java"],
8697 apex_available: ["myapex"],
8698 permitted_packages: ["foo.bar"],
8699 sdk_version: "none",
8700 min_sdk_version: "29",
8701 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008702 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008703 }
8704 java_library {
8705 name: "bcp_lib_unrestricted",
8706 srcs: ["lib2/src/*.java"],
8707 apex_available: ["myapex"],
8708 permitted_packages: ["foo.bar", "bar.baz"],
8709 sdk_version: "none",
8710 min_sdk_version: "29",
8711 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008712 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008713 }
8714 apex {
8715 name: "myapex",
8716 key: "myapex.key",
8717 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8718 updatable: true,
8719 min_sdk_version: "29",
8720 }
8721 `,
8722 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8723 bcpPermittedPackages: map[string][]string{
8724 "bcp_lib1_non_updateable": []string{
8725 "foo.bar",
8726 },
8727 // 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 +01008728 },
8729 },
8730 }
8731 for _, tc := range testcases {
8732 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008733 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008734 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8735 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008736 })
8737 }
8738}
8739
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008740// TODO(jungjw): Move this to proptools
8741func intPtr(i int) *int {
8742 return &i
8743}
8744
8745func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008746 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008747 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008748 apex_set {
8749 name: "myapex",
8750 set: "myapex.apks",
8751 filename: "foo_v2.apex",
8752 overrides: ["foo"],
8753 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008754 `,
8755 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8756 variables.Platform_sdk_version = intPtr(30)
8757 }),
8758 android.FixtureModifyConfig(func(config android.Config) {
8759 config.Targets[android.Android] = []android.Target{
8760 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8761 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8762 }
8763 }),
8764 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008765
Spandan Das9d6e2092024-09-21 02:50:00 +00008766 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008767
8768 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008769 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008770 actual := extractedApex.Args["abis"]
8771 expected := "ARMEABI_V7A,ARM64_V8A"
8772 if actual != expected {
8773 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8774 }
8775 actual = extractedApex.Args["sdk-version"]
8776 expected = "30"
8777 if actual != expected {
8778 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8779 }
8780
Paul Duffin6717d882021-06-15 19:09:41 +01008781 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008782 a := m.Module().(*ApexSet)
8783 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008784 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008785 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8786 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8787 }
8788}
8789
Anton Hansson805e0a52022-11-25 14:06:46 +00008790func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008791 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008792 ctx := testApex(t, `
8793 apex_set {
8794 name: "myapex",
8795 set: "myapex.apks",
8796 filename: "foo_v2.apex",
8797 overrides: ["foo"],
8798 }
8799 `,
8800 android.FixtureModifyConfig(func(config android.Config) {
8801 config.Targets[android.Android] = []android.Target{
8802 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8803 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8804 }
8805 }),
8806 )
8807
Spandan Das9d6e2092024-09-21 02:50:00 +00008808 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008809
8810 // Check extract_apks tool parameters. No native bridge arch expected
8811 extractedApex := m.Output("extracted/myapex.apks")
8812 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8813}
8814
Jiyong Park7d95a512020-05-10 15:16:24 +09008815func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008816 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008817 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8818 apex {
8819 name: "myapex",
8820 key: "myapex.key",
8821 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008822 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008823 }
8824
8825 apex_key {
8826 name: "myapex.key",
8827 public_key: "testkey.avbpubkey",
8828 private_key: "testkey.pem",
8829 }
8830
8831 cc_library {
8832 name: "mylib",
8833 srcs: ["mylib.cpp"],
8834 static_libs: ["otherlib"],
8835 system_shared_libs: [],
8836 stl: "none",
8837 apex_available: [ "myapex" ],
8838 }
8839
8840 cc_library {
8841 name: "otherlib",
8842 srcs: ["mylib.cpp"],
8843 system_shared_libs: [],
8844 stl: "none",
8845 stubs: {
8846 versions: ["1", "2", "3"],
8847 },
8848 apex_available: [ "myapex" ],
8849 }
8850 `)
8851}
8852
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008853func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008854 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008855 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008856 apex {
8857 name: "myapex",
8858 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008859 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008860 custom_sign_tool: "sign_myapex",
8861 }
8862
8863 apex_key {
8864 name: "myapex.key",
8865 public_key: "testkey.avbpubkey",
8866 private_key: "testkey.pem",
8867 }
8868 `)
8869
Jooyung Han286957d2023-10-30 16:17:56 +09008870 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008871 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008872 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 +09008873}
8874
8875func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008876 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008877 ctx := testApex(t, `
8878 apex {
8879 name: "myapex",
8880 key: "myapex.key",
8881 updatable: false,
8882 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008883 }
8884
8885 apex_key {
8886 name: "myapex.key",
8887 public_key: "testkey.avbpubkey",
8888 private_key: "testkey.pem",
8889 }
8890
8891 prebuilt_apex {
8892 name: "myapex",
8893 prefer: true,
8894 arch: {
8895 arm64: {
8896 src: "myapex-arm64.apex",
8897 },
8898 arm: {
8899 src: "myapex-arm.apex",
8900 },
8901 },
8902 }
8903
8904 apex_set {
8905 name: "myapex_set",
8906 set: "myapex.apks",
8907 filename: "myapex_set.apex",
8908 overrides: ["myapex"],
8909 }
8910 `)
8911
Colin Crossf61d03d2023-11-02 16:56:39 -07008912 content := android.ContentFromFileRuleForTests(t, ctx,
8913 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008914 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 -07008915 content = android.ContentFromFileRuleForTests(t, ctx,
8916 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008917 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 +09008918}
8919
Jooyung Han938b5932020-06-20 12:47:47 +09008920func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008921 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008922 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008923 apex {
8924 name: "myapex",
8925 key: "myapex.key",
8926 apps: ["app"],
8927 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008928 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008929 }
8930
8931 apex_key {
8932 name: "myapex.key",
8933 public_key: "testkey.avbpubkey",
8934 private_key: "testkey.pem",
8935 }
8936
8937 android_app {
8938 name: "app",
8939 srcs: ["foo/bar/MyClass.java"],
8940 package_name: "foo",
8941 sdk_version: "none",
8942 system_modules: "none",
8943 apex_available: [ "myapex" ],
8944 }
8945 `, withFiles(map[string][]byte{
8946 "sub/Android.bp": []byte(`
8947 override_apex {
8948 name: "override_myapex",
8949 base: "myapex",
8950 apps: ["override_app"],
8951 allowed_files: ":allowed",
8952 }
8953 // Overridable "path" property should be referenced indirectly
8954 filegroup {
8955 name: "allowed",
8956 srcs: ["allowed.txt"],
8957 }
8958 override_android_app {
8959 name: "override_app",
8960 base: "app",
8961 package_name: "bar",
8962 }
8963 `),
8964 }))
8965
Jooyung Hana0503a52023-08-23 13:12:50 +09008966 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008967 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8968 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8969 }
8970
Spandan Das50801e22024-05-13 18:29:45 +00008971 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008972 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8973 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8974 }
8975}
8976
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008977func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008978 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008979 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008980 apex {
8981 name: "myapex",
8982 key: "myapex.key",
8983 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008984 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008985 }
8986
8987 apex_key {
8988 name: "myapex.key",
8989 public_key: "testkey.avbpubkey",
8990 private_key: "testkey.pem",
8991 }
8992
8993 cc_library {
8994 name: "mylib",
8995 srcs: ["mylib.cpp"],
8996 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008997 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008998 },
8999 apex_available: ["myapex"],
9000 }
9001
9002 cc_prebuilt_library_shared {
9003 name: "mylib",
9004 prefer: false,
9005 srcs: ["prebuilt.so"],
9006 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009007 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009008 },
9009 apex_available: ["myapex"],
9010 }
9011 `)
9012}
9013
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009014func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009015 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009016 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009017 apex {
9018 name: "myapex",
9019 key: "myapex.key",
9020 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009021 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009022 }
9023 apex_key {
9024 name: "myapex.key",
9025 public_key: "testkey.avbpubkey",
9026 private_key: "testkey.pem",
9027 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009028 `,
9029 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9030 variables.CompressedApex = proptools.BoolPtr(true)
9031 }),
9032 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009033
Jooyung Hana0503a52023-08-23 13:12:50 +09009034 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009035 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9036
Jooyung Hana0503a52023-08-23 13:12:50 +09009037 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009038 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9039
9040 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009041 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009042 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9043
9044 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009045 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009046 var builder strings.Builder
9047 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9048 androidMk := builder.String()
9049 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9050}
9051
Jooyung Han26ec8482024-07-31 15:04:05 +09009052func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009053 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009054 for _, compressionEnabled := range []bool{true, false} {
9055 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009056 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009057 ctx := testApex(t, `
9058 apex_set {
9059 name: "com.company.android.myapex",
9060 apex_name: "com.android.myapex",
9061 set: "company-myapex.apks",
9062 }
9063 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9064 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9065 }),
9066 )
9067
9068 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9069 if compressionEnabled {
9070 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9071 } else {
9072 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9073 }
9074 })
9075 }
9076}
9077
Martin Stjernholm2856c662020-12-02 15:03:42 +00009078func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009079 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009080 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009081 apex {
9082 name: "myapex",
9083 key: "myapex.key",
9084 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009085 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009086 }
9087
9088 apex_key {
9089 name: "myapex.key",
9090 public_key: "testkey.avbpubkey",
9091 private_key: "testkey.pem",
9092 }
9093
9094 cc_library {
9095 name: "mylib",
9096 srcs: ["mylib.cpp"],
9097 apex_available: ["myapex"],
9098 shared_libs: ["otherlib"],
9099 system_shared_libs: [],
9100 }
9101
9102 cc_library {
9103 name: "otherlib",
9104 srcs: ["mylib.cpp"],
9105 stubs: {
9106 versions: ["current"],
9107 },
9108 }
9109
9110 cc_prebuilt_library_shared {
9111 name: "otherlib",
9112 prefer: true,
9113 srcs: ["prebuilt.so"],
9114 stubs: {
9115 versions: ["current"],
9116 },
9117 }
9118 `)
9119
Jooyung Hana0503a52023-08-23 13:12:50 +09009120 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009121 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009122 var builder strings.Builder
9123 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9124 androidMk := builder.String()
9125
9126 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9127 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009128 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009129}
9130
Jiyong Parke3867542020-12-03 17:28:25 +09009131func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009132 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009133 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009134 apex {
9135 name: "myapex",
9136 key: "myapex.key",
9137 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009138 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009139 }
9140
9141 apex_key {
9142 name: "myapex.key",
9143 public_key: "testkey.avbpubkey",
9144 private_key: "testkey.pem",
9145 }
9146
9147 cc_library {
9148 name: "mylib",
9149 srcs: ["mylib.cpp"],
9150 system_shared_libs: [],
9151 stl: "none",
9152 apex_available: ["myapex"],
9153 shared_libs: ["mylib2"],
9154 target: {
9155 apex: {
9156 exclude_shared_libs: ["mylib2"],
9157 },
9158 },
9159 }
9160
9161 cc_library {
9162 name: "mylib2",
9163 srcs: ["mylib.cpp"],
9164 system_shared_libs: [],
9165 stl: "none",
9166 }
9167 `)
9168
9169 // Check if mylib is linked to mylib2 for the non-apex target
9170 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9171 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9172
9173 // Make sure that the link doesn't occur for the apex target
9174 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9175 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9176
9177 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009178 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009179 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9180}
9181
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009182func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009183 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009184 bpBase := `
9185 apex {
9186 name: "myapex",
9187 key: "myapex.key",
9188 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009189 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009190 }
9191 apex_key {
9192 name: "myapex.key",
9193 public_key: "testkey.avbpubkey",
9194 private_key: "testkey.pem",
9195 }
9196 cc_library {
9197 name: "mylib",
9198 srcs: ["mylib.cpp"],
9199 apex_available: ["myapex"],
9200 shared_libs: ["stublib"],
9201 system_shared_libs: [],
9202 }
9203 apex {
9204 name: "otherapex",
9205 enabled: %s,
9206 key: "myapex.key",
9207 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009208 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009209 }
9210 `
9211
9212 stublibSourceBp := `
9213 cc_library {
9214 name: "stublib",
9215 srcs: ["mylib.cpp"],
9216 apex_available: ["otherapex"],
9217 system_shared_libs: [],
9218 stl: "none",
9219 stubs: {
9220 versions: ["1"],
9221 },
9222 }
9223 `
9224
9225 stublibPrebuiltBp := `
9226 cc_prebuilt_library_shared {
9227 name: "stublib",
9228 srcs: ["prebuilt.so"],
9229 apex_available: ["otherapex"],
9230 stubs: {
9231 versions: ["1"],
9232 },
9233 %s
9234 }
9235 `
9236
9237 tests := []struct {
9238 name string
9239 stublibBp string
9240 usePrebuilt bool
9241 modNames []string // Modules to collect AndroidMkEntries for
9242 otherApexEnabled []string
9243 }{
9244 {
9245 name: "only_source",
9246 stublibBp: stublibSourceBp,
9247 usePrebuilt: false,
9248 modNames: []string{"stublib"},
9249 otherApexEnabled: []string{"true", "false"},
9250 },
9251 {
9252 name: "source_preferred",
9253 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9254 usePrebuilt: false,
9255 modNames: []string{"stublib", "prebuilt_stublib"},
9256 otherApexEnabled: []string{"true", "false"},
9257 },
9258 {
9259 name: "prebuilt_preferred",
9260 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9261 usePrebuilt: true,
9262 modNames: []string{"stublib", "prebuilt_stublib"},
9263 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9264 },
9265 {
9266 name: "only_prebuilt",
9267 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9268 usePrebuilt: true,
9269 modNames: []string{"stublib"},
9270 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9271 },
9272 }
9273
9274 for _, test := range tests {
9275 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009276 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009277 for _, otherApexEnabled := range test.otherApexEnabled {
9278 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009279 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009280 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009281
9282 type modAndMkEntries struct {
9283 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009284 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009285 }
9286 entries := []*modAndMkEntries{}
9287
9288 // Gather shared lib modules that are installable
9289 for _, modName := range test.modNames {
9290 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9291 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9292 continue
9293 }
9294 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009295 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009296 continue
9297 }
Yu Liue70976d2024-10-15 20:45:35 +00009298 info := android.AndroidMkInfoForTest(t, ctx, mod)
9299 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9300 ents = append(ents, info.ExtraInfo...)
9301 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009302 if ent.Disabled {
9303 continue
9304 }
9305 entries = append(entries, &modAndMkEntries{
9306 mod: mod,
9307 mkEntries: ent,
9308 })
9309 }
9310 }
9311 }
9312
9313 var entry *modAndMkEntries = nil
9314 for _, ent := range entries {
9315 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9316 if entry != nil {
9317 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9318 } else {
9319 entry = ent
9320 }
9321 }
9322 }
9323
9324 if entry == nil {
9325 t.Errorf("AndroidMk entry for \"stublib\" missing")
9326 } else {
9327 isPrebuilt := entry.mod.Prebuilt() != nil
9328 if isPrebuilt != test.usePrebuilt {
9329 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9330 }
9331 if !entry.mod.IsStubs() {
9332 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9333 }
9334 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9335 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9336 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009337 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009338 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009339 if !android.InList(expected, cflags) {
9340 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9341 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009342 }
9343 })
9344 }
9345 })
9346 }
9347}
9348
Colin Crossc33e5212021-05-25 18:16:02 -07009349func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009350 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009351 bp := `
9352 apex {
9353 name: "myapex",
9354 key: "myapex.key",
9355 java_libs: ["mylib"],
9356 bootclasspath_fragments: ["mybootclasspathfragment"],
9357 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9358 updatable: false,
9359 }
9360
9361 apex_key {
9362 name: "myapex.key",
9363 public_key: "testkey.avbpubkey",
9364 private_key: "testkey.pem",
9365 }
9366
9367 java_library {
9368 name: "mylib",
9369 srcs: ["mylib.java"],
9370 apex_available: ["myapex"],
9371 compile_dex: true,
9372 }
9373
9374 bootclasspath_fragment {
9375 name: "mybootclasspathfragment",
9376 contents: ["mybootclasspathlib"],
9377 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009378 hidden_api: {
9379 split_packages: ["*"],
9380 },
Colin Crossc33e5212021-05-25 18:16:02 -07009381 }
9382
9383 java_library {
9384 name: "mybootclasspathlib",
9385 srcs: ["mybootclasspathlib.java"],
9386 apex_available: ["myapex"],
9387 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009388 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009389 }
9390
9391 systemserverclasspath_fragment {
9392 name: "mysystemserverclasspathfragment",
9393 contents: ["mysystemserverclasspathlib"],
9394 apex_available: ["myapex"],
9395 }
9396
9397 java_library {
9398 name: "mysystemserverclasspathlib",
9399 srcs: ["mysystemserverclasspathlib.java"],
9400 apex_available: ["myapex"],
9401 compile_dex: true,
9402 }
9403 `
9404
9405 result := android.GroupFixturePreparers(
9406 PrepareForTestWithApexBuildComponents,
9407 prepareForTestWithMyapex,
9408 java.PrepareForTestWithJavaDefaultModules,
9409 android.PrepareForTestWithAndroidBuildComponents,
9410 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009411 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9412 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009413 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009414 ).RunTest(t)
9415
9416 // Make sure jacoco ran on both mylib and mybootclasspathlib
9417 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9418 t.Errorf("Failed to find jacoco rule for mylib")
9419 }
9420 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9421 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9422 }
9423 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9424 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9425 }
9426}
9427
Jiyong Park192600a2021-08-03 07:52:17 +00009428func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009429 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009430 testApexError(t, `executable mybin is static`, `
9431 apex {
9432 name: "myapex",
9433 key: "myapex.key",
9434 binaries: ["mybin"],
9435 min_sdk_version: "29",
9436 }
9437
9438 apex_key {
9439 name: "myapex.key",
9440 public_key: "testkey.avbpubkey",
9441 private_key: "testkey.pem",
9442 }
9443
9444 cc_binary {
9445 name: "mybin",
9446 srcs: ["mylib.cpp"],
9447 relative_install_path: "foo/bar",
9448 static_executable: true,
9449 system_shared_libs: [],
9450 stl: "none",
9451 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009452 min_sdk_version: "29",
9453 }
9454 `)
9455
9456 testApexError(t, `executable mybin.rust is static`, `
9457 apex {
9458 name: "myapex",
9459 key: "myapex.key",
9460 binaries: ["mybin.rust"],
9461 min_sdk_version: "29",
9462 }
9463
9464 apex_key {
9465 name: "myapex.key",
9466 public_key: "testkey.avbpubkey",
9467 private_key: "testkey.pem",
9468 }
9469
9470 rust_binary {
9471 name: "mybin.rust",
9472 srcs: ["foo.rs"],
9473 static_executable: true,
9474 apex_available: ["myapex"],
9475 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009476 }
9477 `)
9478}
9479
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009480func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009481 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009482 ctx := testApex(t, `
9483 apex {
9484 name: "myapex",
9485 key: "myapex.key",
9486 updatable: false,
9487 java_libs: ["foo"],
9488 }
9489
9490 apex_key {
9491 name: "myapex.key",
9492 public_key: "testkey.avbpubkey",
9493 private_key: "testkey.pem",
9494 }
9495
9496 java_library {
9497 name: "foo",
9498 srcs: ["foo.java"],
9499 apex_available: ["myapex"],
9500 installable: true,
9501 }
9502 `,
9503 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9504 )
9505
Jooyung Hana0503a52023-08-23 13:12:50 +09009506 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009507 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9508 var builder strings.Builder
9509 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9510 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009511 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 +00009512}
9513
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009514func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009515 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009516 ctx := testApex(t, `
9517 apex {
9518 name: "myapex",
9519 key: "myapex.key",
9520 updatable: false,
9521 java_libs: ["foo"],
9522 required: ["otherapex"],
9523 }
9524
9525 apex {
9526 name: "otherapex",
9527 key: "myapex.key",
9528 updatable: false,
9529 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009530 }
9531
9532 apex_key {
9533 name: "myapex.key",
9534 public_key: "testkey.avbpubkey",
9535 private_key: "testkey.pem",
9536 }
9537
9538 java_library {
9539 name: "foo",
9540 srcs: ["foo.java"],
9541 apex_available: ["myapex", "otherapex"],
9542 installable: true,
9543 }
9544 `)
9545
Jooyung Hana0503a52023-08-23 13:12:50 +09009546 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009547 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9548 var builder strings.Builder
9549 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9550 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009551 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009552}
9553
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009554func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009555 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009556 ctx := testApex(t, `
9557 apex {
9558 name: "myapex",
9559 key: "myapex.key",
9560 updatable: false,
9561 }
9562
9563 apex_key {
9564 name: "myapex.key",
9565 public_key: "testkey.avbpubkey",
9566 private_key: "testkey.pem",
9567 }
9568 `)
9569
Jooyung Hana0503a52023-08-23 13:12:50 +09009570 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009571 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009572 data := android.AndroidMkDataForTest(t, ctx, bundle)
9573 var builder strings.Builder
9574 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9575 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009576 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009577}
9578
Jooyung Hana6d36672022-02-24 13:58:07 +09009579func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009580 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009581 for _, tc := range []struct {
9582 name string
9583 ref string
9584 expected_data []string
9585 }{
9586 {
9587 name: "test_using_output",
9588 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009589 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009590 },
9591 {
9592 name: "test_using_apex",
9593 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009594 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009595 },
9596 } {
9597 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009598 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009599 ctx := testApex(t, `
9600 apex {
9601 name: "myapex",
9602 key: "myapex.key",
9603 compressible: true,
9604 updatable: false,
9605 }
9606
9607 apex_key {
9608 name: "myapex.key",
9609 public_key: "testkey.avbpubkey",
9610 private_key: "testkey.pem",
9611 }
9612
9613 java_test {
9614 name: "`+tc.name+`",
9615 srcs: ["a.java"],
9616 data: ["`+tc.ref+`"],
9617 }
9618 `,
9619 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9620 variables.CompressedApex = proptools.BoolPtr(true)
9621 }))
9622 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9623 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9624 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9625 })
9626 }
9627}
9628
satayev758968a2021-12-06 11:42:40 +00009629func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009630 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009631 preparer := android.GroupFixturePreparers(
9632 PrepareForTestWithApexBuildComponents,
9633 prepareForTestWithMyapex,
9634 java.PrepareForTestWithJavaSdkLibraryFiles,
9635 java.PrepareForTestWithJavaDefaultModules,
9636 android.PrepareForTestWithAndroidBuildComponents,
9637 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9638 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9639 )
9640
9641 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9642 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009643 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009644 preparer.RunTestWithBp(t, `
9645 apex {
9646 name: "myapex",
9647 key: "myapex.key",
9648 bootclasspath_fragments: ["mybootclasspathfragment"],
9649 min_sdk_version: "30",
9650 updatable: false,
9651 }
9652
9653 apex_key {
9654 name: "myapex.key",
9655 public_key: "testkey.avbpubkey",
9656 private_key: "testkey.pem",
9657 }
9658
9659 bootclasspath_fragment {
9660 name: "mybootclasspathfragment",
9661 contents: ["mybootclasspathlib"],
9662 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009663 hidden_api: {
9664 split_packages: ["*"],
9665 },
satayev758968a2021-12-06 11:42:40 +00009666 }
9667
9668 java_sdk_library {
9669 name: "mybootclasspathlib",
9670 srcs: ["mybootclasspathlib.java"],
9671 apex_available: ["myapex"],
9672 compile_dex: true,
9673 unsafe_ignore_missing_latest_api: true,
9674 min_sdk_version: "31",
9675 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009676 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009677 }
9678
9679 java_library {
9680 name: "util",
9681 srcs: ["a.java"],
9682 apex_available: ["myapex"],
9683 min_sdk_version: "31",
9684 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009685 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009686 }
9687
9688 java_library {
9689 name: "another_util",
9690 srcs: ["a.java"],
9691 min_sdk_version: "31",
9692 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009693 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009694 }
9695 `)
9696 })
9697
9698 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9699 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009700 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009701 preparer.RunTestWithBp(t, `
9702 apex {
9703 name: "myapex",
9704 key: "myapex.key",
9705 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9706 min_sdk_version: "30",
9707 updatable: false,
9708 }
9709
9710 apex_key {
9711 name: "myapex.key",
9712 public_key: "testkey.avbpubkey",
9713 private_key: "testkey.pem",
9714 }
9715
9716 systemserverclasspath_fragment {
9717 name: "mysystemserverclasspathfragment",
9718 contents: ["mysystemserverclasspathlib"],
9719 apex_available: ["myapex"],
9720 }
9721
9722 java_sdk_library {
9723 name: "mysystemserverclasspathlib",
9724 srcs: ["mysystemserverclasspathlib.java"],
9725 apex_available: ["myapex"],
9726 compile_dex: true,
9727 min_sdk_version: "32",
9728 unsafe_ignore_missing_latest_api: true,
9729 static_libs: ["util"],
9730 }
9731
9732 java_library {
9733 name: "util",
9734 srcs: ["a.java"],
9735 apex_available: ["myapex"],
9736 min_sdk_version: "31",
9737 static_libs: ["another_util"],
9738 }
9739
9740 java_library {
9741 name: "another_util",
9742 srcs: ["a.java"],
9743 min_sdk_version: "31",
9744 apex_available: ["myapex"],
9745 }
9746 `)
9747 })
9748
9749 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009750 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009751 preparer.
satayev758968a2021-12-06 11:42:40 +00009752 RunTestWithBp(t, `
9753 apex {
9754 name: "myapex",
9755 key: "myapex.key",
9756 bootclasspath_fragments: ["mybootclasspathfragment"],
9757 min_sdk_version: "30",
9758 updatable: false,
9759 }
9760
9761 apex_key {
9762 name: "myapex.key",
9763 public_key: "testkey.avbpubkey",
9764 private_key: "testkey.pem",
9765 }
9766
9767 bootclasspath_fragment {
9768 name: "mybootclasspathfragment",
9769 contents: ["mybootclasspathlib"],
9770 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009771 hidden_api: {
9772 split_packages: ["*"],
9773 },
satayev758968a2021-12-06 11:42:40 +00009774 }
9775
9776 java_sdk_library {
9777 name: "mybootclasspathlib",
9778 srcs: ["mybootclasspathlib.java"],
9779 apex_available: ["myapex"],
9780 compile_dex: true,
9781 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009782 sdk_version: "current",
9783 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009784 }
9785 `)
9786 })
9787
9788 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009789 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009790 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9791 RunTestWithBp(t, `
9792 apex {
9793 name: "myapex",
9794 key: "myapex.key",
9795 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9796 min_sdk_version: "30",
9797 updatable: false,
9798 }
9799
9800 apex_key {
9801 name: "myapex.key",
9802 public_key: "testkey.avbpubkey",
9803 private_key: "testkey.pem",
9804 }
9805
9806 systemserverclasspath_fragment {
9807 name: "mysystemserverclasspathfragment",
9808 contents: ["mysystemserverclasspathlib"],
9809 apex_available: ["myapex"],
9810 }
9811
9812 java_sdk_library {
9813 name: "mysystemserverclasspathlib",
9814 srcs: ["mysystemserverclasspathlib.java"],
9815 apex_available: ["myapex"],
9816 compile_dex: true,
9817 unsafe_ignore_missing_latest_api: true,
9818 }
9819 `)
9820 })
9821}
9822
Jiakai Zhang6decef92022-01-12 17:56:19 +00009823// Verifies that the APEX depends on all the Make modules in the list.
9824func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9825 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9826 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009827 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009828 }
9829}
9830
9831// Verifies that the APEX does not depend on any of the Make modules in the list.
9832func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9833 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9834 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009835 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009836 }
9837}
9838
Cole Faust24e25c02024-01-19 14:12:17 -08009839func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009840 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009841 bpTemplate := `
9842 apex {
9843 name: "myapex",
9844 key: "myapex.key",
9845 java_libs: ["myjavalib"],
9846 updatable: %v,
9847 min_sdk_version: "29",
9848 }
9849 apex_key {
9850 name: "myapex.key",
9851 }
9852 java_library {
9853 name: "myjavalib",
9854 srcs: ["MyClass.java"],
9855 apex_available: [ "myapex" ],
9856 lint: {
9857 strict_updatability_linting: %v,
9858 %s
9859 },
9860 sdk_version: "current",
9861 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009862 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009863 }
9864 `
9865 fs := android.MockFS{
9866 "lint-baseline.xml": nil,
9867 }
9868
9869 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009870 testCaseName string
9871 apexUpdatable bool
9872 javaStrictUpdtabilityLint bool
9873 lintFileExists bool
9874 disallowedFlagExpectedOnApex bool
9875 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009876 }{
9877 {
Colin Cross87427352024-09-25 15:41:19 -07009878 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9879 apexUpdatable: true,
9880 javaStrictUpdtabilityLint: true,
9881 lintFileExists: false,
9882 disallowedFlagExpectedOnApex: false,
9883 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009884 },
9885 {
Colin Cross87427352024-09-25 15:41:19 -07009886 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9887 apexUpdatable: false,
9888 javaStrictUpdtabilityLint: false,
9889 lintFileExists: true,
9890 disallowedFlagExpectedOnApex: false,
9891 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009892 },
9893 {
Colin Cross87427352024-09-25 15:41:19 -07009894 testCaseName: "non-updatable apex respects strict updatability of javalib",
9895 apexUpdatable: false,
9896 javaStrictUpdtabilityLint: true,
9897 lintFileExists: true,
9898 disallowedFlagExpectedOnApex: false,
9899 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009900 },
9901 {
Colin Cross87427352024-09-25 15:41:19 -07009902 testCaseName: "updatable apex checks strict updatability of javalib",
9903 apexUpdatable: true,
9904 javaStrictUpdtabilityLint: false,
9905 lintFileExists: true,
9906 disallowedFlagExpectedOnApex: true,
9907 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009908 },
9909 }
9910
9911 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009912 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009913 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009914 fixtures := []android.FixturePreparer{}
9915 baselineProperty := ""
9916 if testCase.lintFileExists {
9917 fixtures = append(fixtures, fs.AddToFixture())
9918 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9919 }
9920 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009921
Colin Cross87427352024-09-25 15:41:19 -07009922 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009923
Colin Cross87427352024-09-25 15:41:19 -07009924 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9925 if expectStrictUpdatability {
9926 if m.Rule == nil {
9927 t.Errorf("expected strict updatability check rule on %s", name)
9928 } else {
9929 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9930 m.RuleParams.Command, "--disallowed_issues NewApi")
9931 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9932 m.Inputs.Strings(), "lint-baseline.xml")
9933 }
9934 } else {
9935 if m.Rule != nil {
9936 t.Errorf("expected no strict updatability check rule on %s", name)
9937 }
9938 }
9939 }
9940
9941 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9942 apex := result.ModuleForTests("myapex", "android_common_myapex")
9943 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9944 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9945
9946 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9947 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9948 })
Cole Faust24e25c02024-01-19 14:12:17 -08009949 }
9950}
9951
Cole Faust24e25c02024-01-19 14:12:17 -08009952// checks transtive deps of an apex coming from bootclasspath_fragment
9953func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009954 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009955 bp := `
9956 apex {
9957 name: "myapex",
9958 key: "myapex.key",
9959 bootclasspath_fragments: ["mybootclasspathfragment"],
9960 updatable: true,
9961 min_sdk_version: "29",
9962 }
9963 apex_key {
9964 name: "myapex.key",
9965 }
9966 bootclasspath_fragment {
9967 name: "mybootclasspathfragment",
9968 contents: ["myjavalib"],
9969 apex_available: ["myapex"],
9970 hidden_api: {
9971 split_packages: ["*"],
9972 },
9973 }
9974 java_library {
9975 name: "myjavalib",
9976 srcs: ["MyClass.java"],
9977 apex_available: [ "myapex" ],
9978 sdk_version: "current",
9979 min_sdk_version: "29",
9980 compile_dex: true,
9981 lint: {
9982 baseline_filename: "lint-baseline.xml",
9983 }
9984 }
9985 `
9986 fs := android.MockFS{
9987 "lint-baseline.xml": nil,
9988 }
9989
9990 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -07009991 apex := result.ModuleForTests("myapex", "android_common_myapex")
9992 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
9993 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
9994 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
9995 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
9996 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -08009997}
Spandan Das66773252022-01-15 00:23:18 +00009998
Jihoon Kang784c0052024-06-25 22:15:39 +00009999func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010000 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010001 bp := `
10002 apex {
10003 name: "myapex",
10004 key: "myapex.key",
10005 bootclasspath_fragments: ["mybootclasspathfragment"],
10006 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010007 java_libs: [
10008 "jacocoagent",
10009 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010010 }
10011 apex_key {
10012 name: "myapex.key",
10013 }
10014 bootclasspath_fragment {
10015 name: "mybootclasspathfragment",
10016 contents: ["foo"],
10017 apex_available: ["myapex"],
10018 hidden_api: {
10019 split_packages: ["*"],
10020 },
10021 }
10022 java_sdk_library {
10023 name: "foo",
10024 srcs: ["MyClass.java"],
10025 apex_available: [ "myapex" ],
10026 sdk_version: "current",
10027 min_sdk_version: "29",
10028 compile_dex: true,
10029 }
10030 `
10031 fs := android.MockFS{
10032 "lint-baseline.xml": nil,
10033 }
10034
10035 result := android.GroupFixturePreparers(
10036 prepareForApexTest,
10037 java.PrepareForTestWithJavaSdkLibraryFiles,
10038 java.PrepareForTestWithJacocoInstrumentation,
10039 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010040 android.FixtureMergeMockFs(fs),
10041 ).RunTestWithBp(t, bp)
10042
10043 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10044 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10045 android.AssertStringDoesContain(t,
10046 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10047 lintReportInputs, "foo.impl")
10048}
10049
Spandan Das42e89502022-05-06 22:12:55 +000010050// updatable apexes should propagate updatable=true to its apps
10051func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010052 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010053 bp := `
10054 apex {
10055 name: "myapex",
10056 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010057 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010058 apps: [
10059 "myapp",
10060 ],
10061 min_sdk_version: "30",
10062 }
10063 apex_key {
10064 name: "myapex.key",
10065 }
10066 android_app {
10067 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010068 apex_available: [
10069 "myapex",
10070 ],
10071 sdk_version: "current",
10072 min_sdk_version: "30",
10073 }
10074 `
Colin Cross99939e92024-10-01 16:02:46 -070010075 _ = android.GroupFixturePreparers(
10076 prepareForApexTest,
10077 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10078 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010079}
10080
Jingwen Chendea7a642023-03-28 11:30:50 +000010081func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010082 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010083 ctx := testApex(t, `
10084 apex {
10085 name: "myapex",
10086 key: "myapex.key",
10087 updatable: false,
10088 }
10089
10090 apex_key {
10091 name: "myapex.key",
10092 public_key: "testkey.avbpubkey",
10093 private_key: "testkey.pem",
10094 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010095 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010096 generateFsRule := mod.Rule("generateFsConfig")
10097 cmd := generateFsRule.RuleParams.Command
10098
10099 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10100}
10101
10102func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010103 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010104 ctx := testApex(t, `
10105 apex {
10106 name: "myapex",
10107 key: "myapex.key",
10108 canned_fs_config: "my_config",
10109 updatable: false,
10110 }
10111
10112 apex_key {
10113 name: "myapex.key",
10114 public_key: "testkey.avbpubkey",
10115 private_key: "testkey.pem",
10116 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010117 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010118 generateFsRule := mod.Rule("generateFsConfig")
10119 cmd := generateFsRule.RuleParams.Command
10120
10121 // Ensure that canned_fs_config has "cat my_config" at the end
10122 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10123}
Spandan Das20fce2d2023-04-12 17:21:39 +000010124
10125func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010126 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010127 testCases := []struct {
10128 desc string
10129 hasStubs bool
10130 apexAvailable string
10131 expectedError string
10132 }{
10133 {
10134 desc: "non-stub library can have multiple apex_available",
10135 hasStubs: false,
10136 apexAvailable: `["myapex", "otherapex"]`,
10137 },
10138 {
10139 desc: "stub library should not be available to anyapex",
10140 hasStubs: true,
10141 apexAvailable: `["//apex_available:anyapex"]`,
10142 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10143 },
10144 {
10145 desc: "stub library should not be available to multiple apexes",
10146 hasStubs: true,
10147 apexAvailable: `["myapex", "otherapex"]`,
10148 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10149 },
10150 {
10151 desc: "stub library can be available to a core apex and a test apex",
10152 hasStubs: true,
10153 apexAvailable: `["myapex", "test_myapex"]`,
10154 },
10155 }
10156 bpTemplate := `
10157 cc_library {
10158 name: "libfoo",
10159 %v
10160 apex_available: %v,
10161 }
10162 apex {
10163 name: "myapex",
10164 key: "apex.key",
10165 updatable: false,
10166 native_shared_libs: ["libfoo"],
10167 }
10168 apex {
10169 name: "otherapex",
10170 key: "apex.key",
10171 updatable: false,
10172 }
10173 apex_test {
10174 name: "test_myapex",
10175 key: "apex.key",
10176 updatable: false,
10177 native_shared_libs: ["libfoo"],
10178 }
10179 apex_key {
10180 name: "apex.key",
10181 }
10182 `
10183 for _, tc := range testCases {
10184 stubs := ""
10185 if tc.hasStubs {
10186 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10187 }
10188 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10189 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10190 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10191 })
10192 if tc.expectedError == "" {
10193 testApex(t, bp, mockFsFixturePreparer)
10194 } else {
10195 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10196 }
10197 }
10198}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010199
10200func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010201 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010202 context := android.GroupFixturePreparers(
10203 android.PrepareForIntegrationTestWithAndroid,
10204 cc.PrepareForIntegrationTestWithCc,
10205 PrepareForTestWithApexBuildComponents,
10206 prepareForTestWithMyapex,
10207 filesystem.PrepareForTestWithFilesystemBuildComponents,
10208 )
10209 result := context.RunTestWithBp(t, `
10210 android_system_image {
10211 name: "myfilesystem",
10212 deps: [
10213 "libfoo",
10214 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010215 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010216 gen_linker_config: true,
10217 linker_config_srcs: ["linker.config.json"],
10218 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010219 }
10220
10221 cc_library {
10222 name: "libfoo",
10223 shared_libs: [
10224 "libbar",
10225 ],
10226 stl: "none",
10227 }
10228
10229 cc_library {
10230 name: "libbar",
10231 stl: "none",
10232 apex_available: ["myapex"],
10233 }
10234
10235 apex {
10236 name: "myapex",
10237 native_shared_libs: ["libbar"],
10238 key: "myapex.key",
10239 updatable: false,
10240 }
10241
10242 apex_key {
10243 name: "myapex.key",
10244 public_key: "testkey.avbpubkey",
10245 private_key: "testkey.pem",
10246 }
10247 `)
10248
Cole Faust3b806d32024-03-11 15:15:03 -070010249 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010250 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10251 inputs.Strings(),
10252 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10253}
Yu Liueae7b362023-11-16 17:05:47 -080010254
10255var apex_default_bp = `
10256 apex_key {
10257 name: "myapex.key",
10258 public_key: "testkey.avbpubkey",
10259 private_key: "testkey.pem",
10260 }
10261
10262 filegroup {
10263 name: "myapex.manifest",
10264 srcs: ["apex_manifest.json"],
10265 }
10266
10267 filegroup {
10268 name: "myapex.androidmanifest",
10269 srcs: ["AndroidManifest.xml"],
10270 }
10271`
10272
10273func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010274 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010275 ctx := testApex(t, apex_default_bp+`
10276 apex {
10277 name: "myapex",
10278 manifest: ":myapex.manifest",
10279 androidManifest: ":myapex.androidmanifest",
10280 key: "myapex.key",
10281 java_libs: [
10282 "my_java_library_foo",
10283 "my_java_library_bar",
10284 ],
10285 updatable: false,
10286 }
10287
10288 java_library {
10289 name: "my_java_library_foo",
10290 srcs: ["foo/bar/MyClass.java"],
10291 sdk_version: "none",
10292 system_modules: "none",
10293 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010294 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010295 "myapex",
10296 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010297 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010298 }
10299
10300 java_library {
10301 name: "my_java_library_bar",
10302 srcs: ["foo/bar/MyClass.java"],
10303 sdk_version: "none",
10304 system_modules: "none",
10305 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010306 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010307 "myapex",
10308 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010309 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010310 }
10311
10312 aconfig_declarations {
10313 name: "my_aconfig_declarations_foo",
10314 package: "com.example.package",
10315 container: "myapex",
10316 srcs: ["foo.aconfig"],
10317 }
10318
10319 java_aconfig_library {
10320 name: "my_java_aconfig_library_foo",
10321 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010322 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010323 "myapex",
10324 ],
10325 }
10326
10327 aconfig_declarations {
10328 name: "my_aconfig_declarations_bar",
10329 package: "com.example.package",
10330 container: "myapex",
10331 srcs: ["bar.aconfig"],
10332 }
10333
10334 java_aconfig_library {
10335 name: "my_java_aconfig_library_bar",
10336 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010337 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010338 "myapex",
10339 ],
10340 }
10341 `)
10342
10343 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10344 s := mod.Rule("apexRule").Args["copy_commands"]
10345 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010346 if len(copyCmds) != 14 {
10347 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010348 }
10349
Jooyung Hana3fddf42024-09-03 13:22:21 +090010350 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10351 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10352 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10353 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010354 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010355
Yu Liubba555e2024-02-17 00:36:42 +000010356 inputs := []string{
10357 "my_aconfig_declarations_foo/intermediate.pb",
10358 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010359 }
Yu Liubba555e2024-02-17 00:36:42 +000010360 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10361 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10362 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10363 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010364 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010365}
10366
10367func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010368 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010369 ctx := testApex(t, apex_default_bp+`
10370 apex {
10371 name: "myapex",
10372 manifest: ":myapex.manifest",
10373 androidManifest: ":myapex.androidmanifest",
10374 key: "myapex.key",
10375 java_libs: [
10376 "my_java_library_foo",
10377 ],
10378 native_shared_libs: [
10379 "my_cc_library_bar",
10380 ],
10381 binaries: [
10382 "my_cc_binary_baz",
10383 ],
10384 updatable: false,
10385 }
10386
10387 java_library {
10388 name: "my_java_library_foo",
10389 srcs: ["foo/bar/MyClass.java"],
10390 sdk_version: "none",
10391 system_modules: "none",
10392 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010393 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010394 "myapex",
10395 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010396 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010397 }
10398
10399 cc_library {
10400 name: "my_cc_library_bar",
10401 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010402 static_libs: [
10403 "my_cc_aconfig_library_bar",
10404 "my_cc_aconfig_library_baz",
10405 ],
Yu Liueae7b362023-11-16 17:05:47 -080010406 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010407 "myapex",
10408 ],
10409 }
10410
10411 cc_binary {
10412 name: "my_cc_binary_baz",
10413 srcs: ["foo/bar/MyClass.cc"],
10414 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010415 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010416 "myapex",
10417 ],
10418 }
10419
10420 aconfig_declarations {
10421 name: "my_aconfig_declarations_foo",
10422 package: "com.example.package",
10423 container: "myapex",
10424 srcs: ["foo.aconfig"],
10425 }
10426
10427 java_aconfig_library {
10428 name: "my_java_aconfig_library_foo",
10429 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010430 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010431 "myapex",
10432 ],
10433 }
10434
10435 aconfig_declarations {
10436 name: "my_aconfig_declarations_bar",
10437 package: "com.example.package",
10438 container: "myapex",
10439 srcs: ["bar.aconfig"],
10440 }
10441
10442 cc_aconfig_library {
10443 name: "my_cc_aconfig_library_bar",
10444 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010445 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010446 "myapex",
10447 ],
10448 }
10449
10450 aconfig_declarations {
10451 name: "my_aconfig_declarations_baz",
10452 package: "com.example.package",
10453 container: "myapex",
10454 srcs: ["baz.aconfig"],
10455 }
10456
10457 cc_aconfig_library {
10458 name: "my_cc_aconfig_library_baz",
10459 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010460 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010461 "myapex",
10462 ],
10463 }
10464
10465 cc_library {
10466 name: "server_configurable_flags",
10467 srcs: ["server_configurable_flags.cc"],
10468 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010469 cc_library {
10470 name: "libbase",
10471 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010472 apex_available: [
10473 "myapex",
10474 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010475 }
10476 cc_library {
10477 name: "libaconfig_storage_read_api_cc",
10478 srcs: ["libaconfig_storage_read_api_cc.cc"],
10479 }
Yu Liueae7b362023-11-16 17:05:47 -080010480 `)
10481
10482 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10483 s := mod.Rule("apexRule").Args["copy_commands"]
10484 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010485 if len(copyCmds) != 18 {
10486 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010487 }
10488
Jooyung Hana3fddf42024-09-03 13:22:21 +090010489 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10490 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10491 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10492 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010493 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010494
Yu Liubba555e2024-02-17 00:36:42 +000010495 inputs := []string{
10496 "my_aconfig_declarations_foo/intermediate.pb",
10497 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10498 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010499 }
Yu Liubba555e2024-02-17 00:36:42 +000010500 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10501 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10502 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10503 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010504 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010505}
10506
Yu Liucec0e412023-11-30 16:45:50 -080010507func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010508 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010509 ctx := testApex(t, apex_default_bp+`
10510 apex {
10511 name: "myapex",
10512 manifest: ":myapex.manifest",
10513 androidManifest: ":myapex.androidmanifest",
10514 key: "myapex.key",
10515 native_shared_libs: [
10516 "libmy_rust_library",
10517 ],
10518 binaries: [
10519 "my_rust_binary",
10520 ],
10521 rust_dyn_libs: [
10522 "libmy_rust_dylib",
10523 ],
10524 updatable: false,
10525 }
10526
10527 rust_library {
10528 name: "libflags_rust", // test mock
10529 crate_name: "flags_rust",
10530 srcs: ["lib.rs"],
10531 apex_available: [
10532 "myapex",
10533 ],
10534 }
10535
10536 rust_library {
10537 name: "liblazy_static", // test mock
10538 crate_name: "lazy_static",
10539 srcs: ["src/lib.rs"],
10540 apex_available: [
10541 "myapex",
10542 ],
10543 }
10544
Ted Bauer02d475c2024-03-27 20:56:26 +000010545 rust_library {
10546 name: "libaconfig_storage_read_api", // test mock
10547 crate_name: "aconfig_storage_read_api",
10548 srcs: ["src/lib.rs"],
10549 apex_available: [
10550 "myapex",
10551 ],
10552 }
10553
Ted Bauer6ef40db2024-03-29 14:04:10 +000010554 rust_library {
10555 name: "liblogger", // test mock
10556 crate_name: "logger",
10557 srcs: ["src/lib.rs"],
10558 apex_available: [
10559 "myapex",
10560 ],
10561 }
10562
10563 rust_library {
10564 name: "liblog_rust", // test mock
10565 crate_name: "log_rust",
10566 srcs: ["src/lib.rs"],
10567 apex_available: [
10568 "myapex",
10569 ],
10570 }
10571
Yu Liucec0e412023-11-30 16:45:50 -080010572 rust_ffi_shared {
10573 name: "libmy_rust_library",
10574 srcs: ["src/lib.rs"],
10575 rustlibs: ["libmy_rust_aconfig_library_foo"],
10576 crate_name: "my_rust_library",
10577 apex_available: [
10578 "myapex",
10579 ],
10580 }
10581
10582 rust_library_dylib {
10583 name: "libmy_rust_dylib",
10584 srcs: ["foo/bar/MyClass.rs"],
10585 rustlibs: ["libmy_rust_aconfig_library_bar"],
10586 crate_name: "my_rust_dylib",
10587 apex_available: [
10588 "myapex",
10589 ],
10590 }
10591
10592 rust_binary {
10593 name: "my_rust_binary",
10594 srcs: ["foo/bar/MyClass.rs"],
10595 rustlibs: [
10596 "libmy_rust_aconfig_library_baz",
10597 "libmy_rust_dylib",
10598 ],
10599 apex_available: [
10600 "myapex",
10601 ],
10602 }
10603
10604 aconfig_declarations {
10605 name: "my_aconfig_declarations_foo",
10606 package: "com.example.package",
10607 container: "myapex",
10608 srcs: ["foo.aconfig"],
10609 }
10610
10611 aconfig_declarations {
10612 name: "my_aconfig_declarations_bar",
10613 package: "com.example.package",
10614 container: "myapex",
10615 srcs: ["bar.aconfig"],
10616 }
10617
10618 aconfig_declarations {
10619 name: "my_aconfig_declarations_baz",
10620 package: "com.example.package",
10621 container: "myapex",
10622 srcs: ["baz.aconfig"],
10623 }
10624
10625 rust_aconfig_library {
10626 name: "libmy_rust_aconfig_library_foo",
10627 aconfig_declarations: "my_aconfig_declarations_foo",
10628 crate_name: "my_rust_aconfig_library_foo",
10629 apex_available: [
10630 "myapex",
10631 ],
10632 }
10633
10634 rust_aconfig_library {
10635 name: "libmy_rust_aconfig_library_bar",
10636 aconfig_declarations: "my_aconfig_declarations_bar",
10637 crate_name: "my_rust_aconfig_library_bar",
10638 apex_available: [
10639 "myapex",
10640 ],
10641 }
10642
10643 rust_aconfig_library {
10644 name: "libmy_rust_aconfig_library_baz",
10645 aconfig_declarations: "my_aconfig_declarations_baz",
10646 crate_name: "my_rust_aconfig_library_baz",
10647 apex_available: [
10648 "myapex",
10649 ],
10650 }
10651 `)
10652
10653 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10654 s := mod.Rule("apexRule").Args["copy_commands"]
10655 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010656 if len(copyCmds) != 38 {
10657 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010658 }
10659
Jooyung Hana3fddf42024-09-03 13:22:21 +090010660 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10661 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10662 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10663 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010664 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010665
Yu Liubba555e2024-02-17 00:36:42 +000010666 inputs := []string{
10667 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010668 "my_aconfig_declarations_bar/intermediate.pb",
10669 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010670 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10671 }
10672 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10673 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10674 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10675 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010676 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010677}
10678
10679func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10680 aconfigRule := mod.Description(desc)
10681 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010682 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010683 if len(aconfigArgs) != len(inputs) {
10684 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010685 }
Yu Liucec0e412023-11-30 16:45:50 -080010686
Yu Liubba555e2024-02-17 00:36:42 +000010687 ensureEquals(t, container, aconfigRule.Args["container"])
10688 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10689
10690 buildParams := aconfigRule.BuildParams
10691 for _, input := range inputs {
10692 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10693 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010694 }
Yu Liubba555e2024-02-17 00:36:42 +000010695
10696 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010697}
10698
Yu Liueae7b362023-11-16 17:05:47 -080010699func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010700 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010701 ctx := testApex(t, apex_default_bp+`
10702 apex {
10703 name: "myapex",
10704 manifest: ":myapex.manifest",
10705 androidManifest: ":myapex.androidmanifest",
10706 key: "myapex.key",
10707 java_libs: [
10708 "my_java_library_foo",
10709 "other_java_library_bar",
10710 ],
10711 updatable: false,
10712 }
10713
10714 java_library {
10715 name: "my_java_library_foo",
10716 srcs: ["foo/bar/MyClass.java"],
10717 sdk_version: "none",
10718 system_modules: "none",
10719 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010720 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010721 "myapex",
10722 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010723 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010724 }
10725
10726 java_library {
10727 name: "other_java_library_bar",
10728 srcs: ["foo/bar/MyClass.java"],
10729 sdk_version: "none",
10730 system_modules: "none",
10731 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010732 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010733 "myapex",
10734 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010735 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010736 }
10737
10738 aconfig_declarations {
10739 name: "my_aconfig_declarations_foo",
10740 package: "com.example.package",
10741 container: "myapex",
10742 srcs: ["foo.aconfig"],
10743 }
10744
10745 java_aconfig_library {
10746 name: "my_java_aconfig_library_foo",
10747 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010748 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010749 "myapex",
10750 ],
10751 }
10752
10753 aconfig_declarations {
10754 name: "other_aconfig_declarations_bar",
10755 package: "com.example.package",
10756 container: "otherapex",
10757 srcs: ["bar.aconfig"],
10758 }
10759
10760 java_aconfig_library {
10761 name: "other_java_aconfig_library_bar",
10762 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010763 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010764 "myapex",
10765 ],
10766 }
10767 `)
10768
10769 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10770 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10771 s := " " + combineAconfigRule.Args["cache_files"]
10772 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10773 if len(aconfigArgs) != 1 {
10774 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10775 }
10776 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10777
10778 buildParams := combineAconfigRule.BuildParams
10779 if len(buildParams.Inputs) != 1 {
10780 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10781 }
10782 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10783 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10784}
10785
10786func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010787 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010788 ctx := testApex(t, apex_default_bp+`
10789 apex {
10790 name: "myapex",
10791 manifest: ":myapex.manifest",
10792 androidManifest: ":myapex.androidmanifest",
10793 key: "myapex.key",
10794 java_libs: [
10795 "my_java_library_foo",
10796 "my_java_library_bar",
10797 ],
10798 updatable: false,
10799 }
10800
10801 java_library {
10802 name: "my_java_library_foo",
10803 srcs: ["foo/bar/MyClass.java"],
10804 sdk_version: "none",
10805 system_modules: "none",
10806 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010807 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010808 "myapex",
10809 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010810 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010811 }
10812
10813 java_library {
10814 name: "my_java_library_bar",
10815 srcs: ["foo/bar/MyClass.java"],
10816 sdk_version: "none",
10817 system_modules: "none",
10818 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010819 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010820 "myapex",
10821 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010822 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010823 }
10824
10825 aconfig_declarations {
10826 name: "my_aconfig_declarations_foo",
10827 package: "com.example.package",
10828 container: "myapex",
10829 srcs: ["foo.aconfig"],
10830 }
10831
10832 java_aconfig_library {
10833 name: "my_java_aconfig_library_foo",
10834 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010835 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010836 "myapex",
10837 ],
10838 }
10839
10840 java_aconfig_library {
10841 name: "my_java_aconfig_library_bar",
10842 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010843 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010844 "myapex",
10845 ],
10846 }
10847 `)
10848
10849 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10850 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10851 s := " " + combineAconfigRule.Args["cache_files"]
10852 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10853 if len(aconfigArgs) != 1 {
10854 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10855 }
10856 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10857
10858 buildParams := combineAconfigRule.BuildParams
10859 if len(buildParams.Inputs) != 1 {
10860 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10861 }
10862 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10863 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10864}
Spandan Das5be63332023-12-13 00:06:32 +000010865
10866// Test that the boot jars come from the _selected_ apex prebuilt
10867// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10868func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010869 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010870 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10871 t.Helper()
10872 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10873 foundLibfooJar := false
10874 base := stem + ".jar"
10875 for _, output := range s.AllOutputs() {
10876 if filepath.Base(output) == base {
10877 foundLibfooJar = true
10878 buildRule := s.Output(output)
10879 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10880 }
10881 }
10882 if !foundLibfooJar {
10883 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10884 }
10885 }
10886
Spandan Das64c9e0c2023-12-20 20:13:34 +000010887 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10888 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10889 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10890 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10891 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10892 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)
10893 }
10894
10895 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10896 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10897 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10898 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10899 }
10900
Spandan Das5be63332023-12-13 00:06:32 +000010901 bp := `
10902 // Source APEX.
10903
10904 java_library {
10905 name: "framework-foo",
10906 srcs: ["foo.java"],
10907 installable: true,
10908 apex_available: [
10909 "com.android.foo",
10910 ],
10911 }
10912
10913 bootclasspath_fragment {
10914 name: "foo-bootclasspath-fragment",
10915 contents: ["framework-foo"],
10916 apex_available: [
10917 "com.android.foo",
10918 ],
10919 hidden_api: {
10920 split_packages: ["*"],
10921 },
10922 }
10923
10924 apex_key {
10925 name: "com.android.foo.key",
10926 public_key: "com.android.foo.avbpubkey",
10927 private_key: "com.android.foo.pem",
10928 }
10929
10930 apex {
10931 name: "com.android.foo",
10932 key: "com.android.foo.key",
10933 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10934 updatable: false,
10935 }
10936
10937 // Prebuilt APEX.
10938
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010939 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010940 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010941 public: {
10942 jars: ["foo.jar"],
10943 },
Spandan Das5be63332023-12-13 00:06:32 +000010944 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010945 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010946 }
10947
10948 prebuilt_bootclasspath_fragment {
10949 name: "foo-bootclasspath-fragment",
10950 contents: ["framework-foo"],
10951 hidden_api: {
10952 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10953 metadata: "my-bootclasspath-fragment/metadata.csv",
10954 index: "my-bootclasspath-fragment/index.csv",
10955 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10956 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10957 },
10958 apex_available: [
10959 "com.android.foo",
10960 ],
10961 }
10962
10963 prebuilt_apex {
10964 name: "com.android.foo",
10965 apex_name: "com.android.foo",
10966 src: "com.android.foo-arm.apex",
10967 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10968 }
10969
10970 // Another Prebuilt ART APEX
10971 prebuilt_apex {
10972 name: "com.android.foo.v2",
10973 apex_name: "com.android.foo", // Used to determine the API domain
10974 src: "com.android.foo-arm.apex",
10975 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10976 }
10977
10978 // APEX contribution modules
10979
10980 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010981 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010982 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010983 contents: ["com.android.foo"],
10984 }
10985
10986 apex_contributions {
10987 name: "foo.prebuilt.contributions",
10988 api_domain: "com.android.foo",
10989 contents: ["prebuilt_com.android.foo"],
10990 }
10991
10992 apex_contributions {
10993 name: "foo.prebuilt.v2.contributions",
10994 api_domain: "com.android.foo",
10995 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010996 }
10997 `
10998
10999 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011000 desc string
11001 selectedApexContributions string
11002 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011003 }{
11004 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011005 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11006 selectedApexContributions: "foo.source.contributions",
11007 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011008 },
11009 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011010 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11011 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011012 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 +000011013 },
11014 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011015 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11016 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011017 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 +000011018 },
11019 }
11020
11021 fragment := java.ApexVariantReference{
11022 Apex: proptools.StringPtr("com.android.foo"),
11023 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11024 }
11025
11026 for _, tc := range testCases {
11027 preparer := android.GroupFixturePreparers(
11028 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11029 android.FixtureMergeMockFs(map[string][]byte{
11030 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11031 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011032 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11033 // file creation.
11034 java.FixtureConfigureBootJars("platform:foo"),
11035 android.FixtureModifyMockFS(func(fs android.MockFS) {
11036 fs["platform/Android.bp"] = []byte(`
11037 java_library {
11038 name: "foo",
11039 srcs: ["Test.java"],
11040 compile_dex: true,
11041 }
11042 `)
11043 fs["platform/Test.java"] = nil
11044 }),
11045
Colin Crossa66b4632024-08-08 15:50:47 -070011046 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011047 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011048 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011049 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011050 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11051 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011052 }
11053}
Spandan Das3576e762024-01-03 18:57:03 +000011054
11055// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11056// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11057func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011058 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011059 // for a mainline module family, check that only the flagged soong module is visible to make
11060 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11061 variation := func(moduleName string) string {
11062 ret := "android_common_com.android.foo"
11063 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011064 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011065 }
11066 return ret
11067 }
11068
11069 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11070 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11071
11072 for _, hiddenModuleName := range hiddenModuleNames {
11073 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11074 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11075
11076 }
11077 }
11078
11079 bp := `
11080 apex_key {
11081 name: "com.android.foo.key",
11082 public_key: "com.android.foo.avbpubkey",
11083 private_key: "com.android.foo.pem",
11084 }
11085
11086 // AOSP source apex
11087 apex {
11088 name: "com.android.foo",
11089 key: "com.android.foo.key",
11090 updatable: false,
11091 }
11092
11093 // Google source apex
11094 override_apex {
11095 name: "com.google.android.foo",
11096 base: "com.android.foo",
11097 key: "com.android.foo.key",
11098 }
11099
11100 // Prebuilt Google APEX.
11101
11102 prebuilt_apex {
11103 name: "com.google.android.foo",
11104 apex_name: "com.android.foo",
11105 src: "com.android.foo-arm.apex",
11106 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11107 }
11108
11109 // Another Prebuilt Google APEX
11110 prebuilt_apex {
11111 name: "com.google.android.foo.v2",
11112 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011113 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011114 src: "com.android.foo-arm.apex",
11115 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11116 }
11117
11118 // APEX contribution modules
11119
11120 apex_contributions {
11121 name: "foo.source.contributions",
11122 api_domain: "com.android.foo",
11123 contents: ["com.google.android.foo"],
11124 }
11125
11126 apex_contributions {
11127 name: "foo.prebuilt.contributions",
11128 api_domain: "com.android.foo",
11129 contents: ["prebuilt_com.google.android.foo"],
11130 }
11131
11132 apex_contributions {
11133 name: "foo.prebuilt.v2.contributions",
11134 api_domain: "com.android.foo",
11135 contents: ["prebuilt_com.google.android.foo.v2"],
11136 }
11137
11138 // This is an incompatible module because it selects multiple versions of the same mainline module
11139 apex_contributions {
11140 name: "foo.prebuilt.duplicate.contributions",
11141 api_domain: "com.android.foo",
11142 contents: [
11143 "prebuilt_com.google.android.foo",
11144 "prebuilt_com.google.android.foo.v2",
11145 ],
11146 }
11147 `
11148
11149 testCases := []struct {
11150 desc string
11151 selectedApexContributions string
11152 expectedVisibleModuleName string
11153 expectedHiddenModuleNames []string
11154 expectedError string
11155 }{
11156 {
11157 desc: "Source apex is selected, prebuilts should be hidden from make",
11158 selectedApexContributions: "foo.source.contributions",
11159 expectedVisibleModuleName: "com.google.android.foo",
11160 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11161 },
11162 {
11163 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11164 selectedApexContributions: "foo.prebuilt.contributions",
11165 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11166 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11167 },
11168 {
11169 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11170 selectedApexContributions: "foo.prebuilt.v2.contributions",
11171 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11172 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11173 },
11174 {
11175 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11176 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11177 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11178 },
11179 }
11180
11181 for _, tc := range testCases {
11182 preparer := android.GroupFixturePreparers(
11183 android.FixtureMergeMockFs(map[string][]byte{
11184 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11185 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011186 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011187 )
11188 if tc.expectedError != "" {
11189 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11190 testApex(t, bp, preparer)
11191 return
11192 }
11193 ctx := testApex(t, bp, preparer)
11194
Spandan Das3576e762024-01-03 18:57:03 +000011195 // Check that
11196 // 1. The contents of the selected apex_contributions are visible to make
11197 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11198 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11199 }
11200}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011201
Spandan Das85bd4622024-08-01 00:51:20 +000011202// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11203func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011204 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011205 // for a mainline module family, check that only the flagged soong module is visible to make
11206 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11207 variation := func(moduleName string) string {
11208 ret := "android_common_com.android.adservices"
11209 if moduleName == "com.google.android.foo" {
11210 ret = "android_common_com.google.android.foo_com.google.android.foo"
11211 }
11212 return ret
11213 }
11214
11215 for _, visibleModuleName := range visibleModuleNames {
11216 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11217 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11218 }
11219
11220 for _, hiddenModuleName := range hiddenModuleNames {
11221 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11222 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11223
11224 }
11225 }
11226
11227 bp := `
11228 apex_key {
11229 name: "com.android.adservices.key",
11230 public_key: "com.android.adservices.avbpubkey",
11231 private_key: "com.android.adservices.pem",
11232 }
11233
11234 // AOSP source apex
11235 apex {
11236 name: "com.android.adservices",
11237 key: "com.android.adservices.key",
11238 updatable: false,
11239 }
11240
11241 // Prebuilt Google APEX.
11242
11243 prebuilt_apex {
11244 name: "com.google.android.adservices",
11245 apex_name: "com.android.adservices",
11246 src: "com.android.foo-arm.apex",
11247 }
11248
11249 // Another Prebuilt Google APEX
11250 prebuilt_apex {
11251 name: "com.google.android.adservices.v2",
11252 apex_name: "com.android.adservices",
11253 src: "com.android.foo-arm.apex",
11254 }
11255
11256 // APEX contribution modules
11257
11258
11259 apex_contributions {
11260 name: "adservices.prebuilt.contributions",
11261 api_domain: "com.android.adservices",
11262 contents: ["prebuilt_com.google.android.adservices"],
11263 }
11264
11265 apex_contributions {
11266 name: "adservices.prebuilt.v2.contributions",
11267 api_domain: "com.android.adservices",
11268 contents: ["prebuilt_com.google.android.adservices.v2"],
11269 }
11270 `
11271
11272 testCases := []struct {
11273 desc string
11274 selectedApexContributions string
11275 expectedVisibleModuleNames []string
11276 expectedHiddenModuleNames []string
11277 }{
11278 {
11279 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11280 selectedApexContributions: "",
11281 expectedVisibleModuleNames: []string{"com.android.adservices"},
11282 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11283 },
11284 {
11285 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11286 selectedApexContributions: "adservices.prebuilt.contributions",
11287 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11288 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11289 },
11290 {
11291 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11292 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11293 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11294 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11295 },
11296 }
11297
11298 for _, tc := range testCases {
11299 preparer := android.GroupFixturePreparers(
11300 android.FixtureMergeMockFs(map[string][]byte{
11301 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11302 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011303 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011304 )
11305 ctx := testApex(t, bp, preparer)
11306
11307 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11308 }
11309}
11310
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011311func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011312 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011313 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11314 for _, moduleName := range moduleNames {
11315 ret += fmt.Sprintf(`
11316 aconfig_declarations {
11317 name: "%[1]s",
11318 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011319 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011320 srcs: [
11321 "%[1]s.aconfig",
11322 ],
11323 }
11324 java_aconfig_library {
11325 name: "%[1]s-lib",
11326 aconfig_declarations: "%[1]s",
11327 }
11328 `, moduleName)
11329 }
11330 return ret
11331 }
11332
11333 result := android.GroupFixturePreparers(
11334 prepareForApexTest,
11335 java.PrepareForTestWithJavaSdkLibraryFiles,
11336 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011337 ).RunTestWithBp(t, `
11338 java_library {
11339 name: "baz-java-lib",
11340 static_libs: [
11341 "baz-lib",
11342 ],
11343 }
11344 filegroup {
11345 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011346 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011347 ":qux-lib{.generated_srcjars}",
11348 ],
11349 }
11350 filegroup {
11351 name: "qux-another-filegroup",
11352 srcs: [
11353 ":qux-filegroup",
11354 ],
11355 }
11356 java_library {
11357 name: "quux-java-lib",
11358 srcs: [
11359 "a.java",
11360 ],
11361 libs: [
11362 "quux-lib",
11363 ],
11364 }
11365 java_sdk_library {
11366 name: "foo",
11367 srcs: [
11368 ":qux-another-filegroup",
11369 ],
11370 api_packages: ["foo"],
11371 system: {
11372 enabled: true,
11373 },
11374 module_lib: {
11375 enabled: true,
11376 },
11377 test: {
11378 enabled: true,
11379 },
11380 static_libs: [
11381 "bar-lib",
11382 ],
11383 libs: [
11384 "baz-java-lib",
11385 "quux-java-lib",
11386 ],
11387 aconfig_declarations: [
11388 "bar",
11389 ],
11390 }
11391 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11392
11393 m := result.ModuleForTests("foo.stubs.source", "android_common")
11394 outDir := "out/soong/.intermediates"
11395
11396 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11397 // textproto files
11398 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11399
11400 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11401 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11402 // to aconfig.
11403 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11404 "passed as an input",
11405 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11406
11407 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11408 // to metalava as classpath. Thus the cache file provided by the associated
11409 // aconfig_declarations module "baz" should be passed to aconfig.
11410 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11411 "java_aconfig_library passed as an input",
11412 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11413
11414 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11415 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11416 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11417 "input",
11418 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11419
11420 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11421 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11422 // aconfig_declarations module "quux" should not be passed to aconfig.
11423 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11424 "depend on java_aconfig_library not passed as an input",
11425 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11426}
Cole Faust7c991b42024-05-15 11:17:55 -070011427
11428func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011429 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011430 ctx := testApex(t, `
11431 apex {
11432 name: "myapex",
11433 key: "myapex.key",
11434 prebuilts: ["myetc", "myetc2"],
11435 min_sdk_version: "29",
11436 }
11437 apex_key {
11438 name: "myapex.key",
11439 public_key: "testkey.avbpubkey",
11440 private_key: "testkey.pem",
11441 }
11442
11443 prebuilt_etc {
11444 name: "myetc",
11445 src: "myprebuilt",
11446 filename: "myfilename",
11447 }
11448 prebuilt_etc {
11449 name: "myetc2",
11450 sub_dir: "mysubdir",
11451 src: "myprebuilt",
11452 filename: "myfilename",
11453 }
11454 `, withFiles(android.MockFS{
11455 "packages/modules/common/build/allowed_deps.txt": nil,
11456 }))
11457
11458 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11459 data := android.AndroidMkDataForTest(t, ctx, ab)
11460 var builder strings.Builder
11461 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11462 androidMk := builder.String()
11463
11464 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11465 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11466}
Spandan Das50801e22024-05-13 18:29:45 +000011467
11468func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011469 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011470 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11471 args := module.Rule("apexRule").Args
11472 optFlags := args["opt_flags"]
11473 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11474 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11475 }
11476 }
11477
11478 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11479 t.Helper()
11480 found := false
11481 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11482 if dep == wantDep {
11483 found = true
11484 }
11485 })
11486 if !found {
11487 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11488 }
11489 }
11490
11491 ctx := testApex(t, `
11492 apex {
11493 name: "com.android.apex30",
11494 min_sdk_version: "30",
11495 key: "apex30.key",
11496 java_libs: ["javalib"],
11497 }
11498
11499 java_library {
11500 name: "javalib",
11501 srcs: ["A.java"],
11502 apex_available: ["com.android.apex30"],
11503 min_sdk_version: "30",
11504 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011505 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011506 }
11507
11508 override_apex {
11509 name: "com.mycompany.android.apex30",
11510 base: "com.android.apex30",
11511 }
11512
11513 override_apex {
11514 name: "com.mycompany.android.apex31",
11515 base: "com.android.apex30",
11516 min_sdk_version: "31",
11517 }
11518
11519 apex_key {
11520 name: "apex30.key",
11521 public_key: "testkey.avbpubkey",
11522 private_key: "testkey.pem",
11523 }
11524
11525 `, android.FixtureMergeMockFs(android.MockFS{
11526 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11527 }),
11528 )
11529
11530 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11531 checkMinSdkVersion(t, baseModule, "30")
11532
11533 // Override module, but uses same min_sdk_version
11534 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11535 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11536 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11537 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11538
11539 // Override module, uses different min_sdk_version
11540 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11541 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11542 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11543 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11544}
Spandan Das0b28fa02024-05-28 23:40:17 +000011545
11546func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011547 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011548 context := android.GroupFixturePreparers(
11549 android.PrepareForIntegrationTestWithAndroid,
11550 PrepareForTestWithApexBuildComponents,
11551 android.FixtureMergeMockFs(android.MockFS{
11552 "system/sepolicy/apex/foo-file_contexts": nil,
11553 }),
11554 )
11555 res := context.RunTestWithBp(t, `
11556 apex {
11557 name: "foo",
11558 key: "myapex.key",
11559 apex_available_name: "com.android.foo",
11560 variant_version: "0",
11561 updatable: false,
11562 }
11563 apex_key {
11564 name: "myapex.key",
11565 public_key: "testkey.avbpubkey",
11566 private_key: "testkey.pem",
11567 }
11568 prebuilt_apex {
11569 name: "foo",
11570 src: "foo.apex",
11571 prefer: true,
11572 }
11573 override_apex {
11574 name: "myoverrideapex",
11575 base: "foo",
11576 }
11577 `)
11578
11579 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11580}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011581
11582func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011583 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011584 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`, `
11585 apex {
11586 name: "myapex",
11587 key: "myapex.key",
11588 updatable: true,
11589 min_sdk_version: "current",
11590 }
11591
11592 apex_key {
11593 name: "myapex.key",
11594 public_key: "testkey.avbpubkey",
11595 private_key: "testkey.pem",
11596 }
11597 `)
11598}
Spandan Das2f68f192024-07-22 19:25:50 +000011599
11600func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011601 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011602 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11603 result := android.GroupFixturePreparers(
11604 prepareForApexTest,
11605 android.PrepareForTestWithAndroidMk,
11606 android.PrepareForTestWithMakevars,
11607 android.FixtureMergeMockFs(fs),
11608 ).RunTest(t)
11609
11610 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011611 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011612
11613 installRules := result.InstallMakeRulesForTesting(t)
11614
11615 var installedlibRule *android.InstallMakeRule
11616 for i, rule := range installRules {
11617 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11618 if installedlibRule != nil {
11619 t.Errorf("Duplicate install rules for %s", rule.Target)
11620 }
11621 installedlibRule = &installRules[i]
11622 }
11623 }
11624 if installedlibRule == nil {
11625 t.Errorf("No install rule found for installedlib")
11626 return
11627 }
11628
11629 if expectLibfooOnSystemLib {
11630 android.AssertStringListContains(t,
11631 "installedlib doesn't have install dependency on libfoo impl",
11632 installedlibRule.OrderOnlyDeps,
11633 "out/target/product/test_device/system/lib/libfoo.so")
11634 } else {
11635 android.AssertStringListDoesNotContain(t,
11636 "installedlib has install dependency on libfoo stub",
11637 installedlibRule.Deps,
11638 "out/target/product/test_device/system/lib/libfoo.so")
11639 android.AssertStringListDoesNotContain(t,
11640 "installedlib has order-only install dependency on libfoo stub",
11641 installedlibRule.OrderOnlyDeps,
11642 "out/target/product/test_device/system/lib/libfoo.so")
11643 }
11644 }
11645
11646 prebuiltLibfooBp := []byte(`
11647 cc_prebuilt_library {
11648 name: "libfoo",
11649 prefer: true,
11650 srcs: ["libfoo.so"],
11651 stubs: {
11652 versions: ["1"],
11653 },
11654 apex_available: ["apexfoo"],
11655 }
11656 `)
11657
11658 apexfooBp := []byte(`
11659 apex {
11660 name: "apexfoo",
11661 key: "apexfoo.key",
11662 native_shared_libs: ["libfoo"],
11663 updatable: false,
11664 compile_multilib: "both",
11665 }
11666 apex_key {
11667 name: "apexfoo.key",
11668 public_key: "testkey.avbpubkey",
11669 private_key: "testkey.pem",
11670 }
11671 `)
11672
11673 installedlibBp := []byte(`
11674 cc_library {
11675 name: "installedlib",
11676 shared_libs: ["libfoo"],
11677 }
11678 `)
11679
11680 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011681 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011682 testFunc(
11683 t,
11684 /*expectLibfooOnSystemLib=*/ false,
11685 android.MockFS{
11686 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11687 "apexfoo/Android.bp": apexfooBp,
11688 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11689 "Android.bp": installedlibBp,
11690 },
11691 )
11692 })
11693
11694 disabledSourceLibfooBp := []byte(`
11695 cc_library {
11696 name: "libfoo",
11697 enabled: false,
11698 stubs: {
11699 versions: ["1"],
11700 },
11701 apex_available: ["apexfoo"],
11702 }
11703 `)
11704
11705 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011706 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011707 testFunc(
11708 t,
11709 /*expectLibfooOnSystemLib=*/ false,
11710 android.MockFS{
11711 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11712 "impl/Android.bp": disabledSourceLibfooBp,
11713 "apexfoo/Android.bp": apexfooBp,
11714 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11715 "Android.bp": installedlibBp,
11716 },
11717 )
11718 })
11719}
Jihoon Kange246bb72024-09-18 22:26:22 +000011720
11721func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011722 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011723 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11724 // in libs of android_app and java_library does not lead to class loader context device/host
11725 // path mismatch errors.
11726 android.GroupFixturePreparers(
11727 prepareForApexTest,
11728 android.PrepareForIntegrationTestWithAndroid,
11729 PrepareForTestWithApexBuildComponents,
11730 android.FixtureModifyEnv(func(env map[string]string) {
11731 env["DISABLE_CONTAINER_CHECK"] = "true"
11732 }),
11733 withFiles(filesForSdkLibrary),
11734 android.FixtureMergeMockFs(android.MockFS{
11735 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11736 }),
11737 ).RunTestWithBp(t, `
11738 apex {
11739 name: "com.android.foo30",
11740 key: "myapex.key",
11741 updatable: true,
11742 bootclasspath_fragments: [
11743 "foo-bootclasspath-fragment",
11744 ],
11745 java_libs: [
11746 "bar",
11747 ],
11748 apps: [
11749 "bar-app",
11750 ],
11751 min_sdk_version: "30",
11752 }
11753 apex_key {
11754 name: "myapex.key",
11755 public_key: "testkey.avbpubkey",
11756 private_key: "testkey.pem",
11757 }
11758 bootclasspath_fragment {
11759 name: "foo-bootclasspath-fragment",
11760 contents: [
11761 "framework-foo",
11762 ],
11763 apex_available: [
11764 "com.android.foo30",
11765 ],
11766 hidden_api: {
11767 split_packages: ["*"]
11768 },
11769 }
11770
11771 java_sdk_library {
11772 name: "framework-foo",
11773 srcs: [
11774 "A.java"
11775 ],
11776 unsafe_ignore_missing_latest_api: true,
11777 apex_available: [
11778 "com.android.foo30",
11779 ],
11780 compile_dex: true,
11781 sdk_version: "core_current",
11782 shared_library: false,
11783 }
11784
11785 java_library {
11786 name: "bar",
11787 srcs: [
11788 "A.java"
11789 ],
11790 libs: [
11791 "framework-foo.impl",
11792 ],
11793 apex_available: [
11794 "com.android.foo30",
11795 ],
11796 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011797 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011798 }
11799
11800 java_library {
11801 name: "baz",
11802 srcs: [
11803 "A.java"
11804 ],
11805 libs: [
11806 "bar",
11807 ],
11808 sdk_version: "core_current",
11809 }
11810
11811 android_app {
11812 name: "bar-app",
11813 srcs: [
11814 "A.java"
11815 ],
11816 libs: [
11817 "baz",
11818 "framework-foo.impl",
11819 ],
11820 apex_available: [
11821 "com.android.foo30",
11822 ],
11823 sdk_version: "core_current",
11824 min_sdk_version: "30",
11825 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011826 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011827 }
11828 `)
11829}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011830
11831// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11832func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011833 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011834 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11835 apex {
11836 name: "myapex",
11837 key: "myapex.key",
11838 systemserverclasspath_fragments: [
11839 "mysystemserverclasspathfragment",
11840 ],
11841 min_sdk_version: "29",
11842 updatable: true,
11843 system_ext_specific: true,
11844 }
11845
11846 apex_key {
11847 name: "myapex.key",
11848 public_key: "testkey.avbpubkey",
11849 private_key: "testkey.pem",
11850 }
11851
11852 java_library {
11853 name: "foo",
11854 srcs: ["b.java"],
11855 min_sdk_version: "29",
11856 installable: true,
11857 apex_available: [
11858 "myapex",
11859 ],
11860 sdk_version: "current",
11861 }
11862
11863 systemserverclasspath_fragment {
11864 name: "mysystemserverclasspathfragment",
11865 contents: [
11866 "foo",
11867 ],
11868 apex_available: [
11869 "myapex",
11870 ],
11871 }
11872 `,
11873 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11874 )
11875}
Spandan Das72d86c62024-10-15 19:27:41 +000011876
11877// partitions should not package the artifacts that are included inside the apex.
11878func TestFilesystemWithApexDeps(t *testing.T) {
11879 t.Parallel()
11880 result := testApex(t, `
11881 android_filesystem {
11882 name: "myfilesystem",
11883 deps: ["myapex"],
11884 }
11885 apex {
11886 name: "myapex",
11887 key: "myapex.key",
11888 binaries: ["binfoo"],
11889 native_shared_libs: ["libfoo"],
11890 apps: ["appfoo"],
11891 updatable: false,
11892 }
11893 apex_key {
11894 name: "myapex.key",
11895 }
11896 cc_binary {
11897 name: "binfoo",
11898 apex_available: ["myapex"],
11899 }
11900 cc_library {
11901 name: "libfoo",
11902 apex_available: ["myapex"],
11903 }
11904 android_app {
11905 name: "appfoo",
11906 sdk_version: "current",
11907 apex_available: ["myapex"],
11908 }
11909 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11910
11911 partition := result.ModuleForTests("myfilesystem", "android_common")
11912 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11913 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11914}
Colin Crossb614cd42024-10-11 12:52:21 -070011915
11916func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11917 t.Parallel()
11918
11919 extractDepenencyPathFromErrors := func(errs []error) []string {
11920 i := slices.IndexFunc(errs, func(err error) bool {
11921 return strings.Contains(err.Error(), "dependency path:")
11922 })
11923 if i < 0 {
11924 return nil
11925 }
11926 var dependencyPath []string
11927 for _, err := range errs[i+1:] {
11928 s := err.Error()
11929 lastSpace := strings.LastIndexByte(s, ' ')
11930 if lastSpace >= 0 {
11931 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11932 }
11933 }
11934 return dependencyPath
11935 }
11936
11937 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11938 return func(t *testing.T, result *android.TestResult) {
11939 t.Helper()
11940 if len(result.Errs) == 0 {
11941 t.Fatalf("expected errors")
11942 }
11943 t.Log("found errors:")
11944 for _, err := range result.Errs {
11945 t.Log(err)
11946 }
11947 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11948 t.Fatalf("expected error %q, got %q", w, g)
11949 }
11950 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11951 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11952 t.Errorf("expected dependency path %q, got %q", w, g)
11953 }
11954 }
11955 }
11956
11957 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11958 return func(bp *bpmodify.Blueprint) {
11959 m := bp.ModulesByName(module)
11960 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11961 if err != nil {
11962 panic(err)
11963 }
11964 props.AddStringToList(lib)
11965 }
11966 }
11967
11968 bpTemplate := `
11969 apex {
11970 name: "myapex",
11971 key: "myapex.key",
11972 native_shared_libs: ["mylib"],
11973 rust_dyn_libs: ["libmyrust"],
11974 binaries: ["mybin", "myrustbin"],
11975 jni_libs: ["libjni"],
11976 apps: ["myapp"],
11977 updatable: false,
11978 }
11979
11980 apex {
11981 name: "otherapex",
11982 key: "myapex.key",
11983 native_shared_libs: ["libotherapex"],
11984 updatable: false,
11985 }
11986
11987 apex_key {
11988 name: "myapex.key",
11989 public_key: "testkey.avbpubkey",
11990 private_key: "testkey.pem",
11991 }
11992
11993 cc_library {
11994 name: "mylib",
11995 srcs: ["foo.cpp"],
11996 apex_available: ["myapex"],
11997 }
11998
11999 cc_binary {
12000 name: "mybin",
12001 srcs: ["foo.cpp"],
12002 apex_available: ["myapex"],
12003 }
12004
12005 rust_library {
12006 name: "libmyrust",
12007 crate_name: "myrust",
12008 srcs: ["src/lib.rs"],
12009 rustlibs: ["libmyrust_transitive_dylib"],
12010 rlibs: ["libmyrust_transitive_rlib"],
12011 apex_available: ["myapex"],
12012 }
12013
12014 rust_library{
12015 name: "libmyrust_transitive_dylib",
12016 crate_name: "myrust_transitive_dylib",
12017 srcs: ["src/lib.rs"],
12018 apex_available: ["myapex"],
12019 }
12020
12021 rust_library {
12022 name: "libmyrust_transitive_rlib",
12023 crate_name: "myrust_transitive_rlib",
12024 srcs: ["src/lib.rs"],
12025 apex_available: ["myapex"],
12026 }
12027
12028 rust_binary {
12029 name: "myrustbin",
12030 srcs: ["src/main.rs"],
12031 apex_available: ["myapex"],
12032 }
12033
12034 cc_library {
12035 name: "libbar",
12036 sdk_version: "current",
12037 srcs: ["bar.cpp"],
12038 apex_available: ["myapex"],
12039 stl: "none",
12040 }
12041
12042 android_app {
12043 name: "myapp",
12044 jni_libs: ["libembeddedjni"],
12045 use_embedded_native_libs: true,
12046 sdk_version: "current",
12047 apex_available: ["myapex"],
12048 }
12049
12050 cc_library {
12051 name: "libembeddedjni",
12052 sdk_version: "current",
12053 srcs: ["bar.cpp"],
12054 apex_available: ["myapex"],
12055 stl: "none",
12056 }
12057
12058 cc_library {
12059 name: "libjni",
12060 sdk_version: "current",
12061 srcs: ["bar.cpp"],
12062 apex_available: ["myapex"],
12063 stl: "none",
12064 }
12065
12066 cc_library {
12067 name: "libotherapex",
12068 sdk_version: "current",
12069 srcs: ["otherapex.cpp"],
12070 apex_available: ["otherapex"],
12071 stubs: {
12072 symbol_file: "libotherapex.map.txt",
12073 versions: ["1", "2", "3"],
12074 },
12075 stl: "none",
12076 }
12077
12078 cc_library {
12079 name: "libplatform",
12080 sdk_version: "current",
12081 srcs: ["libplatform.cpp"],
12082 stubs: {
12083 symbol_file: "libplatform.map.txt",
12084 versions: ["1", "2", "3"],
12085 },
12086 stl: "none",
12087 system_shared_libs: [],
12088 }
12089 `
12090
12091 testCases := []struct {
12092 name string
12093 bpModifier func(bp *bpmodify.Blueprint)
12094 dependencyPath []string
12095 }{
12096 {
12097 name: "library dependency in other apex",
12098 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12099 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12100 },
12101 {
12102 name: "transitive library dependency in other apex",
12103 bpModifier: func(bp *bpmodify.Blueprint) {
12104 addToSharedLibs("mylib", "libbar")(bp)
12105 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12106 },
12107 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12108 },
12109 {
12110 name: "library dependency in platform",
12111 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12112 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12113 },
12114 {
12115 name: "jni library dependency in other apex",
12116 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12117 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12118 },
12119 {
12120 name: "transitive jni library dependency in other apex",
12121 bpModifier: func(bp *bpmodify.Blueprint) {
12122 addToSharedLibs("libjni", "libbar")(bp)
12123 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12124 },
12125 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12126 },
12127 {
12128 name: "jni library dependency in platform",
12129 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12130 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12131 },
12132 {
12133 name: "transitive jni library dependency in platform",
12134 bpModifier: func(bp *bpmodify.Blueprint) {
12135 addToSharedLibs("libjni", "libbar")(bp)
12136 addToSharedLibs("libbar", "libplatform#impl")(bp)
12137 },
12138 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12139 },
12140 // TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
12141 // JNI libraries even if they came from another apex.
12142 //{
12143 // name: "app jni library dependency in other apex",
12144 // bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12145 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12146 //},
12147 //{
12148 // name: "transitive app jni library dependency in other apex",
12149 // bpModifier: func(bp *bpmodify.Blueprint) {
12150 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12151 // addToSharedLibs("libbar", "libotherapex#impl")(bp)
12152 // },
12153 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12154 //},
12155 //{
12156 // name: "app jni library dependency in platform",
12157 // bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12158 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12159 //},
12160 //{
12161 // name: "transitive app jni library dependency in platform",
12162 // bpModifier: func(bp *bpmodify.Blueprint) {
12163 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12164 // addToSharedLibs("libbar", "libplatform#impl")(bp)
12165 // },
12166 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12167 //},
12168 {
12169 name: "binary dependency in other apex",
12170 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12171 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12172 },
12173 {
12174 name: "transitive binary dependency in other apex",
12175 bpModifier: func(bp *bpmodify.Blueprint) {
12176 addToSharedLibs("mybin", "libbar")(bp)
12177 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12178 },
12179 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12180 },
12181 {
12182 name: "binary dependency in platform",
12183 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12184 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12185 },
12186 {
12187 name: "transitive binary dependency in platform",
12188 bpModifier: func(bp *bpmodify.Blueprint) {
12189 addToSharedLibs("mybin", "libbar")(bp)
12190 addToSharedLibs("libbar", "libplatform#impl")(bp)
12191 },
12192 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12193 },
12194
12195 {
12196 name: "rust library dependency in other apex",
12197 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12198 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12199 },
12200 {
12201 name: "transitive rust library dependency in other apex",
12202 bpModifier: func(bp *bpmodify.Blueprint) {
12203 addToSharedLibs("libmyrust", "libbar")(bp)
12204 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12205 },
12206 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12207 },
12208 {
12209 name: "rust library dependency in platform",
12210 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12211 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12212 },
12213 {
12214 name: "transitive rust library dependency in platform",
12215 bpModifier: func(bp *bpmodify.Blueprint) {
12216 addToSharedLibs("libmyrust", "libbar")(bp)
12217 addToSharedLibs("libbar", "libplatform#impl")(bp)
12218 },
12219 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12220 },
12221 {
12222 name: "transitive rust library dylib dependency in other apex",
12223 bpModifier: func(bp *bpmodify.Blueprint) {
12224 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12225 },
12226 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12227 },
12228 {
12229 name: "transitive rust library dylib dependency in platform",
12230 bpModifier: func(bp *bpmodify.Blueprint) {
12231 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12232 },
12233 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12234 },
12235 {
12236 name: "transitive rust library rlib dependency in other apex",
12237 bpModifier: func(bp *bpmodify.Blueprint) {
12238 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12239 },
12240 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12241 },
12242 {
12243 name: "transitive rust library rlib dependency in platform",
12244 bpModifier: func(bp *bpmodify.Blueprint) {
12245 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12246 },
12247 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12248 },
12249 {
12250 name: "rust binary dependency in other apex",
12251 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12252 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12253 },
12254 {
12255 name: "transitive rust binary dependency in other apex",
12256 bpModifier: func(bp *bpmodify.Blueprint) {
12257 addToSharedLibs("myrustbin", "libbar")(bp)
12258 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12259 },
12260 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12261 },
12262 {
12263 name: "rust binary dependency in platform",
12264 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12265 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12266 },
12267 {
12268 name: "transitive rust binary dependency in platform",
12269 bpModifier: func(bp *bpmodify.Blueprint) {
12270 addToSharedLibs("myrustbin", "libbar")(bp)
12271 addToSharedLibs("libbar", "libplatform#impl")(bp)
12272 },
12273 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12274 },
12275 }
12276
12277 for _, testCase := range testCases {
12278 t.Run(testCase.name, func(t *testing.T) {
12279 t.Parallel()
12280 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12281 if err != nil {
12282 t.Fatal(err)
12283 }
12284 if testCase.bpModifier != nil {
12285 func() {
12286 defer func() {
12287 if r := recover(); r != nil {
12288 t.Fatalf("panic in bpModifier: %v", r)
12289 }
12290 }()
12291 testCase.bpModifier(bp)
12292 }()
12293 }
12294 android.GroupFixturePreparers(
12295 android.PrepareForTestWithAndroidBuildComponents,
12296 cc.PrepareForTestWithCcBuildComponents,
12297 java.PrepareForTestWithDexpreopt,
12298 rust.PrepareForTestWithRustDefaultModules,
12299 PrepareForTestWithApexBuildComponents,
12300 prepareForTestWithMyapex,
12301 prepareForTestWithOtherapex,
12302 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12303 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12304 }),
12305 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12306 RunTestWithBp(t, bp.String())
12307 })
12308 }
12309}