blob: 5a51734743e93d20d2df709103260bafa463d643 [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 Hana8fb73b2024-11-25 16:51:25 +09009052func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9053 t.Parallel()
9054 ctx := testApex(t, `
9055 apex {
9056 name: "myapex",
9057 key: "myapex.key",
9058 compressible: true,
9059 updatable: false,
9060 payload_fs_type: "erofs",
9061 }
9062 apex_key {
9063 name: "myapex.key",
9064 public_key: "testkey.avbpubkey",
9065 private_key: "testkey.pem",
9066 }
9067 `,
9068 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9069 variables.CompressedApex = proptools.BoolPtr(true)
9070 }),
9071 )
9072
9073 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9074 if compressRule.Rule != nil {
9075 t.Error("erofs apex should not be compressed")
9076 }
9077}
9078
Jooyung Han26ec8482024-07-31 15:04:05 +09009079func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009080 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009081 for _, compressionEnabled := range []bool{true, false} {
9082 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009083 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009084 ctx := testApex(t, `
9085 apex_set {
9086 name: "com.company.android.myapex",
9087 apex_name: "com.android.myapex",
9088 set: "company-myapex.apks",
9089 }
9090 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9091 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9092 }),
9093 )
9094
9095 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9096 if compressionEnabled {
9097 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9098 } else {
9099 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9100 }
9101 })
9102 }
9103}
9104
Martin Stjernholm2856c662020-12-02 15:03:42 +00009105func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009106 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009107 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009108 apex {
9109 name: "myapex",
9110 key: "myapex.key",
9111 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009112 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009113 }
9114
9115 apex_key {
9116 name: "myapex.key",
9117 public_key: "testkey.avbpubkey",
9118 private_key: "testkey.pem",
9119 }
9120
9121 cc_library {
9122 name: "mylib",
9123 srcs: ["mylib.cpp"],
9124 apex_available: ["myapex"],
9125 shared_libs: ["otherlib"],
9126 system_shared_libs: [],
9127 }
9128
9129 cc_library {
9130 name: "otherlib",
9131 srcs: ["mylib.cpp"],
9132 stubs: {
9133 versions: ["current"],
9134 },
9135 }
9136
9137 cc_prebuilt_library_shared {
9138 name: "otherlib",
9139 prefer: true,
9140 srcs: ["prebuilt.so"],
9141 stubs: {
9142 versions: ["current"],
9143 },
9144 }
9145 `)
9146
Jooyung Hana0503a52023-08-23 13:12:50 +09009147 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009148 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009149 var builder strings.Builder
9150 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9151 androidMk := builder.String()
9152
9153 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9154 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009155 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009156}
9157
Jiyong Parke3867542020-12-03 17:28:25 +09009158func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009159 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009160 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009161 apex {
9162 name: "myapex",
9163 key: "myapex.key",
9164 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009165 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009166 }
9167
9168 apex_key {
9169 name: "myapex.key",
9170 public_key: "testkey.avbpubkey",
9171 private_key: "testkey.pem",
9172 }
9173
9174 cc_library {
9175 name: "mylib",
9176 srcs: ["mylib.cpp"],
9177 system_shared_libs: [],
9178 stl: "none",
9179 apex_available: ["myapex"],
9180 shared_libs: ["mylib2"],
9181 target: {
9182 apex: {
9183 exclude_shared_libs: ["mylib2"],
9184 },
9185 },
9186 }
9187
9188 cc_library {
9189 name: "mylib2",
9190 srcs: ["mylib.cpp"],
9191 system_shared_libs: [],
9192 stl: "none",
9193 }
9194 `)
9195
9196 // Check if mylib is linked to mylib2 for the non-apex target
9197 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9198 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9199
9200 // Make sure that the link doesn't occur for the apex target
9201 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9202 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9203
9204 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009205 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009206 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9207}
9208
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009209func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009210 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009211 bpBase := `
9212 apex {
9213 name: "myapex",
9214 key: "myapex.key",
9215 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009216 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009217 }
9218 apex_key {
9219 name: "myapex.key",
9220 public_key: "testkey.avbpubkey",
9221 private_key: "testkey.pem",
9222 }
9223 cc_library {
9224 name: "mylib",
9225 srcs: ["mylib.cpp"],
9226 apex_available: ["myapex"],
9227 shared_libs: ["stublib"],
9228 system_shared_libs: [],
9229 }
9230 apex {
9231 name: "otherapex",
9232 enabled: %s,
9233 key: "myapex.key",
9234 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009235 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009236 }
9237 `
9238
9239 stublibSourceBp := `
9240 cc_library {
9241 name: "stublib",
9242 srcs: ["mylib.cpp"],
9243 apex_available: ["otherapex"],
9244 system_shared_libs: [],
9245 stl: "none",
9246 stubs: {
9247 versions: ["1"],
9248 },
9249 }
9250 `
9251
9252 stublibPrebuiltBp := `
9253 cc_prebuilt_library_shared {
9254 name: "stublib",
9255 srcs: ["prebuilt.so"],
9256 apex_available: ["otherapex"],
9257 stubs: {
9258 versions: ["1"],
9259 },
9260 %s
9261 }
9262 `
9263
9264 tests := []struct {
9265 name string
9266 stublibBp string
9267 usePrebuilt bool
9268 modNames []string // Modules to collect AndroidMkEntries for
9269 otherApexEnabled []string
9270 }{
9271 {
9272 name: "only_source",
9273 stublibBp: stublibSourceBp,
9274 usePrebuilt: false,
9275 modNames: []string{"stublib"},
9276 otherApexEnabled: []string{"true", "false"},
9277 },
9278 {
9279 name: "source_preferred",
9280 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9281 usePrebuilt: false,
9282 modNames: []string{"stublib", "prebuilt_stublib"},
9283 otherApexEnabled: []string{"true", "false"},
9284 },
9285 {
9286 name: "prebuilt_preferred",
9287 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9288 usePrebuilt: true,
9289 modNames: []string{"stublib", "prebuilt_stublib"},
9290 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9291 },
9292 {
9293 name: "only_prebuilt",
9294 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9295 usePrebuilt: true,
9296 modNames: []string{"stublib"},
9297 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9298 },
9299 }
9300
9301 for _, test := range tests {
9302 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009303 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009304 for _, otherApexEnabled := range test.otherApexEnabled {
9305 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009306 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009307 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009308
9309 type modAndMkEntries struct {
9310 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009311 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009312 }
9313 entries := []*modAndMkEntries{}
9314
9315 // Gather shared lib modules that are installable
9316 for _, modName := range test.modNames {
9317 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9318 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9319 continue
9320 }
9321 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009322 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009323 continue
9324 }
Yu Liue70976d2024-10-15 20:45:35 +00009325 info := android.AndroidMkInfoForTest(t, ctx, mod)
9326 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9327 ents = append(ents, info.ExtraInfo...)
9328 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009329 if ent.Disabled {
9330 continue
9331 }
9332 entries = append(entries, &modAndMkEntries{
9333 mod: mod,
9334 mkEntries: ent,
9335 })
9336 }
9337 }
9338 }
9339
9340 var entry *modAndMkEntries = nil
9341 for _, ent := range entries {
9342 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9343 if entry != nil {
9344 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9345 } else {
9346 entry = ent
9347 }
9348 }
9349 }
9350
9351 if entry == nil {
9352 t.Errorf("AndroidMk entry for \"stublib\" missing")
9353 } else {
9354 isPrebuilt := entry.mod.Prebuilt() != nil
9355 if isPrebuilt != test.usePrebuilt {
9356 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9357 }
9358 if !entry.mod.IsStubs() {
9359 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9360 }
9361 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9362 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9363 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009364 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009365 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009366 if !android.InList(expected, cflags) {
9367 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9368 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009369 }
9370 })
9371 }
9372 })
9373 }
9374}
9375
Colin Crossc33e5212021-05-25 18:16:02 -07009376func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009377 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009378 bp := `
9379 apex {
9380 name: "myapex",
9381 key: "myapex.key",
9382 java_libs: ["mylib"],
9383 bootclasspath_fragments: ["mybootclasspathfragment"],
9384 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9385 updatable: false,
9386 }
9387
9388 apex_key {
9389 name: "myapex.key",
9390 public_key: "testkey.avbpubkey",
9391 private_key: "testkey.pem",
9392 }
9393
9394 java_library {
9395 name: "mylib",
9396 srcs: ["mylib.java"],
9397 apex_available: ["myapex"],
9398 compile_dex: true,
9399 }
9400
9401 bootclasspath_fragment {
9402 name: "mybootclasspathfragment",
9403 contents: ["mybootclasspathlib"],
9404 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009405 hidden_api: {
9406 split_packages: ["*"],
9407 },
Colin Crossc33e5212021-05-25 18:16:02 -07009408 }
9409
9410 java_library {
9411 name: "mybootclasspathlib",
9412 srcs: ["mybootclasspathlib.java"],
9413 apex_available: ["myapex"],
9414 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009415 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009416 }
9417
9418 systemserverclasspath_fragment {
9419 name: "mysystemserverclasspathfragment",
9420 contents: ["mysystemserverclasspathlib"],
9421 apex_available: ["myapex"],
9422 }
9423
9424 java_library {
9425 name: "mysystemserverclasspathlib",
9426 srcs: ["mysystemserverclasspathlib.java"],
9427 apex_available: ["myapex"],
9428 compile_dex: true,
9429 }
9430 `
9431
9432 result := android.GroupFixturePreparers(
9433 PrepareForTestWithApexBuildComponents,
9434 prepareForTestWithMyapex,
9435 java.PrepareForTestWithJavaDefaultModules,
9436 android.PrepareForTestWithAndroidBuildComponents,
9437 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009438 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9439 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009440 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009441 ).RunTest(t)
9442
9443 // Make sure jacoco ran on both mylib and mybootclasspathlib
9444 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9445 t.Errorf("Failed to find jacoco rule for mylib")
9446 }
9447 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9448 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9449 }
9450 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9451 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9452 }
9453}
9454
Jiyong Park192600a2021-08-03 07:52:17 +00009455func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009456 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009457 testApexError(t, `executable mybin is static`, `
9458 apex {
9459 name: "myapex",
9460 key: "myapex.key",
9461 binaries: ["mybin"],
9462 min_sdk_version: "29",
9463 }
9464
9465 apex_key {
9466 name: "myapex.key",
9467 public_key: "testkey.avbpubkey",
9468 private_key: "testkey.pem",
9469 }
9470
9471 cc_binary {
9472 name: "mybin",
9473 srcs: ["mylib.cpp"],
9474 relative_install_path: "foo/bar",
9475 static_executable: true,
9476 system_shared_libs: [],
9477 stl: "none",
9478 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009479 min_sdk_version: "29",
9480 }
9481 `)
9482
9483 testApexError(t, `executable mybin.rust is static`, `
9484 apex {
9485 name: "myapex",
9486 key: "myapex.key",
9487 binaries: ["mybin.rust"],
9488 min_sdk_version: "29",
9489 }
9490
9491 apex_key {
9492 name: "myapex.key",
9493 public_key: "testkey.avbpubkey",
9494 private_key: "testkey.pem",
9495 }
9496
9497 rust_binary {
9498 name: "mybin.rust",
9499 srcs: ["foo.rs"],
9500 static_executable: true,
9501 apex_available: ["myapex"],
9502 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009503 }
9504 `)
9505}
9506
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009507func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009508 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009509 ctx := testApex(t, `
9510 apex {
9511 name: "myapex",
9512 key: "myapex.key",
9513 updatable: false,
9514 java_libs: ["foo"],
9515 }
9516
9517 apex_key {
9518 name: "myapex.key",
9519 public_key: "testkey.avbpubkey",
9520 private_key: "testkey.pem",
9521 }
9522
9523 java_library {
9524 name: "foo",
9525 srcs: ["foo.java"],
9526 apex_available: ["myapex"],
9527 installable: true,
9528 }
9529 `,
9530 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9531 )
9532
Jooyung Hana0503a52023-08-23 13:12:50 +09009533 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009534 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9535 var builder strings.Builder
9536 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9537 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009538 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 +00009539}
9540
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009541func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009542 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009543 ctx := testApex(t, `
9544 apex {
9545 name: "myapex",
9546 key: "myapex.key",
9547 updatable: false,
9548 java_libs: ["foo"],
9549 required: ["otherapex"],
9550 }
9551
9552 apex {
9553 name: "otherapex",
9554 key: "myapex.key",
9555 updatable: false,
9556 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009557 }
9558
9559 apex_key {
9560 name: "myapex.key",
9561 public_key: "testkey.avbpubkey",
9562 private_key: "testkey.pem",
9563 }
9564
9565 java_library {
9566 name: "foo",
9567 srcs: ["foo.java"],
9568 apex_available: ["myapex", "otherapex"],
9569 installable: true,
9570 }
9571 `)
9572
Jooyung Hana0503a52023-08-23 13:12:50 +09009573 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009574 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9575 var builder strings.Builder
9576 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9577 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009578 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009579}
9580
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009581func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009582 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009583 ctx := testApex(t, `
9584 apex {
9585 name: "myapex",
9586 key: "myapex.key",
9587 updatable: false,
9588 }
9589
9590 apex_key {
9591 name: "myapex.key",
9592 public_key: "testkey.avbpubkey",
9593 private_key: "testkey.pem",
9594 }
9595 `)
9596
Jooyung Hana0503a52023-08-23 13:12:50 +09009597 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009598 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009599 data := android.AndroidMkDataForTest(t, ctx, bundle)
9600 var builder strings.Builder
9601 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9602 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009603 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009604}
9605
Jooyung Hana6d36672022-02-24 13:58:07 +09009606func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009607 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009608 for _, tc := range []struct {
9609 name string
9610 ref string
9611 expected_data []string
9612 }{
9613 {
9614 name: "test_using_output",
9615 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009616 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009617 },
9618 {
9619 name: "test_using_apex",
9620 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009621 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009622 },
9623 } {
9624 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009625 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009626 ctx := testApex(t, `
9627 apex {
9628 name: "myapex",
9629 key: "myapex.key",
9630 compressible: true,
9631 updatable: false,
9632 }
9633
9634 apex_key {
9635 name: "myapex.key",
9636 public_key: "testkey.avbpubkey",
9637 private_key: "testkey.pem",
9638 }
9639
9640 java_test {
9641 name: "`+tc.name+`",
9642 srcs: ["a.java"],
9643 data: ["`+tc.ref+`"],
9644 }
9645 `,
9646 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9647 variables.CompressedApex = proptools.BoolPtr(true)
9648 }))
9649 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9650 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9651 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9652 })
9653 }
9654}
9655
satayev758968a2021-12-06 11:42:40 +00009656func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009657 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009658 preparer := android.GroupFixturePreparers(
9659 PrepareForTestWithApexBuildComponents,
9660 prepareForTestWithMyapex,
9661 java.PrepareForTestWithJavaSdkLibraryFiles,
9662 java.PrepareForTestWithJavaDefaultModules,
9663 android.PrepareForTestWithAndroidBuildComponents,
9664 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9665 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9666 )
9667
9668 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9669 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009670 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009671 preparer.RunTestWithBp(t, `
9672 apex {
9673 name: "myapex",
9674 key: "myapex.key",
9675 bootclasspath_fragments: ["mybootclasspathfragment"],
9676 min_sdk_version: "30",
9677 updatable: false,
9678 }
9679
9680 apex_key {
9681 name: "myapex.key",
9682 public_key: "testkey.avbpubkey",
9683 private_key: "testkey.pem",
9684 }
9685
9686 bootclasspath_fragment {
9687 name: "mybootclasspathfragment",
9688 contents: ["mybootclasspathlib"],
9689 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009690 hidden_api: {
9691 split_packages: ["*"],
9692 },
satayev758968a2021-12-06 11:42:40 +00009693 }
9694
9695 java_sdk_library {
9696 name: "mybootclasspathlib",
9697 srcs: ["mybootclasspathlib.java"],
9698 apex_available: ["myapex"],
9699 compile_dex: true,
9700 unsafe_ignore_missing_latest_api: true,
9701 min_sdk_version: "31",
9702 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009703 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009704 }
9705
9706 java_library {
9707 name: "util",
9708 srcs: ["a.java"],
9709 apex_available: ["myapex"],
9710 min_sdk_version: "31",
9711 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009712 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009713 }
9714
9715 java_library {
9716 name: "another_util",
9717 srcs: ["a.java"],
9718 min_sdk_version: "31",
9719 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009720 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009721 }
9722 `)
9723 })
9724
9725 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9726 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009727 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009728 preparer.RunTestWithBp(t, `
9729 apex {
9730 name: "myapex",
9731 key: "myapex.key",
9732 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9733 min_sdk_version: "30",
9734 updatable: false,
9735 }
9736
9737 apex_key {
9738 name: "myapex.key",
9739 public_key: "testkey.avbpubkey",
9740 private_key: "testkey.pem",
9741 }
9742
9743 systemserverclasspath_fragment {
9744 name: "mysystemserverclasspathfragment",
9745 contents: ["mysystemserverclasspathlib"],
9746 apex_available: ["myapex"],
9747 }
9748
9749 java_sdk_library {
9750 name: "mysystemserverclasspathlib",
9751 srcs: ["mysystemserverclasspathlib.java"],
9752 apex_available: ["myapex"],
9753 compile_dex: true,
9754 min_sdk_version: "32",
9755 unsafe_ignore_missing_latest_api: true,
9756 static_libs: ["util"],
9757 }
9758
9759 java_library {
9760 name: "util",
9761 srcs: ["a.java"],
9762 apex_available: ["myapex"],
9763 min_sdk_version: "31",
9764 static_libs: ["another_util"],
9765 }
9766
9767 java_library {
9768 name: "another_util",
9769 srcs: ["a.java"],
9770 min_sdk_version: "31",
9771 apex_available: ["myapex"],
9772 }
9773 `)
9774 })
9775
9776 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009777 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009778 preparer.
satayev758968a2021-12-06 11:42:40 +00009779 RunTestWithBp(t, `
9780 apex {
9781 name: "myapex",
9782 key: "myapex.key",
9783 bootclasspath_fragments: ["mybootclasspathfragment"],
9784 min_sdk_version: "30",
9785 updatable: false,
9786 }
9787
9788 apex_key {
9789 name: "myapex.key",
9790 public_key: "testkey.avbpubkey",
9791 private_key: "testkey.pem",
9792 }
9793
9794 bootclasspath_fragment {
9795 name: "mybootclasspathfragment",
9796 contents: ["mybootclasspathlib"],
9797 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009798 hidden_api: {
9799 split_packages: ["*"],
9800 },
satayev758968a2021-12-06 11:42:40 +00009801 }
9802
9803 java_sdk_library {
9804 name: "mybootclasspathlib",
9805 srcs: ["mybootclasspathlib.java"],
9806 apex_available: ["myapex"],
9807 compile_dex: true,
9808 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009809 sdk_version: "current",
9810 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009811 }
9812 `)
9813 })
9814
9815 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009816 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009817 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9818 RunTestWithBp(t, `
9819 apex {
9820 name: "myapex",
9821 key: "myapex.key",
9822 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9823 min_sdk_version: "30",
9824 updatable: false,
9825 }
9826
9827 apex_key {
9828 name: "myapex.key",
9829 public_key: "testkey.avbpubkey",
9830 private_key: "testkey.pem",
9831 }
9832
9833 systemserverclasspath_fragment {
9834 name: "mysystemserverclasspathfragment",
9835 contents: ["mysystemserverclasspathlib"],
9836 apex_available: ["myapex"],
9837 }
9838
9839 java_sdk_library {
9840 name: "mysystemserverclasspathlib",
9841 srcs: ["mysystemserverclasspathlib.java"],
9842 apex_available: ["myapex"],
9843 compile_dex: true,
9844 unsafe_ignore_missing_latest_api: true,
9845 }
9846 `)
9847 })
9848}
9849
Jiakai Zhang6decef92022-01-12 17:56:19 +00009850// Verifies that the APEX depends on all the Make modules in the list.
9851func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9852 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9853 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009854 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009855 }
9856}
9857
9858// Verifies that the APEX does not depend on any of the Make modules in the list.
9859func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9860 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9861 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009862 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009863 }
9864}
9865
Cole Faust24e25c02024-01-19 14:12:17 -08009866func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009867 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009868 bpTemplate := `
9869 apex {
9870 name: "myapex",
9871 key: "myapex.key",
9872 java_libs: ["myjavalib"],
9873 updatable: %v,
9874 min_sdk_version: "29",
9875 }
9876 apex_key {
9877 name: "myapex.key",
9878 }
9879 java_library {
9880 name: "myjavalib",
9881 srcs: ["MyClass.java"],
9882 apex_available: [ "myapex" ],
9883 lint: {
9884 strict_updatability_linting: %v,
9885 %s
9886 },
9887 sdk_version: "current",
9888 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009889 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009890 }
9891 `
9892 fs := android.MockFS{
9893 "lint-baseline.xml": nil,
9894 }
9895
9896 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009897 testCaseName string
9898 apexUpdatable bool
9899 javaStrictUpdtabilityLint bool
9900 lintFileExists bool
9901 disallowedFlagExpectedOnApex bool
9902 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009903 }{
9904 {
Colin Cross87427352024-09-25 15:41:19 -07009905 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9906 apexUpdatable: true,
9907 javaStrictUpdtabilityLint: true,
9908 lintFileExists: false,
9909 disallowedFlagExpectedOnApex: false,
9910 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009911 },
9912 {
Colin Cross87427352024-09-25 15:41:19 -07009913 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9914 apexUpdatable: false,
9915 javaStrictUpdtabilityLint: false,
9916 lintFileExists: true,
9917 disallowedFlagExpectedOnApex: false,
9918 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009919 },
9920 {
Colin Cross87427352024-09-25 15:41:19 -07009921 testCaseName: "non-updatable apex respects strict updatability of javalib",
9922 apexUpdatable: false,
9923 javaStrictUpdtabilityLint: true,
9924 lintFileExists: true,
9925 disallowedFlagExpectedOnApex: false,
9926 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009927 },
9928 {
Colin Cross87427352024-09-25 15:41:19 -07009929 testCaseName: "updatable apex checks strict updatability of javalib",
9930 apexUpdatable: true,
9931 javaStrictUpdtabilityLint: false,
9932 lintFileExists: true,
9933 disallowedFlagExpectedOnApex: true,
9934 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009935 },
9936 }
9937
9938 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009939 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009940 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009941 fixtures := []android.FixturePreparer{}
9942 baselineProperty := ""
9943 if testCase.lintFileExists {
9944 fixtures = append(fixtures, fs.AddToFixture())
9945 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9946 }
9947 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009948
Colin Cross87427352024-09-25 15:41:19 -07009949 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009950
Colin Cross87427352024-09-25 15:41:19 -07009951 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9952 if expectStrictUpdatability {
9953 if m.Rule == nil {
9954 t.Errorf("expected strict updatability check rule on %s", name)
9955 } else {
9956 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9957 m.RuleParams.Command, "--disallowed_issues NewApi")
9958 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9959 m.Inputs.Strings(), "lint-baseline.xml")
9960 }
9961 } else {
9962 if m.Rule != nil {
9963 t.Errorf("expected no strict updatability check rule on %s", name)
9964 }
9965 }
9966 }
9967
9968 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9969 apex := result.ModuleForTests("myapex", "android_common_myapex")
9970 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9971 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9972
9973 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9974 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9975 })
Cole Faust24e25c02024-01-19 14:12:17 -08009976 }
9977}
9978
Cole Faust24e25c02024-01-19 14:12:17 -08009979// checks transtive deps of an apex coming from bootclasspath_fragment
9980func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009981 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009982 bp := `
9983 apex {
9984 name: "myapex",
9985 key: "myapex.key",
9986 bootclasspath_fragments: ["mybootclasspathfragment"],
9987 updatable: true,
9988 min_sdk_version: "29",
9989 }
9990 apex_key {
9991 name: "myapex.key",
9992 }
9993 bootclasspath_fragment {
9994 name: "mybootclasspathfragment",
9995 contents: ["myjavalib"],
9996 apex_available: ["myapex"],
9997 hidden_api: {
9998 split_packages: ["*"],
9999 },
10000 }
10001 java_library {
10002 name: "myjavalib",
10003 srcs: ["MyClass.java"],
10004 apex_available: [ "myapex" ],
10005 sdk_version: "current",
10006 min_sdk_version: "29",
10007 compile_dex: true,
10008 lint: {
10009 baseline_filename: "lint-baseline.xml",
10010 }
10011 }
10012 `
10013 fs := android.MockFS{
10014 "lint-baseline.xml": nil,
10015 }
10016
10017 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010018 apex := result.ModuleForTests("myapex", "android_common_myapex")
10019 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10020 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10021 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10022 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10023 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010024}
Spandan Das66773252022-01-15 00:23:18 +000010025
Jihoon Kang784c0052024-06-25 22:15:39 +000010026func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010027 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010028 bp := `
10029 apex {
10030 name: "myapex",
10031 key: "myapex.key",
10032 bootclasspath_fragments: ["mybootclasspathfragment"],
10033 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010034 java_libs: [
10035 "jacocoagent",
10036 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010037 }
10038 apex_key {
10039 name: "myapex.key",
10040 }
10041 bootclasspath_fragment {
10042 name: "mybootclasspathfragment",
10043 contents: ["foo"],
10044 apex_available: ["myapex"],
10045 hidden_api: {
10046 split_packages: ["*"],
10047 },
10048 }
10049 java_sdk_library {
10050 name: "foo",
10051 srcs: ["MyClass.java"],
10052 apex_available: [ "myapex" ],
10053 sdk_version: "current",
10054 min_sdk_version: "29",
10055 compile_dex: true,
10056 }
10057 `
10058 fs := android.MockFS{
10059 "lint-baseline.xml": nil,
10060 }
10061
10062 result := android.GroupFixturePreparers(
10063 prepareForApexTest,
10064 java.PrepareForTestWithJavaSdkLibraryFiles,
10065 java.PrepareForTestWithJacocoInstrumentation,
10066 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010067 android.FixtureMergeMockFs(fs),
10068 ).RunTestWithBp(t, bp)
10069
10070 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10071 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10072 android.AssertStringDoesContain(t,
10073 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10074 lintReportInputs, "foo.impl")
10075}
10076
Spandan Das42e89502022-05-06 22:12:55 +000010077// updatable apexes should propagate updatable=true to its apps
10078func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010079 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010080 bp := `
10081 apex {
10082 name: "myapex",
10083 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010084 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010085 apps: [
10086 "myapp",
10087 ],
10088 min_sdk_version: "30",
10089 }
10090 apex_key {
10091 name: "myapex.key",
10092 }
10093 android_app {
10094 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010095 apex_available: [
10096 "myapex",
10097 ],
10098 sdk_version: "current",
10099 min_sdk_version: "30",
10100 }
10101 `
Colin Cross99939e92024-10-01 16:02:46 -070010102 _ = android.GroupFixturePreparers(
10103 prepareForApexTest,
10104 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10105 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010106}
10107
Jingwen Chendea7a642023-03-28 11:30:50 +000010108func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010109 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010110 ctx := testApex(t, `
10111 apex {
10112 name: "myapex",
10113 key: "myapex.key",
10114 updatable: false,
10115 }
10116
10117 apex_key {
10118 name: "myapex.key",
10119 public_key: "testkey.avbpubkey",
10120 private_key: "testkey.pem",
10121 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010122 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010123 generateFsRule := mod.Rule("generateFsConfig")
10124 cmd := generateFsRule.RuleParams.Command
10125
10126 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10127}
10128
10129func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010130 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010131 ctx := testApex(t, `
10132 apex {
10133 name: "myapex",
10134 key: "myapex.key",
10135 canned_fs_config: "my_config",
10136 updatable: false,
10137 }
10138
10139 apex_key {
10140 name: "myapex.key",
10141 public_key: "testkey.avbpubkey",
10142 private_key: "testkey.pem",
10143 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010144 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010145 generateFsRule := mod.Rule("generateFsConfig")
10146 cmd := generateFsRule.RuleParams.Command
10147
10148 // Ensure that canned_fs_config has "cat my_config" at the end
10149 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10150}
Spandan Das20fce2d2023-04-12 17:21:39 +000010151
10152func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010153 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010154 testCases := []struct {
10155 desc string
10156 hasStubs bool
10157 apexAvailable string
10158 expectedError string
10159 }{
10160 {
10161 desc: "non-stub library can have multiple apex_available",
10162 hasStubs: false,
10163 apexAvailable: `["myapex", "otherapex"]`,
10164 },
10165 {
10166 desc: "stub library should not be available to anyapex",
10167 hasStubs: true,
10168 apexAvailable: `["//apex_available:anyapex"]`,
10169 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10170 },
10171 {
10172 desc: "stub library should not be available to multiple apexes",
10173 hasStubs: true,
10174 apexAvailable: `["myapex", "otherapex"]`,
10175 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10176 },
10177 {
10178 desc: "stub library can be available to a core apex and a test apex",
10179 hasStubs: true,
10180 apexAvailable: `["myapex", "test_myapex"]`,
10181 },
10182 }
10183 bpTemplate := `
10184 cc_library {
10185 name: "libfoo",
10186 %v
10187 apex_available: %v,
10188 }
10189 apex {
10190 name: "myapex",
10191 key: "apex.key",
10192 updatable: false,
10193 native_shared_libs: ["libfoo"],
10194 }
10195 apex {
10196 name: "otherapex",
10197 key: "apex.key",
10198 updatable: false,
10199 }
10200 apex_test {
10201 name: "test_myapex",
10202 key: "apex.key",
10203 updatable: false,
10204 native_shared_libs: ["libfoo"],
10205 }
10206 apex_key {
10207 name: "apex.key",
10208 }
10209 `
10210 for _, tc := range testCases {
10211 stubs := ""
10212 if tc.hasStubs {
10213 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10214 }
10215 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10216 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10217 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10218 })
10219 if tc.expectedError == "" {
10220 testApex(t, bp, mockFsFixturePreparer)
10221 } else {
10222 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10223 }
10224 }
10225}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010226
10227func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010228 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010229 context := android.GroupFixturePreparers(
10230 android.PrepareForIntegrationTestWithAndroid,
10231 cc.PrepareForIntegrationTestWithCc,
10232 PrepareForTestWithApexBuildComponents,
10233 prepareForTestWithMyapex,
10234 filesystem.PrepareForTestWithFilesystemBuildComponents,
10235 )
10236 result := context.RunTestWithBp(t, `
10237 android_system_image {
10238 name: "myfilesystem",
10239 deps: [
10240 "libfoo",
10241 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010242 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010243 gen_linker_config: true,
10244 linker_config_srcs: ["linker.config.json"],
10245 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010246 }
10247
10248 cc_library {
10249 name: "libfoo",
10250 shared_libs: [
10251 "libbar",
10252 ],
10253 stl: "none",
10254 }
10255
10256 cc_library {
10257 name: "libbar",
10258 stl: "none",
10259 apex_available: ["myapex"],
10260 }
10261
10262 apex {
10263 name: "myapex",
10264 native_shared_libs: ["libbar"],
10265 key: "myapex.key",
10266 updatable: false,
10267 }
10268
10269 apex_key {
10270 name: "myapex.key",
10271 public_key: "testkey.avbpubkey",
10272 private_key: "testkey.pem",
10273 }
10274 `)
10275
Cole Faust3b806d32024-03-11 15:15:03 -070010276 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010277 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10278 inputs.Strings(),
10279 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10280}
Yu Liueae7b362023-11-16 17:05:47 -080010281
10282var apex_default_bp = `
10283 apex_key {
10284 name: "myapex.key",
10285 public_key: "testkey.avbpubkey",
10286 private_key: "testkey.pem",
10287 }
10288
10289 filegroup {
10290 name: "myapex.manifest",
10291 srcs: ["apex_manifest.json"],
10292 }
10293
10294 filegroup {
10295 name: "myapex.androidmanifest",
10296 srcs: ["AndroidManifest.xml"],
10297 }
10298`
10299
10300func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010301 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010302 ctx := testApex(t, apex_default_bp+`
10303 apex {
10304 name: "myapex",
10305 manifest: ":myapex.manifest",
10306 androidManifest: ":myapex.androidmanifest",
10307 key: "myapex.key",
10308 java_libs: [
10309 "my_java_library_foo",
10310 "my_java_library_bar",
10311 ],
10312 updatable: false,
10313 }
10314
10315 java_library {
10316 name: "my_java_library_foo",
10317 srcs: ["foo/bar/MyClass.java"],
10318 sdk_version: "none",
10319 system_modules: "none",
10320 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010321 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010322 "myapex",
10323 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010324 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010325 }
10326
10327 java_library {
10328 name: "my_java_library_bar",
10329 srcs: ["foo/bar/MyClass.java"],
10330 sdk_version: "none",
10331 system_modules: "none",
10332 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010333 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010334 "myapex",
10335 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010336 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010337 }
10338
10339 aconfig_declarations {
10340 name: "my_aconfig_declarations_foo",
10341 package: "com.example.package",
10342 container: "myapex",
10343 srcs: ["foo.aconfig"],
10344 }
10345
10346 java_aconfig_library {
10347 name: "my_java_aconfig_library_foo",
10348 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010349 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010350 "myapex",
10351 ],
10352 }
10353
10354 aconfig_declarations {
10355 name: "my_aconfig_declarations_bar",
10356 package: "com.example.package",
10357 container: "myapex",
10358 srcs: ["bar.aconfig"],
10359 }
10360
10361 java_aconfig_library {
10362 name: "my_java_aconfig_library_bar",
10363 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010364 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010365 "myapex",
10366 ],
10367 }
10368 `)
10369
10370 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10371 s := mod.Rule("apexRule").Args["copy_commands"]
10372 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010373 if len(copyCmds) != 14 {
10374 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010375 }
10376
Jooyung Hana3fddf42024-09-03 13:22:21 +090010377 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10378 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10379 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10380 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010381 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010382
Yu Liubba555e2024-02-17 00:36:42 +000010383 inputs := []string{
10384 "my_aconfig_declarations_foo/intermediate.pb",
10385 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010386 }
Yu Liubba555e2024-02-17 00:36:42 +000010387 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10388 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10389 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10390 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010391 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010392}
10393
10394func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010395 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010396 ctx := testApex(t, apex_default_bp+`
10397 apex {
10398 name: "myapex",
10399 manifest: ":myapex.manifest",
10400 androidManifest: ":myapex.androidmanifest",
10401 key: "myapex.key",
10402 java_libs: [
10403 "my_java_library_foo",
10404 ],
10405 native_shared_libs: [
10406 "my_cc_library_bar",
10407 ],
10408 binaries: [
10409 "my_cc_binary_baz",
10410 ],
10411 updatable: false,
10412 }
10413
10414 java_library {
10415 name: "my_java_library_foo",
10416 srcs: ["foo/bar/MyClass.java"],
10417 sdk_version: "none",
10418 system_modules: "none",
10419 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010420 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010421 "myapex",
10422 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010423 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010424 }
10425
10426 cc_library {
10427 name: "my_cc_library_bar",
10428 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010429 static_libs: [
10430 "my_cc_aconfig_library_bar",
10431 "my_cc_aconfig_library_baz",
10432 ],
Yu Liueae7b362023-11-16 17:05:47 -080010433 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010434 "myapex",
10435 ],
10436 }
10437
10438 cc_binary {
10439 name: "my_cc_binary_baz",
10440 srcs: ["foo/bar/MyClass.cc"],
10441 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010442 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010443 "myapex",
10444 ],
10445 }
10446
10447 aconfig_declarations {
10448 name: "my_aconfig_declarations_foo",
10449 package: "com.example.package",
10450 container: "myapex",
10451 srcs: ["foo.aconfig"],
10452 }
10453
10454 java_aconfig_library {
10455 name: "my_java_aconfig_library_foo",
10456 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010457 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010458 "myapex",
10459 ],
10460 }
10461
10462 aconfig_declarations {
10463 name: "my_aconfig_declarations_bar",
10464 package: "com.example.package",
10465 container: "myapex",
10466 srcs: ["bar.aconfig"],
10467 }
10468
10469 cc_aconfig_library {
10470 name: "my_cc_aconfig_library_bar",
10471 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010472 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010473 "myapex",
10474 ],
10475 }
10476
10477 aconfig_declarations {
10478 name: "my_aconfig_declarations_baz",
10479 package: "com.example.package",
10480 container: "myapex",
10481 srcs: ["baz.aconfig"],
10482 }
10483
10484 cc_aconfig_library {
10485 name: "my_cc_aconfig_library_baz",
10486 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010487 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010488 "myapex",
10489 ],
10490 }
10491
10492 cc_library {
10493 name: "server_configurable_flags",
10494 srcs: ["server_configurable_flags.cc"],
10495 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010496 cc_library {
10497 name: "libbase",
10498 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010499 apex_available: [
10500 "myapex",
10501 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010502 }
10503 cc_library {
10504 name: "libaconfig_storage_read_api_cc",
10505 srcs: ["libaconfig_storage_read_api_cc.cc"],
10506 }
Yu Liueae7b362023-11-16 17:05:47 -080010507 `)
10508
10509 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10510 s := mod.Rule("apexRule").Args["copy_commands"]
10511 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010512 if len(copyCmds) != 18 {
10513 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010514 }
10515
Jooyung Hana3fddf42024-09-03 13:22:21 +090010516 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10517 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10518 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10519 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010520 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010521
Yu Liubba555e2024-02-17 00:36:42 +000010522 inputs := []string{
10523 "my_aconfig_declarations_foo/intermediate.pb",
10524 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10525 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010526 }
Yu Liubba555e2024-02-17 00:36:42 +000010527 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10528 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10529 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10530 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010531 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010532}
10533
Yu Liucec0e412023-11-30 16:45:50 -080010534func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010535 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010536 ctx := testApex(t, apex_default_bp+`
10537 apex {
10538 name: "myapex",
10539 manifest: ":myapex.manifest",
10540 androidManifest: ":myapex.androidmanifest",
10541 key: "myapex.key",
10542 native_shared_libs: [
10543 "libmy_rust_library",
10544 ],
10545 binaries: [
10546 "my_rust_binary",
10547 ],
10548 rust_dyn_libs: [
10549 "libmy_rust_dylib",
10550 ],
10551 updatable: false,
10552 }
10553
10554 rust_library {
10555 name: "libflags_rust", // test mock
10556 crate_name: "flags_rust",
10557 srcs: ["lib.rs"],
10558 apex_available: [
10559 "myapex",
10560 ],
10561 }
10562
10563 rust_library {
10564 name: "liblazy_static", // test mock
10565 crate_name: "lazy_static",
10566 srcs: ["src/lib.rs"],
10567 apex_available: [
10568 "myapex",
10569 ],
10570 }
10571
Ted Bauer02d475c2024-03-27 20:56:26 +000010572 rust_library {
10573 name: "libaconfig_storage_read_api", // test mock
10574 crate_name: "aconfig_storage_read_api",
10575 srcs: ["src/lib.rs"],
10576 apex_available: [
10577 "myapex",
10578 ],
10579 }
10580
Ted Bauer6ef40db2024-03-29 14:04:10 +000010581 rust_library {
10582 name: "liblogger", // test mock
10583 crate_name: "logger",
10584 srcs: ["src/lib.rs"],
10585 apex_available: [
10586 "myapex",
10587 ],
10588 }
10589
10590 rust_library {
10591 name: "liblog_rust", // test mock
10592 crate_name: "log_rust",
10593 srcs: ["src/lib.rs"],
10594 apex_available: [
10595 "myapex",
10596 ],
10597 }
10598
Yu Liucec0e412023-11-30 16:45:50 -080010599 rust_ffi_shared {
10600 name: "libmy_rust_library",
10601 srcs: ["src/lib.rs"],
10602 rustlibs: ["libmy_rust_aconfig_library_foo"],
10603 crate_name: "my_rust_library",
10604 apex_available: [
10605 "myapex",
10606 ],
10607 }
10608
10609 rust_library_dylib {
10610 name: "libmy_rust_dylib",
10611 srcs: ["foo/bar/MyClass.rs"],
10612 rustlibs: ["libmy_rust_aconfig_library_bar"],
10613 crate_name: "my_rust_dylib",
10614 apex_available: [
10615 "myapex",
10616 ],
10617 }
10618
10619 rust_binary {
10620 name: "my_rust_binary",
10621 srcs: ["foo/bar/MyClass.rs"],
10622 rustlibs: [
10623 "libmy_rust_aconfig_library_baz",
10624 "libmy_rust_dylib",
10625 ],
10626 apex_available: [
10627 "myapex",
10628 ],
10629 }
10630
10631 aconfig_declarations {
10632 name: "my_aconfig_declarations_foo",
10633 package: "com.example.package",
10634 container: "myapex",
10635 srcs: ["foo.aconfig"],
10636 }
10637
10638 aconfig_declarations {
10639 name: "my_aconfig_declarations_bar",
10640 package: "com.example.package",
10641 container: "myapex",
10642 srcs: ["bar.aconfig"],
10643 }
10644
10645 aconfig_declarations {
10646 name: "my_aconfig_declarations_baz",
10647 package: "com.example.package",
10648 container: "myapex",
10649 srcs: ["baz.aconfig"],
10650 }
10651
10652 rust_aconfig_library {
10653 name: "libmy_rust_aconfig_library_foo",
10654 aconfig_declarations: "my_aconfig_declarations_foo",
10655 crate_name: "my_rust_aconfig_library_foo",
10656 apex_available: [
10657 "myapex",
10658 ],
10659 }
10660
10661 rust_aconfig_library {
10662 name: "libmy_rust_aconfig_library_bar",
10663 aconfig_declarations: "my_aconfig_declarations_bar",
10664 crate_name: "my_rust_aconfig_library_bar",
10665 apex_available: [
10666 "myapex",
10667 ],
10668 }
10669
10670 rust_aconfig_library {
10671 name: "libmy_rust_aconfig_library_baz",
10672 aconfig_declarations: "my_aconfig_declarations_baz",
10673 crate_name: "my_rust_aconfig_library_baz",
10674 apex_available: [
10675 "myapex",
10676 ],
10677 }
10678 `)
10679
10680 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10681 s := mod.Rule("apexRule").Args["copy_commands"]
10682 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010683 if len(copyCmds) != 38 {
10684 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010685 }
10686
Jooyung Hana3fddf42024-09-03 13:22:21 +090010687 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10688 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10689 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10690 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010691 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010692
Yu Liubba555e2024-02-17 00:36:42 +000010693 inputs := []string{
10694 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010695 "my_aconfig_declarations_bar/intermediate.pb",
10696 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010697 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10698 }
10699 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10700 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10701 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10702 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010703 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010704}
10705
10706func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10707 aconfigRule := mod.Description(desc)
10708 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010709 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010710 if len(aconfigArgs) != len(inputs) {
10711 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010712 }
Yu Liucec0e412023-11-30 16:45:50 -080010713
Yu Liubba555e2024-02-17 00:36:42 +000010714 ensureEquals(t, container, aconfigRule.Args["container"])
10715 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10716
10717 buildParams := aconfigRule.BuildParams
10718 for _, input := range inputs {
10719 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10720 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010721 }
Yu Liubba555e2024-02-17 00:36:42 +000010722
10723 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010724}
10725
Yu Liueae7b362023-11-16 17:05:47 -080010726func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010727 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010728 ctx := testApex(t, apex_default_bp+`
10729 apex {
10730 name: "myapex",
10731 manifest: ":myapex.manifest",
10732 androidManifest: ":myapex.androidmanifest",
10733 key: "myapex.key",
10734 java_libs: [
10735 "my_java_library_foo",
10736 "other_java_library_bar",
10737 ],
10738 updatable: false,
10739 }
10740
10741 java_library {
10742 name: "my_java_library_foo",
10743 srcs: ["foo/bar/MyClass.java"],
10744 sdk_version: "none",
10745 system_modules: "none",
10746 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010747 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010748 "myapex",
10749 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010750 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010751 }
10752
10753 java_library {
10754 name: "other_java_library_bar",
10755 srcs: ["foo/bar/MyClass.java"],
10756 sdk_version: "none",
10757 system_modules: "none",
10758 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010759 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010760 "myapex",
10761 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010762 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010763 }
10764
10765 aconfig_declarations {
10766 name: "my_aconfig_declarations_foo",
10767 package: "com.example.package",
10768 container: "myapex",
10769 srcs: ["foo.aconfig"],
10770 }
10771
10772 java_aconfig_library {
10773 name: "my_java_aconfig_library_foo",
10774 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010775 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010776 "myapex",
10777 ],
10778 }
10779
10780 aconfig_declarations {
10781 name: "other_aconfig_declarations_bar",
10782 package: "com.example.package",
10783 container: "otherapex",
10784 srcs: ["bar.aconfig"],
10785 }
10786
10787 java_aconfig_library {
10788 name: "other_java_aconfig_library_bar",
10789 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010790 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010791 "myapex",
10792 ],
10793 }
10794 `)
10795
10796 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10797 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10798 s := " " + combineAconfigRule.Args["cache_files"]
10799 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10800 if len(aconfigArgs) != 1 {
10801 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10802 }
10803 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10804
10805 buildParams := combineAconfigRule.BuildParams
10806 if len(buildParams.Inputs) != 1 {
10807 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10808 }
10809 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10810 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10811}
10812
10813func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010814 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010815 ctx := testApex(t, apex_default_bp+`
10816 apex {
10817 name: "myapex",
10818 manifest: ":myapex.manifest",
10819 androidManifest: ":myapex.androidmanifest",
10820 key: "myapex.key",
10821 java_libs: [
10822 "my_java_library_foo",
10823 "my_java_library_bar",
10824 ],
10825 updatable: false,
10826 }
10827
10828 java_library {
10829 name: "my_java_library_foo",
10830 srcs: ["foo/bar/MyClass.java"],
10831 sdk_version: "none",
10832 system_modules: "none",
10833 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010834 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010835 "myapex",
10836 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010837 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010838 }
10839
10840 java_library {
10841 name: "my_java_library_bar",
10842 srcs: ["foo/bar/MyClass.java"],
10843 sdk_version: "none",
10844 system_modules: "none",
10845 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010846 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010847 "myapex",
10848 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010849 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010850 }
10851
10852 aconfig_declarations {
10853 name: "my_aconfig_declarations_foo",
10854 package: "com.example.package",
10855 container: "myapex",
10856 srcs: ["foo.aconfig"],
10857 }
10858
10859 java_aconfig_library {
10860 name: "my_java_aconfig_library_foo",
10861 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010862 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010863 "myapex",
10864 ],
10865 }
10866
10867 java_aconfig_library {
10868 name: "my_java_aconfig_library_bar",
10869 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010870 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010871 "myapex",
10872 ],
10873 }
10874 `)
10875
10876 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10877 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10878 s := " " + combineAconfigRule.Args["cache_files"]
10879 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10880 if len(aconfigArgs) != 1 {
10881 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10882 }
10883 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10884
10885 buildParams := combineAconfigRule.BuildParams
10886 if len(buildParams.Inputs) != 1 {
10887 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10888 }
10889 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10890 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10891}
Spandan Das5be63332023-12-13 00:06:32 +000010892
10893// Test that the boot jars come from the _selected_ apex prebuilt
10894// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10895func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010896 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010897 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10898 t.Helper()
10899 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10900 foundLibfooJar := false
10901 base := stem + ".jar"
10902 for _, output := range s.AllOutputs() {
10903 if filepath.Base(output) == base {
10904 foundLibfooJar = true
10905 buildRule := s.Output(output)
10906 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10907 }
10908 }
10909 if !foundLibfooJar {
10910 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10911 }
10912 }
10913
Spandan Das64c9e0c2023-12-20 20:13:34 +000010914 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10915 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10916 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10917 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10918 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10919 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)
10920 }
10921
10922 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10923 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10924 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10925 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10926 }
10927
Spandan Das5be63332023-12-13 00:06:32 +000010928 bp := `
10929 // Source APEX.
10930
10931 java_library {
10932 name: "framework-foo",
10933 srcs: ["foo.java"],
10934 installable: true,
10935 apex_available: [
10936 "com.android.foo",
10937 ],
10938 }
10939
10940 bootclasspath_fragment {
10941 name: "foo-bootclasspath-fragment",
10942 contents: ["framework-foo"],
10943 apex_available: [
10944 "com.android.foo",
10945 ],
10946 hidden_api: {
10947 split_packages: ["*"],
10948 },
10949 }
10950
10951 apex_key {
10952 name: "com.android.foo.key",
10953 public_key: "com.android.foo.avbpubkey",
10954 private_key: "com.android.foo.pem",
10955 }
10956
10957 apex {
10958 name: "com.android.foo",
10959 key: "com.android.foo.key",
10960 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10961 updatable: false,
10962 }
10963
10964 // Prebuilt APEX.
10965
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010966 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010967 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010968 public: {
10969 jars: ["foo.jar"],
10970 },
Spandan Das5be63332023-12-13 00:06:32 +000010971 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010972 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010973 }
10974
10975 prebuilt_bootclasspath_fragment {
10976 name: "foo-bootclasspath-fragment",
10977 contents: ["framework-foo"],
10978 hidden_api: {
10979 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10980 metadata: "my-bootclasspath-fragment/metadata.csv",
10981 index: "my-bootclasspath-fragment/index.csv",
10982 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10983 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10984 },
10985 apex_available: [
10986 "com.android.foo",
10987 ],
10988 }
10989
10990 prebuilt_apex {
10991 name: "com.android.foo",
10992 apex_name: "com.android.foo",
10993 src: "com.android.foo-arm.apex",
10994 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10995 }
10996
10997 // Another Prebuilt ART APEX
10998 prebuilt_apex {
10999 name: "com.android.foo.v2",
11000 apex_name: "com.android.foo", // Used to determine the API domain
11001 src: "com.android.foo-arm.apex",
11002 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11003 }
11004
11005 // APEX contribution modules
11006
11007 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011008 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011009 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011010 contents: ["com.android.foo"],
11011 }
11012
11013 apex_contributions {
11014 name: "foo.prebuilt.contributions",
11015 api_domain: "com.android.foo",
11016 contents: ["prebuilt_com.android.foo"],
11017 }
11018
11019 apex_contributions {
11020 name: "foo.prebuilt.v2.contributions",
11021 api_domain: "com.android.foo",
11022 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011023 }
11024 `
11025
11026 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011027 desc string
11028 selectedApexContributions string
11029 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011030 }{
11031 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011032 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11033 selectedApexContributions: "foo.source.contributions",
11034 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011035 },
11036 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011037 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11038 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011039 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 +000011040 },
11041 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011042 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11043 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011044 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 +000011045 },
11046 }
11047
11048 fragment := java.ApexVariantReference{
11049 Apex: proptools.StringPtr("com.android.foo"),
11050 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11051 }
11052
11053 for _, tc := range testCases {
11054 preparer := android.GroupFixturePreparers(
11055 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11056 android.FixtureMergeMockFs(map[string][]byte{
11057 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11058 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011059 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11060 // file creation.
11061 java.FixtureConfigureBootJars("platform:foo"),
11062 android.FixtureModifyMockFS(func(fs android.MockFS) {
11063 fs["platform/Android.bp"] = []byte(`
11064 java_library {
11065 name: "foo",
11066 srcs: ["Test.java"],
11067 compile_dex: true,
11068 }
11069 `)
11070 fs["platform/Test.java"] = nil
11071 }),
11072
Colin Crossa66b4632024-08-08 15:50:47 -070011073 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011074 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011075 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011076 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011077 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11078 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011079 }
11080}
Spandan Das3576e762024-01-03 18:57:03 +000011081
11082// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11083// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11084func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011085 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011086 // for a mainline module family, check that only the flagged soong module is visible to make
11087 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11088 variation := func(moduleName string) string {
11089 ret := "android_common_com.android.foo"
11090 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011091 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011092 }
11093 return ret
11094 }
11095
11096 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11097 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11098
11099 for _, hiddenModuleName := range hiddenModuleNames {
11100 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11101 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11102
11103 }
11104 }
11105
11106 bp := `
11107 apex_key {
11108 name: "com.android.foo.key",
11109 public_key: "com.android.foo.avbpubkey",
11110 private_key: "com.android.foo.pem",
11111 }
11112
11113 // AOSP source apex
11114 apex {
11115 name: "com.android.foo",
11116 key: "com.android.foo.key",
11117 updatable: false,
11118 }
11119
11120 // Google source apex
11121 override_apex {
11122 name: "com.google.android.foo",
11123 base: "com.android.foo",
11124 key: "com.android.foo.key",
11125 }
11126
11127 // Prebuilt Google APEX.
11128
11129 prebuilt_apex {
11130 name: "com.google.android.foo",
11131 apex_name: "com.android.foo",
11132 src: "com.android.foo-arm.apex",
11133 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11134 }
11135
11136 // Another Prebuilt Google APEX
11137 prebuilt_apex {
11138 name: "com.google.android.foo.v2",
11139 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011140 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011141 src: "com.android.foo-arm.apex",
11142 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11143 }
11144
11145 // APEX contribution modules
11146
11147 apex_contributions {
11148 name: "foo.source.contributions",
11149 api_domain: "com.android.foo",
11150 contents: ["com.google.android.foo"],
11151 }
11152
11153 apex_contributions {
11154 name: "foo.prebuilt.contributions",
11155 api_domain: "com.android.foo",
11156 contents: ["prebuilt_com.google.android.foo"],
11157 }
11158
11159 apex_contributions {
11160 name: "foo.prebuilt.v2.contributions",
11161 api_domain: "com.android.foo",
11162 contents: ["prebuilt_com.google.android.foo.v2"],
11163 }
11164
11165 // This is an incompatible module because it selects multiple versions of the same mainline module
11166 apex_contributions {
11167 name: "foo.prebuilt.duplicate.contributions",
11168 api_domain: "com.android.foo",
11169 contents: [
11170 "prebuilt_com.google.android.foo",
11171 "prebuilt_com.google.android.foo.v2",
11172 ],
11173 }
11174 `
11175
11176 testCases := []struct {
11177 desc string
11178 selectedApexContributions string
11179 expectedVisibleModuleName string
11180 expectedHiddenModuleNames []string
11181 expectedError string
11182 }{
11183 {
11184 desc: "Source apex is selected, prebuilts should be hidden from make",
11185 selectedApexContributions: "foo.source.contributions",
11186 expectedVisibleModuleName: "com.google.android.foo",
11187 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11188 },
11189 {
11190 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11191 selectedApexContributions: "foo.prebuilt.contributions",
11192 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11193 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11194 },
11195 {
11196 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11197 selectedApexContributions: "foo.prebuilt.v2.contributions",
11198 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11199 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11200 },
11201 {
11202 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11203 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11204 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11205 },
11206 }
11207
11208 for _, tc := range testCases {
11209 preparer := android.GroupFixturePreparers(
11210 android.FixtureMergeMockFs(map[string][]byte{
11211 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11212 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011213 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011214 )
11215 if tc.expectedError != "" {
11216 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11217 testApex(t, bp, preparer)
11218 return
11219 }
11220 ctx := testApex(t, bp, preparer)
11221
Spandan Das3576e762024-01-03 18:57:03 +000011222 // Check that
11223 // 1. The contents of the selected apex_contributions are visible to make
11224 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11225 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11226 }
11227}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011228
Spandan Das85bd4622024-08-01 00:51:20 +000011229// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11230func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011231 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011232 // for a mainline module family, check that only the flagged soong module is visible to make
11233 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11234 variation := func(moduleName string) string {
11235 ret := "android_common_com.android.adservices"
11236 if moduleName == "com.google.android.foo" {
11237 ret = "android_common_com.google.android.foo_com.google.android.foo"
11238 }
11239 return ret
11240 }
11241
11242 for _, visibleModuleName := range visibleModuleNames {
11243 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11244 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11245 }
11246
11247 for _, hiddenModuleName := range hiddenModuleNames {
11248 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11249 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11250
11251 }
11252 }
11253
11254 bp := `
11255 apex_key {
11256 name: "com.android.adservices.key",
11257 public_key: "com.android.adservices.avbpubkey",
11258 private_key: "com.android.adservices.pem",
11259 }
11260
11261 // AOSP source apex
11262 apex {
11263 name: "com.android.adservices",
11264 key: "com.android.adservices.key",
11265 updatable: false,
11266 }
11267
11268 // Prebuilt Google APEX.
11269
11270 prebuilt_apex {
11271 name: "com.google.android.adservices",
11272 apex_name: "com.android.adservices",
11273 src: "com.android.foo-arm.apex",
11274 }
11275
11276 // Another Prebuilt Google APEX
11277 prebuilt_apex {
11278 name: "com.google.android.adservices.v2",
11279 apex_name: "com.android.adservices",
11280 src: "com.android.foo-arm.apex",
11281 }
11282
11283 // APEX contribution modules
11284
11285
11286 apex_contributions {
11287 name: "adservices.prebuilt.contributions",
11288 api_domain: "com.android.adservices",
11289 contents: ["prebuilt_com.google.android.adservices"],
11290 }
11291
11292 apex_contributions {
11293 name: "adservices.prebuilt.v2.contributions",
11294 api_domain: "com.android.adservices",
11295 contents: ["prebuilt_com.google.android.adservices.v2"],
11296 }
11297 `
11298
11299 testCases := []struct {
11300 desc string
11301 selectedApexContributions string
11302 expectedVisibleModuleNames []string
11303 expectedHiddenModuleNames []string
11304 }{
11305 {
11306 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11307 selectedApexContributions: "",
11308 expectedVisibleModuleNames: []string{"com.android.adservices"},
11309 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11310 },
11311 {
11312 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11313 selectedApexContributions: "adservices.prebuilt.contributions",
11314 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11315 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11316 },
11317 {
11318 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11319 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11320 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11321 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11322 },
11323 }
11324
11325 for _, tc := range testCases {
11326 preparer := android.GroupFixturePreparers(
11327 android.FixtureMergeMockFs(map[string][]byte{
11328 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11329 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011330 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011331 )
11332 ctx := testApex(t, bp, preparer)
11333
11334 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11335 }
11336}
11337
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011338func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011339 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011340 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11341 for _, moduleName := range moduleNames {
11342 ret += fmt.Sprintf(`
11343 aconfig_declarations {
11344 name: "%[1]s",
11345 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011346 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011347 srcs: [
11348 "%[1]s.aconfig",
11349 ],
11350 }
11351 java_aconfig_library {
11352 name: "%[1]s-lib",
11353 aconfig_declarations: "%[1]s",
11354 }
11355 `, moduleName)
11356 }
11357 return ret
11358 }
11359
11360 result := android.GroupFixturePreparers(
11361 prepareForApexTest,
11362 java.PrepareForTestWithJavaSdkLibraryFiles,
11363 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011364 ).RunTestWithBp(t, `
11365 java_library {
11366 name: "baz-java-lib",
11367 static_libs: [
11368 "baz-lib",
11369 ],
11370 }
11371 filegroup {
11372 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011373 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011374 ":qux-lib{.generated_srcjars}",
11375 ],
11376 }
11377 filegroup {
11378 name: "qux-another-filegroup",
11379 srcs: [
11380 ":qux-filegroup",
11381 ],
11382 }
11383 java_library {
11384 name: "quux-java-lib",
11385 srcs: [
11386 "a.java",
11387 ],
11388 libs: [
11389 "quux-lib",
11390 ],
11391 }
11392 java_sdk_library {
11393 name: "foo",
11394 srcs: [
11395 ":qux-another-filegroup",
11396 ],
11397 api_packages: ["foo"],
11398 system: {
11399 enabled: true,
11400 },
11401 module_lib: {
11402 enabled: true,
11403 },
11404 test: {
11405 enabled: true,
11406 },
11407 static_libs: [
11408 "bar-lib",
11409 ],
11410 libs: [
11411 "baz-java-lib",
11412 "quux-java-lib",
11413 ],
11414 aconfig_declarations: [
11415 "bar",
11416 ],
11417 }
11418 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11419
11420 m := result.ModuleForTests("foo.stubs.source", "android_common")
11421 outDir := "out/soong/.intermediates"
11422
11423 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11424 // textproto files
11425 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11426
11427 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11428 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11429 // to aconfig.
11430 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11431 "passed as an input",
11432 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11433
11434 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11435 // to metalava as classpath. Thus the cache file provided by the associated
11436 // aconfig_declarations module "baz" should be passed to aconfig.
11437 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11438 "java_aconfig_library passed as an input",
11439 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11440
11441 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11442 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11443 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11444 "input",
11445 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11446
11447 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11448 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11449 // aconfig_declarations module "quux" should not be passed to aconfig.
11450 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11451 "depend on java_aconfig_library not passed as an input",
11452 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11453}
Cole Faust7c991b42024-05-15 11:17:55 -070011454
11455func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011456 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011457 ctx := testApex(t, `
11458 apex {
11459 name: "myapex",
11460 key: "myapex.key",
11461 prebuilts: ["myetc", "myetc2"],
11462 min_sdk_version: "29",
11463 }
11464 apex_key {
11465 name: "myapex.key",
11466 public_key: "testkey.avbpubkey",
11467 private_key: "testkey.pem",
11468 }
11469
11470 prebuilt_etc {
11471 name: "myetc",
11472 src: "myprebuilt",
11473 filename: "myfilename",
11474 }
11475 prebuilt_etc {
11476 name: "myetc2",
11477 sub_dir: "mysubdir",
11478 src: "myprebuilt",
11479 filename: "myfilename",
11480 }
11481 `, withFiles(android.MockFS{
11482 "packages/modules/common/build/allowed_deps.txt": nil,
11483 }))
11484
11485 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11486 data := android.AndroidMkDataForTest(t, ctx, ab)
11487 var builder strings.Builder
11488 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11489 androidMk := builder.String()
11490
11491 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11492 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11493}
Spandan Das50801e22024-05-13 18:29:45 +000011494
11495func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011496 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011497 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11498 args := module.Rule("apexRule").Args
11499 optFlags := args["opt_flags"]
11500 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11501 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11502 }
11503 }
11504
11505 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11506 t.Helper()
11507 found := false
11508 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11509 if dep == wantDep {
11510 found = true
11511 }
11512 })
11513 if !found {
11514 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11515 }
11516 }
11517
11518 ctx := testApex(t, `
11519 apex {
11520 name: "com.android.apex30",
11521 min_sdk_version: "30",
11522 key: "apex30.key",
11523 java_libs: ["javalib"],
11524 }
11525
11526 java_library {
11527 name: "javalib",
11528 srcs: ["A.java"],
11529 apex_available: ["com.android.apex30"],
11530 min_sdk_version: "30",
11531 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011532 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011533 }
11534
11535 override_apex {
11536 name: "com.mycompany.android.apex30",
11537 base: "com.android.apex30",
11538 }
11539
11540 override_apex {
11541 name: "com.mycompany.android.apex31",
11542 base: "com.android.apex30",
11543 min_sdk_version: "31",
11544 }
11545
11546 apex_key {
11547 name: "apex30.key",
11548 public_key: "testkey.avbpubkey",
11549 private_key: "testkey.pem",
11550 }
11551
11552 `, android.FixtureMergeMockFs(android.MockFS{
11553 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11554 }),
11555 )
11556
11557 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11558 checkMinSdkVersion(t, baseModule, "30")
11559
11560 // Override module, but uses same min_sdk_version
11561 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11562 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11563 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11564 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11565
11566 // Override module, uses different min_sdk_version
11567 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11568 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11569 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11570 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11571}
Spandan Das0b28fa02024-05-28 23:40:17 +000011572
11573func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011574 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011575 context := android.GroupFixturePreparers(
11576 android.PrepareForIntegrationTestWithAndroid,
11577 PrepareForTestWithApexBuildComponents,
11578 android.FixtureMergeMockFs(android.MockFS{
11579 "system/sepolicy/apex/foo-file_contexts": nil,
11580 }),
11581 )
11582 res := context.RunTestWithBp(t, `
11583 apex {
11584 name: "foo",
11585 key: "myapex.key",
11586 apex_available_name: "com.android.foo",
11587 variant_version: "0",
11588 updatable: false,
11589 }
11590 apex_key {
11591 name: "myapex.key",
11592 public_key: "testkey.avbpubkey",
11593 private_key: "testkey.pem",
11594 }
11595 prebuilt_apex {
11596 name: "foo",
11597 src: "foo.apex",
11598 prefer: true,
11599 }
11600 override_apex {
11601 name: "myoverrideapex",
11602 base: "foo",
11603 }
11604 `)
11605
11606 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11607}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011608
11609func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011610 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011611 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`, `
11612 apex {
11613 name: "myapex",
11614 key: "myapex.key",
11615 updatable: true,
11616 min_sdk_version: "current",
11617 }
11618
11619 apex_key {
11620 name: "myapex.key",
11621 public_key: "testkey.avbpubkey",
11622 private_key: "testkey.pem",
11623 }
11624 `)
11625}
Spandan Das2f68f192024-07-22 19:25:50 +000011626
11627func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011628 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011629 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11630 result := android.GroupFixturePreparers(
11631 prepareForApexTest,
11632 android.PrepareForTestWithAndroidMk,
11633 android.PrepareForTestWithMakevars,
11634 android.FixtureMergeMockFs(fs),
11635 ).RunTest(t)
11636
11637 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011638 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011639
11640 installRules := result.InstallMakeRulesForTesting(t)
11641
11642 var installedlibRule *android.InstallMakeRule
11643 for i, rule := range installRules {
11644 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11645 if installedlibRule != nil {
11646 t.Errorf("Duplicate install rules for %s", rule.Target)
11647 }
11648 installedlibRule = &installRules[i]
11649 }
11650 }
11651 if installedlibRule == nil {
11652 t.Errorf("No install rule found for installedlib")
11653 return
11654 }
11655
11656 if expectLibfooOnSystemLib {
11657 android.AssertStringListContains(t,
11658 "installedlib doesn't have install dependency on libfoo impl",
11659 installedlibRule.OrderOnlyDeps,
11660 "out/target/product/test_device/system/lib/libfoo.so")
11661 } else {
11662 android.AssertStringListDoesNotContain(t,
11663 "installedlib has install dependency on libfoo stub",
11664 installedlibRule.Deps,
11665 "out/target/product/test_device/system/lib/libfoo.so")
11666 android.AssertStringListDoesNotContain(t,
11667 "installedlib has order-only install dependency on libfoo stub",
11668 installedlibRule.OrderOnlyDeps,
11669 "out/target/product/test_device/system/lib/libfoo.so")
11670 }
11671 }
11672
11673 prebuiltLibfooBp := []byte(`
11674 cc_prebuilt_library {
11675 name: "libfoo",
11676 prefer: true,
11677 srcs: ["libfoo.so"],
11678 stubs: {
11679 versions: ["1"],
11680 },
11681 apex_available: ["apexfoo"],
11682 }
11683 `)
11684
11685 apexfooBp := []byte(`
11686 apex {
11687 name: "apexfoo",
11688 key: "apexfoo.key",
11689 native_shared_libs: ["libfoo"],
11690 updatable: false,
11691 compile_multilib: "both",
11692 }
11693 apex_key {
11694 name: "apexfoo.key",
11695 public_key: "testkey.avbpubkey",
11696 private_key: "testkey.pem",
11697 }
11698 `)
11699
11700 installedlibBp := []byte(`
11701 cc_library {
11702 name: "installedlib",
11703 shared_libs: ["libfoo"],
11704 }
11705 `)
11706
11707 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011708 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011709 testFunc(
11710 t,
11711 /*expectLibfooOnSystemLib=*/ false,
11712 android.MockFS{
11713 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11714 "apexfoo/Android.bp": apexfooBp,
11715 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11716 "Android.bp": installedlibBp,
11717 },
11718 )
11719 })
11720
11721 disabledSourceLibfooBp := []byte(`
11722 cc_library {
11723 name: "libfoo",
11724 enabled: false,
11725 stubs: {
11726 versions: ["1"],
11727 },
11728 apex_available: ["apexfoo"],
11729 }
11730 `)
11731
11732 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011733 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011734 testFunc(
11735 t,
11736 /*expectLibfooOnSystemLib=*/ false,
11737 android.MockFS{
11738 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11739 "impl/Android.bp": disabledSourceLibfooBp,
11740 "apexfoo/Android.bp": apexfooBp,
11741 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11742 "Android.bp": installedlibBp,
11743 },
11744 )
11745 })
11746}
Jihoon Kange246bb72024-09-18 22:26:22 +000011747
11748func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011749 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011750 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11751 // in libs of android_app and java_library does not lead to class loader context device/host
11752 // path mismatch errors.
11753 android.GroupFixturePreparers(
11754 prepareForApexTest,
11755 android.PrepareForIntegrationTestWithAndroid,
11756 PrepareForTestWithApexBuildComponents,
11757 android.FixtureModifyEnv(func(env map[string]string) {
11758 env["DISABLE_CONTAINER_CHECK"] = "true"
11759 }),
11760 withFiles(filesForSdkLibrary),
11761 android.FixtureMergeMockFs(android.MockFS{
11762 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11763 }),
11764 ).RunTestWithBp(t, `
11765 apex {
11766 name: "com.android.foo30",
11767 key: "myapex.key",
11768 updatable: true,
11769 bootclasspath_fragments: [
11770 "foo-bootclasspath-fragment",
11771 ],
11772 java_libs: [
11773 "bar",
11774 ],
11775 apps: [
11776 "bar-app",
11777 ],
11778 min_sdk_version: "30",
11779 }
11780 apex_key {
11781 name: "myapex.key",
11782 public_key: "testkey.avbpubkey",
11783 private_key: "testkey.pem",
11784 }
11785 bootclasspath_fragment {
11786 name: "foo-bootclasspath-fragment",
11787 contents: [
11788 "framework-foo",
11789 ],
11790 apex_available: [
11791 "com.android.foo30",
11792 ],
11793 hidden_api: {
11794 split_packages: ["*"]
11795 },
11796 }
11797
11798 java_sdk_library {
11799 name: "framework-foo",
11800 srcs: [
11801 "A.java"
11802 ],
11803 unsafe_ignore_missing_latest_api: true,
11804 apex_available: [
11805 "com.android.foo30",
11806 ],
11807 compile_dex: true,
11808 sdk_version: "core_current",
11809 shared_library: false,
11810 }
11811
11812 java_library {
11813 name: "bar",
11814 srcs: [
11815 "A.java"
11816 ],
11817 libs: [
11818 "framework-foo.impl",
11819 ],
11820 apex_available: [
11821 "com.android.foo30",
11822 ],
11823 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011824 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011825 }
11826
11827 java_library {
11828 name: "baz",
11829 srcs: [
11830 "A.java"
11831 ],
11832 libs: [
11833 "bar",
11834 ],
11835 sdk_version: "core_current",
11836 }
11837
11838 android_app {
11839 name: "bar-app",
11840 srcs: [
11841 "A.java"
11842 ],
11843 libs: [
11844 "baz",
11845 "framework-foo.impl",
11846 ],
11847 apex_available: [
11848 "com.android.foo30",
11849 ],
11850 sdk_version: "core_current",
11851 min_sdk_version: "30",
11852 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011853 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011854 }
11855 `)
11856}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011857
11858// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11859func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011860 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011861 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11862 apex {
11863 name: "myapex",
11864 key: "myapex.key",
11865 systemserverclasspath_fragments: [
11866 "mysystemserverclasspathfragment",
11867 ],
11868 min_sdk_version: "29",
11869 updatable: true,
11870 system_ext_specific: true,
11871 }
11872
11873 apex_key {
11874 name: "myapex.key",
11875 public_key: "testkey.avbpubkey",
11876 private_key: "testkey.pem",
11877 }
11878
11879 java_library {
11880 name: "foo",
11881 srcs: ["b.java"],
11882 min_sdk_version: "29",
11883 installable: true,
11884 apex_available: [
11885 "myapex",
11886 ],
11887 sdk_version: "current",
11888 }
11889
11890 systemserverclasspath_fragment {
11891 name: "mysystemserverclasspathfragment",
11892 contents: [
11893 "foo",
11894 ],
11895 apex_available: [
11896 "myapex",
11897 ],
11898 }
11899 `,
11900 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11901 )
11902}
Spandan Das72d86c62024-10-15 19:27:41 +000011903
11904// partitions should not package the artifacts that are included inside the apex.
11905func TestFilesystemWithApexDeps(t *testing.T) {
11906 t.Parallel()
11907 result := testApex(t, `
11908 android_filesystem {
11909 name: "myfilesystem",
11910 deps: ["myapex"],
11911 }
11912 apex {
11913 name: "myapex",
11914 key: "myapex.key",
11915 binaries: ["binfoo"],
11916 native_shared_libs: ["libfoo"],
11917 apps: ["appfoo"],
11918 updatable: false,
11919 }
11920 apex_key {
11921 name: "myapex.key",
11922 }
11923 cc_binary {
11924 name: "binfoo",
11925 apex_available: ["myapex"],
11926 }
11927 cc_library {
11928 name: "libfoo",
11929 apex_available: ["myapex"],
11930 }
11931 android_app {
11932 name: "appfoo",
11933 sdk_version: "current",
11934 apex_available: ["myapex"],
11935 }
11936 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11937
11938 partition := result.ModuleForTests("myfilesystem", "android_common")
11939 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11940 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11941}
Colin Crossb614cd42024-10-11 12:52:21 -070011942
11943func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11944 t.Parallel()
11945
11946 extractDepenencyPathFromErrors := func(errs []error) []string {
11947 i := slices.IndexFunc(errs, func(err error) bool {
11948 return strings.Contains(err.Error(), "dependency path:")
11949 })
11950 if i < 0 {
11951 return nil
11952 }
11953 var dependencyPath []string
11954 for _, err := range errs[i+1:] {
11955 s := err.Error()
11956 lastSpace := strings.LastIndexByte(s, ' ')
11957 if lastSpace >= 0 {
11958 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11959 }
11960 }
11961 return dependencyPath
11962 }
11963
11964 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11965 return func(t *testing.T, result *android.TestResult) {
11966 t.Helper()
11967 if len(result.Errs) == 0 {
11968 t.Fatalf("expected errors")
11969 }
11970 t.Log("found errors:")
11971 for _, err := range result.Errs {
11972 t.Log(err)
11973 }
11974 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11975 t.Fatalf("expected error %q, got %q", w, g)
11976 }
11977 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11978 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11979 t.Errorf("expected dependency path %q, got %q", w, g)
11980 }
11981 }
11982 }
11983
11984 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11985 return func(bp *bpmodify.Blueprint) {
11986 m := bp.ModulesByName(module)
11987 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11988 if err != nil {
11989 panic(err)
11990 }
11991 props.AddStringToList(lib)
11992 }
11993 }
11994
11995 bpTemplate := `
11996 apex {
11997 name: "myapex",
11998 key: "myapex.key",
11999 native_shared_libs: ["mylib"],
12000 rust_dyn_libs: ["libmyrust"],
12001 binaries: ["mybin", "myrustbin"],
12002 jni_libs: ["libjni"],
12003 apps: ["myapp"],
12004 updatable: false,
12005 }
12006
12007 apex {
12008 name: "otherapex",
12009 key: "myapex.key",
12010 native_shared_libs: ["libotherapex"],
12011 updatable: false,
12012 }
12013
12014 apex_key {
12015 name: "myapex.key",
12016 public_key: "testkey.avbpubkey",
12017 private_key: "testkey.pem",
12018 }
12019
12020 cc_library {
12021 name: "mylib",
12022 srcs: ["foo.cpp"],
12023 apex_available: ["myapex"],
12024 }
12025
12026 cc_binary {
12027 name: "mybin",
12028 srcs: ["foo.cpp"],
12029 apex_available: ["myapex"],
12030 }
12031
12032 rust_library {
12033 name: "libmyrust",
12034 crate_name: "myrust",
12035 srcs: ["src/lib.rs"],
12036 rustlibs: ["libmyrust_transitive_dylib"],
12037 rlibs: ["libmyrust_transitive_rlib"],
12038 apex_available: ["myapex"],
12039 }
12040
12041 rust_library{
12042 name: "libmyrust_transitive_dylib",
12043 crate_name: "myrust_transitive_dylib",
12044 srcs: ["src/lib.rs"],
12045 apex_available: ["myapex"],
12046 }
12047
12048 rust_library {
12049 name: "libmyrust_transitive_rlib",
12050 crate_name: "myrust_transitive_rlib",
12051 srcs: ["src/lib.rs"],
12052 apex_available: ["myapex"],
12053 }
12054
12055 rust_binary {
12056 name: "myrustbin",
12057 srcs: ["src/main.rs"],
12058 apex_available: ["myapex"],
12059 }
12060
12061 cc_library {
12062 name: "libbar",
12063 sdk_version: "current",
12064 srcs: ["bar.cpp"],
12065 apex_available: ["myapex"],
12066 stl: "none",
12067 }
12068
12069 android_app {
12070 name: "myapp",
12071 jni_libs: ["libembeddedjni"],
12072 use_embedded_native_libs: true,
12073 sdk_version: "current",
12074 apex_available: ["myapex"],
12075 }
12076
12077 cc_library {
12078 name: "libembeddedjni",
12079 sdk_version: "current",
12080 srcs: ["bar.cpp"],
12081 apex_available: ["myapex"],
12082 stl: "none",
12083 }
12084
12085 cc_library {
12086 name: "libjni",
12087 sdk_version: "current",
12088 srcs: ["bar.cpp"],
12089 apex_available: ["myapex"],
12090 stl: "none",
12091 }
12092
12093 cc_library {
12094 name: "libotherapex",
12095 sdk_version: "current",
12096 srcs: ["otherapex.cpp"],
12097 apex_available: ["otherapex"],
12098 stubs: {
12099 symbol_file: "libotherapex.map.txt",
12100 versions: ["1", "2", "3"],
12101 },
12102 stl: "none",
12103 }
12104
12105 cc_library {
12106 name: "libplatform",
12107 sdk_version: "current",
12108 srcs: ["libplatform.cpp"],
12109 stubs: {
12110 symbol_file: "libplatform.map.txt",
12111 versions: ["1", "2", "3"],
12112 },
12113 stl: "none",
12114 system_shared_libs: [],
12115 }
12116 `
12117
12118 testCases := []struct {
12119 name string
12120 bpModifier func(bp *bpmodify.Blueprint)
12121 dependencyPath []string
12122 }{
12123 {
12124 name: "library dependency in other apex",
12125 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12126 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12127 },
12128 {
12129 name: "transitive library dependency in other apex",
12130 bpModifier: func(bp *bpmodify.Blueprint) {
12131 addToSharedLibs("mylib", "libbar")(bp)
12132 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12133 },
12134 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12135 },
12136 {
12137 name: "library dependency in platform",
12138 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12139 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12140 },
12141 {
12142 name: "jni library dependency in other apex",
12143 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12144 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12145 },
12146 {
12147 name: "transitive jni library dependency in other apex",
12148 bpModifier: func(bp *bpmodify.Blueprint) {
12149 addToSharedLibs("libjni", "libbar")(bp)
12150 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12151 },
12152 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12153 },
12154 {
12155 name: "jni library dependency in platform",
12156 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12157 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12158 },
12159 {
12160 name: "transitive jni library dependency in platform",
12161 bpModifier: func(bp *bpmodify.Blueprint) {
12162 addToSharedLibs("libjni", "libbar")(bp)
12163 addToSharedLibs("libbar", "libplatform#impl")(bp)
12164 },
12165 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12166 },
12167 // TODO: embedded JNI in apps should be checked too, but Soong currently just packages the transitive
12168 // JNI libraries even if they came from another apex.
12169 //{
12170 // name: "app jni library dependency in other apex",
12171 // bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12172 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12173 //},
12174 //{
12175 // name: "transitive app jni library dependency in other apex",
12176 // bpModifier: func(bp *bpmodify.Blueprint) {
12177 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12178 // addToSharedLibs("libbar", "libotherapex#impl")(bp)
12179 // },
12180 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12181 //},
12182 //{
12183 // name: "app jni library dependency in platform",
12184 // bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12185 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12186 //},
12187 //{
12188 // name: "transitive app jni library dependency in platform",
12189 // bpModifier: func(bp *bpmodify.Blueprint) {
12190 // addToSharedLibs("libembeddedjni", "libbar")(bp)
12191 // addToSharedLibs("libbar", "libplatform#impl")(bp)
12192 // },
12193 // dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12194 //},
12195 {
12196 name: "binary dependency in other apex",
12197 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12198 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12199 },
12200 {
12201 name: "transitive binary dependency in other apex",
12202 bpModifier: func(bp *bpmodify.Blueprint) {
12203 addToSharedLibs("mybin", "libbar")(bp)
12204 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12205 },
12206 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12207 },
12208 {
12209 name: "binary dependency in platform",
12210 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12211 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12212 },
12213 {
12214 name: "transitive binary dependency in platform",
12215 bpModifier: func(bp *bpmodify.Blueprint) {
12216 addToSharedLibs("mybin", "libbar")(bp)
12217 addToSharedLibs("libbar", "libplatform#impl")(bp)
12218 },
12219 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12220 },
12221
12222 {
12223 name: "rust library dependency in other apex",
12224 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12225 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12226 },
12227 {
12228 name: "transitive rust library dependency in other apex",
12229 bpModifier: func(bp *bpmodify.Blueprint) {
12230 addToSharedLibs("libmyrust", "libbar")(bp)
12231 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12232 },
12233 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12234 },
12235 {
12236 name: "rust library dependency in platform",
12237 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12238 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12239 },
12240 {
12241 name: "transitive rust library dependency in platform",
12242 bpModifier: func(bp *bpmodify.Blueprint) {
12243 addToSharedLibs("libmyrust", "libbar")(bp)
12244 addToSharedLibs("libbar", "libplatform#impl")(bp)
12245 },
12246 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12247 },
12248 {
12249 name: "transitive rust library dylib dependency in other apex",
12250 bpModifier: func(bp *bpmodify.Blueprint) {
12251 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12252 },
12253 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12254 },
12255 {
12256 name: "transitive rust library dylib dependency in platform",
12257 bpModifier: func(bp *bpmodify.Blueprint) {
12258 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12259 },
12260 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12261 },
12262 {
12263 name: "transitive rust library rlib dependency in other apex",
12264 bpModifier: func(bp *bpmodify.Blueprint) {
12265 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12266 },
12267 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12268 },
12269 {
12270 name: "transitive rust library rlib dependency in platform",
12271 bpModifier: func(bp *bpmodify.Blueprint) {
12272 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12273 },
12274 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12275 },
12276 {
12277 name: "rust binary dependency in other apex",
12278 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12279 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12280 },
12281 {
12282 name: "transitive rust binary dependency in other apex",
12283 bpModifier: func(bp *bpmodify.Blueprint) {
12284 addToSharedLibs("myrustbin", "libbar")(bp)
12285 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12286 },
12287 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12288 },
12289 {
12290 name: "rust binary dependency in platform",
12291 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12292 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12293 },
12294 {
12295 name: "transitive rust binary dependency in platform",
12296 bpModifier: func(bp *bpmodify.Blueprint) {
12297 addToSharedLibs("myrustbin", "libbar")(bp)
12298 addToSharedLibs("libbar", "libplatform#impl")(bp)
12299 },
12300 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12301 },
12302 }
12303
12304 for _, testCase := range testCases {
12305 t.Run(testCase.name, func(t *testing.T) {
12306 t.Parallel()
12307 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12308 if err != nil {
12309 t.Fatal(err)
12310 }
12311 if testCase.bpModifier != nil {
12312 func() {
12313 defer func() {
12314 if r := recover(); r != nil {
12315 t.Fatalf("panic in bpModifier: %v", r)
12316 }
12317 }()
12318 testCase.bpModifier(bp)
12319 }()
12320 }
12321 android.GroupFixturePreparers(
12322 android.PrepareForTestWithAndroidBuildComponents,
12323 cc.PrepareForTestWithCcBuildComponents,
12324 java.PrepareForTestWithDexpreopt,
12325 rust.PrepareForTestWithRustDefaultModules,
12326 PrepareForTestWithApexBuildComponents,
12327 prepareForTestWithMyapex,
12328 prepareForTestWithOtherapex,
12329 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12330 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12331 }),
12332 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12333 RunTestWithBp(t, bp.String())
12334 })
12335 }
12336}