blob: 83053332a1e49ff9b3dcdbda5d6e9a7ee5ba44a8 [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"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000221 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
222 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
223 variables.Platform_sdk_codename = proptools.StringPtr("Q")
224 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000225 // "Tiramisu" needs to be in the next line for compatibility with soong code,
226 // not because of these tests specifically (it's not used by the tests)
227 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000228 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000229 }),
230)
231
Paul Duffin52bfaa42021-03-23 23:40:12 +0000232var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
233 "system/sepolicy/apex/myapex-file_contexts": nil,
234})
235
Jooyung Han643adc42020-02-27 13:50:06 +0900236// ensure that 'result' equals 'expected'
237func ensureEquals(t *testing.T, result string, expected string) {
238 t.Helper()
239 if result != expected {
240 t.Errorf("%q != %q", expected, result)
241 }
242}
243
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244// ensure that 'result' contains 'expected'
245func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900246 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247 if !strings.Contains(result, expected) {
248 t.Errorf("%q is not found in %q", expected, result)
249 }
250}
251
Liz Kammer5bd365f2020-05-27 15:15:11 -0700252// ensure that 'result' contains 'expected' exactly one time
253func ensureContainsOnce(t *testing.T, result string, expected string) {
254 t.Helper()
255 count := strings.Count(result, expected)
256 if count != 1 {
257 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
258 }
259}
260
Jiyong Park25fc6a92018-11-18 18:02:45 +0900261// ensures that 'result' does not contain 'notExpected'
262func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264 if strings.Contains(result, notExpected) {
265 t.Errorf("%q is found in %q", notExpected, result)
266 }
267}
268
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269func ensureMatches(t *testing.T, result string, expectedRex string) {
270 ok, err := regexp.MatchString(expectedRex, result)
271 if err != nil {
272 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
273 return
274 }
275 if !ok {
276 t.Errorf("%s does not match regular expession %s", result, expectedRex)
277 }
278}
279
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900281 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 if !android.InList(expected, result) {
283 t.Errorf("%q is not found in %v", expected, result)
284 }
285}
286
287func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if android.InList(notExpected, result) {
290 t.Errorf("%q is found in %v", notExpected, result)
291 }
292}
293
Jooyung Hane1633032019-08-01 17:41:43 +0900294func ensureListEmpty(t *testing.T, result []string) {
295 t.Helper()
296 if len(result) > 0 {
297 t.Errorf("%q is expected to be empty", result)
298 }
299}
300
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000301func ensureListNotEmpty(t *testing.T, result []string) {
302 t.Helper()
303 if len(result) == 0 {
304 t.Errorf("%q is expected to be not empty", result)
305 }
306}
307
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308// Minimal test
309func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800310 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900311 apex_defaults {
312 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900313 manifest: ":myapex.manifest",
314 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900315 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900316 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900317 native_shared_libs: [
318 "mylib",
319 "libfoo.ffi",
320 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900321 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800322 multilib: {
323 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900324 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800325 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900326 },
Jiyong Park77acec62020-06-01 21:39:15 +0900327 java_libs: [
328 "myjar",
329 "myjar_dex",
330 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000331 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 }
333
Jiyong Park30ca9372019-02-07 16:27:23 +0900334 apex {
335 name: "myapex",
336 defaults: ["myapex-defaults"],
337 }
338
Jiyong Park25fc6a92018-11-18 18:02:45 +0900339 apex_key {
340 name: "myapex.key",
341 public_key: "testkey.avbpubkey",
342 private_key: "testkey.pem",
343 }
344
Jiyong Park809bb722019-02-13 21:33:49 +0900345 filegroup {
346 name: "myapex.manifest",
347 srcs: ["apex_manifest.json"],
348 }
349
350 filegroup {
351 name: "myapex.androidmanifest",
352 srcs: ["AndroidManifest.xml"],
353 }
354
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 cc_library {
356 name: "mylib",
357 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900358 shared_libs: [
359 "mylib2",
360 "libbar.ffi",
361 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 system_shared_libs: [],
363 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000364 // TODO: remove //apex_available:platform
365 apex_available: [
366 "//apex_available:platform",
367 "myapex",
368 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900369 }
370
Alex Light3d673592019-01-18 14:37:31 -0800371 cc_binary {
372 name: "foo",
373 srcs: ["mylib.cpp"],
374 compile_multilib: "both",
375 multilib: {
376 lib32: {
377 suffix: "32",
378 },
379 lib64: {
380 suffix: "64",
381 },
382 },
383 symlinks: ["foo_link_"],
384 symlink_preferred_arch: true,
385 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800386 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900387 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700388 }
389
Jiyong Park99644e92020-11-17 22:21:02 +0900390 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000391 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900392 srcs: ["foo.rs"],
393 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400394 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900395 apex_available: ["myapex"],
396 }
397
398 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000399 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900400 srcs: ["foo.rs"],
401 crate_name: "foo",
402 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900403 shared_libs: ["libfoo.shared_from_rust"],
404 }
405
406 cc_library_shared {
407 name: "libfoo.shared_from_rust",
408 srcs: ["mylib.cpp"],
409 system_shared_libs: [],
410 stl: "none",
411 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900412 }
413
414 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000415 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900421 rust_ffi_shared {
422 name: "libfoo.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "foo",
425 apex_available: ["myapex"],
426 }
427
428 rust_ffi_shared {
429 name: "libbar.ffi",
430 srcs: ["foo.rs"],
431 crate_name: "bar",
432 apex_available: ["myapex"],
433 }
434
Paul Duffindddd5462020-04-07 15:25:44 +0100435 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900436 name: "mylib2",
437 srcs: ["mylib.cpp"],
438 system_shared_libs: [],
439 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900440 static_libs: ["libstatic"],
441 // TODO: remove //apex_available:platform
442 apex_available: [
443 "//apex_available:platform",
444 "myapex",
445 ],
446 }
447
Paul Duffindddd5462020-04-07 15:25:44 +0100448 cc_prebuilt_library_shared {
449 name: "mylib2",
450 srcs: ["prebuilt.so"],
451 // TODO: remove //apex_available:platform
452 apex_available: [
453 "//apex_available:platform",
454 "myapex",
455 ],
456 }
457
Jiyong Park9918e1a2020-03-17 19:16:40 +0900458 cc_library_static {
459 name: "libstatic",
460 srcs: ["mylib.cpp"],
461 system_shared_libs: [],
462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000463 // TODO: remove //apex_available:platform
464 apex_available: [
465 "//apex_available:platform",
466 "myapex",
467 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900468 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469
470 java_library {
471 name: "myjar",
472 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900473 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900474 sdk_version: "none",
475 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900477 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000478 // TODO: remove //apex_available:platform
479 apex_available: [
480 "//apex_available:platform",
481 "myapex",
482 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 }
484
Jiyong Park77acec62020-06-01 21:39:15 +0900485 dex_import {
486 name: "myjar_dex",
487 jars: ["prebuilt.jar"],
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
492 }
493
Jiyong Park7f7766d2019-07-25 22:02:35 +0900494 java_library {
495 name: "myotherjar",
496 srcs: ["foo/bar/MyClass.java"],
497 sdk_version: "none",
498 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900499 // TODO: remove //apex_available:platform
500 apex_available: [
501 "//apex_available:platform",
502 "myapex",
503 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900505
506 java_library {
507 name: "mysharedjar",
508 srcs: ["foo/bar/MyClass.java"],
509 sdk_version: "none",
510 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900511 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900512 `)
513
Jooyung Hana0503a52023-08-23 13:12:50 +0900514 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900515
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900516 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900517 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700518 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900519 var builder strings.Builder
520 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
521
522 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000523 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900524 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
525
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526 optFlags := apexRule.Args["opt_flags"]
527 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700528 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900529 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900530
Jiyong Park25fc6a92018-11-18 18:02:45 +0900531 copyCmds := apexRule.Args["copy_commands"]
532
533 // Ensure that main rule creates an output
534 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
535
536 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700537 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
538 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900540 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900541 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900542
543 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900550
551 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800552 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
553 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900554 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900555 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
558 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900559 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900560 // .. but not for java libs
561 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900562 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800563
Colin Cross7113d202019-11-20 16:39:12 -0800564 // Ensure that the platform variant ends with _shared or _common
565 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
566 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
568 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
570
571 // Ensure that dynamic dependency to java libs are not included
572 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800573
574 // Ensure that all symlinks are present.
575 found_foo_link_64 := false
576 found_foo := false
577 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900578 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800579 if strings.HasSuffix(cmd, "bin/foo") {
580 found_foo = true
581 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
582 found_foo_link_64 = true
583 }
584 }
585 }
586 good := found_foo && found_foo_link_64
587 if !good {
588 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
589 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900590
Colin Crossf61d03d2023-11-02 16:56:39 -0700591 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
592 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100593 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100594 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
595 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
596 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597
Colin Crossf61d03d2023-11-02 16:56:39 -0700598 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
599 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
602 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
603 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800604}
605
Jooyung Hanf21c7972019-12-16 22:32:06 +0900606func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800607 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900608 apex_defaults {
609 name: "myapex-defaults",
610 key: "myapex.key",
611 prebuilts: ["myetc"],
612 native_shared_libs: ["mylib"],
613 java_libs: ["myjar"],
614 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900615 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800616 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000617 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 }
619
620 prebuilt_etc {
621 name: "myetc",
622 src: "myprebuilt",
623 }
624
625 apex {
626 name: "myapex",
627 defaults: ["myapex-defaults"],
628 }
629
630 apex_key {
631 name: "myapex.key",
632 public_key: "testkey.avbpubkey",
633 private_key: "testkey.pem",
634 }
635
636 cc_library {
637 name: "mylib",
638 system_shared_libs: [],
639 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000640 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900641 }
642
643 java_library {
644 name: "myjar",
645 srcs: ["foo/bar/MyClass.java"],
646 sdk_version: "none",
647 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000648 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800689 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900690 apex {
691 name: "myapex",
692 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000693 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 }
695
696 apex_key {
697 name: "myapex.key",
698 public_key: "testkey.avbpubkey",
699 private_key: "testkey.pem",
700 }
701 `)
702
Jooyung Hana0503a52023-08-23 13:12:50 +0900703 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900704 args := module.Rule("apexRule").Args
705 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
706 t.Error("manifest should be apex_manifest.pb, but " + manifest)
707 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900708}
709
Liz Kammer4854a7d2021-05-27 14:28:27 -0400710func TestApexManifestMinSdkVersion(t *testing.T) {
711 ctx := testApex(t, `
712 apex_defaults {
713 name: "my_defaults",
714 key: "myapex.key",
715 product_specific: true,
716 file_contexts: ":my-file-contexts",
717 updatable: false,
718 }
719 apex {
720 name: "myapex_30",
721 min_sdk_version: "30",
722 defaults: ["my_defaults"],
723 }
724
725 apex {
726 name: "myapex_current",
727 min_sdk_version: "current",
728 defaults: ["my_defaults"],
729 }
730
731 apex {
732 name: "myapex_none",
733 defaults: ["my_defaults"],
734 }
735
736 apex_key {
737 name: "myapex.key",
738 public_key: "testkey.avbpubkey",
739 private_key: "testkey.pem",
740 }
741
742 filegroup {
743 name: "my-file-contexts",
744 srcs: ["product_specific_file_contexts"],
745 }
746 `, withFiles(map[string][]byte{
747 "product_specific_file_contexts": nil,
748 }), android.FixtureModifyProductVariables(
749 func(variables android.FixtureProductVariables) {
750 variables.Unbundled_build = proptools.BoolPtr(true)
751 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
752 }), android.FixtureMergeEnv(map[string]string{
753 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
754 }))
755
756 testCases := []struct {
757 module string
758 minSdkVersion string
759 }{
760 {
761 module: "myapex_30",
762 minSdkVersion: "30",
763 },
764 {
765 module: "myapex_current",
766 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
767 },
768 {
769 module: "myapex_none",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 }
773 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900774 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400775 args := module.Rule("apexRule").Args
776 optFlags := args["opt_flags"]
777 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
778 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
779 }
780 }
781}
782
Jihoon Kang842b9992024-02-08 01:41:51 +0000783func TestApexWithDessertSha(t *testing.T) {
784 ctx := testApex(t, `
785 apex_defaults {
786 name: "my_defaults",
787 key: "myapex.key",
788 product_specific: true,
789 file_contexts: ":my-file-contexts",
790 updatable: false,
791 }
792 apex {
793 name: "myapex_30",
794 min_sdk_version: "30",
795 defaults: ["my_defaults"],
796 }
797
798 apex {
799 name: "myapex_current",
800 min_sdk_version: "current",
801 defaults: ["my_defaults"],
802 }
803
804 apex {
805 name: "myapex_none",
806 defaults: ["my_defaults"],
807 }
808
809 apex_key {
810 name: "myapex.key",
811 public_key: "testkey.avbpubkey",
812 private_key: "testkey.pem",
813 }
814
815 filegroup {
816 name: "my-file-contexts",
817 srcs: ["product_specific_file_contexts"],
818 }
819 `, withFiles(map[string][]byte{
820 "product_specific_file_contexts": nil,
821 }), android.FixtureModifyProductVariables(
822 func(variables android.FixtureProductVariables) {
823 variables.Unbundled_build = proptools.BoolPtr(true)
824 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
825 }), android.FixtureMergeEnv(map[string]string{
826 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
827 }))
828
829 testCases := []struct {
830 module string
831 minSdkVersion string
832 }{
833 {
834 module: "myapex_30",
835 minSdkVersion: "30",
836 },
837 {
838 module: "myapex_current",
839 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
840 },
841 {
842 module: "myapex_none",
843 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
844 },
845 }
846 for _, tc := range testCases {
847 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
848 args := module.Rule("apexRule").Args
849 optFlags := args["opt_flags"]
850 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
851 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
852 }
853 }
854}
855
Jooyung Hanaf730952023-02-28 14:13:38 +0900856func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900857 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900858 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900859 if vendor {
860 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900861 }
862 ctx := testApex(t, `
863 apex {
864 name: "myapex",
865 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900866 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900867 `+prop+`
868 }
869
870 apex_key {
871 name: "myapex.key",
872 public_key: "testkey.avbpubkey",
873 private_key: "testkey.pem",
874 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900875 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900876
Jooyung Hana0503a52023-08-23 13:12:50 +0900877 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900878 if vendor {
879 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
880 rule.RuleParams.Command,
881 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900882 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900883 android.AssertStringDoesContain(t, "should force-label as system_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 }
887 }
888}
889
Jiyong Park25fc6a92018-11-18 18:02:45 +0900890func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800891 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900892 apex {
893 name: "myapex",
894 key: "myapex.key",
895 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900896 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000897 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 }
899
900 apex_key {
901 name: "myapex.key",
902 public_key: "testkey.avbpubkey",
903 private_key: "testkey.pem",
904 }
905
906 cc_library {
907 name: "mylib",
908 srcs: ["mylib.cpp"],
Spandan Das357ffcc2024-07-24 18:07:48 +0000909 shared_libs: ["mylib2", "mylib3", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900910 system_shared_libs: [],
911 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000912 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913 }
914
915 cc_library {
916 name: "mylib2",
917 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900918 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 system_shared_libs: [],
920 stl: "none",
921 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000922 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 versions: ["1", "2", "3"],
924 },
925 }
926
927 cc_library {
928 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900929 srcs: ["mylib.cpp"],
930 shared_libs: ["mylib4"],
931 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932 stl: "none",
933 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000934 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 versions: ["10", "11", "12"],
936 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000937 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900939
940 cc_library {
941 name: "mylib4",
942 srcs: ["mylib.cpp"],
943 system_shared_libs: [],
944 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000945 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900946 }
Jiyong Park105dc322021-06-11 17:22:09 +0900947
Spandan Das357ffcc2024-07-24 18:07:48 +0000948 cc_prebuilt_library_shared {
949 name: "my_prebuilt_platform_lib",
950 stubs: {
951 symbol_file: "my_prebuilt_platform_lib.map.txt",
952 versions: ["1", "2", "3"],
953 },
954 srcs: ["foo.so"],
955 }
956
957 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
958 cc_prebuilt_library_shared {
959 name: "my_prebuilt_platform_stub_only_lib",
960 stubs: {
961 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
962 versions: ["1", "2", "3"],
963 }
964 }
965
Jiyong Park105dc322021-06-11 17:22:09 +0900966 rust_binary {
967 name: "foo.rust",
968 srcs: ["foo.rs"],
969 shared_libs: ["libfoo.shared_from_rust"],
970 prefer_rlib: true,
971 apex_available: ["myapex"],
972 }
973
974 cc_library_shared {
975 name: "libfoo.shared_from_rust",
976 srcs: ["mylib.cpp"],
977 system_shared_libs: [],
978 stl: "none",
979 stubs: {
980 versions: ["10", "11", "12"],
981 },
982 }
983
Jiyong Park25fc6a92018-11-18 18:02:45 +0900984 `)
985
Jooyung Hana0503a52023-08-23 13:12:50 +0900986 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987 copyCmds := apexRule.Args["copy_commands"]
988
989 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800990 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900991
992 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800993 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900994
995 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800996 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900997
Colin Crossaede88c2020-08-11 12:17:01 -0700998 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900999
1000 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001001 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001003 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004
1005 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -07001006 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001008 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001009
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001010 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1011 // is replaced by sharing of "cFlags" in cc/builder.go.
1012 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1013 // module variable representing "cflags". So it was not detected by ensureNotContains.
1014 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1015 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1016 // including the original cflags's "-include mylib.h".
1017 //
Jiyong Park64379952018-12-13 18:37:29 +09001018 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001019 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1020 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001021
Jiyong Park85cc35a2022-07-17 11:30:47 +09001022 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1023 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1024 // Ensure that genstub for apex-provided lib is invoked with --apex
1025 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001026
Jooyung Hana0503a52023-08-23 13:12:50 +09001027 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001028 "lib64/mylib.so",
1029 "lib64/mylib3.so",
1030 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001031 "bin/foo.rust",
1032 "lib64/libc++.so", // by the implicit dependency from foo.rust
1033 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001034 })
Jiyong Park105dc322021-06-11 17:22:09 +09001035
1036 // Ensure that stub dependency from a rust module is not included
1037 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1038 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001039 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001040 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1041 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001042
Jooyung Hana0503a52023-08-23 13:12:50 +09001043 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001044 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001045
1046 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1047 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1048 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1049 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1050 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1051 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1052
1053 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1054 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1055 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1056 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1057 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1058 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 +09001059}
1060
Jooyung Han20348752023-12-05 15:23:56 +09001061func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1062 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1063 apex {
1064 name: "myapex",
1065 key: "myapex.key",
1066 vendor: true,
1067 updatable: false,
1068 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1069 }
1070
1071 apex_key {
1072 name: "myapex.key",
1073 public_key: "testkey.avbpubkey",
1074 private_key: "testkey.pem",
1075 }
1076
1077 cc_library {
1078 name: "libbar",
1079 srcs: ["mylib.cpp"],
1080 llndk: {
1081 symbol_file: "libbar.map.txt",
1082 }
1083 }
1084 `)
1085}
1086
Jiyong Park1bc84122021-06-22 20:23:05 +09001087func TestApexCanUsePrivateApis(t *testing.T) {
1088 ctx := testApex(t, `
1089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 native_shared_libs: ["mylib"],
1093 binaries: ["foo.rust"],
1094 updatable: false,
1095 platform_apis: true,
1096 }
1097
1098 apex_key {
1099 name: "myapex.key",
1100 public_key: "testkey.avbpubkey",
1101 private_key: "testkey.pem",
1102 }
1103
1104 cc_library {
1105 name: "mylib",
1106 srcs: ["mylib.cpp"],
1107 shared_libs: ["mylib2"],
1108 system_shared_libs: [],
1109 stl: "none",
1110 apex_available: [ "myapex" ],
1111 }
1112
1113 cc_library {
1114 name: "mylib2",
1115 srcs: ["mylib.cpp"],
1116 cflags: ["-include mylib.h"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 stubs: {
1120 versions: ["1", "2", "3"],
1121 },
1122 }
1123
1124 rust_binary {
1125 name: "foo.rust",
1126 srcs: ["foo.rs"],
1127 shared_libs: ["libfoo.shared_from_rust"],
1128 prefer_rlib: true,
1129 apex_available: ["myapex"],
1130 }
1131
1132 cc_library_shared {
1133 name: "libfoo.shared_from_rust",
1134 srcs: ["mylib.cpp"],
1135 system_shared_libs: [],
1136 stl: "none",
1137 stubs: {
1138 versions: ["10", "11", "12"],
1139 },
1140 }
1141 `)
1142
Jooyung Hana0503a52023-08-23 13:12:50 +09001143 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001144 copyCmds := apexRule.Args["copy_commands"]
1145
1146 // Ensure that indirect stubs dep is not included
1147 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1148 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1149
1150 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1151 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001152 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001153 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1154 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001155 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001156 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1157 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1158}
1159
Colin Cross7812fd32020-09-25 12:35:10 -07001160func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1161 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001162 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001163 apex {
1164 name: "myapex",
1165 key: "myapex.key",
1166 native_shared_libs: ["mylib", "mylib3"],
1167 min_sdk_version: "29",
1168 }
1169
1170 apex_key {
1171 name: "myapex.key",
1172 public_key: "testkey.avbpubkey",
1173 private_key: "testkey.pem",
1174 }
1175
1176 cc_library {
1177 name: "mylib",
1178 srcs: ["mylib.cpp"],
1179 shared_libs: ["mylib2", "mylib3"],
1180 system_shared_libs: [],
1181 stl: "none",
1182 apex_available: [ "myapex" ],
1183 min_sdk_version: "28",
1184 }
1185
1186 cc_library {
1187 name: "mylib2",
1188 srcs: ["mylib.cpp"],
1189 cflags: ["-include mylib.h"],
1190 system_shared_libs: [],
1191 stl: "none",
1192 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001193 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001194 versions: ["28", "29", "30", "current"],
1195 },
1196 min_sdk_version: "28",
1197 }
1198
1199 cc_library {
1200 name: "mylib3",
1201 srcs: ["mylib.cpp"],
1202 shared_libs: ["mylib4"],
1203 system_shared_libs: [],
1204 stl: "none",
1205 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001206 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001207 versions: ["28", "29", "30", "current"],
1208 },
1209 apex_available: [ "myapex" ],
1210 min_sdk_version: "28",
1211 }
1212
1213 cc_library {
1214 name: "mylib4",
1215 srcs: ["mylib.cpp"],
1216 system_shared_libs: [],
1217 stl: "none",
1218 apex_available: [ "myapex" ],
1219 min_sdk_version: "28",
1220 }
1221 `)
1222
Jooyung Hana0503a52023-08-23 13:12:50 +09001223 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001224 copyCmds := apexRule.Args["copy_commands"]
1225
1226 // Ensure that direct non-stubs dep is always included
1227 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1228
1229 // Ensure that indirect stubs dep is not included
1230 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1231
1232 // Ensure that direct stubs dep is included
1233 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1234
1235 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1236
Jiyong Park55549df2021-02-26 23:57:23 +09001237 // Ensure that mylib is linking with the latest version of stub for mylib2
1238 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001239 // ... and not linking to the non-stub (impl) variant of mylib2
1240 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1241
1242 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1243 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1244 // .. and not linking to the stubs variant of mylib3
1245 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1246
1247 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001248 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001249 ensureNotContains(t, mylib2Cflags, "-include ")
1250
Jiyong Park85cc35a2022-07-17 11:30:47 +09001251 // Ensure that genstub is invoked with --systemapi
1252 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001253
Jooyung Hana0503a52023-08-23 13:12:50 +09001254 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001255 "lib64/mylib.so",
1256 "lib64/mylib3.so",
1257 "lib64/mylib4.so",
1258 })
1259}
1260
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001261func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1262 t.Parallel()
1263 // myapex (Z)
1264 // mylib -----------------.
1265 // |
1266 // otherapex (29) |
1267 // libstub's versions: 29 Z current
1268 // |
1269 // <platform> |
1270 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001271 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001272 apex {
1273 name: "myapex",
1274 key: "myapex.key",
1275 native_shared_libs: ["mylib"],
1276 min_sdk_version: "Z", // non-final
1277 }
1278
1279 cc_library {
1280 name: "mylib",
1281 srcs: ["mylib.cpp"],
1282 shared_libs: ["libstub"],
1283 apex_available: ["myapex"],
1284 min_sdk_version: "Z",
1285 }
1286
1287 apex_key {
1288 name: "myapex.key",
1289 public_key: "testkey.avbpubkey",
1290 private_key: "testkey.pem",
1291 }
1292
1293 apex {
1294 name: "otherapex",
1295 key: "myapex.key",
1296 native_shared_libs: ["libstub"],
1297 min_sdk_version: "29",
1298 }
1299
1300 cc_library {
1301 name: "libstub",
1302 srcs: ["mylib.cpp"],
1303 stubs: {
1304 versions: ["29", "Z", "current"],
1305 },
1306 apex_available: ["otherapex"],
1307 min_sdk_version: "29",
1308 }
1309
1310 // platform module depending on libstub from otherapex should use the latest stub("current")
1311 cc_library {
1312 name: "libplatform",
1313 srcs: ["mylib.cpp"],
1314 shared_libs: ["libstub"],
1315 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001316 `,
1317 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1318 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1319 variables.Platform_sdk_final = proptools.BoolPtr(false)
1320 variables.Platform_version_active_codenames = []string{"Z"}
1321 }),
1322 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001323
Jiyong Park55549df2021-02-26 23:57:23 +09001324 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001325 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001326 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001327 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001328 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001329
1330 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1331 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1332 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1333 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1334 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1335}
1336
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001337func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001338 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001339 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001340 name: "myapex2",
1341 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001342 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001343 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001344 }
1345
1346 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001347 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001348 public_key: "testkey.avbpubkey",
1349 private_key: "testkey.pem",
1350 }
1351
1352 cc_library {
1353 name: "mylib",
1354 srcs: ["mylib.cpp"],
1355 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001356 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001357 system_shared_libs: [],
1358 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001359 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001360 }
1361
1362 cc_library {
1363 name: "libfoo",
1364 srcs: ["mylib.cpp"],
1365 shared_libs: ["libbar"],
1366 system_shared_libs: [],
1367 stl: "none",
1368 stubs: {
1369 versions: ["10", "20", "30"],
1370 },
1371 }
1372
1373 cc_library {
1374 name: "libbar",
1375 srcs: ["mylib.cpp"],
1376 system_shared_libs: [],
1377 stl: "none",
1378 }
1379
Jiyong Park678c8812020-02-07 17:25:49 +09001380 cc_library_static {
1381 name: "libbaz",
1382 srcs: ["mylib.cpp"],
1383 system_shared_libs: [],
1384 stl: "none",
1385 apex_available: [ "myapex2" ],
1386 }
1387
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001388 `)
1389
Jooyung Hana0503a52023-08-23 13:12:50 +09001390 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001391 copyCmds := apexRule.Args["copy_commands"]
1392
1393 // Ensure that direct non-stubs dep is always included
1394 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1395
1396 // Ensure that indirect stubs dep is not included
1397 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1398
1399 // Ensure that dependency of stubs is not included
1400 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1401
Colin Crossaede88c2020-08-11 12:17:01 -07001402 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001403
1404 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001405 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001406 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001407 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001408
Jiyong Park3ff16992019-12-27 14:11:47 +09001409 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001410
1411 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1412 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001413
Colin Crossf61d03d2023-11-02 16:56:39 -07001414 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1415 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001416 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001417
Colin Crossf61d03d2023-11-02 16:56:39 -07001418 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1419 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001420 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001421}
1422
Jooyung Hand3639552019-08-09 12:57:43 +09001423func TestApexWithRuntimeLibsDependency(t *testing.T) {
1424 /*
1425 myapex
1426 |
1427 v (runtime_libs)
1428 mylib ------+------> libfoo [provides stub]
1429 |
1430 `------> libbar
1431 */
Colin Cross1c460562021-02-16 17:55:47 -08001432 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001433 apex {
1434 name: "myapex",
1435 key: "myapex.key",
1436 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001437 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001438 }
1439
1440 apex_key {
1441 name: "myapex.key",
1442 public_key: "testkey.avbpubkey",
1443 private_key: "testkey.pem",
1444 }
1445
1446 cc_library {
1447 name: "mylib",
1448 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001449 static_libs: ["libstatic"],
1450 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001451 runtime_libs: ["libfoo", "libbar"],
1452 system_shared_libs: [],
1453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001454 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001455 }
1456
1457 cc_library {
1458 name: "libfoo",
1459 srcs: ["mylib.cpp"],
1460 system_shared_libs: [],
1461 stl: "none",
1462 stubs: {
1463 versions: ["10", "20", "30"],
1464 },
1465 }
1466
1467 cc_library {
1468 name: "libbar",
1469 srcs: ["mylib.cpp"],
1470 system_shared_libs: [],
1471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001472 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001473 }
1474
Liz Kammer5f108fa2023-05-11 14:33:17 -04001475 cc_library {
1476 name: "libstatic",
1477 srcs: ["mylib.cpp"],
1478 system_shared_libs: [],
1479 stl: "none",
1480 apex_available: [ "myapex" ],
1481 runtime_libs: ["libstatic_to_runtime"],
1482 }
1483
1484 cc_library {
1485 name: "libshared",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libshared_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libstatic_to_runtime",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 }
1500
1501 cc_library {
1502 name: "libshared_to_runtime",
1503 srcs: ["mylib.cpp"],
1504 system_shared_libs: [],
1505 stl: "none",
1506 apex_available: [ "myapex" ],
1507 }
Jooyung Hand3639552019-08-09 12:57:43 +09001508 `)
1509
Jooyung Hana0503a52023-08-23 13:12:50 +09001510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001511 copyCmds := apexRule.Args["copy_commands"]
1512
1513 // Ensure that direct non-stubs dep is always included
1514 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1515
1516 // Ensure that indirect stubs dep is not included
1517 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1518
1519 // Ensure that runtime_libs dep in included
1520 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001521 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1522 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1523
1524 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001525
Jooyung Hana0503a52023-08-23 13:12:50 +09001526 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001527 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1528 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001529}
1530
Paul Duffina02cae32021-03-09 01:44:06 +00001531var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1532 cc.PrepareForTestWithCcBuildComponents,
1533 PrepareForTestWithApexBuildComponents,
1534 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001535 apex {
1536 name: "com.android.runtime",
1537 key: "com.android.runtime.key",
1538 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001539 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001540 }
1541
1542 apex_key {
1543 name: "com.android.runtime.key",
1544 public_key: "testkey.avbpubkey",
1545 private_key: "testkey.pem",
1546 }
Paul Duffina02cae32021-03-09 01:44:06 +00001547 `),
1548 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1549)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001550
Paul Duffina02cae32021-03-09 01:44:06 +00001551func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001552 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001553 cc_library {
1554 name: "libc",
1555 no_libcrt: true,
1556 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001557 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558 stl: "none",
1559 system_shared_libs: [],
1560 stubs: { versions: ["1"] },
1561 apex_available: ["com.android.runtime"],
1562
1563 sanitize: {
1564 hwaddress: true,
1565 }
1566 }
1567
1568 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001569 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001570 no_libcrt: true,
1571 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001572 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001573 stl: "none",
1574 system_shared_libs: [],
1575 srcs: [""],
1576 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001577 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001578
1579 sanitize: {
1580 never: true,
1581 },
Spandan Das4de7b492023-05-05 21:13:01 +00001582 apex_available: [
1583 "//apex_available:anyapex",
1584 "//apex_available:platform",
1585 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001586 } `)
1587 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588
Jooyung Hana0503a52023-08-23 13:12:50 +09001589 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001590 "lib64/bionic/libc.so",
1591 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1592 })
1593
Colin Cross4c4c1be2022-02-10 11:41:18 -08001594 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001595
1596 installed := hwasan.Description("install libclang_rt.hwasan")
1597 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1598
1599 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1600 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1601 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1602}
1603
1604func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001605 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001606 prepareForTestOfRuntimeApexWithHwasan,
1607 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1608 variables.SanitizeDevice = []string{"hwaddress"}
1609 }),
1610 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001611 cc_library {
1612 name: "libc",
1613 no_libcrt: true,
1614 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001615 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001616 stl: "none",
1617 system_shared_libs: [],
1618 stubs: { versions: ["1"] },
1619 apex_available: ["com.android.runtime"],
1620 }
1621
1622 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001623 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001624 no_libcrt: true,
1625 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001626 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001627 stl: "none",
1628 system_shared_libs: [],
1629 srcs: [""],
1630 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001631 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001632
1633 sanitize: {
1634 never: true,
1635 },
Spandan Das4de7b492023-05-05 21:13:01 +00001636 apex_available: [
1637 "//apex_available:anyapex",
1638 "//apex_available:platform",
1639 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001640 }
Paul Duffina02cae32021-03-09 01:44:06 +00001641 `)
1642 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001643
Jooyung Hana0503a52023-08-23 13:12:50 +09001644 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001645 "lib64/bionic/libc.so",
1646 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1647 })
1648
Colin Cross4c4c1be2022-02-10 11:41:18 -08001649 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001650
1651 installed := hwasan.Description("install libclang_rt.hwasan")
1652 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1653
1654 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1655 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1656 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1657}
1658
Jooyung Han61b66e92020-03-21 14:21:46 +00001659func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1660 testcases := []struct {
1661 name string
1662 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001663 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001664 shouldLink string
1665 shouldNotLink []string
1666 }{
1667 {
Jiyong Park55549df2021-02-26 23:57:23 +09001668 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001669 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001670 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001671 shouldLink: "current",
1672 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001673 },
1674 {
Jiyong Park55549df2021-02-26 23:57:23 +09001675 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001676 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001677 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001678 shouldLink: "current",
1679 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001680 },
1681 }
1682 for _, tc := range testcases {
1683 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001684 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001685 apex {
1686 name: "myapex",
1687 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001688 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001689 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001690 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001691 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001692
Jooyung Han61b66e92020-03-21 14:21:46 +00001693 apex_key {
1694 name: "myapex.key",
1695 public_key: "testkey.avbpubkey",
1696 private_key: "testkey.pem",
1697 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001698
Jooyung Han61b66e92020-03-21 14:21:46 +00001699 cc_library {
1700 name: "mylib",
1701 srcs: ["mylib.cpp"],
1702 vendor_available: true,
1703 shared_libs: ["libbar"],
1704 system_shared_libs: [],
1705 stl: "none",
1706 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001707 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001708 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001709
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 cc_library {
1711 name: "libbar",
1712 srcs: ["mylib.cpp"],
1713 system_shared_libs: [],
1714 stl: "none",
1715 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001716 llndk: {
1717 symbol_file: "libbar.map.txt",
1718 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001719 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001720 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001721 withUnbundledBuild,
1722 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001723
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001725 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001726 "lib64/mylib.so",
1727 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001728
Jooyung Han61b66e92020-03-21 14:21:46 +00001729 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001730 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001731 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1732 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001733
Steven Moreland2c4000c2021-04-27 02:08:49 +00001734 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1735 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001736 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001737 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001738 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001739
Steven Moreland2c4000c2021-04-27 02:08:49 +00001740 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001741 ver := tc.shouldLink
1742 if tc.shouldLink == "current" {
1743 ver = strconv.Itoa(android.FutureApiLevelInt)
1744 }
1745 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001746 })
1747 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001748}
1749
Jiyong Park25fc6a92018-11-18 18:02:45 +09001750func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001751 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001752 apex {
1753 name: "myapex",
1754 key: "myapex.key",
1755 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001756 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001757 }
1758
1759 apex_key {
1760 name: "myapex.key",
1761 public_key: "testkey.avbpubkey",
1762 private_key: "testkey.pem",
1763 }
1764
1765 cc_library {
1766 name: "mylib",
1767 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001768 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001769 shared_libs: ["libdl#27"],
1770 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001771 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001772 }
1773
1774 cc_library_shared {
1775 name: "mylib_shared",
1776 srcs: ["mylib.cpp"],
1777 shared_libs: ["libdl#27"],
1778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001779 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001780 }
1781
1782 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001783 name: "libBootstrap",
1784 srcs: ["mylib.cpp"],
1785 stl: "none",
1786 bootstrap: true,
1787 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001788 `)
1789
Jooyung Hana0503a52023-08-23 13:12:50 +09001790 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 copyCmds := apexRule.Args["copy_commands"]
1792
1793 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001794 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001795 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1796 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001797
1798 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001799 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001800
Colin Crossaede88c2020-08-11 12:17:01 -07001801 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1802 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1803 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804
1805 // For dependency to libc
1806 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001807 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001808 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001809 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001810 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001811 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1812 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001813
1814 // For dependency to libm
1815 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001816 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001817 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001818 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001819 // ... and is not compiling with the stub
1820 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1821 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1822
1823 // For dependency to libdl
1824 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001825 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001826 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001827 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1828 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001829 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001830 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831 // ... Cflags from stub is correctly exported to mylib
1832 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1833 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001834
1835 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001836 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1837 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1838 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1839 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001841
Jooyung Han749dc692020-04-15 11:03:39 +09001842func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001843 // there are three links between liba --> libz.
1844 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001845 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001846 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001852 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex {
1856 name: "otherapex",
1857 key: "myapex.key",
1858 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001859 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001860 }
1861
1862 apex_key {
1863 name: "myapex.key",
1864 public_key: "testkey.avbpubkey",
1865 private_key: "testkey.pem",
1866 }
1867
1868 cc_library {
1869 name: "libx",
1870 shared_libs: ["liba"],
1871 system_shared_libs: [],
1872 stl: "none",
1873 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001874 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001875 }
1876
1877 cc_library {
1878 name: "liby",
1879 shared_libs: ["liba"],
1880 system_shared_libs: [],
1881 stl: "none",
1882 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001883 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001884 }
1885
1886 cc_library {
1887 name: "liba",
1888 shared_libs: ["libz"],
1889 system_shared_libs: [],
1890 stl: "none",
1891 apex_available: [
1892 "//apex_available:anyapex",
1893 "//apex_available:platform",
1894 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001895 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001896 }
1897
1898 cc_library {
1899 name: "libz",
1900 system_shared_libs: [],
1901 stl: "none",
1902 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001903 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001904 },
1905 }
Jooyung Han749dc692020-04-15 11:03:39 +09001906 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001907
1908 expectLink := func(from, from_variant, to, to_variant string) {
1909 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1910 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1911 }
1912 expectNoLink := func(from, from_variant, to, to_variant string) {
1913 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1914 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1915 }
1916 // platform liba is linked to non-stub version
1917 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001918 // liba in myapex is linked to current
1919 expectLink("liba", "shared_apex29", "libz", "shared_current")
1920 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001921 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001922 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001923 // liba in otherapex is linked to current
1924 expectLink("liba", "shared_apex30", "libz", "shared_current")
1925 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001926 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1927 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001928}
1929
Jooyung Hanaed150d2020-04-02 01:41:41 +09001930func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001931 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["libx"],
1936 min_sdk_version: "R",
1937 }
1938
1939 apex_key {
1940 name: "myapex.key",
1941 public_key: "testkey.avbpubkey",
1942 private_key: "testkey.pem",
1943 }
1944
1945 cc_library {
1946 name: "libx",
1947 shared_libs: ["libz"],
1948 system_shared_libs: [],
1949 stl: "none",
1950 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001951 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001952 }
1953
1954 cc_library {
1955 name: "libz",
1956 system_shared_libs: [],
1957 stl: "none",
1958 stubs: {
1959 versions: ["29", "R"],
1960 },
1961 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001962 `,
1963 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1964 variables.Platform_version_active_codenames = []string{"R"}
1965 }),
1966 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001967
1968 expectLink := func(from, from_variant, to, to_variant string) {
1969 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1970 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1971 }
1972 expectNoLink := func(from, from_variant, to, to_variant string) {
1973 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1974 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1975 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001976 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1977 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001978 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1979 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001980}
1981
Jooyung Han4c4da062021-06-23 10:23:16 +09001982func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1983 testApex(t, `
1984 apex {
1985 name: "myapex",
1986 key: "myapex.key",
1987 java_libs: ["libx"],
1988 min_sdk_version: "S",
1989 }
1990
1991 apex_key {
1992 name: "myapex.key",
1993 public_key: "testkey.avbpubkey",
1994 private_key: "testkey.pem",
1995 }
1996
1997 java_library {
1998 name: "libx",
1999 srcs: ["a.java"],
2000 apex_available: [ "myapex" ],
2001 sdk_version: "current",
2002 min_sdk_version: "S", // should be okay
2003 }
2004 `,
2005 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2006 variables.Platform_version_active_codenames = []string{"S"}
2007 variables.Platform_sdk_codename = proptools.StringPtr("S")
2008 }),
2009 )
2010}
2011
Jooyung Han749dc692020-04-15 11:03:39 +09002012func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002013 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002014 apex {
2015 name: "myapex",
2016 key: "myapex.key",
2017 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002018 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002019 }
2020
2021 apex_key {
2022 name: "myapex.key",
2023 public_key: "testkey.avbpubkey",
2024 private_key: "testkey.pem",
2025 }
2026
2027 cc_library {
2028 name: "libx",
2029 shared_libs: ["libz"],
2030 system_shared_libs: [],
2031 stl: "none",
2032 apex_available: [ "myapex" ],
2033 }
2034
2035 cc_library {
2036 name: "libz",
2037 system_shared_libs: [],
2038 stl: "none",
2039 stubs: {
2040 versions: ["1", "2"],
2041 },
2042 }
2043 `)
2044
2045 expectLink := func(from, from_variant, to, to_variant string) {
2046 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2047 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2048 }
2049 expectNoLink := func(from, from_variant, to, to_variant string) {
2050 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2051 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2052 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002053 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002054 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002055 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002056 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002057}
2058
Jooyung Handfc864c2023-03-20 18:19:07 +09002059func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002060 ctx := testApex(t, `
2061 apex {
2062 name: "myapex",
2063 key: "myapex.key",
2064 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002065 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002066 vendor: true,
2067 min_sdk_version: "29",
2068 }
2069
2070 apex_key {
2071 name: "myapex.key",
2072 public_key: "testkey.avbpubkey",
2073 private_key: "testkey.pem",
2074 }
2075
2076 cc_library {
2077 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002078 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002079 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002081 shared_libs: ["libbar"],
2082 }
2083
2084 cc_library {
2085 name: "libbar",
2086 stubs: { versions: ["29", "30"] },
2087 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002088 }
2089 `)
2090
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002091 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002092
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002093 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002094
2095 // Ensure that mylib links with "current" LLNDK
2096 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002097 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002098
2099 // Ensure that mylib is targeting 29
2100 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2101 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2102
2103 // Ensure that the correct variant of crtbegin_so is used.
2104 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2105 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002106
2107 // Ensure that the crtbegin_so used by the APEX is targeting 29
2108 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2109 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2110}
2111
Jooyung Han4495f842023-04-25 16:39:59 +09002112func TestTrackAllowedDeps(t *testing.T) {
2113 ctx := testApex(t, `
2114 apex {
2115 name: "myapex",
2116 key: "myapex.key",
2117 updatable: true,
2118 native_shared_libs: [
2119 "mylib",
2120 "yourlib",
2121 ],
2122 min_sdk_version: "29",
2123 }
2124
2125 apex {
2126 name: "myapex2",
2127 key: "myapex.key",
2128 updatable: false,
2129 native_shared_libs: ["yourlib"],
2130 }
2131
2132 apex_key {
2133 name: "myapex.key",
2134 public_key: "testkey.avbpubkey",
2135 private_key: "testkey.pem",
2136 }
2137
2138 cc_library {
2139 name: "mylib",
2140 srcs: ["mylib.cpp"],
2141 shared_libs: ["libbar"],
2142 min_sdk_version: "29",
2143 apex_available: ["myapex"],
2144 }
2145
2146 cc_library {
2147 name: "libbar",
2148 stubs: { versions: ["29", "30"] },
2149 }
2150
2151 cc_library {
2152 name: "yourlib",
2153 srcs: ["mylib.cpp"],
2154 min_sdk_version: "29",
2155 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2156 }
2157 `, withFiles(android.MockFS{
2158 "packages/modules/common/build/allowed_deps.txt": nil,
2159 }))
2160
2161 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2162 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2163 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002164 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002165 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002166 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002167
Jooyung Hana0503a52023-08-23 13:12:50 +09002168 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002169 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2170 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002171 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2172 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2173 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2174 flatlist, "mylib:(minSdkVersion:29)")
2175 android.AssertStringListContains(t, "track platform-available lib",
2176 flatlist, "yourlib(minSdkVersion:29)")
2177}
2178
2179func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2180 ctx := testApex(t, `
2181 apex {
2182 name: "myapex",
2183 key: "myapex.key",
2184 updatable: true,
2185 min_sdk_version: "29",
2186 }
2187
2188 apex_key {
2189 name: "myapex.key",
2190 public_key: "testkey.avbpubkey",
2191 private_key: "testkey.pem",
2192 }
2193 `)
2194 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2195 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2196 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2197 }
2198}
2199
Jooyung Han03b51852020-02-26 22:45:42 +09002200func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002201 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002206 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libx",
2217 system_shared_libs: [],
2218 stl: "none",
2219 apex_available: [ "myapex" ],
2220 stubs: {
2221 versions: ["1", "2"],
2222 },
2223 }
2224
2225 cc_library {
2226 name: "libz",
2227 shared_libs: ["libx"],
2228 system_shared_libs: [],
2229 stl: "none",
2230 }
2231 `)
2232
2233 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002234 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002235 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2236 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2237 }
2238 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002239 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002240 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2241 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2242 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002243 expectLink("libz", "shared", "libx", "shared_current")
2244 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002245 expectNoLink("libz", "shared", "libz", "shared_1")
2246 expectNoLink("libz", "shared", "libz", "shared")
2247}
2248
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002249var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2250 func(variables android.FixtureProductVariables) {
2251 variables.SanitizeDevice = []string{"hwaddress"}
2252 },
2253)
2254
Jooyung Han75568392020-03-20 04:29:24 +09002255func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002256 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002257 apex {
2258 name: "myapex",
2259 key: "myapex.key",
2260 native_shared_libs: ["libx"],
2261 min_sdk_version: "29",
2262 }
2263
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269
2270 cc_library {
2271 name: "libx",
2272 shared_libs: ["libbar"],
2273 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002275 }
2276
2277 cc_library {
2278 name: "libbar",
2279 stubs: {
2280 versions: ["29", "30"],
2281 },
2282 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002283 `,
2284 prepareForTestWithSantitizeHwaddress,
2285 )
Jooyung Han03b51852020-02-26 22:45:42 +09002286 expectLink := func(from, from_variant, to, to_variant string) {
2287 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2288 libFlags := ld.Args["libFlags"]
2289 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2290 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002291 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002292}
2293
Jooyung Han75568392020-03-20 04:29:24 +09002294func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002295 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002296 apex {
2297 name: "myapex",
2298 key: "myapex.key",
2299 native_shared_libs: ["libx"],
2300 min_sdk_version: "29",
2301 }
2302
2303 apex_key {
2304 name: "myapex.key",
2305 public_key: "testkey.avbpubkey",
2306 private_key: "testkey.pem",
2307 }
2308
2309 cc_library {
2310 name: "libx",
2311 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002312 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002313 }
Jooyung Han75568392020-03-20 04:29:24 +09002314 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002315
2316 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002317 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002318 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002319 // note that platform variant is not.
2320 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002321 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002322}
2323
Jooyung Han749dc692020-04-15 11:03:39 +09002324func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2325 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002326 apex {
2327 name: "myapex",
2328 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002329 native_shared_libs: ["mylib"],
2330 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002331 }
2332
2333 apex_key {
2334 name: "myapex.key",
2335 public_key: "testkey.avbpubkey",
2336 private_key: "testkey.pem",
2337 }
Jooyung Han749dc692020-04-15 11:03:39 +09002338
2339 cc_library {
2340 name: "mylib",
2341 srcs: ["mylib.cpp"],
2342 system_shared_libs: [],
2343 stl: "none",
2344 apex_available: [
2345 "myapex",
2346 ],
2347 min_sdk_version: "30",
2348 }
2349 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002350
2351 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2352 apex {
2353 name: "myapex",
2354 key: "myapex.key",
2355 native_shared_libs: ["libfoo.ffi"],
2356 min_sdk_version: "29",
2357 }
2358
2359 apex_key {
2360 name: "myapex.key",
2361 public_key: "testkey.avbpubkey",
2362 private_key: "testkey.pem",
2363 }
2364
2365 rust_ffi_shared {
2366 name: "libfoo.ffi",
2367 srcs: ["foo.rs"],
2368 crate_name: "foo",
2369 apex_available: [
2370 "myapex",
2371 ],
2372 min_sdk_version: "30",
2373 }
2374 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002375
2376 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2377 apex {
2378 name: "myapex",
2379 key: "myapex.key",
2380 java_libs: ["libfoo"],
2381 min_sdk_version: "29",
2382 }
2383
2384 apex_key {
2385 name: "myapex.key",
2386 public_key: "testkey.avbpubkey",
2387 private_key: "testkey.pem",
2388 }
2389
2390 java_import {
2391 name: "libfoo",
2392 jars: ["libfoo.jar"],
2393 apex_available: [
2394 "myapex",
2395 ],
2396 min_sdk_version: "30",
2397 }
2398 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002399
2400 // Skip check for modules compiling against core API surface
2401 testApex(t, `
2402 apex {
2403 name: "myapex",
2404 key: "myapex.key",
2405 java_libs: ["libfoo"],
2406 min_sdk_version: "29",
2407 }
2408
2409 apex_key {
2410 name: "myapex.key",
2411 public_key: "testkey.avbpubkey",
2412 private_key: "testkey.pem",
2413 }
2414
2415 java_library {
2416 name: "libfoo",
2417 srcs: ["Foo.java"],
2418 apex_available: [
2419 "myapex",
2420 ],
2421 // Compile against core API surface
2422 sdk_version: "core_current",
2423 min_sdk_version: "30",
2424 }
2425 `)
2426
Jooyung Han749dc692020-04-15 11:03:39 +09002427}
2428
2429func TestApexMinSdkVersion_Okay(t *testing.T) {
2430 testApex(t, `
2431 apex {
2432 name: "myapex",
2433 key: "myapex.key",
2434 native_shared_libs: ["libfoo"],
2435 java_libs: ["libbar"],
2436 min_sdk_version: "29",
2437 }
2438
2439 apex_key {
2440 name: "myapex.key",
2441 public_key: "testkey.avbpubkey",
2442 private_key: "testkey.pem",
2443 }
2444
2445 cc_library {
2446 name: "libfoo",
2447 srcs: ["mylib.cpp"],
2448 shared_libs: ["libfoo_dep"],
2449 apex_available: ["myapex"],
2450 min_sdk_version: "29",
2451 }
2452
2453 cc_library {
2454 name: "libfoo_dep",
2455 srcs: ["mylib.cpp"],
2456 apex_available: ["myapex"],
2457 min_sdk_version: "29",
2458 }
2459
2460 java_library {
2461 name: "libbar",
2462 sdk_version: "current",
2463 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002464 static_libs: [
2465 "libbar_dep",
2466 "libbar_import_dep",
2467 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002468 apex_available: ["myapex"],
2469 min_sdk_version: "29",
2470 }
2471
2472 java_library {
2473 name: "libbar_dep",
2474 sdk_version: "current",
2475 srcs: ["a.java"],
2476 apex_available: ["myapex"],
2477 min_sdk_version: "29",
2478 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002479
2480 java_import {
2481 name: "libbar_import_dep",
2482 jars: ["libbar.jar"],
2483 apex_available: ["myapex"],
2484 min_sdk_version: "29",
2485 }
Jooyung Han03b51852020-02-26 22:45:42 +09002486 `)
2487}
2488
Colin Cross8ca61c12022-10-06 21:00:14 -07002489func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2490 // Tests that an apex dependency with min_sdk_version higher than the
2491 // min_sdk_version of the apex is allowed as long as the dependency's
2492 // min_sdk_version is less than or equal to the api level that the
2493 // architecture was introduced in. In this case, arm64 didn't exist
2494 // until api level 21, so the arm64 code will never need to run on
2495 // an api level 20 device, even if other architectures of the apex
2496 // will.
2497 testApex(t, `
2498 apex {
2499 name: "myapex",
2500 key: "myapex.key",
2501 native_shared_libs: ["libfoo"],
2502 min_sdk_version: "20",
2503 }
2504
2505 apex_key {
2506 name: "myapex.key",
2507 public_key: "testkey.avbpubkey",
2508 private_key: "testkey.pem",
2509 }
2510
2511 cc_library {
2512 name: "libfoo",
2513 srcs: ["mylib.cpp"],
2514 apex_available: ["myapex"],
2515 min_sdk_version: "21",
2516 stl: "none",
2517 }
2518 `)
2519}
2520
Artur Satayev8cf899a2020-04-15 17:29:42 +01002521func TestJavaStableSdkVersion(t *testing.T) {
2522 testCases := []struct {
2523 name string
2524 expectedError string
2525 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002526 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002527 }{
2528 {
2529 name: "Non-updatable apex with non-stable dep",
2530 bp: `
2531 apex {
2532 name: "myapex",
2533 java_libs: ["myjar"],
2534 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002535 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002536 }
2537 apex_key {
2538 name: "myapex.key",
2539 public_key: "testkey.avbpubkey",
2540 private_key: "testkey.pem",
2541 }
2542 java_library {
2543 name: "myjar",
2544 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002545 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002546 apex_available: ["myapex"],
2547 }
2548 `,
2549 },
2550 {
2551 name: "Updatable apex with stable dep",
2552 bp: `
2553 apex {
2554 name: "myapex",
2555 java_libs: ["myjar"],
2556 key: "myapex.key",
2557 updatable: true,
2558 min_sdk_version: "29",
2559 }
2560 apex_key {
2561 name: "myapex.key",
2562 public_key: "testkey.avbpubkey",
2563 private_key: "testkey.pem",
2564 }
2565 java_library {
2566 name: "myjar",
2567 srcs: ["foo/bar/MyClass.java"],
2568 sdk_version: "current",
2569 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002570 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002571 }
2572 `,
2573 },
2574 {
2575 name: "Updatable apex with non-stable dep",
2576 expectedError: "cannot depend on \"myjar\"",
2577 bp: `
2578 apex {
2579 name: "myapex",
2580 java_libs: ["myjar"],
2581 key: "myapex.key",
2582 updatable: true,
2583 }
2584 apex_key {
2585 name: "myapex.key",
2586 public_key: "testkey.avbpubkey",
2587 private_key: "testkey.pem",
2588 }
2589 java_library {
2590 name: "myjar",
2591 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002592 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002593 apex_available: ["myapex"],
2594 }
2595 `,
2596 },
2597 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002598 name: "Updatable apex with non-stable legacy core platform dep",
2599 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2600 bp: `
2601 apex {
2602 name: "myapex",
2603 java_libs: ["myjar-uses-legacy"],
2604 key: "myapex.key",
2605 updatable: true,
2606 }
2607 apex_key {
2608 name: "myapex.key",
2609 public_key: "testkey.avbpubkey",
2610 private_key: "testkey.pem",
2611 }
2612 java_library {
2613 name: "myjar-uses-legacy",
2614 srcs: ["foo/bar/MyClass.java"],
2615 sdk_version: "core_platform",
2616 apex_available: ["myapex"],
2617 }
2618 `,
2619 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2620 },
2621 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002622 name: "Updatable apex with non-stable transitive dep",
2623 // This is not actually detecting that the transitive dependency is unstable, rather it is
2624 // detecting that the transitive dependency is building against a wider API surface than the
2625 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002626 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002627 bp: `
2628 apex {
2629 name: "myapex",
2630 java_libs: ["myjar"],
2631 key: "myapex.key",
2632 updatable: true,
2633 }
2634 apex_key {
2635 name: "myapex.key",
2636 public_key: "testkey.avbpubkey",
2637 private_key: "testkey.pem",
2638 }
2639 java_library {
2640 name: "myjar",
2641 srcs: ["foo/bar/MyClass.java"],
2642 sdk_version: "current",
2643 apex_available: ["myapex"],
2644 static_libs: ["transitive-jar"],
2645 }
2646 java_library {
2647 name: "transitive-jar",
2648 srcs: ["foo/bar/MyClass.java"],
2649 sdk_version: "core_platform",
2650 apex_available: ["myapex"],
2651 }
2652 `,
2653 },
2654 }
2655
2656 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002657 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2658 continue
2659 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002660 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002661 errorHandler := android.FixtureExpectsNoErrors
2662 if test.expectedError != "" {
2663 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002664 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002665 android.GroupFixturePreparers(
2666 java.PrepareForTestWithJavaDefaultModules,
2667 PrepareForTestWithApexBuildComponents,
2668 prepareForTestWithMyapex,
2669 android.OptionalFixturePreparer(test.preparer),
2670 ).
2671 ExtendWithErrorHandler(errorHandler).
2672 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002673 })
2674 }
2675}
2676
Jooyung Han749dc692020-04-15 11:03:39 +09002677func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2678 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2679 apex {
2680 name: "myapex",
2681 key: "myapex.key",
2682 native_shared_libs: ["mylib"],
2683 min_sdk_version: "29",
2684 }
2685
2686 apex_key {
2687 name: "myapex.key",
2688 public_key: "testkey.avbpubkey",
2689 private_key: "testkey.pem",
2690 }
2691
2692 cc_library {
2693 name: "mylib",
2694 srcs: ["mylib.cpp"],
2695 shared_libs: ["mylib2"],
2696 system_shared_libs: [],
2697 stl: "none",
2698 apex_available: [
2699 "myapex",
2700 ],
2701 min_sdk_version: "29",
2702 }
2703
2704 // indirect part of the apex
2705 cc_library {
2706 name: "mylib2",
2707 srcs: ["mylib.cpp"],
2708 system_shared_libs: [],
2709 stl: "none",
2710 apex_available: [
2711 "myapex",
2712 ],
2713 min_sdk_version: "30",
2714 }
2715 `)
2716}
2717
2718func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2719 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2720 apex {
2721 name: "myapex",
2722 key: "myapex.key",
2723 apps: ["AppFoo"],
2724 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002725 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002726 }
2727
2728 apex_key {
2729 name: "myapex.key",
2730 public_key: "testkey.avbpubkey",
2731 private_key: "testkey.pem",
2732 }
2733
2734 android_app {
2735 name: "AppFoo",
2736 srcs: ["foo/bar/MyClass.java"],
2737 sdk_version: "current",
2738 min_sdk_version: "29",
2739 system_modules: "none",
2740 stl: "none",
2741 static_libs: ["bar"],
2742 apex_available: [ "myapex" ],
2743 }
2744
2745 java_library {
2746 name: "bar",
2747 sdk_version: "current",
2748 srcs: ["a.java"],
2749 apex_available: [ "myapex" ],
2750 }
2751 `)
2752}
2753
2754func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002755 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002756 apex {
2757 name: "myapex",
2758 key: "myapex.key",
2759 native_shared_libs: ["mylib"],
2760 min_sdk_version: "29",
2761 }
2762
2763 apex_key {
2764 name: "myapex.key",
2765 public_key: "testkey.avbpubkey",
2766 private_key: "testkey.pem",
2767 }
2768
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002769 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002770 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2771 cc_library {
2772 name: "mylib",
2773 srcs: ["mylib.cpp"],
2774 shared_libs: ["mylib2"],
2775 system_shared_libs: [],
2776 stl: "none",
2777 apex_available: ["myapex", "otherapex"],
2778 min_sdk_version: "29",
2779 }
2780
2781 cc_library {
2782 name: "mylib2",
2783 srcs: ["mylib.cpp"],
2784 system_shared_libs: [],
2785 stl: "none",
2786 apex_available: ["otherapex"],
2787 stubs: { versions: ["29", "30"] },
2788 min_sdk_version: "30",
2789 }
2790
2791 apex {
2792 name: "otherapex",
2793 key: "myapex.key",
2794 native_shared_libs: ["mylib", "mylib2"],
2795 min_sdk_version: "30",
2796 }
2797 `)
2798 expectLink := func(from, from_variant, to, to_variant string) {
2799 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2800 libFlags := ld.Args["libFlags"]
2801 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2802 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002803 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002804 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002805}
2806
Jooyung Haned124c32021-01-26 11:43:46 +09002807func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002808 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2809 func(variables android.FixtureProductVariables) {
2810 variables.Platform_sdk_codename = proptools.StringPtr("S")
2811 variables.Platform_version_active_codenames = []string{"S"}
2812 },
2813 )
Jooyung Haned124c32021-01-26 11:43:46 +09002814 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2815 apex {
2816 name: "myapex",
2817 key: "myapex.key",
2818 native_shared_libs: ["libfoo"],
2819 min_sdk_version: "S",
2820 }
2821 apex_key {
2822 name: "myapex.key",
2823 public_key: "testkey.avbpubkey",
2824 private_key: "testkey.pem",
2825 }
2826 cc_library {
2827 name: "libfoo",
2828 shared_libs: ["libbar"],
2829 apex_available: ["myapex"],
2830 min_sdk_version: "29",
2831 }
2832 cc_library {
2833 name: "libbar",
2834 apex_available: ["myapex"],
2835 }
2836 `, withSAsActiveCodeNames)
2837}
2838
2839func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002840 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2841 variables.Platform_sdk_codename = proptools.StringPtr("S")
2842 variables.Platform_version_active_codenames = []string{"S", "T"}
2843 })
Colin Cross1c460562021-02-16 17:55:47 -08002844 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002845 apex {
2846 name: "myapex",
2847 key: "myapex.key",
2848 native_shared_libs: ["libfoo"],
2849 min_sdk_version: "S",
2850 }
2851 apex_key {
2852 name: "myapex.key",
2853 public_key: "testkey.avbpubkey",
2854 private_key: "testkey.pem",
2855 }
2856 cc_library {
2857 name: "libfoo",
2858 shared_libs: ["libbar"],
2859 apex_available: ["myapex"],
2860 min_sdk_version: "S",
2861 }
2862 cc_library {
2863 name: "libbar",
2864 stubs: {
2865 symbol_file: "libbar.map.txt",
2866 versions: ["30", "S", "T"],
2867 },
2868 }
2869 `, withSAsActiveCodeNames)
2870
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002871 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002872 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2873 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002874 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002875}
2876
Jiyong Park7c2ee712018-12-07 00:42:25 +09002877func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002878 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002879 apex {
2880 name: "myapex",
2881 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002882 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002883 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002884 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002885 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002886 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002887 }
2888
2889 apex_key {
2890 name: "myapex.key",
2891 public_key: "testkey.avbpubkey",
2892 private_key: "testkey.pem",
2893 }
2894
2895 prebuilt_etc {
2896 name: "myetc",
2897 src: "myprebuilt",
2898 sub_dir: "foo/bar",
2899 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002900
2901 cc_library {
2902 name: "mylib",
2903 srcs: ["mylib.cpp"],
2904 relative_install_path: "foo/bar",
2905 system_shared_libs: [],
2906 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002907 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002908 }
2909
2910 cc_binary {
2911 name: "mybin",
2912 srcs: ["mylib.cpp"],
2913 relative_install_path: "foo/bar",
2914 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002915 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002916 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002917 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002918
2919 rust_binary {
2920 name: "mybin.rust",
2921 srcs: ["foo.rs"],
2922 relative_install_path: "rust_subdir",
2923 apex_available: [ "myapex" ],
2924 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002925 `)
2926
Jooyung Hana0503a52023-08-23 13:12:50 +09002927 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002928 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002929
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002930 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002931 ensureContains(t, cmd, "/etc ")
2932 ensureContains(t, cmd, "/etc/foo ")
2933 ensureContains(t, cmd, "/etc/foo/bar ")
2934 ensureContains(t, cmd, "/lib64 ")
2935 ensureContains(t, cmd, "/lib64/foo ")
2936 ensureContains(t, cmd, "/lib64/foo/bar ")
2937 ensureContains(t, cmd, "/lib ")
2938 ensureContains(t, cmd, "/lib/foo ")
2939 ensureContains(t, cmd, "/lib/foo/bar ")
2940 ensureContains(t, cmd, "/bin ")
2941 ensureContains(t, cmd, "/bin/foo ")
2942 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002943 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002944}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002945
Jooyung Han35155c42020-02-06 17:33:20 +09002946func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002947 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002948 apex {
2949 name: "myapex",
2950 key: "myapex.key",
2951 multilib: {
2952 both: {
2953 native_shared_libs: ["mylib"],
2954 binaries: ["mybin"],
2955 },
2956 },
2957 compile_multilib: "both",
2958 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002959 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002960 }
2961
2962 apex_key {
2963 name: "myapex.key",
2964 public_key: "testkey.avbpubkey",
2965 private_key: "testkey.pem",
2966 }
2967
2968 cc_library {
2969 name: "mylib",
2970 relative_install_path: "foo/bar",
2971 system_shared_libs: [],
2972 stl: "none",
2973 apex_available: [ "myapex" ],
2974 native_bridge_supported: true,
2975 }
2976
2977 cc_binary {
2978 name: "mybin",
2979 relative_install_path: "foo/bar",
2980 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002981 stl: "none",
2982 apex_available: [ "myapex" ],
2983 native_bridge_supported: true,
2984 compile_multilib: "both", // default is "first" for binary
2985 multilib: {
2986 lib64: {
2987 suffix: "64",
2988 },
2989 },
2990 }
2991 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002992 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002993 "bin/foo/bar/mybin",
2994 "bin/foo/bar/mybin64",
2995 "bin/arm/foo/bar/mybin",
2996 "bin/arm64/foo/bar/mybin64",
2997 "lib/foo/bar/mylib.so",
2998 "lib/arm/foo/bar/mylib.so",
2999 "lib64/foo/bar/mylib.so",
3000 "lib64/arm64/foo/bar/mylib.so",
3001 })
3002}
3003
Jooyung Han85d61762020-06-24 23:50:26 +09003004func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08003005 result := android.GroupFixturePreparers(
3006 prepareForApexTest,
3007 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3008 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003009 apex {
3010 name: "myapex",
3011 key: "myapex.key",
3012 binaries: ["mybin"],
3013 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003014 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003015 }
3016 apex_key {
3017 name: "myapex.key",
3018 public_key: "testkey.avbpubkey",
3019 private_key: "testkey.pem",
3020 }
3021 cc_binary {
3022 name: "mybin",
3023 vendor: true,
3024 shared_libs: ["libfoo"],
3025 }
3026 cc_library {
3027 name: "libfoo",
3028 proprietary: true,
3029 }
3030 `)
3031
Jooyung Hana0503a52023-08-23 13:12:50 +09003032 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003033 "bin/mybin",
3034 "lib64/libfoo.so",
3035 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3036 "lib64/libc++.so",
3037 })
3038
Jooyung Hana0503a52023-08-23 13:12:50 +09003039 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003040 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003041 name := apexBundle.BaseModuleName()
3042 prefix := "TARGET_"
3043 var builder strings.Builder
3044 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003045 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003046 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003047 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003048
Jooyung Hana0503a52023-08-23 13:12:50 +09003049 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003050 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3051 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003052}
3053
Justin Yun13decfb2021-03-08 19:25:55 +09003054func TestProductVariant(t *testing.T) {
3055 ctx := testApex(t, `
3056 apex {
3057 name: "myapex",
3058 key: "myapex.key",
3059 updatable: false,
3060 product_specific: true,
3061 binaries: ["foo"],
3062 }
3063
3064 apex_key {
3065 name: "myapex.key",
3066 public_key: "testkey.avbpubkey",
3067 private_key: "testkey.pem",
3068 }
3069
3070 cc_binary {
3071 name: "foo",
3072 product_available: true,
3073 apex_available: ["myapex"],
3074 srcs: ["foo.cpp"],
3075 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003076 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003077
3078 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003079 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003080 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3081 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3082 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3083 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3084}
3085
Jooyung Han8e5685d2020-09-21 11:02:57 +09003086func TestApex_withPrebuiltFirmware(t *testing.T) {
3087 testCases := []struct {
3088 name string
3089 additionalProp string
3090 }{
3091 {"system apex with prebuilt_firmware", ""},
3092 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3093 }
3094 for _, tc := range testCases {
3095 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003096 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003097 apex {
3098 name: "myapex",
3099 key: "myapex.key",
3100 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003101 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003102 `+tc.additionalProp+`
3103 }
3104 apex_key {
3105 name: "myapex.key",
3106 public_key: "testkey.avbpubkey",
3107 private_key: "testkey.pem",
3108 }
3109 prebuilt_firmware {
3110 name: "myfirmware",
3111 src: "myfirmware.bin",
3112 filename_from_src: true,
3113 `+tc.additionalProp+`
3114 }
3115 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003116 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003117 "etc/firmware/myfirmware.bin",
3118 })
3119 })
3120 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003121}
3122
Jooyung Hanefb184e2020-06-25 17:14:25 +09003123func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003124 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003125 apex {
3126 name: "myapex",
3127 key: "myapex.key",
3128 vendor: true,
3129 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003130 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003131 }
3132
3133 apex_key {
3134 name: "myapex.key",
3135 public_key: "testkey.avbpubkey",
3136 private_key: "testkey.pem",
3137 }
3138
3139 cc_library {
3140 name: "mylib",
3141 vendor_available: true,
3142 }
3143 `)
3144
Jooyung Hana0503a52023-08-23 13:12:50 +09003145 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003146 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003147 name := apexBundle.BaseModuleName()
3148 prefix := "TARGET_"
3149 var builder strings.Builder
3150 data.Custom(&builder, name, prefix, "", data)
3151 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003152 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 +09003153}
3154
Jooyung Han2ed99d02020-06-24 23:26:26 +09003155func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003156 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003157 apex {
3158 name: "myapex",
3159 key: "myapex.key",
3160 vintf_fragments: ["fragment.xml"],
3161 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003162 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003163 }
3164 apex_key {
3165 name: "myapex.key",
3166 public_key: "testkey.avbpubkey",
3167 private_key: "testkey.pem",
3168 }
3169 cc_binary {
3170 name: "mybin",
3171 }
3172 `)
3173
Jooyung Hana0503a52023-08-23 13:12:50 +09003174 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003175 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003176 name := apexBundle.BaseModuleName()
3177 prefix := "TARGET_"
3178 var builder strings.Builder
3179 data.Custom(&builder, name, prefix, "", data)
3180 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003181 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003182 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003183}
3184
Jiyong Park16e91a02018-12-20 18:18:08 +09003185func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003186 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003187 apex {
3188 name: "myapex",
3189 key: "myapex.key",
3190 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003191 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003192 }
3193
3194 apex_key {
3195 name: "myapex.key",
3196 public_key: "testkey.avbpubkey",
3197 private_key: "testkey.pem",
3198 }
3199
3200 cc_library {
3201 name: "mylib",
3202 srcs: ["mylib.cpp"],
3203 system_shared_libs: [],
3204 stl: "none",
3205 stubs: {
3206 versions: ["1", "2", "3"],
3207 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003208 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003209 }
3210
3211 cc_binary {
3212 name: "not_in_apex",
3213 srcs: ["mylib.cpp"],
3214 static_libs: ["mylib"],
3215 static_executable: true,
3216 system_shared_libs: [],
3217 stl: "none",
3218 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003219 `)
3220
Colin Cross7113d202019-11-20 16:39:12 -08003221 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003222
3223 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003224 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003225}
Jiyong Park9335a262018-12-24 11:31:58 +09003226
3227func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003228 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003229 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003230 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003231 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003232 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003233 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003234 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003235 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003236 }
3237
3238 cc_library {
3239 name: "mylib",
3240 srcs: ["mylib.cpp"],
3241 system_shared_libs: [],
3242 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003243 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003244 }
3245
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003252 android_app_certificate {
3253 name: "myapex.certificate",
3254 certificate: "testkey",
3255 }
3256
3257 android_app_certificate {
3258 name: "myapex.certificate.override",
3259 certificate: "testkey.override",
3260 }
3261
Jiyong Park9335a262018-12-24 11:31:58 +09003262 `)
3263
3264 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003265 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003266
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003267 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3268 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003269 "vendor/foo/devkeys/testkey.avbpubkey")
3270 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003271 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3272 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003273 "vendor/foo/devkeys/testkey.pem")
3274 }
3275
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003276 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003277 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003278 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003279 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003280 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003281 }
3282}
Jiyong Park58e364a2019-01-19 19:24:06 +09003283
Jooyung Hanf121a652019-12-17 14:30:11 +09003284func TestCertificate(t *testing.T) {
3285 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003286 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003287 apex {
3288 name: "myapex",
3289 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003290 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003291 }
3292 apex_key {
3293 name: "myapex.key",
3294 public_key: "testkey.avbpubkey",
3295 private_key: "testkey.pem",
3296 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003297 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003298 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3299 if actual := rule.Args["certificates"]; actual != expected {
3300 t.Errorf("certificates should be %q, not %q", expected, actual)
3301 }
3302 })
3303 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003304 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003305 apex {
3306 name: "myapex_keytest",
3307 key: "myapex.key",
3308 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003309 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003310 }
3311 apex_key {
3312 name: "myapex.key",
3313 public_key: "testkey.avbpubkey",
3314 private_key: "testkey.pem",
3315 }
3316 android_app_certificate {
3317 name: "myapex.certificate.override",
3318 certificate: "testkey.override",
3319 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003320 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003321 expected := "testkey.override.x509.pem testkey.override.pk8"
3322 if actual := rule.Args["certificates"]; actual != expected {
3323 t.Errorf("certificates should be %q, not %q", expected, actual)
3324 }
3325 })
3326 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003327 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003328 apex {
3329 name: "myapex",
3330 key: "myapex.key",
3331 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003332 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003333 }
3334 apex_key {
3335 name: "myapex.key",
3336 public_key: "testkey.avbpubkey",
3337 private_key: "testkey.pem",
3338 }
3339 android_app_certificate {
3340 name: "myapex.certificate",
3341 certificate: "testkey",
3342 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003343 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003344 expected := "testkey.x509.pem testkey.pk8"
3345 if actual := rule.Args["certificates"]; actual != expected {
3346 t.Errorf("certificates should be %q, not %q", expected, actual)
3347 }
3348 })
3349 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003350 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 apex {
3352 name: "myapex_keytest",
3353 key: "myapex.key",
3354 file_contexts: ":myapex-file_contexts",
3355 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003356 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003357 }
3358 apex_key {
3359 name: "myapex.key",
3360 public_key: "testkey.avbpubkey",
3361 private_key: "testkey.pem",
3362 }
3363 android_app_certificate {
3364 name: "myapex.certificate.override",
3365 certificate: "testkey.override",
3366 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003367 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003368 expected := "testkey.override.x509.pem testkey.override.pk8"
3369 if actual := rule.Args["certificates"]; actual != expected {
3370 t.Errorf("certificates should be %q, not %q", expected, actual)
3371 }
3372 })
3373 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003374 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003375 apex {
3376 name: "myapex",
3377 key: "myapex.key",
3378 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003379 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003380 }
3381 apex_key {
3382 name: "myapex.key",
3383 public_key: "testkey.avbpubkey",
3384 private_key: "testkey.pem",
3385 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003386 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003387 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3388 if actual := rule.Args["certificates"]; actual != expected {
3389 t.Errorf("certificates should be %q, not %q", expected, actual)
3390 }
3391 })
3392 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003393 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003394 apex {
3395 name: "myapex_keytest",
3396 key: "myapex.key",
3397 file_contexts: ":myapex-file_contexts",
3398 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003399 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003400 }
3401 apex_key {
3402 name: "myapex.key",
3403 public_key: "testkey.avbpubkey",
3404 private_key: "testkey.pem",
3405 }
3406 android_app_certificate {
3407 name: "myapex.certificate.override",
3408 certificate: "testkey.override",
3409 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003410 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003411 expected := "testkey.override.x509.pem testkey.override.pk8"
3412 if actual := rule.Args["certificates"]; actual != expected {
3413 t.Errorf("certificates should be %q, not %q", expected, actual)
3414 }
3415 })
3416}
3417
Jiyong Park58e364a2019-01-19 19:24:06 +09003418func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003419 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003420 apex {
3421 name: "myapex",
3422 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003423 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003424 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003425 }
3426
3427 apex {
3428 name: "otherapex",
3429 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003430 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003431 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003432 }
3433
3434 apex_key {
3435 name: "myapex.key",
3436 public_key: "testkey.avbpubkey",
3437 private_key: "testkey.pem",
3438 }
3439
3440 cc_library {
3441 name: "mylib",
3442 srcs: ["mylib.cpp"],
3443 system_shared_libs: [],
3444 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003445 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003446 "myapex",
3447 "otherapex",
3448 ],
Jooyung Han24282772020-03-21 23:20:55 +09003449 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003450 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003451 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003452 cc_library {
3453 name: "mylib2",
3454 srcs: ["mylib.cpp"],
3455 system_shared_libs: [],
3456 stl: "none",
3457 apex_available: [
3458 "myapex",
3459 "otherapex",
3460 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003461 static_libs: ["mylib3"],
3462 recovery_available: true,
3463 min_sdk_version: "29",
3464 }
3465 cc_library {
3466 name: "mylib3",
3467 srcs: ["mylib.cpp"],
3468 system_shared_libs: [],
3469 stl: "none",
3470 apex_available: [
3471 "myapex",
3472 "otherapex",
3473 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003474 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003475 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003476 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003477 `)
3478
Jooyung Hanc87a0592020-03-02 17:44:33 +09003479 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003480 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003481 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003482
Vinh Tranf9754732023-01-19 22:41:46 -05003483 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003484 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003485 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003486
Vinh Tranf9754732023-01-19 22:41:46 -05003487 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003488 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003489 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003490
Colin Crossaede88c2020-08-11 12:17:01 -07003491 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3492 // each variant defines additional macros to distinguish which apex variant it is built for
3493
3494 // non-APEX variant does not have __ANDROID_APEX__ defined
3495 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3496 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3497
Vinh Tranf9754732023-01-19 22:41:46 -05003498 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003499 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3500 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003501
Jooyung Hanc87a0592020-03-02 17:44:33 +09003502 // non-APEX variant does not have __ANDROID_APEX__ defined
3503 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3504 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3505
Vinh Tranf9754732023-01-19 22:41:46 -05003506 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003507 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003508 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003509}
Jiyong Park7e636d02019-01-28 16:16:54 +09003510
3511func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003512 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003513 apex {
3514 name: "myapex",
3515 key: "myapex.key",
3516 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003517 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003518 }
3519
3520 apex_key {
3521 name: "myapex.key",
3522 public_key: "testkey.avbpubkey",
3523 private_key: "testkey.pem",
3524 }
3525
3526 cc_library_headers {
3527 name: "mylib_headers",
3528 export_include_dirs: ["my_include"],
3529 system_shared_libs: [],
3530 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003531 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003532 }
3533
3534 cc_library {
3535 name: "mylib",
3536 srcs: ["mylib.cpp"],
3537 system_shared_libs: [],
3538 stl: "none",
3539 header_libs: ["mylib_headers"],
3540 export_header_lib_headers: ["mylib_headers"],
3541 stubs: {
3542 versions: ["1", "2", "3"],
3543 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003544 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003545 }
3546
3547 cc_library {
3548 name: "otherlib",
3549 srcs: ["mylib.cpp"],
3550 system_shared_libs: [],
3551 stl: "none",
3552 shared_libs: ["mylib"],
3553 }
3554 `)
3555
Colin Cross7113d202019-11-20 16:39:12 -08003556 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003557
3558 // Ensure that the include path of the header lib is exported to 'otherlib'
3559 ensureContains(t, cFlags, "-Imy_include")
3560}
Alex Light9670d332019-01-29 18:07:33 -08003561
Jiyong Park7cd10e32020-01-14 09:22:18 +09003562type fileInApex struct {
3563 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003564 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003565 isLink bool
3566}
3567
Jooyung Han1724d582022-12-21 10:17:44 +09003568func (f fileInApex) String() string {
3569 return f.src + ":" + f.path
3570}
3571
3572func (f fileInApex) match(expectation string) bool {
3573 parts := strings.Split(expectation, ":")
3574 if len(parts) == 1 {
3575 match, _ := path.Match(parts[0], f.path)
3576 return match
3577 }
3578 if len(parts) == 2 {
3579 matchSrc, _ := path.Match(parts[0], f.src)
3580 matchDst, _ := path.Match(parts[1], f.path)
3581 return matchSrc && matchDst
3582 }
3583 panic("invalid expected file specification: " + expectation)
3584}
3585
Jooyung Hana57af4a2020-01-23 05:36:59 +00003586func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003587 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003588 module := ctx.ModuleForTests(moduleName, variant)
3589 apexRule := module.MaybeRule("apexRule")
3590 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003591 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003592 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003593 for _, cmd := range strings.Split(copyCmds, "&&") {
3594 cmd = strings.TrimSpace(cmd)
3595 if cmd == "" {
3596 continue
3597 }
3598 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003599 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003600 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003601 switch terms[0] {
3602 case "mkdir":
3603 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003604 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003605 t.Fatal("copyCmds contains invalid cp command", cmd)
3606 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003607 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003608 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 isLink = false
3610 case "ln":
3611 if len(terms) != 3 && len(terms) != 4 {
3612 // ln LINK TARGET or ln -s LINK TARGET
3613 t.Fatal("copyCmds contains invalid ln command", cmd)
3614 }
3615 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003616 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 isLink = true
3618 default:
3619 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3620 }
3621 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003622 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003623 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003624 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003625 }
Jooyung Han1724d582022-12-21 10:17:44 +09003626 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003627 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003628 }
3629 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003630 return ret
3631}
3632
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003633func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003634 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003635 var failed bool
3636 var surplus []string
3637 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003638 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003639 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003640 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003641 if file.match(expected) {
3642 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003643 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003644 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003645 }
3646 }
Jooyung Han1724d582022-12-21 10:17:44 +09003647 if !matchFound {
3648 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003649 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003650 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003651
Jooyung Han31c470b2019-10-18 16:26:59 +09003652 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003653 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 t.Log("surplus files", surplus)
3655 failed = true
3656 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003657
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003658 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003659 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003660 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003661 if !filesMatched[expected] {
3662 missing = append(missing, expected)
3663 }
3664 }
3665 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 t.Log("missing files", missing)
3667 failed = true
3668 }
3669 if failed {
3670 t.Fail()
3671 }
3672}
3673
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003674func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3675 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3676}
3677
3678func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003679 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003680 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3681 if deapexer.Output != nil {
3682 outputs = append(outputs, deapexer.Output.String())
3683 }
3684 for _, output := range deapexer.ImplicitOutputs {
3685 outputs = append(outputs, output.String())
3686 }
3687 actualFiles := make([]fileInApex, 0, len(outputs))
3688 for _, output := range outputs {
3689 dir := "/deapexer/"
3690 pos := strings.LastIndex(output, dir)
3691 if pos == -1 {
3692 t.Fatal("Unknown deapexer output ", output)
3693 }
3694 path := output[pos+len(dir):]
3695 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3696 }
3697 assertFileListEquals(t, files, actualFiles)
3698}
3699
Jooyung Han39edb6c2019-11-06 16:53:07 +09003700func vndkLibrariesTxtFiles(vers ...string) (result string) {
3701 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003702 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003703 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003704 prebuilt_etc {
3705 name: "` + txt + `.libraries.` + v + `.txt",
3706 src: "dummy.txt",
3707 }
3708 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003709 }
3710 }
3711 return
3712}
3713
Jooyung Han344d5432019-08-23 11:17:39 +09003714func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003715 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003716 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003717 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003718 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003719 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003720 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003721 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003722 }
3723
3724 apex_key {
3725 name: "myapex.key",
3726 public_key: "testkey.avbpubkey",
3727 private_key: "testkey.pem",
3728 }
3729
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 vndk_prebuilt_shared {
3731 name: "libvndk27",
3732 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003733 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003734 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003735 vndk: {
3736 enabled: true,
3737 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003738 target_arch: "arm64",
3739 arch: {
3740 arm: {
3741 srcs: ["libvndk27_arm.so"],
3742 },
3743 arm64: {
3744 srcs: ["libvndk27_arm64.so"],
3745 },
3746 },
Colin Cross2807f002021-03-02 10:15:29 -08003747 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003748 }
3749
3750 vndk_prebuilt_shared {
3751 name: "libvndk27",
3752 version: "27",
3753 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003754 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003755 vndk: {
3756 enabled: true,
3757 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003758 target_arch: "x86_64",
3759 arch: {
3760 x86: {
3761 srcs: ["libvndk27_x86.so"],
3762 },
3763 x86_64: {
3764 srcs: ["libvndk27_x86_64.so"],
3765 },
3766 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003767 }
3768 `+vndkLibrariesTxtFiles("27"),
3769 withFiles(map[string][]byte{
3770 "libvndk27_arm.so": nil,
3771 "libvndk27_arm64.so": nil,
3772 "libvndk27_x86.so": nil,
3773 "libvndk27_x86_64.so": nil,
3774 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003775
Jooyung Hana0503a52023-08-23 13:12:50 +09003776 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003777 "lib/libvndk27_arm.so",
3778 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003779 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003780 })
Jooyung Han344d5432019-08-23 11:17:39 +09003781}
3782
Jooyung Han90eee022019-10-01 20:02:42 +09003783func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003784 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003785 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003786 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003787 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003788 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003789 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003790 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003791 }
3792 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003793 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003794 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003795 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003796 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003797 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003798 }
3799 apex_key {
3800 name: "myapex.key",
3801 public_key: "testkey.avbpubkey",
3802 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003803 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003804
3805 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003806 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003807 apexManifestRule := module.Rule("apexManifestRule")
3808 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003809 }
3810
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003811 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003812 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003813}
3814
Jooyung Han344d5432019-08-23 11:17:39 +09003815func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003816 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003817 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003818 name: "com.android.vndk.v30",
3819 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003820 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003821 native_bridge_supported: true,
3822 }
3823
3824 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003825 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003826 public_key: "testkey.avbpubkey",
3827 private_key: "testkey.pem",
3828 }
3829
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003830 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003831 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003832 version: "30",
3833 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003834 srcs: ["mylib.cpp"],
3835 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003836 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003837 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003838 vndk: {
3839 enabled: true,
3840 },
Jooyung Han344d5432019-08-23 11:17:39 +09003841 }
3842 `)
3843}
3844
Jooyung Han31c470b2019-10-18 16:26:59 +09003845func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003846 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003848 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003850 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003852 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003853 }
3854
3855 apex_key {
3856 name: "myapex.key",
3857 public_key: "testkey.avbpubkey",
3858 private_key: "testkey.pem",
3859 }
3860
3861 vndk_prebuilt_shared {
3862 name: "libvndk27",
3863 version: "27",
3864 target_arch: "arm",
3865 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003866 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003867 vndk: {
3868 enabled: true,
3869 },
3870 arch: {
3871 arm: {
3872 srcs: ["libvndk27.so"],
3873 }
3874 },
3875 }
3876
3877 vndk_prebuilt_shared {
3878 name: "libvndk27",
3879 version: "27",
3880 target_arch: "arm",
3881 binder32bit: true,
3882 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003883 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003884 vndk: {
3885 enabled: true,
3886 },
3887 arch: {
3888 arm: {
3889 srcs: ["libvndk27binder32.so"],
3890 }
3891 },
Colin Cross2807f002021-03-02 10:15:29 -08003892 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003893 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003894 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003895 withFiles(map[string][]byte{
3896 "libvndk27.so": nil,
3897 "libvndk27binder32.so": nil,
3898 }),
3899 withBinder32bit,
3900 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003901 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003902 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3903 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 },
3905 }),
3906 )
3907
Jooyung Hana0503a52023-08-23 13:12:50 +09003908 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003909 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003911 })
3912}
3913
Jooyung Hane1633032019-08-01 17:41:43 +09003914func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003915 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003916 apex {
3917 name: "myapex_nodep",
3918 key: "myapex.key",
3919 native_shared_libs: ["lib_nodep"],
3920 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003921 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003922 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003923 }
3924
3925 apex {
3926 name: "myapex_dep",
3927 key: "myapex.key",
3928 native_shared_libs: ["lib_dep"],
3929 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003930 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003931 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003932 }
3933
3934 apex {
3935 name: "myapex_provider",
3936 key: "myapex.key",
3937 native_shared_libs: ["libfoo"],
3938 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003939 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003940 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003941 }
3942
3943 apex {
3944 name: "myapex_selfcontained",
3945 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00003946 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09003947 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003950 }
3951
3952 apex_key {
3953 name: "myapex.key",
3954 public_key: "testkey.avbpubkey",
3955 private_key: "testkey.pem",
3956 }
3957
3958 cc_library {
3959 name: "lib_nodep",
3960 srcs: ["mylib.cpp"],
3961 system_shared_libs: [],
3962 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003963 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003964 }
3965
3966 cc_library {
3967 name: "lib_dep",
3968 srcs: ["mylib.cpp"],
3969 shared_libs: ["libfoo"],
3970 system_shared_libs: [],
3971 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003972 apex_available: [
3973 "myapex_dep",
3974 "myapex_provider",
3975 "myapex_selfcontained",
3976 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003977 }
3978
3979 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00003980 name: "lib_dep_on_bar",
3981 srcs: ["mylib.cpp"],
3982 shared_libs: ["libbar"],
3983 system_shared_libs: [],
3984 stl: "none",
3985 apex_available: [
3986 "myapex_selfcontained",
3987 ],
3988 }
3989
3990
3991 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09003992 name: "libfoo",
3993 srcs: ["mytest.cpp"],
3994 stubs: {
3995 versions: ["1"],
3996 },
3997 system_shared_libs: [],
3998 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003999 apex_available: [
4000 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004001 ],
4002 }
4003
4004 cc_library {
4005 name: "libbar",
4006 srcs: ["mytest.cpp"],
4007 stubs: {
4008 versions: ["1"],
4009 },
4010 system_shared_libs: [],
4011 stl: "none",
4012 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004013 "myapex_selfcontained",
4014 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004015 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004016
Jooyung Hane1633032019-08-01 17:41:43 +09004017 `)
4018
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004019 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004020 var provideNativeLibs, requireNativeLibs []string
4021
Jooyung Hana0503a52023-08-23 13:12:50 +09004022 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004023 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4024 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004025 ensureListEmpty(t, provideNativeLibs)
4026 ensureListEmpty(t, requireNativeLibs)
4027
Jooyung Hana0503a52023-08-23 13:12:50 +09004028 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004029 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4030 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004031 ensureListEmpty(t, provideNativeLibs)
4032 ensureListContains(t, requireNativeLibs, "libfoo.so")
4033
Jooyung Hana0503a52023-08-23 13:12:50 +09004034 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004035 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4036 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004037 ensureListContains(t, provideNativeLibs, "libfoo.so")
4038 ensureListEmpty(t, requireNativeLibs)
4039
Jooyung Hana0503a52023-08-23 13:12:50 +09004040 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004041 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4042 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004043 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004044 ensureListEmpty(t, requireNativeLibs)
4045}
4046
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004047func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4048 ctx := testApex(t, `
4049 apex {
4050 name: "myapex",
4051 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004052 native_shared_libs: ["mylib"],
4053 updatable: false,
4054 }
4055
4056 apex_key {
4057 name: "myapex.key",
4058 public_key: "testkey.avbpubkey",
4059 private_key: "testkey.pem",
4060 }
4061
4062 cc_library {
4063 name: "mylib",
4064 srcs: ["mylib.cpp"],
4065 system_shared_libs: [],
4066 stl: "none",
4067 apex_available: [
4068 "//apex_available:platform",
4069 "myapex",
4070 ],
4071 }
4072 `, android.FixtureMergeEnv(map[string]string{
4073 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4074 }))
4075
Jooyung Hana0503a52023-08-23 13:12:50 +09004076 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004077 apexManifestRule := module.Rule("apexManifestRule")
4078 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4079}
4080
Vinh Tran8f5310f2022-10-07 18:16:47 -04004081func TestCompileMultilibProp(t *testing.T) {
4082 testCases := []struct {
4083 compileMultiLibProp string
4084 containedLibs []string
4085 notContainedLibs []string
4086 }{
4087 {
4088 containedLibs: []string{
4089 "image.apex/lib64/mylib.so",
4090 "image.apex/lib/mylib.so",
4091 },
4092 compileMultiLibProp: `compile_multilib: "both",`,
4093 },
4094 {
4095 containedLibs: []string{"image.apex/lib64/mylib.so"},
4096 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4097 compileMultiLibProp: `compile_multilib: "first",`,
4098 },
4099 {
4100 containedLibs: []string{"image.apex/lib64/mylib.so"},
4101 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4102 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4103 },
4104 {
4105 containedLibs: []string{"image.apex/lib64/mylib.so"},
4106 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4107 compileMultiLibProp: `compile_multilib: "64",`,
4108 },
4109 {
4110 containedLibs: []string{"image.apex/lib/mylib.so"},
4111 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4112 compileMultiLibProp: `compile_multilib: "32",`,
4113 },
4114 }
4115 for _, testCase := range testCases {
4116 ctx := testApex(t, fmt.Sprintf(`
4117 apex {
4118 name: "myapex",
4119 key: "myapex.key",
4120 %s
4121 native_shared_libs: ["mylib"],
4122 updatable: false,
4123 }
4124 apex_key {
4125 name: "myapex.key",
4126 public_key: "testkey.avbpubkey",
4127 private_key: "testkey.pem",
4128 }
4129 cc_library {
4130 name: "mylib",
4131 srcs: ["mylib.cpp"],
4132 apex_available: [
4133 "//apex_available:platform",
4134 "myapex",
4135 ],
4136 }
4137 `, testCase.compileMultiLibProp),
4138 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004139 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004140 apexRule := module.Rule("apexRule")
4141 copyCmds := apexRule.Args["copy_commands"]
4142 for _, containedLib := range testCase.containedLibs {
4143 ensureContains(t, copyCmds, containedLib)
4144 }
4145 for _, notContainedLib := range testCase.notContainedLibs {
4146 ensureNotContains(t, copyCmds, notContainedLib)
4147 }
4148 }
4149}
4150
Alex Light0851b882019-02-07 13:20:53 -08004151func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004152 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004153 apex {
4154 name: "myapex",
4155 key: "myapex.key",
4156 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004157 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004158 }
4159
4160 apex_key {
4161 name: "myapex.key",
4162 public_key: "testkey.avbpubkey",
4163 private_key: "testkey.pem",
4164 }
4165
4166 cc_library {
4167 name: "mylib_common",
4168 srcs: ["mylib.cpp"],
4169 system_shared_libs: [],
4170 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004171 apex_available: [
4172 "//apex_available:platform",
4173 "myapex",
4174 ],
Alex Light0851b882019-02-07 13:20:53 -08004175 }
4176 `)
4177
Jooyung Hana0503a52023-08-23 13:12:50 +09004178 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004179 apexRule := module.Rule("apexRule")
4180 copyCmds := apexRule.Args["copy_commands"]
4181
4182 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4183 t.Log("Apex was a test apex!")
4184 t.Fail()
4185 }
4186 // Ensure that main rule creates an output
4187 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4188
4189 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004190 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004191
4192 // Ensure that both direct and indirect deps are copied into apex
4193 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4194
Colin Cross7113d202019-11-20 16:39:12 -08004195 // Ensure that the platform variant ends with _shared
4196 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004197
Colin Cross56a83212020-09-15 18:30:11 -07004198 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004199 t.Log("Found mylib_common not in any apex!")
4200 t.Fail()
4201 }
4202}
4203
4204func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004205 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004206 apex_test {
4207 name: "myapex",
4208 key: "myapex.key",
4209 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004210 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004211 }
4212
4213 apex_key {
4214 name: "myapex.key",
4215 public_key: "testkey.avbpubkey",
4216 private_key: "testkey.pem",
4217 }
4218
4219 cc_library {
4220 name: "mylib_common_test",
4221 srcs: ["mylib.cpp"],
4222 system_shared_libs: [],
4223 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004224 // TODO: remove //apex_available:platform
4225 apex_available: [
4226 "//apex_available:platform",
4227 "myapex",
4228 ],
Alex Light0851b882019-02-07 13:20:53 -08004229 }
4230 `)
4231
Jooyung Hana0503a52023-08-23 13:12:50 +09004232 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004233 apexRule := module.Rule("apexRule")
4234 copyCmds := apexRule.Args["copy_commands"]
4235
4236 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4237 t.Log("Apex was not a test apex!")
4238 t.Fail()
4239 }
4240 // Ensure that main rule creates an output
4241 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4242
4243 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004244 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004245
4246 // Ensure that both direct and indirect deps are copied into apex
4247 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4248
Colin Cross7113d202019-11-20 16:39:12 -08004249 // Ensure that the platform variant ends with _shared
4250 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004251}
4252
Jooyung Han85707de2023-12-01 14:21:13 +09004253func TestLibzVendorIsntStable(t *testing.T) {
4254 ctx := testApex(t, `
4255 apex {
4256 name: "myapex",
4257 key: "myapex.key",
4258 updatable: false,
4259 binaries: ["mybin"],
4260 }
4261 apex {
4262 name: "myvendorapex",
4263 key: "myapex.key",
4264 file_contexts: "myvendorapex_file_contexts",
4265 vendor: true,
4266 updatable: false,
4267 binaries: ["mybin"],
4268 }
4269 apex_key {
4270 name: "myapex.key",
4271 public_key: "testkey.avbpubkey",
4272 private_key: "testkey.pem",
4273 }
4274 cc_binary {
4275 name: "mybin",
4276 vendor_available: true,
4277 system_shared_libs: [],
4278 stl: "none",
4279 shared_libs: ["libz"],
4280 apex_available: ["//apex_available:anyapex"],
4281 }
4282 cc_library {
4283 name: "libz",
4284 vendor_available: true,
4285 system_shared_libs: [],
4286 stl: "none",
4287 stubs: {
4288 versions: ["28", "30"],
4289 },
4290 target: {
4291 vendor: {
4292 no_stubs: true,
4293 },
4294 },
4295 }
4296 `, withFiles(map[string][]byte{
4297 "myvendorapex_file_contexts": nil,
4298 }))
4299
4300 // libz provides stubs for core variant.
4301 {
4302 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4303 "bin/mybin",
4304 })
4305 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4306 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4307 }
4308 // libz doesn't provide stubs for vendor variant.
4309 {
4310 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4311 "bin/mybin",
4312 "lib64/libz.so",
4313 })
4314 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4315 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4316 }
4317}
4318
Alex Light9670d332019-01-29 18:07:33 -08004319func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004320 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004321 apex {
4322 name: "myapex",
4323 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004324 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004325 multilib: {
4326 first: {
4327 native_shared_libs: ["mylib_common"],
4328 }
4329 },
4330 target: {
4331 android: {
4332 multilib: {
4333 first: {
4334 native_shared_libs: ["mylib"],
4335 }
4336 }
4337 },
4338 host: {
4339 multilib: {
4340 first: {
4341 native_shared_libs: ["mylib2"],
4342 }
4343 }
4344 }
4345 }
4346 }
4347
4348 apex_key {
4349 name: "myapex.key",
4350 public_key: "testkey.avbpubkey",
4351 private_key: "testkey.pem",
4352 }
4353
4354 cc_library {
4355 name: "mylib",
4356 srcs: ["mylib.cpp"],
4357 system_shared_libs: [],
4358 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004359 // TODO: remove //apex_available:platform
4360 apex_available: [
4361 "//apex_available:platform",
4362 "myapex",
4363 ],
Alex Light9670d332019-01-29 18:07:33 -08004364 }
4365
4366 cc_library {
4367 name: "mylib_common",
4368 srcs: ["mylib.cpp"],
4369 system_shared_libs: [],
4370 stl: "none",
4371 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004372 // TODO: remove //apex_available:platform
4373 apex_available: [
4374 "//apex_available:platform",
4375 "myapex",
4376 ],
Alex Light9670d332019-01-29 18:07:33 -08004377 }
4378
4379 cc_library {
4380 name: "mylib2",
4381 srcs: ["mylib.cpp"],
4382 system_shared_libs: [],
4383 stl: "none",
4384 compile_multilib: "first",
4385 }
4386 `)
4387
Jooyung Hana0503a52023-08-23 13:12:50 +09004388 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004389 copyCmds := apexRule.Args["copy_commands"]
4390
4391 // Ensure that main rule creates an output
4392 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4393
4394 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004395 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4396 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4397 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004398
4399 // Ensure that both direct and indirect deps are copied into apex
4400 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4401 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4402 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4403
Colin Cross7113d202019-11-20 16:39:12 -08004404 // Ensure that the platform variant ends with _shared
4405 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4406 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4407 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004408}
Jiyong Park04480cf2019-02-06 00:16:29 +09004409
Jiyong Park59140302020-12-14 18:44:04 +09004410func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004411 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004412 apex {
4413 name: "myapex",
4414 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004415 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004416 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004417 arch: {
4418 arm64: {
4419 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004420 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004421 },
4422 x86_64: {
4423 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004424 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004425 },
4426 }
4427 }
4428
4429 apex_key {
4430 name: "myapex.key",
4431 public_key: "testkey.avbpubkey",
4432 private_key: "testkey.pem",
4433 }
4434
4435 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004436 name: "mylib.generic",
4437 srcs: ["mylib.cpp"],
4438 system_shared_libs: [],
4439 stl: "none",
4440 // TODO: remove //apex_available:platform
4441 apex_available: [
4442 "//apex_available:platform",
4443 "myapex",
4444 ],
4445 }
4446
4447 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004448 name: "mylib.arm64",
4449 srcs: ["mylib.cpp"],
4450 system_shared_libs: [],
4451 stl: "none",
4452 // TODO: remove //apex_available:platform
4453 apex_available: [
4454 "//apex_available:platform",
4455 "myapex",
4456 ],
4457 }
4458
4459 cc_library {
4460 name: "mylib.x64",
4461 srcs: ["mylib.cpp"],
4462 system_shared_libs: [],
4463 stl: "none",
4464 // TODO: remove //apex_available:platform
4465 apex_available: [
4466 "//apex_available:platform",
4467 "myapex",
4468 ],
4469 }
4470 `)
4471
Jooyung Hana0503a52023-08-23 13:12:50 +09004472 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004473 copyCmds := apexRule.Args["copy_commands"]
4474
4475 // Ensure that apex variant is created for the direct dep
4476 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004477 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004478 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4479
4480 // Ensure that both direct and indirect deps are copied into apex
4481 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4482 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4483}
4484
Jiyong Park04480cf2019-02-06 00:16:29 +09004485func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004486 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004487 apex {
4488 name: "myapex",
4489 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004490 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004491 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004492 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004493 }
4494
4495 apex_key {
4496 name: "myapex.key",
4497 public_key: "testkey.avbpubkey",
4498 private_key: "testkey.pem",
4499 }
4500
4501 sh_binary {
4502 name: "myscript",
4503 src: "mylib.cpp",
4504 filename: "myscript.sh",
4505 sub_dir: "script",
4506 }
4507 `)
4508
Jooyung Hana0503a52023-08-23 13:12:50 +09004509 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004510 copyCmds := apexRule.Args["copy_commands"]
4511
4512 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4513}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004514
Jooyung Han91df2082019-11-20 01:49:42 +09004515func TestApexInVariousPartition(t *testing.T) {
4516 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004517 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004518 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004519 {"", "system"},
4520 {"product_specific: true", "product"},
4521 {"soc_specific: true", "vendor"},
4522 {"proprietary: true", "vendor"},
4523 {"vendor: true", "vendor"},
4524 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004525 }
4526 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004527 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004528 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004529 apex {
4530 name: "myapex",
4531 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004532 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004533 `+tc.propName+`
4534 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004535
Jooyung Han91df2082019-11-20 01:49:42 +09004536 apex_key {
4537 name: "myapex.key",
4538 public_key: "testkey.avbpubkey",
4539 private_key: "testkey.pem",
4540 }
4541 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004542
Jooyung Hana0503a52023-08-23 13:12:50 +09004543 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004544 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004545 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004546 if actual != expected {
4547 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4548 }
Jooyung Han91df2082019-11-20 01:49:42 +09004549 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004550 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004551}
Jiyong Park67882562019-03-21 01:11:21 +09004552
Jooyung Han580eb4f2020-06-24 19:33:06 +09004553func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004554 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004555 apex {
4556 name: "myapex",
4557 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004558 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004559 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004560
Jooyung Han580eb4f2020-06-24 19:33:06 +09004561 apex_key {
4562 name: "myapex.key",
4563 public_key: "testkey.avbpubkey",
4564 private_key: "testkey.pem",
4565 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004566 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004567 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004568 rule := module.Output("file_contexts")
4569 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4570}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004571
Jooyung Han580eb4f2020-06-24 19:33:06 +09004572func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004573 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004574 apex {
4575 name: "myapex",
4576 key: "myapex.key",
4577 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004578 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004579 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004580
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581 apex_key {
4582 name: "myapex.key",
4583 public_key: "testkey.avbpubkey",
4584 private_key: "testkey.pem",
4585 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004586 `, withFiles(map[string][]byte{
4587 "my_own_file_contexts": nil,
4588 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004589}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004590
Jooyung Han580eb4f2020-06-24 19:33:06 +09004591func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004592 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004593 apex {
4594 name: "myapex",
4595 key: "myapex.key",
4596 product_specific: true,
4597 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004598 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004599 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004600
Jooyung Han580eb4f2020-06-24 19:33:06 +09004601 apex_key {
4602 name: "myapex.key",
4603 public_key: "testkey.avbpubkey",
4604 private_key: "testkey.pem",
4605 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004606 `)
4607
Colin Cross1c460562021-02-16 17:55:47 -08004608 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004609 apex {
4610 name: "myapex",
4611 key: "myapex.key",
4612 product_specific: true,
4613 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004614 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004615 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004616
Jooyung Han580eb4f2020-06-24 19:33:06 +09004617 apex_key {
4618 name: "myapex.key",
4619 public_key: "testkey.avbpubkey",
4620 private_key: "testkey.pem",
4621 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004622 `, withFiles(map[string][]byte{
4623 "product_specific_file_contexts": nil,
4624 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004625 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 rule := module.Output("file_contexts")
4627 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4628}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004629
Jooyung Han580eb4f2020-06-24 19:33:06 +09004630func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004631 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004632 apex {
4633 name: "myapex",
4634 key: "myapex.key",
4635 product_specific: true,
4636 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004637 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004638 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004639
Jooyung Han580eb4f2020-06-24 19:33:06 +09004640 apex_key {
4641 name: "myapex.key",
4642 public_key: "testkey.avbpubkey",
4643 private_key: "testkey.pem",
4644 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004645
Jooyung Han580eb4f2020-06-24 19:33:06 +09004646 filegroup {
4647 name: "my-file-contexts",
4648 srcs: ["product_specific_file_contexts"],
4649 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004650 `, withFiles(map[string][]byte{
4651 "product_specific_file_contexts": nil,
4652 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004653 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004654 rule := module.Output("file_contexts")
4655 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004656}
4657
Jiyong Park67882562019-03-21 01:11:21 +09004658func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004659 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004660 apex_key {
4661 name: "myapex.key",
4662 public_key: ":my.avbpubkey",
4663 private_key: ":my.pem",
4664 product_specific: true,
4665 }
4666
4667 filegroup {
4668 name: "my.avbpubkey",
4669 srcs: ["testkey2.avbpubkey"],
4670 }
4671
4672 filegroup {
4673 name: "my.pem",
4674 srcs: ["testkey2.pem"],
4675 }
4676 `)
4677
4678 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4679 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004680 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004681 if actual_pubkey != expected_pubkey {
4682 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4683 }
4684 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004685 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004686 if actual_privkey != expected_privkey {
4687 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4688 }
4689}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004690
4691func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004692 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004693 prebuilt_apex {
4694 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004695 arch: {
4696 arm64: {
4697 src: "myapex-arm64.apex",
4698 },
4699 arm: {
4700 src: "myapex-arm.apex",
4701 },
4702 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004703 }
4704 `)
4705
Wei Li340ee8e2022-03-18 17:33:24 -07004706 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4707 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004708
Jiyong Parkc95714e2019-03-29 14:23:10 +09004709 expectedInput := "myapex-arm64.apex"
4710 if prebuilt.inputApex.String() != expectedInput {
4711 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4712 }
Wei Li340ee8e2022-03-18 17:33:24 -07004713 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4714 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4715 rule := testingModule.Rule("genProvenanceMetaData")
4716 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4717 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4718 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4719 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004720
4721 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4722 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004723}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004724
Paul Duffinc0609c62021-03-01 17:27:16 +00004725func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004726 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004727 prebuilt_apex {
4728 name: "myapex",
4729 }
4730 `)
4731}
4732
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004733func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004734 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004735 prebuilt_apex {
4736 name: "myapex",
4737 src: "myapex-arm.apex",
4738 filename: "notmyapex.apex",
4739 }
4740 `)
4741
Wei Li340ee8e2022-03-18 17:33:24 -07004742 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4743 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004744
4745 expected := "notmyapex.apex"
4746 if p.installFilename != expected {
4747 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4748 }
Wei Li340ee8e2022-03-18 17:33:24 -07004749 rule := testingModule.Rule("genProvenanceMetaData")
4750 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4751 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4752 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4753 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004754}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004755
Samiul Islam7c02e262021-09-08 17:48:28 +01004756func TestApexSetFilenameOverride(t *testing.T) {
4757 testApex(t, `
4758 apex_set {
4759 name: "com.company.android.myapex",
4760 apex_name: "com.android.myapex",
4761 set: "company-myapex.apks",
4762 filename: "com.company.android.myapex.apex"
4763 }
4764 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4765
4766 testApex(t, `
4767 apex_set {
4768 name: "com.company.android.myapex",
4769 apex_name: "com.android.myapex",
4770 set: "company-myapex.apks",
4771 filename: "com.company.android.myapex.capex"
4772 }
4773 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4774
4775 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4776 apex_set {
4777 name: "com.company.android.myapex",
4778 apex_name: "com.android.myapex",
4779 set: "company-myapex.apks",
4780 filename: "some-random-suffix"
4781 }
4782 `)
4783}
4784
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004785func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004786 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004787 prebuilt_apex {
4788 name: "myapex.prebuilt",
4789 src: "myapex-arm.apex",
4790 overrides: [
4791 "myapex",
4792 ],
4793 }
4794 `)
4795
Wei Li340ee8e2022-03-18 17:33:24 -07004796 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4797 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004798
4799 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004800 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004801 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004802 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004803 }
Wei Li340ee8e2022-03-18 17:33:24 -07004804 rule := testingModule.Rule("genProvenanceMetaData")
4805 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4806 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4807 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4808 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004809}
4810
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004811func TestPrebuiltApexName(t *testing.T) {
4812 testApex(t, `
4813 prebuilt_apex {
4814 name: "com.company.android.myapex",
4815 apex_name: "com.android.myapex",
4816 src: "company-myapex-arm.apex",
4817 }
4818 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4819
4820 testApex(t, `
4821 apex_set {
4822 name: "com.company.android.myapex",
4823 apex_name: "com.android.myapex",
4824 set: "company-myapex.apks",
4825 }
4826 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4827}
4828
4829func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4830 _ = android.GroupFixturePreparers(
4831 java.PrepareForTestWithJavaDefaultModules,
4832 PrepareForTestWithApexBuildComponents,
4833 android.FixtureWithRootAndroidBp(`
4834 platform_bootclasspath {
4835 name: "platform-bootclasspath",
4836 fragments: [
4837 {
4838 apex: "com.android.art",
4839 module: "art-bootclasspath-fragment",
4840 },
4841 ],
4842 }
4843
4844 prebuilt_apex {
4845 name: "com.company.android.art",
4846 apex_name: "com.android.art",
4847 src: "com.company.android.art-arm.apex",
4848 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4849 }
4850
4851 prebuilt_bootclasspath_fragment {
4852 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004853 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004854 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004855 hidden_api: {
4856 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4857 metadata: "my-bootclasspath-fragment/metadata.csv",
4858 index: "my-bootclasspath-fragment/index.csv",
4859 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4860 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4861 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004862 }
4863
4864 java_import {
4865 name: "core-oj",
4866 jars: ["prebuilt.jar"],
4867 }
4868 `),
4869 ).RunTest(t)
4870}
4871
Spandan Das59a4a2b2024-01-09 21:35:56 +00004872// A minimal context object for use with DexJarBuildPath
4873type moduleErrorfTestCtx struct {
4874}
4875
4876func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4877}
4878
Paul Duffin092153d2021-01-26 11:42:39 +00004879// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4880// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004881func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004882 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004883
Paul Duffin89886cb2021-02-05 16:44:03 +00004884 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004885 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004886 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004887 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00004888 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004889 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004890 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00004891 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09004892 android.NormalizePathForTesting(dexJarBuildPath))
4893 }
4894
4895 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004896 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004897 // Make sure the import has been given the correct path to the dex jar.
4898 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4899 dexJarBuildPath := p.DexJarInstallPath()
4900 stem := android.RemoveOptionalPrebuiltPrefix(name)
4901 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4902 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4903 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004904 }
4905
Paul Duffin39853512021-02-26 11:09:39 +00004906 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004907 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004908 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004909 android.AssertArrayString(t, "Check if there is no source variant",
4910 []string{"android_common"},
4911 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004912 }
4913
4914 t.Run("prebuilt only", func(t *testing.T) {
4915 bp := `
4916 prebuilt_apex {
4917 name: "myapex",
4918 arch: {
4919 arm64: {
4920 src: "myapex-arm64.apex",
4921 },
4922 arm: {
4923 src: "myapex-arm.apex",
4924 },
4925 },
Paul Duffin39853512021-02-26 11:09:39 +00004926 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004927 }
4928
4929 java_import {
4930 name: "libfoo",
4931 jars: ["libfoo.jar"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00004932 sdk_version: "core_current",
Paul Duffin064b70c2020-11-02 17:32:38 +00004933 }
Paul Duffin39853512021-02-26 11:09:39 +00004934
4935 java_sdk_library_import {
4936 name: "libbar",
4937 public: {
4938 jars: ["libbar.jar"],
4939 },
4940 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004941 `
4942
4943 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4944 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4945
Spandan Das3576e762024-01-03 18:57:03 +00004946 deapexerName := deapexerModuleName("prebuilt_myapex")
4947 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01004948
Paul Duffinf6932af2021-02-26 18:21:56 +00004949 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004950 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004951 rule := deapexer.Rule("deapexer")
4952 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4953 t.Errorf("expected: %q, found: %q", expected, actual)
4954 }
4955
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004956 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004957 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004958 rule = prebuiltApex.Rule("android/soong/android.Cp")
4959 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4960 t.Errorf("expected: %q, found: %q", expected, actual)
4961 }
4962
Paul Duffin89886cb2021-02-05 16:44:03 +00004963 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004964 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004965
4966 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004967 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004968 })
4969
4970 t.Run("prebuilt with source preferred", func(t *testing.T) {
4971
4972 bp := `
Jihoon Kang85bc1932024-07-01 17:04:46 +00004973 apex {
4974 name: "myapex",
4975 key: "myapex.key",
4976 updatable: false,
4977 java_libs: [
4978 "libfoo",
4979 "libbar",
4980 ],
4981 }
4982
4983 apex_key {
4984 name: "myapex.key",
4985 public_key: "testkey.avbpubkey",
4986 private_key: "testkey.pem",
4987 }
4988
Paul Duffin064b70c2020-11-02 17:32:38 +00004989 prebuilt_apex {
4990 name: "myapex",
4991 arch: {
4992 arm64: {
4993 src: "myapex-arm64.apex",
4994 },
4995 arm: {
4996 src: "myapex-arm.apex",
4997 },
4998 },
Paul Duffin39853512021-02-26 11:09:39 +00004999 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005000 }
5001
5002 java_import {
5003 name: "libfoo",
5004 jars: ["libfoo.jar"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005005 apex_available: [
5006 "myapex",
5007 ],
5008 compile_dex: true,
5009 sdk_version: "core_current",
Paul Duffin064b70c2020-11-02 17:32:38 +00005010 }
5011
5012 java_library {
5013 name: "libfoo",
Jihoon Kang85bc1932024-07-01 17:04:46 +00005014 srcs: ["foo/bar/MyClass.java"],
5015 apex_available: [
5016 "myapex",
5017 ],
5018 compile_dex: true,
5019 sdk_version: "core_current",
Paul Duffin064b70c2020-11-02 17:32:38 +00005020 }
Paul Duffin39853512021-02-26 11:09:39 +00005021
5022 java_sdk_library_import {
5023 name: "libbar",
5024 public: {
5025 jars: ["libbar.jar"],
5026 },
Jihoon Kang85bc1932024-07-01 17:04:46 +00005027 apex_available: [
5028 "myapex",
5029 ],
5030 compile_dex: true,
Paul Duffin39853512021-02-26 11:09:39 +00005031 }
5032
5033 java_sdk_library {
5034 name: "libbar",
5035 srcs: ["foo/bar/MyClass.java"],
5036 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005037 apex_available: [
5038 "myapex",
5039 ],
5040 compile_dex: true,
5041 sdk_version: "core_current",
Paul Duffin39853512021-02-26 11:09:39 +00005042 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005043 `
5044
5045 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5046 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5047
Paul Duffin89886cb2021-02-05 16:44:03 +00005048 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005049 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005050
5051 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005052 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005053 })
5054
5055 t.Run("prebuilt preferred with source", func(t *testing.T) {
5056 bp := `
5057 prebuilt_apex {
5058 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005059 arch: {
5060 arm64: {
5061 src: "myapex-arm64.apex",
5062 },
5063 arm: {
5064 src: "myapex-arm.apex",
5065 },
5066 },
Paul Duffin39853512021-02-26 11:09:39 +00005067 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005068 }
5069
5070 java_import {
5071 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005072 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005073 jars: ["libfoo.jar"],
5074 }
5075
5076 java_library {
5077 name: "libfoo",
Jihoon Kang85bc1932024-07-01 17:04:46 +00005078 sdk_version: "core_current",
Paul Duffin064b70c2020-11-02 17:32:38 +00005079 }
Paul Duffin39853512021-02-26 11:09:39 +00005080
5081 java_sdk_library_import {
5082 name: "libbar",
5083 prefer: true,
5084 public: {
5085 jars: ["libbar.jar"],
5086 },
5087 }
5088
5089 java_sdk_library {
5090 name: "libbar",
5091 srcs: ["foo/bar/MyClass.java"],
5092 unsafe_ignore_missing_latest_api: true,
5093 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005094 `
5095
5096 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5097 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5098
Paul Duffin89886cb2021-02-05 16:44:03 +00005099 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005100 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005101 ensureNoSourceVariant(t, ctx, "libfoo")
5102
5103 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005104 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005105 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005106 })
5107}
5108
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005109func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005110 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005111 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005112 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5113 // is disabled.
5114 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005115
5116 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5117 // file creation.
5118 java.FixtureConfigureBootJars("platform:foo"),
5119 android.FixtureModifyMockFS(func(fs android.MockFS) {
5120 fs["platform/Android.bp"] = []byte(`
5121 java_library {
5122 name: "foo",
5123 srcs: ["Test.java"],
5124 compile_dex: true,
5125 }
5126 `)
5127 fs["platform/Test.java"] = nil
5128 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005129 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005130
Paul Duffin37856732021-02-26 14:24:15 +00005131 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5132 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005133 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005134 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005135 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005136 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005137 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005138 foundLibfooJar = true
5139 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005140 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005141 }
5142 }
5143 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005144 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005145 }
5146 }
5147
Paul Duffin40a3f652021-07-19 13:11:24 +01005148 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005149 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005150 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005151 var rule android.TestingBuildParams
5152
5153 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5154 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005155 }
5156
Paul Duffin40a3f652021-07-19 13:11:24 +01005157 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5158 t.Helper()
5159 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5160 var rule android.TestingBuildParams
5161
5162 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5163 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5164 }
5165
Paul Duffin89f570a2021-06-16 01:42:33 +01005166 fragment := java.ApexVariantReference{
5167 Apex: proptools.StringPtr("myapex"),
5168 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5169 }
5170
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005171 t.Run("prebuilt only", func(t *testing.T) {
5172 bp := `
5173 prebuilt_apex {
5174 name: "myapex",
5175 arch: {
5176 arm64: {
5177 src: "myapex-arm64.apex",
5178 },
5179 arm: {
5180 src: "myapex-arm.apex",
5181 },
5182 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005183 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5184 }
5185
5186 prebuilt_bootclasspath_fragment {
5187 name: "my-bootclasspath-fragment",
5188 contents: ["libfoo", "libbar"],
5189 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005190 hidden_api: {
5191 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5192 metadata: "my-bootclasspath-fragment/metadata.csv",
5193 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005194 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5195 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5196 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005197 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005198 }
5199
5200 java_import {
5201 name: "libfoo",
5202 jars: ["libfoo.jar"],
5203 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005204 permitted_packages: ["foo"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005205 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005206 }
Paul Duffin37856732021-02-26 14:24:15 +00005207
5208 java_sdk_library_import {
5209 name: "libbar",
5210 public: {
5211 jars: ["libbar.jar"],
5212 },
5213 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005214 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005215 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005216 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005217 `
5218
Paul Duffin89f570a2021-06-16 01:42:33 +01005219 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005220 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5221 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005222
Paul Duffin537ea3d2021-05-14 10:38:00 +01005223 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005224 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005225 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005226 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005227 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005228 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 +01005229 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005230 })
5231
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005232 t.Run("apex_set only", func(t *testing.T) {
5233 bp := `
5234 apex_set {
5235 name: "myapex",
5236 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005237 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005238 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005239 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5240 }
5241
5242 java_import {
5243 name: "myjavalib",
5244 jars: ["myjavalib.jar"],
5245 apex_available: ["myapex"],
5246 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005247 }
5248
5249 prebuilt_bootclasspath_fragment {
5250 name: "my-bootclasspath-fragment",
5251 contents: ["libfoo", "libbar"],
5252 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005253 hidden_api: {
5254 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5255 metadata: "my-bootclasspath-fragment/metadata.csv",
5256 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005257 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5258 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5259 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005260 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005261 }
5262
Liz Kammer2dc72442023-04-20 10:10:48 -04005263 prebuilt_systemserverclasspath_fragment {
5264 name: "my-systemserverclasspath-fragment",
5265 contents: ["libbaz"],
5266 apex_available: ["myapex"],
5267 }
5268
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005269 java_import {
5270 name: "libfoo",
5271 jars: ["libfoo.jar"],
5272 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005273 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005274 }
5275
5276 java_sdk_library_import {
5277 name: "libbar",
5278 public: {
5279 jars: ["libbar.jar"],
5280 },
5281 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005282 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005283 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005284 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005285
5286 java_sdk_library_import {
5287 name: "libbaz",
5288 public: {
5289 jars: ["libbaz.jar"],
5290 },
5291 apex_available: ["myapex"],
5292 shared_library: false,
5293 permitted_packages: ["baz"],
5294 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005295 `
5296
Paul Duffin89f570a2021-06-16 01:42:33 +01005297 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005298 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5299 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005300
Paul Duffin537ea3d2021-05-14 10:38:00 +01005301 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005302 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005303 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005304 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005305 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005306 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 +01005307 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005308
5309 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5310
5311 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005312 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005313 "myjavalib.myapex",
5314 "libfoo.myapex",
5315 "libbar.myapex",
5316 "libbaz.myapex",
5317 }
5318 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5319 for i, e := range mkEntries {
5320 g := e.OverrideName
5321 if w := overrideNames[i]; w != g {
5322 t.Errorf("Expected override name %q, got %q", w, g)
5323 }
5324 }
5325
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005326 })
5327
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005328 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5329 bp := `
5330 prebuilt_apex {
5331 name: "myapex",
5332 arch: {
5333 arm64: {
5334 src: "myapex-arm64.apex",
5335 },
5336 arm: {
5337 src: "myapex-arm.apex",
5338 },
5339 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005340 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5341 }
5342
5343 prebuilt_bootclasspath_fragment {
5344 name: "my-bootclasspath-fragment",
5345 contents: ["libfoo", "libbar"],
5346 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005347 hidden_api: {
5348 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5349 metadata: "my-bootclasspath-fragment/metadata.csv",
5350 index: "my-bootclasspath-fragment/index.csv",
5351 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5352 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5353 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005354 }
5355
5356 java_import {
5357 name: "libfoo",
5358 jars: ["libfoo.jar"],
5359 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005360 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005361 }
5362
5363 java_library {
5364 name: "libfoo",
5365 srcs: ["foo/bar/MyClass.java"],
5366 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005367 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005368 }
Paul Duffin37856732021-02-26 14:24:15 +00005369
5370 java_sdk_library_import {
5371 name: "libbar",
5372 public: {
5373 jars: ["libbar.jar"],
5374 },
5375 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005376 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005377 }
5378
5379 java_sdk_library {
5380 name: "libbar",
5381 srcs: ["foo/bar/MyClass.java"],
5382 unsafe_ignore_missing_latest_api: true,
5383 apex_available: ["myapex"],
5384 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005385 `
5386
5387 // In this test the source (java_library) libfoo is active since the
5388 // prebuilt (java_import) defaults to prefer:false. However the
5389 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5390 // find the dex boot jar in it. We either need to disable the source libfoo
5391 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005392 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005393 // dexbootjar check is skipped if AllowMissingDependencies is true
5394 preparerAllowMissingDeps := android.GroupFixturePreparers(
5395 preparer,
5396 android.PrepareForTestWithAllowMissingDependencies,
5397 )
5398 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005399 })
5400
5401 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5402 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005403 apex {
5404 name: "myapex",
5405 key: "myapex.key",
5406 updatable: false,
5407 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5408 }
5409
5410 apex_key {
5411 name: "myapex.key",
5412 public_key: "testkey.avbpubkey",
5413 private_key: "testkey.pem",
5414 }
5415
5416 bootclasspath_fragment {
5417 name: "my-bootclasspath-fragment",
5418 contents: ["libfoo", "libbar"],
5419 apex_available: ["myapex"],
5420 hidden_api: {
5421 split_packages: ["*"],
5422 },
5423 }
5424
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005425 prebuilt_apex {
5426 name: "myapex",
5427 arch: {
5428 arm64: {
5429 src: "myapex-arm64.apex",
5430 },
5431 arm: {
5432 src: "myapex-arm.apex",
5433 },
5434 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005435 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5436 }
5437
5438 prebuilt_bootclasspath_fragment {
5439 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005440 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005441 contents: ["libfoo", "libbar"],
5442 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005443 hidden_api: {
5444 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5445 metadata: "my-bootclasspath-fragment/metadata.csv",
5446 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005447 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5448 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5449 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005450 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451 }
5452
5453 java_import {
5454 name: "libfoo",
5455 prefer: true,
5456 jars: ["libfoo.jar"],
5457 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005458 permitted_packages: ["foo"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005459 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005460 }
5461
5462 java_library {
5463 name: "libfoo",
5464 srcs: ["foo/bar/MyClass.java"],
5465 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005466 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005467 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 }
Paul Duffin37856732021-02-26 14:24:15 +00005469
5470 java_sdk_library_import {
5471 name: "libbar",
5472 prefer: true,
5473 public: {
5474 jars: ["libbar.jar"],
5475 },
5476 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005477 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005478 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005479 }
5480
5481 java_sdk_library {
5482 name: "libbar",
5483 srcs: ["foo/bar/MyClass.java"],
5484 unsafe_ignore_missing_latest_api: true,
5485 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005486 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005487 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005488 `
5489
Paul Duffin89f570a2021-06-16 01:42:33 +01005490 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005491 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5492 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005493
Paul Duffin537ea3d2021-05-14 10:38:00 +01005494 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005495 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005496 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005497 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005498 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005499 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 +01005500 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005501 })
5502
5503 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5504 bp := `
5505 apex {
5506 name: "myapex",
5507 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005508 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005509 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005510 }
5511
5512 apex_key {
5513 name: "myapex.key",
5514 public_key: "testkey.avbpubkey",
5515 private_key: "testkey.pem",
5516 }
5517
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005518 bootclasspath_fragment {
5519 name: "my-bootclasspath-fragment",
5520 contents: ["libfoo", "libbar"],
5521 apex_available: ["myapex"],
5522 hidden_api: {
5523 split_packages: ["*"],
5524 },
5525 }
5526
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005527 prebuilt_apex {
5528 name: "myapex",
5529 arch: {
5530 arm64: {
5531 src: "myapex-arm64.apex",
5532 },
5533 arm: {
5534 src: "myapex-arm.apex",
5535 },
5536 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005537 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5538 }
5539
5540 prebuilt_bootclasspath_fragment {
5541 name: "my-bootclasspath-fragment",
5542 contents: ["libfoo", "libbar"],
5543 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005544 hidden_api: {
5545 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5546 metadata: "my-bootclasspath-fragment/metadata.csv",
5547 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005548 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5549 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5550 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005551 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005552 }
5553
5554 java_import {
5555 name: "libfoo",
5556 jars: ["libfoo.jar"],
5557 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005558 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005559 }
5560
5561 java_library {
5562 name: "libfoo",
5563 srcs: ["foo/bar/MyClass.java"],
5564 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005565 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005566 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005567 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005568 }
Paul Duffin37856732021-02-26 14:24:15 +00005569
5570 java_sdk_library_import {
5571 name: "libbar",
5572 public: {
5573 jars: ["libbar.jar"],
5574 },
5575 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005576 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005577 }
5578
5579 java_sdk_library {
5580 name: "libbar",
5581 srcs: ["foo/bar/MyClass.java"],
5582 unsafe_ignore_missing_latest_api: true,
5583 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005584 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005585 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005586 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005587 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005588 `
5589
Paul Duffin89f570a2021-06-16 01:42:33 +01005590 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005591 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5592 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005593
Paul Duffin537ea3d2021-05-14 10:38:00 +01005594 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005595 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005596 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5597 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005598 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5599 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 +01005600 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005601 })
5602
5603 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5604 bp := `
5605 apex {
5606 name: "myapex",
5607 enabled: false,
5608 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005609 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005610 }
5611
5612 apex_key {
5613 name: "myapex.key",
5614 public_key: "testkey.avbpubkey",
5615 private_key: "testkey.pem",
5616 }
5617
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005618 bootclasspath_fragment {
5619 name: "my-bootclasspath-fragment",
5620 enabled: false,
5621 contents: ["libfoo", "libbar"],
5622 apex_available: ["myapex"],
5623 hidden_api: {
5624 split_packages: ["*"],
5625 },
5626 }
5627
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005628 prebuilt_apex {
5629 name: "myapex",
5630 arch: {
5631 arm64: {
5632 src: "myapex-arm64.apex",
5633 },
5634 arm: {
5635 src: "myapex-arm.apex",
5636 },
5637 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005638 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5639 }
5640
5641 prebuilt_bootclasspath_fragment {
5642 name: "my-bootclasspath-fragment",
5643 contents: ["libfoo", "libbar"],
5644 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005645 hidden_api: {
5646 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5647 metadata: "my-bootclasspath-fragment/metadata.csv",
5648 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005649 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5650 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5651 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005652 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005653 }
5654
5655 java_import {
5656 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005657 jars: ["libfoo.jar"],
5658 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005659 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005660 }
5661
5662 java_library {
5663 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005664 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005665 srcs: ["foo/bar/MyClass.java"],
5666 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005667 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005668 }
Paul Duffin37856732021-02-26 14:24:15 +00005669
5670 java_sdk_library_import {
5671 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005672 public: {
5673 jars: ["libbar.jar"],
5674 },
5675 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005676 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005677 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005678 }
5679
5680 java_sdk_library {
5681 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005682 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005683 srcs: ["foo/bar/MyClass.java"],
5684 unsafe_ignore_missing_latest_api: true,
5685 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005686 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005687 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005688 `
Cole Fausta963b942024-04-11 17:43:00 -07005689 // This test disables libbar, which causes the ComponentDepsMutator to add
5690 // deps on libbar.stubs and other sub-modules that don't exist. We can
5691 // enable AllowMissingDependencies to work around that, but enabling that
5692 // causes extra checks for missing source files to dex_bootjars, so add those
5693 // to the mock fs as well.
5694 preparer2 := android.GroupFixturePreparers(
5695 preparer,
5696 android.PrepareForTestWithAllowMissingDependencies,
5697 android.FixtureMergeMockFs(map[string][]byte{
5698 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5699 "frameworks/base/config/boot-profile.txt": nil,
5700 }),
5701 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005702
Cole Fausta963b942024-04-11 17:43:00 -07005703 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005704 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5705 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005706
Paul Duffin537ea3d2021-05-14 10:38:00 +01005707 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005708 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005709 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005710 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005711 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005712 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 +01005713 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005714 })
Spandan Das3a392012024-01-17 18:26:27 +00005715
Spandan Dasf2c10572024-02-27 04:49:52 +00005716 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005717 bp := `
5718 // Source
5719 apex {
5720 name: "myapex",
5721 enabled: false,
5722 key: "myapex.key",
5723 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5724 }
5725
5726 apex_key {
5727 name: "myapex.key",
5728 public_key: "testkey.avbpubkey",
5729 private_key: "testkey.pem",
5730 }
5731
5732 // Prebuilt
5733 prebuilt_apex {
5734 name: "myapex.v1",
5735 source_apex_name: "myapex",
5736 arch: {
5737 arm64: {
5738 src: "myapex-arm64.apex",
5739 },
5740 arm: {
5741 src: "myapex-arm.apex",
5742 },
5743 },
5744 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5745 prefer: true,
5746 }
5747 prebuilt_apex {
5748 name: "myapex.v2",
5749 source_apex_name: "myapex",
5750 arch: {
5751 arm64: {
5752 src: "myapex-arm64.apex",
5753 },
5754 arm: {
5755 src: "myapex-arm.apex",
5756 },
5757 },
5758 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5759 prefer: true,
5760 }
5761
5762 prebuilt_bootclasspath_fragment {
5763 name: "my-bootclasspath-fragment",
5764 contents: ["libfoo", "libbar"],
5765 apex_available: ["myapex"],
5766 hidden_api: {
5767 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5768 metadata: "my-bootclasspath-fragment/metadata.csv",
5769 index: "my-bootclasspath-fragment/index.csv",
5770 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5771 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5772 },
5773 prefer: true,
5774 }
5775
5776 java_import {
5777 name: "libfoo",
5778 jars: ["libfoo.jar"],
5779 apex_available: ["myapex"],
5780 prefer: true,
5781 }
5782 java_import {
5783 name: "libbar",
5784 jars: ["libbar.jar"],
5785 apex_available: ["myapex"],
5786 prefer: true,
5787 }
5788 `
5789
Spandan Dasf2c10572024-02-27 04:49:52 +00005790 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 +00005791 })
5792
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005793}
5794
Roland Levillain630846d2019-06-26 12:48:34 +01005795func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005796 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005797 apex_test {
5798 name: "myapex",
5799 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005800 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005801 tests: [
5802 "mytest",
5803 ],
5804 }
5805
5806 apex_key {
5807 name: "myapex.key",
5808 public_key: "testkey.avbpubkey",
5809 private_key: "testkey.pem",
5810 }
5811
Liz Kammer1c14a212020-05-12 15:26:55 -07005812 filegroup {
5813 name: "fg",
5814 srcs: [
5815 "baz",
5816 "bar/baz"
5817 ],
5818 }
5819
Roland Levillain630846d2019-06-26 12:48:34 +01005820 cc_test {
5821 name: "mytest",
5822 gtest: false,
5823 srcs: ["mytest.cpp"],
5824 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005825 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005826 system_shared_libs: [],
5827 static_executable: true,
5828 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005829 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005830 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005831
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005832 cc_library {
5833 name: "mylib",
5834 srcs: ["mylib.cpp"],
5835 system_shared_libs: [],
5836 stl: "none",
5837 }
5838
Liz Kammer5bd365f2020-05-27 15:15:11 -07005839 filegroup {
5840 name: "fg2",
5841 srcs: [
5842 "testdata/baz"
5843 ],
5844 }
Roland Levillain630846d2019-06-26 12:48:34 +01005845 `)
5846
Jooyung Hana0503a52023-08-23 13:12:50 +09005847 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005848 copyCmds := apexRule.Args["copy_commands"]
5849
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005850 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005851 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005852 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005853
Liz Kammer1c14a212020-05-12 15:26:55 -07005854 //Ensure that test data are copied into apex.
5855 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5856 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5857
Roland Levillainf89cd092019-07-29 16:22:59 +01005858 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005859 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005860 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005861 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005862 prefix := "TARGET_"
5863 var builder strings.Builder
5864 data.Custom(&builder, name, prefix, "", data)
5865 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005866 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005867 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005868}
5869
Jooyung Hand48f3c32019-08-23 11:18:57 +09005870func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5871 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5872 apex {
5873 name: "myapex",
5874 key: "myapex.key",
5875 native_shared_libs: ["libfoo"],
5876 }
5877
5878 apex_key {
5879 name: "myapex.key",
5880 public_key: "testkey.avbpubkey",
5881 private_key: "testkey.pem",
5882 }
5883
5884 cc_library {
5885 name: "libfoo",
5886 stl: "none",
5887 system_shared_libs: [],
5888 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005889 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005890 }
5891 `)
5892 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5893 apex {
5894 name: "myapex",
5895 key: "myapex.key",
5896 java_libs: ["myjar"],
5897 }
5898
5899 apex_key {
5900 name: "myapex.key",
5901 public_key: "testkey.avbpubkey",
5902 private_key: "testkey.pem",
5903 }
5904
5905 java_library {
5906 name: "myjar",
5907 srcs: ["foo/bar/MyClass.java"],
5908 sdk_version: "none",
5909 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005910 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005911 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005912 }
5913 `)
5914}
5915
Bill Peckhama41a6962021-01-11 10:58:54 -08005916func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005917 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005918 apex {
5919 name: "myapex",
5920 key: "myapex.key",
5921 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005922 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005923 }
5924
5925 apex_key {
5926 name: "myapex.key",
5927 public_key: "testkey.avbpubkey",
5928 private_key: "testkey.pem",
5929 }
5930
5931 java_import {
5932 name: "myjavaimport",
5933 apex_available: ["myapex"],
5934 jars: ["my.jar"],
5935 compile_dex: true,
5936 }
5937 `)
5938
Jooyung Hana0503a52023-08-23 13:12:50 +09005939 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005940 apexRule := module.Rule("apexRule")
5941 copyCmds := apexRule.Args["copy_commands"]
5942 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5943}
5944
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005945func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005946 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005947 apex {
5948 name: "myapex",
5949 key: "myapex.key",
5950 apps: [
5951 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005952 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005953 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005954 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005955 }
5956
5957 apex_key {
5958 name: "myapex.key",
5959 public_key: "testkey.avbpubkey",
5960 private_key: "testkey.pem",
5961 }
5962
5963 android_app {
5964 name: "AppFoo",
5965 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005966 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005967 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005968 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005969 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005970 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005971 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005972 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005973
5974 android_app {
5975 name: "AppFooPriv",
5976 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005977 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005978 system_modules: "none",
5979 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005980 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005981 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005982 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005983 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005984
5985 cc_library_shared {
5986 name: "libjni",
5987 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005988 shared_libs: ["libfoo"],
5989 stl: "none",
5990 system_shared_libs: [],
5991 apex_available: [ "myapex" ],
5992 sdk_version: "current",
5993 }
5994
5995 cc_library_shared {
5996 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005997 stl: "none",
5998 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005999 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006000 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006001 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006002 `)
6003
Jooyung Hana0503a52023-08-23 13:12:50 +09006004 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006005 apexRule := module.Rule("apexRule")
6006 copyCmds := apexRule.Args["copy_commands"]
6007
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006008 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6009 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006010 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006011
Colin Crossaede88c2020-08-11 12:17:01 -07006012 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006013 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006014 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006015 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006016 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006017 // JNI libraries including transitive deps are
6018 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006019 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006020 // ... embedded inside APK (jnilibs.zip)
6021 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6022 // ... and not directly inside the APEX
6023 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6024 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006025
6026 apexBundle := module.Module().(*apexBundle)
6027 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6028 var builder strings.Builder
6029 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6030 androidMk := builder.String()
6031 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6032 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6033 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6034 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6035 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6036 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 +01006037}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006038
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006039func TestApexWithAppImportBuildId(t *testing.T) {
6040 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6041 for _, id := range invalidBuildIds {
6042 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6043 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6044 variables.BuildId = proptools.StringPtr(id)
6045 })
6046 testApexError(t, message, `apex {
6047 name: "myapex",
6048 key: "myapex.key",
6049 apps: ["AppFooPrebuilt"],
6050 updatable: false,
6051 }
6052
6053 apex_key {
6054 name: "myapex.key",
6055 public_key: "testkey.avbpubkey",
6056 private_key: "testkey.pem",
6057 }
6058
6059 android_app_import {
6060 name: "AppFooPrebuilt",
6061 apk: "PrebuiltAppFoo.apk",
6062 presigned: true,
6063 apex_available: ["myapex"],
6064 }
6065 `, fixture)
6066 }
6067}
6068
Dario Frenicde2a032019-10-27 00:29:22 +01006069func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006070 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006071 apex {
6072 name: "myapex",
6073 key: "myapex.key",
6074 apps: [
6075 "AppFooPrebuilt",
6076 "AppFooPrivPrebuilt",
6077 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006078 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006079 }
6080
6081 apex_key {
6082 name: "myapex.key",
6083 public_key: "testkey.avbpubkey",
6084 private_key: "testkey.pem",
6085 }
6086
6087 android_app_import {
6088 name: "AppFooPrebuilt",
6089 apk: "PrebuiltAppFoo.apk",
6090 presigned: true,
6091 dex_preopt: {
6092 enabled: false,
6093 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006094 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006095 }
6096
6097 android_app_import {
6098 name: "AppFooPrivPrebuilt",
6099 apk: "PrebuiltAppFooPriv.apk",
6100 privileged: true,
6101 presigned: true,
6102 dex_preopt: {
6103 enabled: false,
6104 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006105 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006106 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006107 }
6108 `)
6109
Jooyung Hana0503a52023-08-23 13:12:50 +09006110 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006111 apexRule := module.Rule("apexRule")
6112 copyCmds := apexRule.Args["copy_commands"]
6113
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006114 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6115 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006116}
6117
6118func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006119 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006120 apex {
6121 name: "myapex",
6122 key: "myapex.key",
6123 apps: [
6124 "AppFoo",
6125 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006126 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006127 }
6128
6129 apex_key {
6130 name: "myapex.key",
6131 public_key: "testkey.avbpubkey",
6132 private_key: "testkey.pem",
6133 }
6134
6135 android_app {
6136 name: "AppFoo",
6137 srcs: ["foo/bar/MyClass.java"],
6138 sdk_version: "none",
6139 system_modules: "none",
6140 apex_available: [ "myapex" ],
6141 }
6142
6143 android_app_import {
6144 name: "AppFoo",
6145 apk: "AppFooPrebuilt.apk",
6146 filename: "AppFooPrebuilt.apk",
6147 presigned: true,
6148 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006149 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006150 }
6151 `, withFiles(map[string][]byte{
6152 "AppFooPrebuilt.apk": nil,
6153 }))
6154
Jooyung Hana0503a52023-08-23 13:12:50 +09006155 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006156 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006157 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006158}
6159
Dario Freni6f3937c2019-12-20 22:58:03 +00006160func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006161 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006162 apex {
6163 name: "myapex",
6164 key: "myapex.key",
6165 apps: [
6166 "TesterHelpAppFoo",
6167 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006168 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006169 }
6170
6171 apex_key {
6172 name: "myapex.key",
6173 public_key: "testkey.avbpubkey",
6174 private_key: "testkey.pem",
6175 }
6176
6177 android_test_helper_app {
6178 name: "TesterHelpAppFoo",
6179 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006180 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006181 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006182 }
6183
6184 `)
6185
Jooyung Hana0503a52023-08-23 13:12:50 +09006186 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006187 apexRule := module.Rule("apexRule")
6188 copyCmds := apexRule.Args["copy_commands"]
6189
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006190 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006191}
6192
Jooyung Han18020ea2019-11-13 10:50:48 +09006193func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6194 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006195 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006196 apex {
6197 name: "myapex",
6198 key: "myapex.key",
6199 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006200 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006201 }
6202
6203 apex_key {
6204 name: "myapex.key",
6205 public_key: "testkey.avbpubkey",
6206 private_key: "testkey.pem",
6207 }
6208
6209 apex {
6210 name: "otherapex",
6211 key: "myapex.key",
6212 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006213 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006214 }
6215
6216 cc_defaults {
6217 name: "libfoo-defaults",
6218 apex_available: ["otherapex"],
6219 }
6220
6221 cc_library {
6222 name: "libfoo",
6223 defaults: ["libfoo-defaults"],
6224 stl: "none",
6225 system_shared_libs: [],
6226 }`)
6227}
6228
Paul Duffine52e66f2020-03-30 17:54:29 +01006229func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006230 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006231 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006232 apex {
6233 name: "myapex",
6234 key: "myapex.key",
6235 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006236 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006237 }
6238
6239 apex_key {
6240 name: "myapex.key",
6241 public_key: "testkey.avbpubkey",
6242 private_key: "testkey.pem",
6243 }
6244
6245 apex {
6246 name: "otherapex",
6247 key: "otherapex.key",
6248 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006249 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006250 }
6251
6252 apex_key {
6253 name: "otherapex.key",
6254 public_key: "testkey.avbpubkey",
6255 private_key: "testkey.pem",
6256 }
6257
6258 cc_library {
6259 name: "libfoo",
6260 stl: "none",
6261 system_shared_libs: [],
6262 apex_available: ["otherapex"],
6263 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006264}
Jiyong Park127b40b2019-09-30 16:04:35 +09006265
Paul Duffine52e66f2020-03-30 17:54:29 +01006266func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006267 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006268 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006269.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006270.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006271.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006272.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006273.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006274.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006275 apex {
6276 name: "myapex",
6277 key: "myapex.key",
6278 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006279 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006280 }
6281
6282 apex_key {
6283 name: "myapex.key",
6284 public_key: "testkey.avbpubkey",
6285 private_key: "testkey.pem",
6286 }
6287
Jiyong Park127b40b2019-09-30 16:04:35 +09006288 cc_library {
6289 name: "libfoo",
6290 stl: "none",
6291 shared_libs: ["libbar"],
6292 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006293 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006294 }
6295
6296 cc_library {
6297 name: "libbar",
6298 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006299 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006300 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006301 apex_available: ["myapex"],
6302 }
6303
6304 cc_library {
6305 name: "libbaz",
6306 stl: "none",
6307 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006308 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006309}
Jiyong Park127b40b2019-09-30 16:04:35 +09006310
Liz Kammer5f108fa2023-05-11 14:33:17 -04006311func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6312 testApex(t, `
6313 apex {
6314 name: "myapex",
6315 key: "myapex.key",
6316 native_shared_libs: ["libfoo"],
6317 updatable: false,
6318 }
6319
6320 apex_key {
6321 name: "myapex.key",
6322 public_key: "testkey.avbpubkey",
6323 private_key: "testkey.pem",
6324 }
6325
6326 cc_library {
6327 name: "libfoo",
6328 stl: "none",
6329 static_libs: ["libbar"],
6330 system_shared_libs: [],
6331 apex_available: ["myapex"],
6332 }
6333
6334 cc_library {
6335 name: "libbar",
6336 stl: "none",
6337 shared_libs: ["libbaz"],
6338 system_shared_libs: [],
6339 apex_available: ["myapex"],
6340 }
6341
6342 cc_library {
6343 name: "libbaz",
6344 stl: "none",
6345 system_shared_libs: [],
6346 }`)
6347
6348 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6349 apex {
6350 name: "myapex",
6351 key: "myapex.key",
6352 native_shared_libs: ["libfoo"],
6353 updatable: false,
6354 }
6355
6356 apex_key {
6357 name: "myapex.key",
6358 public_key: "testkey.avbpubkey",
6359 private_key: "testkey.pem",
6360 }
6361
6362 cc_library {
6363 name: "libfoo",
6364 stl: "none",
6365 static_libs: ["libbar"],
6366 system_shared_libs: [],
6367 apex_available: ["myapex"],
6368 }
6369
6370 cc_library {
6371 name: "libbar",
6372 stl: "none",
6373 system_shared_libs: [],
6374 }`)
6375}
6376
Paul Duffine52e66f2020-03-30 17:54:29 +01006377func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006378 testApexError(t, "\"otherapex\" is not a valid module name", `
6379 apex {
6380 name: "myapex",
6381 key: "myapex.key",
6382 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006383 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006384 }
6385
6386 apex_key {
6387 name: "myapex.key",
6388 public_key: "testkey.avbpubkey",
6389 private_key: "testkey.pem",
6390 }
6391
6392 cc_library {
6393 name: "libfoo",
6394 stl: "none",
6395 system_shared_libs: [],
6396 apex_available: ["otherapex"],
6397 }`)
6398
Paul Duffine52e66f2020-03-30 17:54:29 +01006399 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006400 apex {
6401 name: "myapex",
6402 key: "myapex.key",
6403 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006404 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006405 }
6406
6407 apex_key {
6408 name: "myapex.key",
6409 public_key: "testkey.avbpubkey",
6410 private_key: "testkey.pem",
6411 }
6412
6413 cc_library {
6414 name: "libfoo",
6415 stl: "none",
6416 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006417 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006418 apex_available: ["myapex"],
6419 }
6420
6421 cc_library {
6422 name: "libbar",
6423 stl: "none",
6424 system_shared_libs: [],
6425 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006426 }
6427
6428 cc_library {
6429 name: "libbaz",
6430 stl: "none",
6431 system_shared_libs: [],
6432 stubs: {
6433 versions: ["10", "20", "30"],
6434 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006435 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006436}
Jiyong Park127b40b2019-09-30 16:04:35 +09006437
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006438func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6439 t.Run("negative variant_version produces error", func(t *testing.T) {
6440 testApexError(t, "expected an integer between 0-9; got -1", `
6441 apex {
6442 name: "myapex",
6443 key: "myapex.key",
6444 apex_available_name: "com.android.foo",
6445 variant_version: "-1",
6446 updatable: false,
6447 }
6448 apex_key {
6449 name: "myapex.key",
6450 public_key: "testkey.avbpubkey",
6451 private_key: "testkey.pem",
6452 }
6453 `)
6454 })
6455
6456 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6457 testApexError(t, "expected an integer between 0-9; got 10", `
6458 apex {
6459 name: "myapex",
6460 key: "myapex.key",
6461 apex_available_name: "com.android.foo",
6462 variant_version: "10",
6463 updatable: false,
6464 }
6465 apex_key {
6466 name: "myapex.key",
6467 public_key: "testkey.avbpubkey",
6468 private_key: "testkey.pem",
6469 }
6470 `)
6471 })
6472}
6473
6474func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6475 context := android.GroupFixturePreparers(
6476 android.PrepareForIntegrationTestWithAndroid,
6477 PrepareForTestWithApexBuildComponents,
6478 android.FixtureMergeMockFs(android.MockFS{
6479 "system/sepolicy/apex/foo-file_contexts": nil,
6480 "system/sepolicy/apex/bar-file_contexts": nil,
6481 }),
6482 )
6483 result := context.RunTestWithBp(t, `
6484 apex {
6485 name: "foo",
6486 key: "myapex.key",
6487 apex_available_name: "com.android.foo",
6488 variant_version: "0",
6489 updatable: false,
6490 }
6491 apex {
6492 name: "bar",
6493 key: "myapex.key",
6494 apex_available_name: "com.android.foo",
6495 variant_version: "3",
6496 updatable: false,
6497 }
6498 apex_key {
6499 name: "myapex.key",
6500 public_key: "testkey.avbpubkey",
6501 private_key: "testkey.pem",
6502 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006503 override_apex {
6504 name: "myoverrideapex",
6505 base: "bar",
6506 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006507 `)
6508
Jooyung Hana0503a52023-08-23 13:12:50 +09006509 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006510 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6511 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6512 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6513 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6514 }
6515
Jooyung Hana0503a52023-08-23 13:12:50 +09006516 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006517 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6518 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6519 barActualDefaultVersion := barManifestRule.Args["default_version"]
6520 if barActualDefaultVersion != barExpectedDefaultVersion {
6521 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6522 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006523
Spandan Das50801e22024-05-13 18:29:45 +00006524 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006525 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6526 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6527 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6528 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006529}
6530
Sam Delmericoca816532023-06-02 14:09:50 -04006531func TestApexAvailable_ApexAvailableName(t *testing.T) {
6532 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6533 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6534 apex {
6535 name: "myapex_sminus",
6536 key: "myapex.key",
6537 apps: ["AppFoo"],
6538 apex_available_name: "myapex",
6539 updatable: false,
6540 }
6541 apex {
6542 name: "myapex",
6543 key: "myapex.key",
6544 apps: ["AppFoo"],
6545 updatable: false,
6546 }
6547 apex_key {
6548 name: "myapex.key",
6549 public_key: "testkey.avbpubkey",
6550 private_key: "testkey.pem",
6551 }
6552 android_app {
6553 name: "AppFoo",
6554 srcs: ["foo/bar/MyClass.java"],
6555 sdk_version: "none",
6556 system_modules: "none",
6557 apex_available: [ "myapex_sminus" ],
6558 }`,
6559 android.FixtureMergeMockFs(android.MockFS{
6560 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6561 }),
6562 )
6563 })
6564
6565 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6566 testApex(t, `
6567 apex {
6568 name: "myapex_sminus",
6569 key: "myapex.key",
6570 apps: ["AppFoo"],
6571 apex_available_name: "myapex",
6572 updatable: false,
6573 }
6574 apex {
6575 name: "myapex",
6576 key: "myapex.key",
6577 apps: ["AppFoo"],
6578 updatable: false,
6579 }
6580 apex_key {
6581 name: "myapex.key",
6582 public_key: "testkey.avbpubkey",
6583 private_key: "testkey.pem",
6584 }
6585 android_app {
6586 name: "AppFoo",
6587 srcs: ["foo/bar/MyClass.java"],
6588 sdk_version: "none",
6589 system_modules: "none",
6590 apex_available: [ "myapex" ],
6591 }`,
6592 android.FixtureMergeMockFs(android.MockFS{
6593 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6594 }),
6595 )
6596 })
6597
6598 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6599 testApex(t, `
6600 override_apex {
6601 name: "myoverrideapex_sminus",
6602 base: "myapex_sminus",
6603 key: "myapex.key",
6604 apps: ["AppFooOverride"],
6605 }
6606 override_apex {
6607 name: "myoverrideapex",
6608 base: "myapex",
6609 key: "myapex.key",
6610 apps: ["AppFooOverride"],
6611 }
6612 apex {
6613 name: "myapex_sminus",
6614 key: "myapex.key",
6615 apps: ["AppFoo"],
6616 apex_available_name: "myapex",
6617 updatable: false,
6618 }
6619 apex {
6620 name: "myapex",
6621 key: "myapex.key",
6622 apps: ["AppFoo"],
6623 updatable: false,
6624 }
6625 apex_key {
6626 name: "myapex.key",
6627 public_key: "testkey.avbpubkey",
6628 private_key: "testkey.pem",
6629 }
6630 android_app {
6631 name: "AppFooOverride",
6632 srcs: ["foo/bar/MyClass.java"],
6633 sdk_version: "none",
6634 system_modules: "none",
6635 apex_available: [ "myapex" ],
6636 }
6637 android_app {
6638 name: "AppFoo",
6639 srcs: ["foo/bar/MyClass.java"],
6640 sdk_version: "none",
6641 system_modules: "none",
6642 apex_available: [ "myapex" ],
6643 }`,
6644 android.FixtureMergeMockFs(android.MockFS{
6645 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6646 }),
6647 )
6648 })
6649}
6650
6651func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6652 context := android.GroupFixturePreparers(
6653 android.PrepareForIntegrationTestWithAndroid,
6654 PrepareForTestWithApexBuildComponents,
6655 java.PrepareForTestWithDexpreopt,
6656 android.FixtureMergeMockFs(android.MockFS{
6657 "system/sepolicy/apex/myapex-file_contexts": nil,
6658 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6659 }),
6660 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6661 variables.BuildId = proptools.StringPtr("buildid")
6662 }),
6663 )
6664 context.RunTestWithBp(t, `
6665 override_apex {
6666 name: "myoverrideapex_sminus",
6667 base: "myapex_sminus",
6668 }
6669 override_apex {
6670 name: "myoverrideapex",
6671 base: "myapex",
6672 }
6673 apex {
6674 name: "myapex",
6675 key: "myapex.key",
6676 apps: ["AppFoo"],
6677 updatable: false,
6678 }
6679 apex {
6680 name: "myapex_sminus",
6681 apex_available_name: "myapex",
6682 key: "myapex.key",
6683 apps: ["AppFoo_sminus"],
6684 updatable: false,
6685 }
6686 apex_key {
6687 name: "myapex.key",
6688 public_key: "testkey.avbpubkey",
6689 private_key: "testkey.pem",
6690 }
6691 android_app {
6692 name: "AppFoo",
6693 srcs: ["foo/bar/MyClass.java"],
6694 sdk_version: "none",
6695 system_modules: "none",
6696 apex_available: [ "myapex" ],
6697 }
6698 android_app {
6699 name: "AppFoo_sminus",
6700 srcs: ["foo/bar/MyClass.java"],
6701 sdk_version: "none",
6702 min_sdk_version: "29",
6703 system_modules: "none",
6704 apex_available: [ "myapex" ],
6705 }`)
6706}
6707
Jiyong Park89e850a2020-04-07 16:37:39 +09006708func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006709 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006710 apex {
6711 name: "myapex",
6712 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006713 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006714 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006715 }
6716
6717 apex_key {
6718 name: "myapex.key",
6719 public_key: "testkey.avbpubkey",
6720 private_key: "testkey.pem",
6721 }
6722
6723 cc_library {
6724 name: "libfoo",
6725 stl: "none",
6726 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006727 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006728 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006729 }
6730
6731 cc_library {
6732 name: "libfoo2",
6733 stl: "none",
6734 system_shared_libs: [],
6735 shared_libs: ["libbaz"],
6736 apex_available: ["//apex_available:platform"],
6737 }
6738
6739 cc_library {
6740 name: "libbar",
6741 stl: "none",
6742 system_shared_libs: [],
6743 apex_available: ["myapex"],
6744 }
6745
6746 cc_library {
6747 name: "libbaz",
6748 stl: "none",
6749 system_shared_libs: [],
6750 apex_available: ["myapex"],
6751 stubs: {
6752 versions: ["1"],
6753 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006754 }`)
6755
Jiyong Park89e850a2020-04-07 16:37:39 +09006756 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6757 // because it depends on libbar which isn't available to platform
6758 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6759 if libfoo.NotAvailableForPlatform() != true {
6760 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6761 }
6762
6763 // libfoo2 however can be available to platform because it depends on libbaz which provides
6764 // stubs
6765 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6766 if libfoo2.NotAvailableForPlatform() == true {
6767 t.Errorf("%q should be available to platform", libfoo2.String())
6768 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006769}
Jiyong Parka90ca002019-10-07 15:47:24 +09006770
Paul Duffine52e66f2020-03-30 17:54:29 +01006771func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006772 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006773 apex {
6774 name: "myapex",
6775 key: "myapex.key",
6776 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006777 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006778 }
6779
6780 apex_key {
6781 name: "myapex.key",
6782 public_key: "testkey.avbpubkey",
6783 private_key: "testkey.pem",
6784 }
6785
6786 cc_library {
6787 name: "libfoo",
6788 stl: "none",
6789 system_shared_libs: [],
6790 apex_available: ["myapex"],
6791 static: {
6792 apex_available: ["//apex_available:platform"],
6793 },
6794 }`)
6795
Jiyong Park89e850a2020-04-07 16:37:39 +09006796 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6797 if libfooShared.NotAvailableForPlatform() != true {
6798 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6799 }
6800 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6801 if libfooStatic.NotAvailableForPlatform() != false {
6802 t.Errorf("%q should be available to platform", libfooStatic.String())
6803 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006804}
6805
Jooyung Han9a419e22024-08-16 17:14:21 +09006806func TestApexAvailable_PrefixMatch(t *testing.T) {
6807
6808 for _, tc := range []struct {
6809 name string
6810 apexAvailable string
6811 expectedError string
6812 }{
6813 {
6814 name: "prefix matches correctly",
6815 apexAvailable: "com.foo.*",
6816 },
6817 {
6818 name: "prefix doesn't match",
6819 apexAvailable: "com.bar.*",
6820 expectedError: `Consider .* "com.foo\.\*"`,
6821 },
6822 {
6823 name: "short prefix",
6824 apexAvailable: "com.*",
6825 expectedError: "requires two or more components",
6826 },
6827 {
6828 name: "wildcard not in the end",
6829 apexAvailable: "com.*.foo",
6830 expectedError: "should end with .*",
6831 },
6832 {
6833 name: "wildcard in the middle",
6834 apexAvailable: "com.foo*.*",
6835 expectedError: "not allowed in the middle",
6836 },
6837 {
6838 name: "hint with prefix pattern",
6839 apexAvailable: "//apex_available:platform",
6840 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6841 },
6842 } {
6843 t.Run(tc.name, func(t *testing.T) {
6844 errorHandler := android.FixtureExpectsNoErrors
6845 if tc.expectedError != "" {
6846 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6847 }
6848 context := android.GroupFixturePreparers(
6849 prepareForApexTest,
6850 android.FixtureMergeMockFs(android.MockFS{
6851 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6852 }),
6853 ).ExtendWithErrorHandler(errorHandler)
6854
6855 context.RunTestWithBp(t, `
6856 apex {
6857 name: "com.foo.bar",
6858 key: "myapex.key",
6859 native_shared_libs: ["libfoo"],
6860 updatable: false,
6861 }
6862
6863 apex_key {
6864 name: "myapex.key",
6865 public_key: "testkey.avbpubkey",
6866 private_key: "testkey.pem",
6867 }
6868
6869 cc_library {
6870 name: "libfoo",
6871 stl: "none",
6872 system_shared_libs: [],
6873 apex_available: ["`+tc.apexAvailable+`"],
6874 }`)
6875 })
6876 }
6877 testApexError(t, `Consider adding "com.foo" to`, `
6878 apex {
6879 name: "com.foo", // too short for a partner apex
6880 key: "myapex.key",
6881 native_shared_libs: ["libfoo"],
6882 updatable: false,
6883 }
6884
6885 apex_key {
6886 name: "myapex.key",
6887 public_key: "testkey.avbpubkey",
6888 private_key: "testkey.pem",
6889 }
6890
6891 cc_library {
6892 name: "libfoo",
6893 stl: "none",
6894 system_shared_libs: [],
6895 }
6896 `)
6897}
6898
Jiyong Park5d790c32019-11-15 18:40:32 +09006899func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006900 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006901 apex {
6902 name: "myapex",
6903 key: "myapex.key",
6904 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006905 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006906 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006907 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006908 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006909 }
6910
6911 override_apex {
6912 name: "override_myapex",
6913 base: "myapex",
6914 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006915 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006916 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006917 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006918 compile_multilib: "first",
6919 multilib: {
6920 lib32: {
6921 native_shared_libs: ["mylib32"],
6922 },
6923 lib64: {
6924 native_shared_libs: ["mylib64"],
6925 },
6926 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006927 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006928 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006929 key: "mynewapex.key",
6930 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006931 }
6932
6933 apex_key {
6934 name: "myapex.key",
6935 public_key: "testkey.avbpubkey",
6936 private_key: "testkey.pem",
6937 }
6938
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006939 apex_key {
6940 name: "mynewapex.key",
6941 public_key: "testkey2.avbpubkey",
6942 private_key: "testkey2.pem",
6943 }
6944
6945 android_app_certificate {
6946 name: "myapex.certificate",
6947 certificate: "testkey",
6948 }
6949
Jiyong Park5d790c32019-11-15 18:40:32 +09006950 android_app {
6951 name: "app",
6952 srcs: ["foo/bar/MyClass.java"],
6953 package_name: "foo",
6954 sdk_version: "none",
6955 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006956 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006957 }
6958
6959 override_android_app {
6960 name: "override_app",
6961 base: "app",
6962 package_name: "bar",
6963 }
markchien7c803b82021-08-26 22:10:06 +08006964
6965 bpf {
6966 name: "bpf",
6967 srcs: ["bpf.c"],
6968 }
6969
6970 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006971 name: "overrideBpf",
6972 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006973 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006974
6975 prebuilt_etc {
6976 name: "myetc",
6977 src: "myprebuilt",
6978 }
6979
6980 prebuilt_etc {
6981 name: "override_myetc",
6982 src: "override_myprebuilt",
6983 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006984
6985 cc_library {
6986 name: "mylib32",
6987 apex_available: [ "myapex" ],
6988 }
6989
6990 cc_library {
6991 name: "mylib64",
6992 apex_available: [ "myapex" ],
6993 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006994 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006995
Jooyung Hana0503a52023-08-23 13:12:50 +09006996 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00006997 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006998 if originalVariant.GetOverriddenBy() != "" {
6999 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7000 }
7001 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7002 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7003 }
7004
Spandan Das50801e22024-05-13 18:29:45 +00007005 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007006 apexRule := module.Rule("apexRule")
7007 copyCmds := apexRule.Args["copy_commands"]
7008
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007009 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7010 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007011
markchien7c803b82021-08-26 22:10:06 +08007012 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007013 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007014
Daniel Norman5a3ce132021-08-26 15:44:43 -07007015 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7016 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7017
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007018 apexBundle := module.Module().(*apexBundle)
7019 name := apexBundle.Name()
7020 if name != "override_myapex" {
7021 t.Errorf("name should be \"override_myapex\", but was %q", name)
7022 }
7023
Baligh Uddin004d7172020-02-19 21:29:28 -08007024 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7025 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7026 }
7027
Jiyong Park20bacab2020-03-03 11:45:41 +09007028 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007029 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007030 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7031
7032 signApkRule := module.Rule("signapk")
7033 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007034
Colin Crossaa255532020-07-03 13:18:24 -07007035 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007036 var builder strings.Builder
7037 data.Custom(&builder, name, "TARGET_", "", data)
7038 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007039 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7040 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007041 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007042 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007043 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007044 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007045 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007046 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007047}
7048
Albert Martineefabcf2022-03-21 20:11:16 +00007049func TestMinSdkVersionOverride(t *testing.T) {
7050 // Override from 29 to 31
7051 minSdkOverride31 := "31"
7052 ctx := testApex(t, `
7053 apex {
7054 name: "myapex",
7055 key: "myapex.key",
7056 native_shared_libs: ["mylib"],
7057 updatable: true,
7058 min_sdk_version: "29"
7059 }
7060
7061 override_apex {
7062 name: "override_myapex",
7063 base: "myapex",
7064 logging_parent: "com.foo.bar",
7065 package_name: "test.overridden.package"
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: "mylib",
7076 srcs: ["mylib.cpp"],
7077 runtime_libs: ["libbar"],
7078 system_shared_libs: [],
7079 stl: "none",
7080 apex_available: [ "myapex" ],
7081 min_sdk_version: "apex_inherit"
7082 }
7083
7084 cc_library {
7085 name: "libbar",
7086 srcs: ["mylib.cpp"],
7087 system_shared_libs: [],
7088 stl: "none",
7089 apex_available: [ "myapex" ],
7090 min_sdk_version: "apex_inherit"
7091 }
7092
7093 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7094
Jooyung Hana0503a52023-08-23 13:12:50 +09007095 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007096 copyCmds := apexRule.Args["copy_commands"]
7097
7098 // Ensure that direct non-stubs dep is always included
7099 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7100
7101 // Ensure that runtime_libs dep in included
7102 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7103
7104 // Ensure libraries target overridden min_sdk_version value
7105 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7106}
7107
7108func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7109 // Attempt to override from 31 to 29, should be a NOOP
7110 minSdkOverride29 := "29"
7111 ctx := testApex(t, `
7112 apex {
7113 name: "myapex",
7114 key: "myapex.key",
7115 native_shared_libs: ["mylib"],
7116 updatable: true,
7117 min_sdk_version: "31"
7118 }
7119
7120 override_apex {
7121 name: "override_myapex",
7122 base: "myapex",
7123 logging_parent: "com.foo.bar",
7124 package_name: "test.overridden.package"
7125 }
7126
7127 apex_key {
7128 name: "myapex.key",
7129 public_key: "testkey.avbpubkey",
7130 private_key: "testkey.pem",
7131 }
7132
7133 cc_library {
7134 name: "mylib",
7135 srcs: ["mylib.cpp"],
7136 runtime_libs: ["libbar"],
7137 system_shared_libs: [],
7138 stl: "none",
7139 apex_available: [ "myapex" ],
7140 min_sdk_version: "apex_inherit"
7141 }
7142
7143 cc_library {
7144 name: "libbar",
7145 srcs: ["mylib.cpp"],
7146 system_shared_libs: [],
7147 stl: "none",
7148 apex_available: [ "myapex" ],
7149 min_sdk_version: "apex_inherit"
7150 }
7151
7152 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7153
Jooyung Hana0503a52023-08-23 13:12:50 +09007154 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007155 copyCmds := apexRule.Args["copy_commands"]
7156
7157 // Ensure that direct non-stubs dep is always included
7158 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7159
7160 // Ensure that runtime_libs dep in included
7161 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7162
7163 // Ensure libraries target the original min_sdk_version value rather than the overridden
7164 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7165}
7166
Jooyung Han214bf372019-11-12 13:03:50 +09007167func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007168 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007169 apex {
7170 name: "myapex",
7171 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007172 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007173 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007174 }
7175
7176 apex_key {
7177 name: "myapex.key",
7178 public_key: "testkey.avbpubkey",
7179 private_key: "testkey.pem",
7180 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007181
7182 cc_library {
7183 name: "mylib",
7184 srcs: ["mylib.cpp"],
7185 stl: "libc++",
7186 system_shared_libs: [],
7187 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007188 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007189 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007190 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007191
Jooyung Hana0503a52023-08-23 13:12:50 +09007192 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007193 args := module.Rule("apexRule").Args
7194 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007195 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007196
7197 // The copies of the libraries in the apex should have one more dependency than
7198 // the ones outside the apex, namely the unwinder. Ideally we should check
7199 // the dependency names directly here but for some reason the names are blank in
7200 // this test.
7201 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007202 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007203 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7204 if len(apexImplicits) != len(nonApexImplicits)+1 {
7205 t.Errorf("%q missing unwinder dep", lib)
7206 }
7207 }
Jooyung Han214bf372019-11-12 13:03:50 +09007208}
7209
Paul Duffine05480a2021-03-08 15:07:14 +00007210var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007211 "api/current.txt": nil,
7212 "api/removed.txt": nil,
7213 "api/system-current.txt": nil,
7214 "api/system-removed.txt": nil,
7215 "api/test-current.txt": nil,
7216 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007217
Anton Hanssondff2c782020-12-21 17:10:01 +00007218 "100/public/api/foo.txt": nil,
7219 "100/public/api/foo-removed.txt": nil,
7220 "100/system/api/foo.txt": nil,
7221 "100/system/api/foo-removed.txt": nil,
7222
Paul Duffineedc5d52020-06-12 17:46:39 +01007223 // For java_sdk_library_import
7224 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007225}
7226
Jooyung Han58f26ab2019-12-18 15:34:32 +09007227func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007228 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007229 apex {
7230 name: "myapex",
7231 key: "myapex.key",
7232 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007233 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007234 }
7235
7236 apex_key {
7237 name: "myapex.key",
7238 public_key: "testkey.avbpubkey",
7239 private_key: "testkey.pem",
7240 }
7241
7242 java_sdk_library {
7243 name: "foo",
7244 srcs: ["a.java"],
7245 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007246 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007247 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007248
7249 prebuilt_apis {
7250 name: "sdk",
7251 api_dirs: ["100"],
7252 }
Paul Duffin9b879592020-05-26 13:21:35 +01007253 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007254
7255 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007256 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007257 "javalib/foo.jar",
7258 "etc/permissions/foo.xml",
7259 })
7260 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007261 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7262 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7263 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007264}
7265
Spandan Das3ee19692024-06-19 04:47:40 +00007266func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7267 ctx := testApex(t, `
7268 override_apex {
7269 name: "mycompanyapex",
7270 base: "myapex",
7271 }
7272 apex {
7273 name: "myapex",
7274 key: "myapex.key",
7275 java_libs: ["foo"],
7276 updatable: false,
7277 }
7278
7279 apex_key {
7280 name: "myapex.key",
7281 public_key: "testkey.avbpubkey",
7282 private_key: "testkey.pem",
7283 }
7284
7285 java_sdk_library {
7286 name: "foo",
7287 srcs: ["a.java"],
7288 api_packages: ["foo"],
7289 apex_available: [ "myapex" ],
7290 }
7291
7292 prebuilt_apis {
7293 name: "sdk",
7294 api_dirs: ["100"],
7295 }
7296 `, withFiles(filesForSdkLibrary))
7297
7298 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7299 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7300 // (com.android.foo), the filepath should not contain override apex name.
7301 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7302 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7303 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7304}
7305
Paul Duffin9b879592020-05-26 13:21:35 +01007306func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007307 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007308 apex {
7309 name: "myapex",
7310 key: "myapex.key",
7311 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007312 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007313 }
7314
7315 apex_key {
7316 name: "myapex.key",
7317 public_key: "testkey.avbpubkey",
7318 private_key: "testkey.pem",
7319 }
7320
7321 java_sdk_library {
7322 name: "foo",
7323 srcs: ["a.java"],
7324 api_packages: ["foo"],
7325 apex_available: ["myapex"],
7326 sdk_version: "none",
7327 system_modules: "none",
7328 }
7329
7330 java_library {
7331 name: "bar",
7332 srcs: ["a.java"],
7333 libs: ["foo"],
7334 apex_available: ["myapex"],
7335 sdk_version: "none",
7336 system_modules: "none",
7337 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007338
7339 prebuilt_apis {
7340 name: "sdk",
7341 api_dirs: ["100"],
7342 }
Paul Duffin9b879592020-05-26 13:21:35 +01007343 `, withFiles(filesForSdkLibrary))
7344
7345 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007346 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007347 "javalib/bar.jar",
7348 "javalib/foo.jar",
7349 "etc/permissions/foo.xml",
7350 })
7351
7352 // The bar library should depend on the implementation jar.
7353 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007354 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007355 t.Errorf("expected %q, found %#q", expected, actual)
7356 }
7357}
7358
7359func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007360 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007361 apex {
7362 name: "myapex",
7363 key: "myapex.key",
7364 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007365 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007366 }
7367
7368 apex_key {
7369 name: "myapex.key",
7370 public_key: "testkey.avbpubkey",
7371 private_key: "testkey.pem",
7372 }
7373
7374 java_sdk_library {
7375 name: "foo",
7376 srcs: ["a.java"],
7377 api_packages: ["foo"],
7378 apex_available: ["myapex"],
7379 sdk_version: "none",
7380 system_modules: "none",
7381 }
7382
7383 java_library {
7384 name: "bar",
7385 srcs: ["a.java"],
7386 libs: ["foo"],
7387 sdk_version: "none",
7388 system_modules: "none",
7389 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007390
7391 prebuilt_apis {
7392 name: "sdk",
7393 api_dirs: ["100"],
7394 }
Paul Duffin9b879592020-05-26 13:21:35 +01007395 `, withFiles(filesForSdkLibrary))
7396
7397 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007398 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007399 "javalib/foo.jar",
7400 "etc/permissions/foo.xml",
7401 })
7402
7403 // The bar library should depend on the stubs jar.
7404 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007405 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007406 t.Errorf("expected %q, found %#q", expected, actual)
7407 }
7408}
7409
Paul Duffineedc5d52020-06-12 17:46:39 +01007410func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007411 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007412 prebuilt_apis {
7413 name: "sdk",
7414 api_dirs: ["100"],
7415 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007416 withFiles(map[string][]byte{
7417 "apex/a.java": nil,
7418 "apex/apex_manifest.json": nil,
7419 "apex/Android.bp": []byte(`
7420 package {
7421 default_visibility: ["//visibility:private"],
7422 }
7423
7424 apex {
7425 name: "myapex",
7426 key: "myapex.key",
7427 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007428 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007429 }
7430
7431 apex_key {
7432 name: "myapex.key",
7433 public_key: "testkey.avbpubkey",
7434 private_key: "testkey.pem",
7435 }
7436
7437 java_library {
7438 name: "bar",
7439 srcs: ["a.java"],
7440 libs: ["foo"],
7441 apex_available: ["myapex"],
7442 sdk_version: "none",
7443 system_modules: "none",
7444 }
7445`),
7446 "source/a.java": nil,
7447 "source/api/current.txt": nil,
7448 "source/api/removed.txt": nil,
7449 "source/Android.bp": []byte(`
7450 package {
7451 default_visibility: ["//visibility:private"],
7452 }
7453
7454 java_sdk_library {
7455 name: "foo",
7456 visibility: ["//apex"],
7457 srcs: ["a.java"],
7458 api_packages: ["foo"],
7459 apex_available: ["myapex"],
7460 sdk_version: "none",
7461 system_modules: "none",
7462 public: {
7463 enabled: true,
7464 },
7465 }
7466`),
7467 "prebuilt/a.jar": nil,
7468 "prebuilt/Android.bp": []byte(`
7469 package {
7470 default_visibility: ["//visibility:private"],
7471 }
7472
7473 java_sdk_library_import {
7474 name: "foo",
7475 visibility: ["//apex", "//source"],
7476 apex_available: ["myapex"],
7477 prefer: true,
7478 public: {
7479 jars: ["a.jar"],
7480 },
7481 }
7482`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007483 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007484 )
7485
7486 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007487 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007488 "javalib/bar.jar",
7489 "javalib/foo.jar",
7490 "etc/permissions/foo.xml",
7491 })
7492
7493 // The bar library should depend on the implementation jar.
7494 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007495 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007496 t.Errorf("expected %q, found %#q", expected, actual)
7497 }
7498}
7499
7500func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7501 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7502 apex {
7503 name: "myapex",
7504 key: "myapex.key",
7505 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007506 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007507 }
7508
7509 apex_key {
7510 name: "myapex.key",
7511 public_key: "testkey.avbpubkey",
7512 private_key: "testkey.pem",
7513 }
7514
7515 java_sdk_library_import {
7516 name: "foo",
7517 apex_available: ["myapex"],
7518 prefer: true,
7519 public: {
7520 jars: ["a.jar"],
7521 },
7522 }
7523
7524 `, withFiles(filesForSdkLibrary))
7525}
7526
atrost6e126252020-01-27 17:01:16 +00007527func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007528 result := android.GroupFixturePreparers(
7529 prepareForApexTest,
7530 java.PrepareForTestWithPlatformCompatConfig,
7531 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007532 apex {
7533 name: "myapex",
7534 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007535 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007536 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007537 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007538 }
7539
7540 apex_key {
7541 name: "myapex.key",
7542 public_key: "testkey.avbpubkey",
7543 private_key: "testkey.pem",
7544 }
7545
7546 platform_compat_config {
7547 name: "myjar-platform-compat-config",
7548 src: ":myjar",
7549 }
7550
7551 java_library {
7552 name: "myjar",
7553 srcs: ["foo/bar/MyClass.java"],
7554 sdk_version: "none",
7555 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007556 apex_available: [ "myapex" ],
7557 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007558
7559 // Make sure that a preferred prebuilt does not affect the apex contents.
7560 prebuilt_platform_compat_config {
7561 name: "myjar-platform-compat-config",
7562 metadata: "compat-config/metadata.xml",
7563 prefer: true,
7564 }
atrost6e126252020-01-27 17:01:16 +00007565 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007566 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007567 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007568 "etc/compatconfig/myjar-platform-compat-config.xml",
7569 "javalib/myjar.jar",
7570 })
7571}
7572
Jooyung Han862c0d62022-12-21 10:15:37 +09007573func TestNoDupeApexFiles(t *testing.T) {
7574 android.GroupFixturePreparers(
7575 android.PrepareForTestWithAndroidBuildComponents,
7576 PrepareForTestWithApexBuildComponents,
7577 prepareForTestWithMyapex,
7578 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7579 ).
7580 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7581 RunTestWithBp(t, `
7582 apex {
7583 name: "myapex",
7584 key: "myapex.key",
7585 prebuilts: ["foo", "bar"],
7586 updatable: false,
7587 }
7588
7589 apex_key {
7590 name: "myapex.key",
7591 public_key: "testkey.avbpubkey",
7592 private_key: "testkey.pem",
7593 }
7594
7595 prebuilt_etc {
7596 name: "foo",
7597 src: "myprebuilt",
7598 filename_from_src: true,
7599 }
7600
7601 prebuilt_etc {
7602 name: "bar",
7603 src: "myprebuilt",
7604 filename_from_src: true,
7605 }
7606 `)
7607}
7608
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007609func TestApexUnwantedTransitiveDeps(t *testing.T) {
7610 bp := `
7611 apex {
7612 name: "myapex",
7613 key: "myapex.key",
7614 native_shared_libs: ["libfoo"],
7615 updatable: false,
7616 unwanted_transitive_deps: ["libbar"],
7617 }
7618
7619 apex_key {
7620 name: "myapex.key",
7621 public_key: "testkey.avbpubkey",
7622 private_key: "testkey.pem",
7623 }
7624
7625 cc_library {
7626 name: "libfoo",
7627 srcs: ["foo.cpp"],
7628 shared_libs: ["libbar"],
7629 apex_available: ["myapex"],
7630 }
7631
7632 cc_library {
7633 name: "libbar",
7634 srcs: ["bar.cpp"],
7635 apex_available: ["myapex"],
7636 }`
7637 ctx := testApex(t, bp)
7638 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7639 "*/libc++.so",
7640 "*/libfoo.so",
7641 // not libbar.so
7642 })
7643}
7644
Jiyong Park479321d2019-12-16 11:47:12 +09007645func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7646 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7647 apex {
7648 name: "myapex",
7649 key: "myapex.key",
7650 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007651 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007652 }
7653
7654 apex_key {
7655 name: "myapex.key",
7656 public_key: "testkey.avbpubkey",
7657 private_key: "testkey.pem",
7658 }
7659
7660 java_library {
7661 name: "myjar",
7662 srcs: ["foo/bar/MyClass.java"],
7663 sdk_version: "none",
7664 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007665 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007666 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007667 }
7668 `)
7669}
7670
Jiyong Park7afd1072019-12-30 16:56:33 +09007671func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007672 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007673 apex {
7674 name: "myapex",
7675 key: "myapex.key",
7676 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007677 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007678 }
7679
7680 apex_key {
7681 name: "myapex.key",
7682 public_key: "testkey.avbpubkey",
7683 private_key: "testkey.pem",
7684 }
7685
7686 cc_library {
7687 name: "mylib",
7688 srcs: ["mylib.cpp"],
7689 system_shared_libs: [],
7690 stl: "none",
7691 required: ["a", "b"],
7692 host_required: ["c", "d"],
7693 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007694 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007695 }
7696 `)
7697
Jooyung Hana0503a52023-08-23 13:12:50 +09007698 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007699 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007700 name := apexBundle.BaseModuleName()
7701 prefix := "TARGET_"
7702 var builder strings.Builder
7703 data.Custom(&builder, name, prefix, "", data)
7704 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007705 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007706 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7707 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007708}
7709
Jiyong Park7cd10e32020-01-14 09:22:18 +09007710func TestSymlinksFromApexToSystem(t *testing.T) {
7711 bp := `
7712 apex {
7713 name: "myapex",
7714 key: "myapex.key",
7715 native_shared_libs: ["mylib"],
7716 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007717 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007718 }
7719
Jiyong Park9d677202020-02-19 16:29:35 +09007720 apex {
7721 name: "myapex.updatable",
7722 key: "myapex.key",
7723 native_shared_libs: ["mylib"],
7724 java_libs: ["myjar"],
7725 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007726 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007727 }
7728
Jiyong Park7cd10e32020-01-14 09:22:18 +09007729 apex_key {
7730 name: "myapex.key",
7731 public_key: "testkey.avbpubkey",
7732 private_key: "testkey.pem",
7733 }
7734
7735 cc_library {
7736 name: "mylib",
7737 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007738 shared_libs: [
7739 "myotherlib",
7740 "myotherlib_ext",
7741 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007742 system_shared_libs: [],
7743 stl: "none",
7744 apex_available: [
7745 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007746 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007747 "//apex_available:platform",
7748 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007749 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007750 }
7751
7752 cc_library {
7753 name: "myotherlib",
7754 srcs: ["mylib.cpp"],
7755 system_shared_libs: [],
7756 stl: "none",
7757 apex_available: [
7758 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007759 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007760 "//apex_available:platform",
7761 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007762 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007763 }
7764
Jiyong Parkce243632023-02-17 18:22:25 +09007765 cc_library {
7766 name: "myotherlib_ext",
7767 srcs: ["mylib.cpp"],
7768 system_shared_libs: [],
7769 system_ext_specific: true,
7770 stl: "none",
7771 apex_available: [
7772 "myapex",
7773 "myapex.updatable",
7774 "//apex_available:platform",
7775 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007776 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007777 }
7778
Jiyong Park7cd10e32020-01-14 09:22:18 +09007779 java_library {
7780 name: "myjar",
7781 srcs: ["foo/bar/MyClass.java"],
7782 sdk_version: "none",
7783 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007784 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007785 apex_available: [
7786 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007787 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007788 "//apex_available:platform",
7789 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007790 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007791 }
7792
7793 java_library {
7794 name: "myotherjar",
7795 srcs: ["foo/bar/MyClass.java"],
7796 sdk_version: "none",
7797 system_modules: "none",
7798 apex_available: [
7799 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007800 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007801 "//apex_available:platform",
7802 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007803 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007804 }
7805 `
7806
7807 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7808 for _, f := range files {
7809 if f.path == file {
7810 if f.isLink {
7811 t.Errorf("%q is not a real file", file)
7812 }
7813 return
7814 }
7815 }
7816 t.Errorf("%q is not found", file)
7817 }
7818
Jiyong Parkce243632023-02-17 18:22:25 +09007819 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007820 for _, f := range files {
7821 if f.path == file {
7822 if !f.isLink {
7823 t.Errorf("%q is not a symlink", file)
7824 }
Jiyong Parkce243632023-02-17 18:22:25 +09007825 if f.src != target {
7826 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7827 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007828 return
7829 }
7830 }
7831 t.Errorf("%q is not found", file)
7832 }
7833
Jiyong Park9d677202020-02-19 16:29:35 +09007834 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7835 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007836 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007837 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007838 ensureRealfileExists(t, files, "javalib/myjar.jar")
7839 ensureRealfileExists(t, files, "lib64/mylib.so")
7840 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007841 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007842
Jooyung Hana0503a52023-08-23 13:12:50 +09007843 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007844 ensureRealfileExists(t, files, "javalib/myjar.jar")
7845 ensureRealfileExists(t, files, "lib64/mylib.so")
7846 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007847 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007848
7849 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007850 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007851 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007852 ensureRealfileExists(t, files, "javalib/myjar.jar")
7853 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007854 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7855 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007856
Jooyung Hana0503a52023-08-23 13:12:50 +09007857 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007858 ensureRealfileExists(t, files, "javalib/myjar.jar")
7859 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007860 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7861 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007862}
7863
Yo Chiange8128052020-07-23 20:09:18 +08007864func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007865 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007866 apex {
7867 name: "myapex",
7868 key: "myapex.key",
7869 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007870 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007871 }
7872
7873 apex_key {
7874 name: "myapex.key",
7875 public_key: "testkey.avbpubkey",
7876 private_key: "testkey.pem",
7877 }
7878
7879 cc_library_shared {
7880 name: "mylib",
7881 srcs: ["mylib.cpp"],
7882 shared_libs: ["myotherlib"],
7883 system_shared_libs: [],
7884 stl: "none",
7885 apex_available: [
7886 "myapex",
7887 "//apex_available:platform",
7888 ],
7889 }
7890
7891 cc_prebuilt_library_shared {
7892 name: "myotherlib",
7893 srcs: ["prebuilt.so"],
7894 system_shared_libs: [],
7895 stl: "none",
7896 apex_available: [
7897 "myapex",
7898 "//apex_available:platform",
7899 ],
7900 }
7901 `)
7902
Jooyung Hana0503a52023-08-23 13:12:50 +09007903 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007904 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007905 var builder strings.Builder
7906 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7907 androidMk := builder.String()
7908 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007909 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007910 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7911 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7912 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007913 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007914}
7915
Jooyung Han643adc42020-02-27 13:50:06 +09007916func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007917 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007918 apex {
7919 name: "myapex",
7920 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007921 binaries: ["mybin"],
7922 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007923 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007924 }
7925
7926 apex_key {
7927 name: "myapex.key",
7928 public_key: "testkey.avbpubkey",
7929 private_key: "testkey.pem",
7930 }
7931
7932 cc_library {
7933 name: "mylib",
7934 srcs: ["mylib.cpp"],
7935 shared_libs: ["mylib2"],
7936 system_shared_libs: [],
7937 stl: "none",
7938 apex_available: [ "myapex" ],
7939 }
7940
7941 cc_library {
7942 name: "mylib2",
7943 srcs: ["mylib.cpp"],
7944 system_shared_libs: [],
7945 stl: "none",
7946 apex_available: [ "myapex" ],
7947 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007948
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007949 // Used as both a JNI library and a regular shared library.
7950 cc_library {
7951 name: "mylib3",
7952 srcs: ["mylib.cpp"],
7953 system_shared_libs: [],
7954 stl: "none",
7955 apex_available: [ "myapex" ],
7956 }
7957
7958 cc_binary {
7959 name: "mybin",
7960 srcs: ["mybin.cpp"],
7961 shared_libs: ["mylib3"],
7962 system_shared_libs: [],
7963 stl: "none",
7964 apex_available: [ "myapex" ],
7965 }
7966
Jiyong Park34d5c332022-02-24 18:02:44 +09007967 rust_ffi_shared {
7968 name: "libfoo.rust",
7969 crate_name: "foo",
7970 srcs: ["foo.rs"],
7971 shared_libs: ["libfoo.shared_from_rust"],
7972 prefer_rlib: true,
7973 apex_available: ["myapex"],
7974 }
7975
7976 cc_library_shared {
7977 name: "libfoo.shared_from_rust",
7978 srcs: ["mylib.cpp"],
7979 system_shared_libs: [],
7980 stl: "none",
7981 stubs: {
7982 versions: ["10", "11", "12"],
7983 },
7984 }
7985
Jooyung Han643adc42020-02-27 13:50:06 +09007986 `)
7987
Jooyung Hana0503a52023-08-23 13:12:50 +09007988 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007989 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007990 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007991 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007992 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007993 "lib64/mylib.so",
7994 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007995 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007996 "lib64/libfoo.rust.so",
7997 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7998 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007999 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008000
8001 // b/220397949
8002 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008003}
8004
Jooyung Han49f67012020-04-17 13:43:10 +09008005func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008006 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008007 apex {
8008 name: "myapex",
8009 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008010 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008011 }
8012 apex_key {
8013 name: "myapex.key",
8014 public_key: "testkey.avbpubkey",
8015 private_key: "testkey.pem",
8016 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008017 `,
8018 android.FixtureModifyConfig(func(config android.Config) {
8019 delete(config.Targets, android.Android)
8020 config.AndroidCommonTarget = android.Target{}
8021 }),
8022 )
Jooyung Han49f67012020-04-17 13:43:10 +09008023
8024 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8025 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8026 }
8027}
8028
Jiyong Parkbd159612020-02-28 15:22:21 +09008029func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008030 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008031 apex {
8032 name: "myapex",
8033 key: "myapex.key",
8034 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008035 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008036 }
8037
8038 apex_key {
8039 name: "myapex.key",
8040 public_key: "testkey.avbpubkey",
8041 private_key: "testkey.pem",
8042 }
8043
8044 android_app {
8045 name: "AppFoo",
8046 srcs: ["foo/bar/MyClass.java"],
8047 sdk_version: "none",
8048 system_modules: "none",
8049 apex_available: [ "myapex" ],
8050 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008051 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008052
Jooyung Hana0503a52023-08-23 13:12:50 +09008053 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008054 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008055
8056 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008057 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 +09008058}
8059
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008060func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008061 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008062 apex {
8063 name: "myapex",
8064 key: "myapex.key",
8065 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008066 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008067 }
8068
8069 apex_key {
8070 name: "myapex.key",
8071 public_key: "testkey.avbpubkey",
8072 private_key: "testkey.pem",
8073 }
8074
8075 android_app_set {
8076 name: "AppSet",
8077 set: "AppSet.apks",
8078 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008079 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008080 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008081 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008082 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8083 s := mod.Rule("apexRule").Args["copy_commands"]
8084 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008085 if len(copyCmds) != 4 {
8086 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008087 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008088 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8089 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008090 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8091 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008092
8093 // Ensure that canned_fs_config has an entry for the app set zip file
8094 generateFsRule := mod.Rule("generateFsConfig")
8095 cmd := generateFsRule.RuleParams.Command
8096 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008097}
8098
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008099func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008100 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008101 apex_set {
8102 name: "myapex",
8103 filename: "foo_v2.apex",
8104 sanitized: {
8105 none: { set: "myapex.apks", },
8106 hwaddress: { set: "myapex.hwasan.apks", },
8107 },
Paul Duffin24704672021-04-06 16:09:30 +01008108 }
8109 `
8110 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008111
Paul Duffin24704672021-04-06 16:09:30 +01008112 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008113 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008114
Spandan Das3576e762024-01-03 18:57:03 +00008115 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008116 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008117
Paul Duffin24704672021-04-06 16:09:30 +01008118 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8119
8120 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008121 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8122 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008123
8124 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008125}
8126
Pranav Guptaeba03b02022-09-27 00:27:08 +00008127func TestApexSetApksModuleAssignment(t *testing.T) {
8128 ctx := testApex(t, `
8129 apex_set {
8130 name: "myapex",
8131 set: ":myapex_apks_file",
8132 }
8133
8134 filegroup {
8135 name: "myapex_apks_file",
8136 srcs: ["myapex.apks"],
8137 }
8138 `)
8139
Spandan Das3576e762024-01-03 18:57:03 +00008140 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008141
8142 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008143 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008144 extractedApex := m.Output(extractorOutput)
8145
8146 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8147}
8148
Paul Duffin89f570a2021-06-16 01:42:33 +01008149func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008150 t.Helper()
8151
Paul Duffin55607122021-03-30 23:32:51 +01008152 fs := android.MockFS{
8153 "a.java": nil,
8154 "a.jar": nil,
8155 "apex_manifest.json": nil,
8156 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008157 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008158 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8159 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8160 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008161 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008162 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008163
Paul Duffin55607122021-03-30 23:32:51 +01008164 errorHandler := android.FixtureExpectsNoErrors
8165 if errmsg != "" {
8166 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008167 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008168
Paul Duffin55607122021-03-30 23:32:51 +01008169 result := android.GroupFixturePreparers(
8170 cc.PrepareForTestWithCcDefaultModules,
8171 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008172 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008173 java.PrepareForTestWithJavaSdkLibraryFiles,
8174 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008175 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008176 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008177 android.FixtureModifyMockFS(func(fs android.MockFS) {
8178 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8179 insert := ""
8180 for _, fragment := range fragments {
8181 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8182 }
8183 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8184 platform_bootclasspath {
8185 name: "platform-bootclasspath",
8186 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008187 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008188 %s
8189 ],
8190 }
8191 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008192 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008193 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008194 // Dexpreopt for boot jars requires the ART boot image profile.
8195 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8196 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008197 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008198 ).
8199 ExtendWithErrorHandler(errorHandler).
8200 RunTestWithBp(t, bp)
8201
8202 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008203}
8204
Paul Duffin5556c5f2022-06-09 17:32:21 +00008205func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008206 preparers := android.GroupFixturePreparers(
8207 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008208 prepareForTestWithBootclasspathFragment,
8209 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008210 PrepareForTestWithApexBuildComponents,
8211 ).
8212 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008213 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008214
8215 bpBase := `
8216 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008217 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008218 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008219 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008220 set: "myapex.apks",
8221 }
8222
8223 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008224 name: "com.mycompany.android.art",
8225 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008226 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008227 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008228 set: "company-myapex.apks",
8229 }
8230
8231 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008232 name: "art-bootclasspath-fragment",
8233 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008234 hidden_api: {
8235 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8236 metadata: "my-bootclasspath-fragment/metadata.csv",
8237 index: "my-bootclasspath-fragment/index.csv",
8238 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8239 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8240 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008241 %s
8242 }
8243 `
8244
8245 t.Run("java_import", func(t *testing.T) {
8246 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8247 java_import {
8248 name: "libfoo",
8249 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008250 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008251 }
8252 `)
8253 })
8254
8255 t.Run("java_sdk_library_import", func(t *testing.T) {
8256 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8257 java_sdk_library_import {
8258 name: "libfoo",
8259 public: {
8260 jars: ["libbar.jar"],
8261 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008262 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008263 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008264 }
8265 `)
8266 })
8267
8268 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8269 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8270 image_name: "art",
8271 contents: ["libfoo"],
8272 `)+`
8273 java_sdk_library_import {
8274 name: "libfoo",
8275 public: {
8276 jars: ["libbar.jar"],
8277 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008278 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008279 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008280 }
8281 `)
8282 })
8283}
8284
Paul Duffin5556c5f2022-06-09 17:32:21 +00008285func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8286 preparers := android.GroupFixturePreparers(
8287 java.PrepareForTestWithJavaDefaultModules,
8288 PrepareForTestWithApexBuildComponents,
8289 )
8290
Spandan Das59a4a2b2024-01-09 21:35:56 +00008291 errCtx := moduleErrorfTestCtx{}
8292
Paul Duffin5556c5f2022-06-09 17:32:21 +00008293 bpBase := `
8294 apex_set {
8295 name: "com.android.myapex",
8296 installable: true,
8297 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8298 set: "myapex.apks",
8299 }
8300
8301 apex_set {
8302 name: "com.android.myapex_compressed",
8303 apex_name: "com.android.myapex",
8304 installable: true,
8305 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8306 set: "myapex_compressed.apks",
8307 }
8308
8309 prebuilt_bootclasspath_fragment {
8310 name: "my-bootclasspath-fragment",
8311 apex_available: [
8312 "com.android.myapex",
8313 "com.android.myapex_compressed",
8314 ],
8315 hidden_api: {
8316 annotation_flags: "annotation-flags.csv",
8317 metadata: "metadata.csv",
8318 index: "index.csv",
8319 signature_patterns: "signature_patterns.csv",
8320 },
8321 %s
8322 }
8323 `
8324
8325 t.Run("java_import", func(t *testing.T) {
8326 result := preparers.RunTestWithBp(t,
8327 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8328 java_import {
8329 name: "libfoo",
8330 jars: ["libfoo.jar"],
8331 apex_available: [
8332 "com.android.myapex",
8333 "com.android.myapex_compressed",
8334 ],
8335 }
8336 `)
8337
8338 module := result.Module("libfoo", "android_common_com.android.myapex")
8339 usesLibraryDep := module.(java.UsesLibraryDependency)
8340 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008341 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008342 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008343 })
8344
8345 t.Run("java_sdk_library_import", func(t *testing.T) {
8346 result := preparers.RunTestWithBp(t,
8347 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8348 java_sdk_library_import {
8349 name: "libfoo",
8350 public: {
8351 jars: ["libbar.jar"],
8352 },
8353 apex_available: [
8354 "com.android.myapex",
8355 "com.android.myapex_compressed",
8356 ],
8357 compile_dex: true,
8358 }
8359 `)
8360
8361 module := result.Module("libfoo", "android_common_com.android.myapex")
8362 usesLibraryDep := module.(java.UsesLibraryDependency)
8363 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008364 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008365 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008366 })
8367
8368 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8369 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8370 image_name: "art",
8371 contents: ["libfoo"],
8372 `)+`
8373 java_sdk_library_import {
8374 name: "libfoo",
8375 public: {
8376 jars: ["libbar.jar"],
8377 },
8378 apex_available: [
8379 "com.android.myapex",
8380 "com.android.myapex_compressed",
8381 ],
8382 compile_dex: true,
8383 }
8384 `)
8385 })
8386}
8387
Jooyung Han548640b2020-04-27 12:10:30 +09008388func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8389 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8390 apex {
8391 name: "myapex",
8392 key: "myapex.key",
8393 updatable: true,
8394 }
8395
8396 apex_key {
8397 name: "myapex.key",
8398 public_key: "testkey.avbpubkey",
8399 private_key: "testkey.pem",
8400 }
8401 `)
8402}
8403
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008404func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8405 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8406 apex {
8407 name: "myapex",
8408 key: "myapex.key",
8409 }
8410
8411 apex_key {
8412 name: "myapex.key",
8413 public_key: "testkey.avbpubkey",
8414 private_key: "testkey.pem",
8415 }
8416 `)
8417}
8418
satayevb98371c2021-06-15 16:49:50 +01008419func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8420 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8421 apex {
8422 name: "myapex",
8423 key: "myapex.key",
8424 systemserverclasspath_fragments: [
8425 "mysystemserverclasspathfragment",
8426 ],
8427 min_sdk_version: "29",
8428 updatable: true,
8429 }
8430
8431 apex_key {
8432 name: "myapex.key",
8433 public_key: "testkey.avbpubkey",
8434 private_key: "testkey.pem",
8435 }
8436
8437 java_library {
8438 name: "foo",
8439 srcs: ["b.java"],
8440 min_sdk_version: "29",
8441 installable: true,
8442 apex_available: [
8443 "myapex",
8444 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008445 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008446 }
8447
8448 systemserverclasspath_fragment {
8449 name: "mysystemserverclasspathfragment",
8450 generate_classpaths_proto: false,
8451 contents: [
8452 "foo",
8453 ],
8454 apex_available: [
8455 "myapex",
8456 ],
8457 }
satayevabcd5972021-08-06 17:49:46 +01008458 `,
8459 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8460 )
satayevb98371c2021-06-15 16:49:50 +01008461}
8462
Paul Duffin064b70c2020-11-02 17:32:38 +00008463func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008464 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008465 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008466 fragment := java.ApexVariantReference{
8467 Apex: proptools.StringPtr("myapex"),
8468 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8469 }
8470
Paul Duffin064b70c2020-11-02 17:32:38 +00008471 testDexpreoptWithApexes(t, `
8472 prebuilt_apex {
8473 name: "myapex" ,
8474 arch: {
8475 arm64: {
8476 src: "myapex-arm64.apex",
8477 },
8478 arm: {
8479 src: "myapex-arm.apex",
8480 },
8481 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008482 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8483 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008484
Paul Duffin89f570a2021-06-16 01:42:33 +01008485 prebuilt_bootclasspath_fragment {
8486 name: "my-bootclasspath-fragment",
8487 contents: ["libfoo"],
8488 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008489 hidden_api: {
8490 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8491 metadata: "my-bootclasspath-fragment/metadata.csv",
8492 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008493 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8494 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8495 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008496 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008497 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008498
Paul Duffin89f570a2021-06-16 01:42:33 +01008499 java_import {
8500 name: "libfoo",
8501 jars: ["libfoo.jar"],
8502 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008503 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008504 }
8505 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008506 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008507}
8508
Spandan Dasf14e2542021-11-12 00:01:37 +00008509func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008510 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008511 bp += `
8512 apex_key {
8513 name: "myapex.key",
8514 public_key: "testkey.avbpubkey",
8515 private_key: "testkey.pem",
8516 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008517 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008518 "lib1/src/A.java": nil,
8519 "lib2/src/B.java": nil,
8520 "system/sepolicy/apex/myapex-file_contexts": nil,
8521 }
8522
Paul Duffin45338f02021-03-30 23:07:52 +01008523 errorHandler := android.FixtureExpectsNoErrors
8524 if errmsg != "" {
8525 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008526 }
Colin Crossae8600b2020-10-29 17:09:13 -07008527
Paul Duffin45338f02021-03-30 23:07:52 +01008528 android.GroupFixturePreparers(
8529 android.PrepareForTestWithAndroidBuildComponents,
8530 java.PrepareForTestWithJavaBuildComponents,
8531 PrepareForTestWithApexBuildComponents,
8532 android.PrepareForTestWithNeverallowRules(rules),
8533 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008534 apexBootJars := make([]string, 0, len(bootJars))
8535 for _, apexBootJar := range bootJars {
8536 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008537 }
satayevd604b212021-07-21 14:23:52 +01008538 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008539 }),
8540 fs.AddToFixture(),
8541 ).
8542 ExtendWithErrorHandler(errorHandler).
8543 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008544}
8545
8546func TestApexPermittedPackagesRules(t *testing.T) {
8547 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008548 name string
8549 expectedError string
8550 bp string
8551 bootJars []string
8552 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008553 }{
8554
8555 {
8556 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8557 expectedError: "",
8558 bp: `
8559 java_library {
8560 name: "bcp_lib1",
8561 srcs: ["lib1/src/*.java"],
8562 permitted_packages: ["foo.bar"],
8563 apex_available: ["myapex"],
8564 sdk_version: "none",
8565 system_modules: "none",
8566 }
8567 java_library {
8568 name: "nonbcp_lib2",
8569 srcs: ["lib2/src/*.java"],
8570 apex_available: ["myapex"],
8571 permitted_packages: ["a.b"],
8572 sdk_version: "none",
8573 system_modules: "none",
8574 }
8575 apex {
8576 name: "myapex",
8577 key: "myapex.key",
8578 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008579 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008580 }`,
8581 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008582 bcpPermittedPackages: map[string][]string{
8583 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008584 "foo.bar",
8585 },
8586 },
8587 },
8588 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008589 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008590 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 +01008591 bp: `
8592 java_library {
8593 name: "bcp_lib1",
8594 srcs: ["lib1/src/*.java"],
8595 apex_available: ["myapex"],
8596 permitted_packages: ["foo.bar"],
8597 sdk_version: "none",
8598 system_modules: "none",
8599 }
8600 java_library {
8601 name: "bcp_lib2",
8602 srcs: ["lib2/src/*.java"],
8603 apex_available: ["myapex"],
8604 permitted_packages: ["foo.bar", "bar.baz"],
8605 sdk_version: "none",
8606 system_modules: "none",
8607 }
8608 apex {
8609 name: "myapex",
8610 key: "myapex.key",
8611 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008612 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008613 }
8614 `,
8615 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008616 bcpPermittedPackages: map[string][]string{
8617 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008618 "foo.bar",
8619 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008620 "bcp_lib2": []string{
8621 "foo.bar",
8622 },
8623 },
8624 },
8625 {
8626 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8627 expectedError: "",
8628 bp: `
8629 java_library {
8630 name: "bcp_lib_restricted",
8631 srcs: ["lib1/src/*.java"],
8632 apex_available: ["myapex"],
8633 permitted_packages: ["foo.bar"],
8634 sdk_version: "none",
8635 min_sdk_version: "29",
8636 system_modules: "none",
8637 }
8638 java_library {
8639 name: "bcp_lib_unrestricted",
8640 srcs: ["lib2/src/*.java"],
8641 apex_available: ["myapex"],
8642 permitted_packages: ["foo.bar", "bar.baz"],
8643 sdk_version: "none",
8644 min_sdk_version: "29",
8645 system_modules: "none",
8646 }
8647 apex {
8648 name: "myapex",
8649 key: "myapex.key",
8650 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8651 updatable: true,
8652 min_sdk_version: "29",
8653 }
8654 `,
8655 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8656 bcpPermittedPackages: map[string][]string{
8657 "bcp_lib1_non_updateable": []string{
8658 "foo.bar",
8659 },
8660 // 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 +01008661 },
8662 },
8663 }
8664 for _, tc := range testcases {
8665 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008666 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8667 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008668 })
8669 }
8670}
8671
Jiyong Park62304bb2020-04-13 16:19:48 +09008672func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008673 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008674 apex {
8675 name: "myapex",
8676 key: "myapex.key",
8677 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008678 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008679 }
8680
8681 apex_key {
8682 name: "myapex.key",
8683 public_key: "testkey.avbpubkey",
8684 private_key: "testkey.pem",
8685 }
8686
8687 cc_library {
8688 name: "mylib",
8689 srcs: ["mylib.cpp"],
8690 system_shared_libs: [],
8691 stl: "none",
8692 stubs: {
8693 versions: ["1"],
8694 },
8695 apex_available: ["myapex"],
8696 }
8697
8698 cc_library {
8699 name: "myprivlib",
8700 srcs: ["mylib.cpp"],
8701 system_shared_libs: [],
8702 stl: "none",
8703 apex_available: ["myapex"],
8704 }
8705
8706
8707 cc_test {
8708 name: "mytest",
8709 gtest: false,
8710 srcs: ["mylib.cpp"],
8711 system_shared_libs: [],
8712 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008713 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008714 test_for: ["myapex"]
8715 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008716
8717 cc_library {
8718 name: "mytestlib",
8719 srcs: ["mylib.cpp"],
8720 system_shared_libs: [],
8721 shared_libs: ["mylib", "myprivlib"],
8722 stl: "none",
8723 test_for: ["myapex"],
8724 }
8725
8726 cc_benchmark {
8727 name: "mybench",
8728 srcs: ["mylib.cpp"],
8729 system_shared_libs: [],
8730 shared_libs: ["mylib", "myprivlib"],
8731 stl: "none",
8732 test_for: ["myapex"],
8733 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008734 `)
8735
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008736 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008737 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008738 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8739 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8740 }
8741
8742 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008743 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008744 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8745 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8746 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8747}
Jiyong Park46a512f2020-12-04 18:02:13 +09008748
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008749func TestIndirectTestFor(t *testing.T) {
8750 ctx := testApex(t, `
8751 apex {
8752 name: "myapex",
8753 key: "myapex.key",
8754 native_shared_libs: ["mylib", "myprivlib"],
8755 updatable: false,
8756 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008757
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008758 apex_key {
8759 name: "myapex.key",
8760 public_key: "testkey.avbpubkey",
8761 private_key: "testkey.pem",
8762 }
8763
8764 cc_library {
8765 name: "mylib",
8766 srcs: ["mylib.cpp"],
8767 system_shared_libs: [],
8768 stl: "none",
8769 stubs: {
8770 versions: ["1"],
8771 },
8772 apex_available: ["myapex"],
8773 }
8774
8775 cc_library {
8776 name: "myprivlib",
8777 srcs: ["mylib.cpp"],
8778 system_shared_libs: [],
8779 stl: "none",
8780 shared_libs: ["mylib"],
8781 apex_available: ["myapex"],
8782 }
8783
8784 cc_library {
8785 name: "mytestlib",
8786 srcs: ["mylib.cpp"],
8787 system_shared_libs: [],
8788 shared_libs: ["myprivlib"],
8789 stl: "none",
8790 test_for: ["myapex"],
8791 }
8792 `)
8793
8794 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008795 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008796 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8797 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8798 }
8799
8800 // The platform variant of mytestlib links to the platform variant of the
8801 // internal myprivlib.
8802 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8803
8804 // The platform variant of myprivlib links to the platform variant of mylib
8805 // and bypasses its stubs.
8806 ensureLinkedLibIs("myprivlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09008807}
8808
Martin Stjernholmec009002021-03-27 15:18:31 +00008809func TestTestForForLibInOtherApex(t *testing.T) {
8810 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8811 _ = testApex(t, `
8812 apex {
8813 name: "com.android.art",
8814 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008815 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008816 updatable: false,
8817 }
8818
8819 apex {
8820 name: "com.android.art.debug",
8821 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008822 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008823 updatable: false,
8824 }
8825
8826 apex_key {
8827 name: "myapex.key",
8828 public_key: "testkey.avbpubkey",
8829 private_key: "testkey.pem",
8830 }
8831
8832 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008833 name: "libnativebridge",
8834 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008835 system_shared_libs: [],
8836 stl: "none",
8837 stubs: {
8838 versions: ["1"],
8839 },
8840 apex_available: ["com.android.art", "com.android.art.debug"],
8841 }
8842
8843 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008844 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008845 srcs: ["mylib.cpp"],
8846 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008847 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008848 stl: "none",
8849 apex_available: ["com.android.art.debug"],
8850 test_for: ["com.android.art"],
8851 }
8852 `,
8853 android.MockFS{
8854 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8855 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8856 }.AddToFixture())
8857}
8858
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008859// TODO(jungjw): Move this to proptools
8860func intPtr(i int) *int {
8861 return &i
8862}
8863
8864func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008865 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008866 apex_set {
8867 name: "myapex",
8868 set: "myapex.apks",
8869 filename: "foo_v2.apex",
8870 overrides: ["foo"],
8871 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008872 `,
8873 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8874 variables.Platform_sdk_version = intPtr(30)
8875 }),
8876 android.FixtureModifyConfig(func(config android.Config) {
8877 config.Targets[android.Android] = []android.Target{
8878 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8879 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8880 }
8881 }),
8882 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008883
Spandan Das3576e762024-01-03 18:57:03 +00008884 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008885
8886 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008887 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008888 actual := extractedApex.Args["abis"]
8889 expected := "ARMEABI_V7A,ARM64_V8A"
8890 if actual != expected {
8891 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8892 }
8893 actual = extractedApex.Args["sdk-version"]
8894 expected = "30"
8895 if actual != expected {
8896 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8897 }
8898
Paul Duffin6717d882021-06-15 19:09:41 +01008899 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008900 a := m.Module().(*ApexSet)
8901 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008902 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008903 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8904 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8905 }
8906}
8907
Anton Hansson805e0a52022-11-25 14:06:46 +00008908func TestApexSet_NativeBridge(t *testing.T) {
8909 ctx := testApex(t, `
8910 apex_set {
8911 name: "myapex",
8912 set: "myapex.apks",
8913 filename: "foo_v2.apex",
8914 overrides: ["foo"],
8915 }
8916 `,
8917 android.FixtureModifyConfig(func(config android.Config) {
8918 config.Targets[android.Android] = []android.Target{
8919 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8920 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8921 }
8922 }),
8923 )
8924
Spandan Das3576e762024-01-03 18:57:03 +00008925 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008926
8927 // Check extract_apks tool parameters. No native bridge arch expected
8928 extractedApex := m.Output("extracted/myapex.apks")
8929 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8930}
8931
Jiyong Park7d95a512020-05-10 15:16:24 +09008932func TestNoStaticLinkingToStubsLib(t *testing.T) {
8933 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8934 apex {
8935 name: "myapex",
8936 key: "myapex.key",
8937 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008938 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008939 }
8940
8941 apex_key {
8942 name: "myapex.key",
8943 public_key: "testkey.avbpubkey",
8944 private_key: "testkey.pem",
8945 }
8946
8947 cc_library {
8948 name: "mylib",
8949 srcs: ["mylib.cpp"],
8950 static_libs: ["otherlib"],
8951 system_shared_libs: [],
8952 stl: "none",
8953 apex_available: [ "myapex" ],
8954 }
8955
8956 cc_library {
8957 name: "otherlib",
8958 srcs: ["mylib.cpp"],
8959 system_shared_libs: [],
8960 stl: "none",
8961 stubs: {
8962 versions: ["1", "2", "3"],
8963 },
8964 apex_available: [ "myapex" ],
8965 }
8966 `)
8967}
8968
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008969func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008970 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008971 apex {
8972 name: "myapex",
8973 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008974 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008975 custom_sign_tool: "sign_myapex",
8976 }
8977
8978 apex_key {
8979 name: "myapex.key",
8980 public_key: "testkey.avbpubkey",
8981 private_key: "testkey.pem",
8982 }
8983 `)
8984
Jooyung Han286957d2023-10-30 16:17:56 +09008985 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008986 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008987 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 +09008988}
8989
8990func TestApexKeysTxtOverrides(t *testing.T) {
8991 ctx := testApex(t, `
8992 apex {
8993 name: "myapex",
8994 key: "myapex.key",
8995 updatable: false,
8996 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008997 }
8998
8999 apex_key {
9000 name: "myapex.key",
9001 public_key: "testkey.avbpubkey",
9002 private_key: "testkey.pem",
9003 }
9004
9005 prebuilt_apex {
9006 name: "myapex",
9007 prefer: true,
9008 arch: {
9009 arm64: {
9010 src: "myapex-arm64.apex",
9011 },
9012 arm: {
9013 src: "myapex-arm.apex",
9014 },
9015 },
9016 }
9017
9018 apex_set {
9019 name: "myapex_set",
9020 set: "myapex.apks",
9021 filename: "myapex_set.apex",
9022 overrides: ["myapex"],
9023 }
9024 `)
9025
Colin Crossf61d03d2023-11-02 16:56:39 -07009026 content := android.ContentFromFileRuleForTests(t, ctx,
9027 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009028 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 -07009029 content = android.ContentFromFileRuleForTests(t, ctx,
9030 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009031 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 +09009032}
9033
Jooyung Han938b5932020-06-20 12:47:47 +09009034func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009035 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009036 apex {
9037 name: "myapex",
9038 key: "myapex.key",
9039 apps: ["app"],
9040 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009041 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009042 }
9043
9044 apex_key {
9045 name: "myapex.key",
9046 public_key: "testkey.avbpubkey",
9047 private_key: "testkey.pem",
9048 }
9049
9050 android_app {
9051 name: "app",
9052 srcs: ["foo/bar/MyClass.java"],
9053 package_name: "foo",
9054 sdk_version: "none",
9055 system_modules: "none",
9056 apex_available: [ "myapex" ],
9057 }
9058 `, withFiles(map[string][]byte{
9059 "sub/Android.bp": []byte(`
9060 override_apex {
9061 name: "override_myapex",
9062 base: "myapex",
9063 apps: ["override_app"],
9064 allowed_files: ":allowed",
9065 }
9066 // Overridable "path" property should be referenced indirectly
9067 filegroup {
9068 name: "allowed",
9069 srcs: ["allowed.txt"],
9070 }
9071 override_android_app {
9072 name: "override_app",
9073 base: "app",
9074 package_name: "bar",
9075 }
9076 `),
9077 }))
9078
Jooyung Hana0503a52023-08-23 13:12:50 +09009079 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009080 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9081 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9082 }
9083
Spandan Das50801e22024-05-13 18:29:45 +00009084 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009085 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9086 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9087 }
9088}
9089
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009090func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009091 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009092 apex {
9093 name: "myapex",
9094 key: "myapex.key",
9095 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009096 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009097 }
9098
9099 apex_key {
9100 name: "myapex.key",
9101 public_key: "testkey.avbpubkey",
9102 private_key: "testkey.pem",
9103 }
9104
9105 cc_library {
9106 name: "mylib",
9107 srcs: ["mylib.cpp"],
9108 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009109 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009110 },
9111 apex_available: ["myapex"],
9112 }
9113
9114 cc_prebuilt_library_shared {
9115 name: "mylib",
9116 prefer: false,
9117 srcs: ["prebuilt.so"],
9118 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009119 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009120 },
9121 apex_available: ["myapex"],
9122 }
9123 `)
9124}
9125
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009126func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009127 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009128 apex {
9129 name: "myapex",
9130 key: "myapex.key",
9131 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009132 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009133 }
9134 apex_key {
9135 name: "myapex.key",
9136 public_key: "testkey.avbpubkey",
9137 private_key: "testkey.pem",
9138 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009139 `,
9140 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9141 variables.CompressedApex = proptools.BoolPtr(true)
9142 }),
9143 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009144
Jooyung Hana0503a52023-08-23 13:12:50 +09009145 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009146 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9147
Jooyung Hana0503a52023-08-23 13:12:50 +09009148 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009149 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9150
9151 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009152 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009153 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9154
9155 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009156 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009157 var builder strings.Builder
9158 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9159 androidMk := builder.String()
9160 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9161}
9162
Jooyung Han26ec8482024-07-31 15:04:05 +09009163func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
9164 for _, compressionEnabled := range []bool{true, false} {
9165 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
9166 ctx := testApex(t, `
9167 apex_set {
9168 name: "com.company.android.myapex",
9169 apex_name: "com.android.myapex",
9170 set: "company-myapex.apks",
9171 }
9172 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9173 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9174 }),
9175 )
9176
9177 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9178 if compressionEnabled {
9179 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9180 } else {
9181 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9182 }
9183 })
9184 }
9185}
9186
Martin Stjernholm2856c662020-12-02 15:03:42 +00009187func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009188 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009189 apex {
9190 name: "myapex",
9191 key: "myapex.key",
9192 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009193 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009194 }
9195
9196 apex_key {
9197 name: "myapex.key",
9198 public_key: "testkey.avbpubkey",
9199 private_key: "testkey.pem",
9200 }
9201
9202 cc_library {
9203 name: "mylib",
9204 srcs: ["mylib.cpp"],
9205 apex_available: ["myapex"],
9206 shared_libs: ["otherlib"],
9207 system_shared_libs: [],
9208 }
9209
9210 cc_library {
9211 name: "otherlib",
9212 srcs: ["mylib.cpp"],
9213 stubs: {
9214 versions: ["current"],
9215 },
9216 }
9217
9218 cc_prebuilt_library_shared {
9219 name: "otherlib",
9220 prefer: true,
9221 srcs: ["prebuilt.so"],
9222 stubs: {
9223 versions: ["current"],
9224 },
9225 }
9226 `)
9227
Jooyung Hana0503a52023-08-23 13:12:50 +09009228 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009229 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009230 var builder strings.Builder
9231 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9232 androidMk := builder.String()
9233
9234 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9235 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009236 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009237}
9238
Jiyong Parke3867542020-12-03 17:28:25 +09009239func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009240 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009241 apex {
9242 name: "myapex",
9243 key: "myapex.key",
9244 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009245 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009246 }
9247
9248 apex_key {
9249 name: "myapex.key",
9250 public_key: "testkey.avbpubkey",
9251 private_key: "testkey.pem",
9252 }
9253
9254 cc_library {
9255 name: "mylib",
9256 srcs: ["mylib.cpp"],
9257 system_shared_libs: [],
9258 stl: "none",
9259 apex_available: ["myapex"],
9260 shared_libs: ["mylib2"],
9261 target: {
9262 apex: {
9263 exclude_shared_libs: ["mylib2"],
9264 },
9265 },
9266 }
9267
9268 cc_library {
9269 name: "mylib2",
9270 srcs: ["mylib.cpp"],
9271 system_shared_libs: [],
9272 stl: "none",
9273 }
9274 `)
9275
9276 // Check if mylib is linked to mylib2 for the non-apex target
9277 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9278 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9279
9280 // Make sure that the link doesn't occur for the apex target
9281 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9282 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9283
9284 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009285 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009286 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9287}
9288
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009289func TestPrebuiltStubLibDep(t *testing.T) {
9290 bpBase := `
9291 apex {
9292 name: "myapex",
9293 key: "myapex.key",
9294 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009295 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009296 }
9297 apex_key {
9298 name: "myapex.key",
9299 public_key: "testkey.avbpubkey",
9300 private_key: "testkey.pem",
9301 }
9302 cc_library {
9303 name: "mylib",
9304 srcs: ["mylib.cpp"],
9305 apex_available: ["myapex"],
9306 shared_libs: ["stublib"],
9307 system_shared_libs: [],
9308 }
9309 apex {
9310 name: "otherapex",
9311 enabled: %s,
9312 key: "myapex.key",
9313 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009314 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009315 }
9316 `
9317
9318 stublibSourceBp := `
9319 cc_library {
9320 name: "stublib",
9321 srcs: ["mylib.cpp"],
9322 apex_available: ["otherapex"],
9323 system_shared_libs: [],
9324 stl: "none",
9325 stubs: {
9326 versions: ["1"],
9327 },
9328 }
9329 `
9330
9331 stublibPrebuiltBp := `
9332 cc_prebuilt_library_shared {
9333 name: "stublib",
9334 srcs: ["prebuilt.so"],
9335 apex_available: ["otherapex"],
9336 stubs: {
9337 versions: ["1"],
9338 },
9339 %s
9340 }
9341 `
9342
9343 tests := []struct {
9344 name string
9345 stublibBp string
9346 usePrebuilt bool
9347 modNames []string // Modules to collect AndroidMkEntries for
9348 otherApexEnabled []string
9349 }{
9350 {
9351 name: "only_source",
9352 stublibBp: stublibSourceBp,
9353 usePrebuilt: false,
9354 modNames: []string{"stublib"},
9355 otherApexEnabled: []string{"true", "false"},
9356 },
9357 {
9358 name: "source_preferred",
9359 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9360 usePrebuilt: false,
9361 modNames: []string{"stublib", "prebuilt_stublib"},
9362 otherApexEnabled: []string{"true", "false"},
9363 },
9364 {
9365 name: "prebuilt_preferred",
9366 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9367 usePrebuilt: true,
9368 modNames: []string{"stublib", "prebuilt_stublib"},
9369 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9370 },
9371 {
9372 name: "only_prebuilt",
9373 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9374 usePrebuilt: true,
9375 modNames: []string{"stublib"},
9376 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9377 },
9378 }
9379
9380 for _, test := range tests {
9381 t.Run(test.name, func(t *testing.T) {
9382 for _, otherApexEnabled := range test.otherApexEnabled {
9383 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009384 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009385
9386 type modAndMkEntries struct {
9387 mod *cc.Module
9388 mkEntries android.AndroidMkEntries
9389 }
9390 entries := []*modAndMkEntries{}
9391
9392 // Gather shared lib modules that are installable
9393 for _, modName := range test.modNames {
9394 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9395 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9396 continue
9397 }
9398 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009399 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009400 continue
9401 }
Colin Crossaa255532020-07-03 13:18:24 -07009402 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009403 if ent.Disabled {
9404 continue
9405 }
9406 entries = append(entries, &modAndMkEntries{
9407 mod: mod,
9408 mkEntries: ent,
9409 })
9410 }
9411 }
9412 }
9413
9414 var entry *modAndMkEntries = nil
9415 for _, ent := range entries {
9416 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9417 if entry != nil {
9418 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9419 } else {
9420 entry = ent
9421 }
9422 }
9423 }
9424
9425 if entry == nil {
9426 t.Errorf("AndroidMk entry for \"stublib\" missing")
9427 } else {
9428 isPrebuilt := entry.mod.Prebuilt() != nil
9429 if isPrebuilt != test.usePrebuilt {
9430 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9431 }
9432 if !entry.mod.IsStubs() {
9433 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9434 }
9435 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9436 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9437 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009438 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009439 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009440 if !android.InList(expected, cflags) {
9441 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9442 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009443 }
9444 })
9445 }
9446 })
9447 }
9448}
9449
Colin Crossc33e5212021-05-25 18:16:02 -07009450func TestApexJavaCoverage(t *testing.T) {
9451 bp := `
9452 apex {
9453 name: "myapex",
9454 key: "myapex.key",
9455 java_libs: ["mylib"],
9456 bootclasspath_fragments: ["mybootclasspathfragment"],
9457 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9458 updatable: false,
9459 }
9460
9461 apex_key {
9462 name: "myapex.key",
9463 public_key: "testkey.avbpubkey",
9464 private_key: "testkey.pem",
9465 }
9466
9467 java_library {
9468 name: "mylib",
9469 srcs: ["mylib.java"],
9470 apex_available: ["myapex"],
9471 compile_dex: true,
9472 }
9473
9474 bootclasspath_fragment {
9475 name: "mybootclasspathfragment",
9476 contents: ["mybootclasspathlib"],
9477 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009478 hidden_api: {
9479 split_packages: ["*"],
9480 },
Colin Crossc33e5212021-05-25 18:16:02 -07009481 }
9482
9483 java_library {
9484 name: "mybootclasspathlib",
9485 srcs: ["mybootclasspathlib.java"],
9486 apex_available: ["myapex"],
9487 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009488 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009489 }
9490
9491 systemserverclasspath_fragment {
9492 name: "mysystemserverclasspathfragment",
9493 contents: ["mysystemserverclasspathlib"],
9494 apex_available: ["myapex"],
9495 }
9496
9497 java_library {
9498 name: "mysystemserverclasspathlib",
9499 srcs: ["mysystemserverclasspathlib.java"],
9500 apex_available: ["myapex"],
9501 compile_dex: true,
9502 }
9503 `
9504
9505 result := android.GroupFixturePreparers(
9506 PrepareForTestWithApexBuildComponents,
9507 prepareForTestWithMyapex,
9508 java.PrepareForTestWithJavaDefaultModules,
9509 android.PrepareForTestWithAndroidBuildComponents,
9510 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009511 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9512 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009513 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009514 ).RunTest(t)
9515
9516 // Make sure jacoco ran on both mylib and mybootclasspathlib
9517 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9518 t.Errorf("Failed to find jacoco rule for mylib")
9519 }
9520 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9521 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9522 }
9523 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9524 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9525 }
9526}
9527
Jiyong Park192600a2021-08-03 07:52:17 +00009528func TestProhibitStaticExecutable(t *testing.T) {
9529 testApexError(t, `executable mybin is static`, `
9530 apex {
9531 name: "myapex",
9532 key: "myapex.key",
9533 binaries: ["mybin"],
9534 min_sdk_version: "29",
9535 }
9536
9537 apex_key {
9538 name: "myapex.key",
9539 public_key: "testkey.avbpubkey",
9540 private_key: "testkey.pem",
9541 }
9542
9543 cc_binary {
9544 name: "mybin",
9545 srcs: ["mylib.cpp"],
9546 relative_install_path: "foo/bar",
9547 static_executable: true,
9548 system_shared_libs: [],
9549 stl: "none",
9550 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009551 min_sdk_version: "29",
9552 }
9553 `)
9554
9555 testApexError(t, `executable mybin.rust is static`, `
9556 apex {
9557 name: "myapex",
9558 key: "myapex.key",
9559 binaries: ["mybin.rust"],
9560 min_sdk_version: "29",
9561 }
9562
9563 apex_key {
9564 name: "myapex.key",
9565 public_key: "testkey.avbpubkey",
9566 private_key: "testkey.pem",
9567 }
9568
9569 rust_binary {
9570 name: "mybin.rust",
9571 srcs: ["foo.rs"],
9572 static_executable: true,
9573 apex_available: ["myapex"],
9574 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009575 }
9576 `)
9577}
9578
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009579func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9580 ctx := testApex(t, `
9581 apex {
9582 name: "myapex",
9583 key: "myapex.key",
9584 updatable: false,
9585 java_libs: ["foo"],
9586 }
9587
9588 apex_key {
9589 name: "myapex.key",
9590 public_key: "testkey.avbpubkey",
9591 private_key: "testkey.pem",
9592 }
9593
9594 java_library {
9595 name: "foo",
9596 srcs: ["foo.java"],
9597 apex_available: ["myapex"],
9598 installable: true,
9599 }
9600 `,
9601 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9602 )
9603
Jooyung Hana0503a52023-08-23 13:12:50 +09009604 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009605 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9606 var builder strings.Builder
9607 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9608 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009609 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 +00009610}
9611
9612func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9613 ctx := testApex(t, `
9614 prebuilt_apex {
9615 name: "myapex",
9616 arch: {
9617 arm64: {
9618 src: "myapex-arm64.apex",
9619 },
9620 arm: {
9621 src: "myapex-arm.apex",
9622 },
9623 },
9624 exported_java_libs: ["foo"],
9625 }
9626
9627 java_import {
9628 name: "foo",
9629 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009630 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009631 }
9632 `,
9633 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9634 )
9635
9636 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9637 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9638 mainModuleEntries := entriesList[0]
9639 android.AssertArrayString(t,
9640 "LOCAL_REQUIRED_MODULES",
9641 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9642 []string{
9643 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9644 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9645 })
9646}
9647
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009648func TestAndroidMk_RequiredModules(t *testing.T) {
9649 ctx := testApex(t, `
9650 apex {
9651 name: "myapex",
9652 key: "myapex.key",
9653 updatable: false,
9654 java_libs: ["foo"],
9655 required: ["otherapex"],
9656 }
9657
9658 apex {
9659 name: "otherapex",
9660 key: "myapex.key",
9661 updatable: false,
9662 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009663 }
9664
9665 apex_key {
9666 name: "myapex.key",
9667 public_key: "testkey.avbpubkey",
9668 private_key: "testkey.pem",
9669 }
9670
9671 java_library {
9672 name: "foo",
9673 srcs: ["foo.java"],
9674 apex_available: ["myapex", "otherapex"],
9675 installable: true,
9676 }
9677 `)
9678
Jooyung Hana0503a52023-08-23 13:12:50 +09009679 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009680 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9681 var builder strings.Builder
9682 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9683 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009684 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009685}
9686
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009687func TestAndroidMk_RequiredDeps(t *testing.T) {
9688 ctx := testApex(t, `
9689 apex {
9690 name: "myapex",
9691 key: "myapex.key",
9692 updatable: false,
9693 }
9694
9695 apex_key {
9696 name: "myapex.key",
9697 public_key: "testkey.avbpubkey",
9698 private_key: "testkey.pem",
9699 }
9700 `)
9701
Jooyung Hana0503a52023-08-23 13:12:50 +09009702 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009703 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009704 data := android.AndroidMkDataForTest(t, ctx, bundle)
9705 var builder strings.Builder
9706 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9707 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009708 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009709}
9710
Jooyung Hana6d36672022-02-24 13:58:07 +09009711func TestApexOutputFileProducer(t *testing.T) {
9712 for _, tc := range []struct {
9713 name string
9714 ref string
9715 expected_data []string
9716 }{
9717 {
9718 name: "test_using_output",
9719 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009720 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009721 },
9722 {
9723 name: "test_using_apex",
9724 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009725 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009726 },
9727 } {
9728 t.Run(tc.name, func(t *testing.T) {
9729 ctx := testApex(t, `
9730 apex {
9731 name: "myapex",
9732 key: "myapex.key",
9733 compressible: true,
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 java_test {
9744 name: "`+tc.name+`",
9745 srcs: ["a.java"],
9746 data: ["`+tc.ref+`"],
9747 }
9748 `,
9749 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9750 variables.CompressedApex = proptools.BoolPtr(true)
9751 }))
9752 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9753 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9754 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9755 })
9756 }
9757}
9758
satayev758968a2021-12-06 11:42:40 +00009759func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9760 preparer := android.GroupFixturePreparers(
9761 PrepareForTestWithApexBuildComponents,
9762 prepareForTestWithMyapex,
9763 java.PrepareForTestWithJavaSdkLibraryFiles,
9764 java.PrepareForTestWithJavaDefaultModules,
9765 android.PrepareForTestWithAndroidBuildComponents,
9766 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9767 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9768 )
9769
9770 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9771 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9772 preparer.RunTestWithBp(t, `
9773 apex {
9774 name: "myapex",
9775 key: "myapex.key",
9776 bootclasspath_fragments: ["mybootclasspathfragment"],
9777 min_sdk_version: "30",
9778 updatable: false,
9779 }
9780
9781 apex_key {
9782 name: "myapex.key",
9783 public_key: "testkey.avbpubkey",
9784 private_key: "testkey.pem",
9785 }
9786
9787 bootclasspath_fragment {
9788 name: "mybootclasspathfragment",
9789 contents: ["mybootclasspathlib"],
9790 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009791 hidden_api: {
9792 split_packages: ["*"],
9793 },
satayev758968a2021-12-06 11:42:40 +00009794 }
9795
9796 java_sdk_library {
9797 name: "mybootclasspathlib",
9798 srcs: ["mybootclasspathlib.java"],
9799 apex_available: ["myapex"],
9800 compile_dex: true,
9801 unsafe_ignore_missing_latest_api: true,
9802 min_sdk_version: "31",
9803 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009804 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009805 }
9806
9807 java_library {
9808 name: "util",
9809 srcs: ["a.java"],
9810 apex_available: ["myapex"],
9811 min_sdk_version: "31",
9812 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009813 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009814 }
9815
9816 java_library {
9817 name: "another_util",
9818 srcs: ["a.java"],
9819 min_sdk_version: "31",
9820 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009821 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009822 }
9823 `)
9824 })
9825
9826 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9827 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9828 preparer.RunTestWithBp(t, `
9829 apex {
9830 name: "myapex",
9831 key: "myapex.key",
9832 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9833 min_sdk_version: "30",
9834 updatable: false,
9835 }
9836
9837 apex_key {
9838 name: "myapex.key",
9839 public_key: "testkey.avbpubkey",
9840 private_key: "testkey.pem",
9841 }
9842
9843 systemserverclasspath_fragment {
9844 name: "mysystemserverclasspathfragment",
9845 contents: ["mysystemserverclasspathlib"],
9846 apex_available: ["myapex"],
9847 }
9848
9849 java_sdk_library {
9850 name: "mysystemserverclasspathlib",
9851 srcs: ["mysystemserverclasspathlib.java"],
9852 apex_available: ["myapex"],
9853 compile_dex: true,
9854 min_sdk_version: "32",
9855 unsafe_ignore_missing_latest_api: true,
9856 static_libs: ["util"],
9857 }
9858
9859 java_library {
9860 name: "util",
9861 srcs: ["a.java"],
9862 apex_available: ["myapex"],
9863 min_sdk_version: "31",
9864 static_libs: ["another_util"],
9865 }
9866
9867 java_library {
9868 name: "another_util",
9869 srcs: ["a.java"],
9870 min_sdk_version: "31",
9871 apex_available: ["myapex"],
9872 }
9873 `)
9874 })
9875
9876 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Jihoon Kang85bc1932024-07-01 17:04:46 +00009877 preparer.
satayev758968a2021-12-06 11:42:40 +00009878 RunTestWithBp(t, `
9879 apex {
9880 name: "myapex",
9881 key: "myapex.key",
9882 bootclasspath_fragments: ["mybootclasspathfragment"],
9883 min_sdk_version: "30",
9884 updatable: false,
9885 }
9886
9887 apex_key {
9888 name: "myapex.key",
9889 public_key: "testkey.avbpubkey",
9890 private_key: "testkey.pem",
9891 }
9892
9893 bootclasspath_fragment {
9894 name: "mybootclasspathfragment",
9895 contents: ["mybootclasspathlib"],
9896 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009897 hidden_api: {
9898 split_packages: ["*"],
9899 },
satayev758968a2021-12-06 11:42:40 +00009900 }
9901
9902 java_sdk_library {
9903 name: "mybootclasspathlib",
9904 srcs: ["mybootclasspathlib.java"],
9905 apex_available: ["myapex"],
9906 compile_dex: true,
9907 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009908 sdk_version: "current",
9909 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009910 }
9911 `)
9912 })
9913
9914 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9915 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9916 RunTestWithBp(t, `
9917 apex {
9918 name: "myapex",
9919 key: "myapex.key",
9920 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9921 min_sdk_version: "30",
9922 updatable: false,
9923 }
9924
9925 apex_key {
9926 name: "myapex.key",
9927 public_key: "testkey.avbpubkey",
9928 private_key: "testkey.pem",
9929 }
9930
9931 systemserverclasspath_fragment {
9932 name: "mysystemserverclasspathfragment",
9933 contents: ["mysystemserverclasspathlib"],
9934 apex_available: ["myapex"],
9935 }
9936
9937 java_sdk_library {
9938 name: "mysystemserverclasspathlib",
9939 srcs: ["mysystemserverclasspathlib.java"],
9940 apex_available: ["myapex"],
9941 compile_dex: true,
9942 unsafe_ignore_missing_latest_api: true,
9943 }
9944 `)
9945 })
9946}
9947
Jiakai Zhang6decef92022-01-12 17:56:19 +00009948// Verifies that the APEX depends on all the Make modules in the list.
9949func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9950 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9951 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009952 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009953 }
9954}
9955
9956// Verifies that the APEX does not depend on any of the Make modules in the list.
9957func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9958 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9959 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009960 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009961 }
9962}
9963
Cole Faust24e25c02024-01-19 14:12:17 -08009964func TestApexStrictUpdtabilityLint(t *testing.T) {
9965 bpTemplate := `
9966 apex {
9967 name: "myapex",
9968 key: "myapex.key",
9969 java_libs: ["myjavalib"],
9970 updatable: %v,
9971 min_sdk_version: "29",
9972 }
9973 apex_key {
9974 name: "myapex.key",
9975 }
9976 java_library {
9977 name: "myjavalib",
9978 srcs: ["MyClass.java"],
9979 apex_available: [ "myapex" ],
9980 lint: {
9981 strict_updatability_linting: %v,
9982 %s
9983 },
9984 sdk_version: "current",
9985 min_sdk_version: "29",
9986 }
9987 `
9988 fs := android.MockFS{
9989 "lint-baseline.xml": nil,
9990 }
9991
9992 testCases := []struct {
9993 testCaseName string
9994 apexUpdatable bool
9995 javaStrictUpdtabilityLint bool
9996 lintFileExists bool
9997 disallowedFlagExpected bool
9998 }{
9999 {
10000 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10001 apexUpdatable: true,
10002 javaStrictUpdtabilityLint: true,
10003 lintFileExists: false,
10004 disallowedFlagExpected: false,
10005 },
10006 {
10007 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10008 apexUpdatable: false,
10009 javaStrictUpdtabilityLint: false,
10010 lintFileExists: true,
10011 disallowedFlagExpected: false,
10012 },
10013 {
10014 testCaseName: "non-updatable apex respects strict updatability of javalib",
10015 apexUpdatable: false,
10016 javaStrictUpdtabilityLint: true,
10017 lintFileExists: true,
10018 disallowedFlagExpected: true,
10019 },
10020 {
10021 testCaseName: "updatable apex sets strict updatability of javalib to true",
10022 apexUpdatable: true,
10023 javaStrictUpdtabilityLint: false, // will be set to true by mutator
10024 lintFileExists: true,
10025 disallowedFlagExpected: true,
10026 },
10027 }
10028
10029 for _, testCase := range testCases {
10030 fixtures := []android.FixturePreparer{}
10031 baselineProperty := ""
10032 if testCase.lintFileExists {
10033 fixtures = append(fixtures, fs.AddToFixture())
10034 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10035 }
10036 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
10037
10038 result := testApex(t, bp, fixtures...)
10039 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10040 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10041 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10042
10043 if disallowedFlagActual != testCase.disallowedFlagExpected {
10044 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10045 }
10046 }
10047}
10048
10049func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10050 bp := `
10051 apex {
10052 name: "myapex",
10053 key: "myapex.key",
10054 java_libs: ["myjavalib"],
10055 updatable: true,
10056 min_sdk_version: "29",
10057 }
10058 apex_key {
10059 name: "myapex.key",
10060 }
10061 java_library {
10062 name: "myjavalib",
10063 srcs: ["MyClass.java"],
10064 apex_available: [ "myapex" ],
10065 sdk_version: "current",
10066 min_sdk_version: "29",
10067 lint: {
10068 baseline_filename: "lint-baseline.xml",
10069 }
10070 }
10071 `
10072
10073 testCases := []struct {
10074 testCaseName string
10075 moduleDirectory string
10076 disallowedFlagExpected bool
10077 }{
10078 {
10079 testCaseName: "lintable module defined outside libcore",
10080 moduleDirectory: "",
10081 disallowedFlagExpected: true,
10082 },
10083 {
10084 testCaseName: "lintable module defined in libcore root directory",
10085 moduleDirectory: "libcore/",
10086 disallowedFlagExpected: false,
10087 },
10088 {
10089 testCaseName: "lintable module defined in libcore child directory",
10090 moduleDirectory: "libcore/childdir/",
10091 disallowedFlagExpected: true,
10092 },
10093 }
10094
10095 for _, testCase := range testCases {
10096 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10097 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10098 result := testApex(t, "", lintFileCreator, bpFileCreator)
10099 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10100 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10101 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10102 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10103
10104 if disallowedFlagActual != testCase.disallowedFlagExpected {
10105 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10106 }
10107 }
10108}
10109
10110// checks transtive deps of an apex coming from bootclasspath_fragment
10111func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10112 bp := `
10113 apex {
10114 name: "myapex",
10115 key: "myapex.key",
10116 bootclasspath_fragments: ["mybootclasspathfragment"],
10117 updatable: true,
10118 min_sdk_version: "29",
10119 }
10120 apex_key {
10121 name: "myapex.key",
10122 }
10123 bootclasspath_fragment {
10124 name: "mybootclasspathfragment",
10125 contents: ["myjavalib"],
10126 apex_available: ["myapex"],
10127 hidden_api: {
10128 split_packages: ["*"],
10129 },
10130 }
10131 java_library {
10132 name: "myjavalib",
10133 srcs: ["MyClass.java"],
10134 apex_available: [ "myapex" ],
10135 sdk_version: "current",
10136 min_sdk_version: "29",
10137 compile_dex: true,
10138 lint: {
10139 baseline_filename: "lint-baseline.xml",
10140 }
10141 }
10142 `
10143 fs := android.MockFS{
10144 "lint-baseline.xml": nil,
10145 }
10146
10147 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10148 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10149 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10150 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10151 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10152 }
10153}
Spandan Das66773252022-01-15 00:23:18 +000010154
Jihoon Kang784c0052024-06-25 22:15:39 +000010155func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
10156 bp := `
10157 apex {
10158 name: "myapex",
10159 key: "myapex.key",
10160 bootclasspath_fragments: ["mybootclasspathfragment"],
10161 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010162 java_libs: [
10163 "jacocoagent",
10164 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010165 }
10166 apex_key {
10167 name: "myapex.key",
10168 }
10169 bootclasspath_fragment {
10170 name: "mybootclasspathfragment",
10171 contents: ["foo"],
10172 apex_available: ["myapex"],
10173 hidden_api: {
10174 split_packages: ["*"],
10175 },
10176 }
10177 java_sdk_library {
10178 name: "foo",
10179 srcs: ["MyClass.java"],
10180 apex_available: [ "myapex" ],
10181 sdk_version: "current",
10182 min_sdk_version: "29",
10183 compile_dex: true,
10184 }
10185 `
10186 fs := android.MockFS{
10187 "lint-baseline.xml": nil,
10188 }
10189
10190 result := android.GroupFixturePreparers(
10191 prepareForApexTest,
10192 java.PrepareForTestWithJavaSdkLibraryFiles,
10193 java.PrepareForTestWithJacocoInstrumentation,
10194 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010195 android.FixtureMergeMockFs(fs),
10196 ).RunTestWithBp(t, bp)
10197
10198 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10199 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10200 android.AssertStringDoesContain(t,
10201 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10202 lintReportInputs, "foo.impl")
10203}
10204
Spandan Das42e89502022-05-06 22:12:55 +000010205// updatable apexes should propagate updatable=true to its apps
10206func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10207 bp := `
10208 apex {
10209 name: "myapex",
10210 key: "myapex.key",
10211 updatable: %v,
10212 apps: [
10213 "myapp",
10214 ],
10215 min_sdk_version: "30",
10216 }
10217 apex_key {
10218 name: "myapex.key",
10219 }
10220 android_app {
10221 name: "myapp",
10222 updatable: %v,
10223 apex_available: [
10224 "myapex",
10225 ],
10226 sdk_version: "current",
10227 min_sdk_version: "30",
10228 }
10229 `
10230 testCases := []struct {
10231 name string
10232 apex_is_updatable_bp bool
10233 app_is_updatable_bp bool
10234 app_is_updatable_expected bool
10235 }{
10236 {
10237 name: "Non-updatable apex respects updatable property of non-updatable app",
10238 apex_is_updatable_bp: false,
10239 app_is_updatable_bp: false,
10240 app_is_updatable_expected: false,
10241 },
10242 {
10243 name: "Non-updatable apex respects updatable property of updatable app",
10244 apex_is_updatable_bp: false,
10245 app_is_updatable_bp: true,
10246 app_is_updatable_expected: true,
10247 },
10248 {
10249 name: "Updatable apex respects updatable property of updatable app",
10250 apex_is_updatable_bp: true,
10251 app_is_updatable_bp: true,
10252 app_is_updatable_expected: true,
10253 },
10254 {
10255 name: "Updatable apex sets updatable=true on non-updatable app",
10256 apex_is_updatable_bp: true,
10257 app_is_updatable_bp: false,
10258 app_is_updatable_expected: true,
10259 },
10260 }
10261 for _, testCase := range testCases {
10262 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10263 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10264 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10265 }
10266}
10267
Kiyoung Kim487689e2022-07-26 09:48:22 +090010268func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10269 bp := `
10270 apex {
10271 name: "myapex",
10272 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010273 native_shared_libs: ["libbaz"],
10274 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010275 min_sdk_version: "29",
10276 }
10277 apex_key {
10278 name: "myapex.key",
10279 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010280 cc_binary {
10281 name: "binfoo",
10282 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010283 apex_available: ["myapex"],
10284 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010285 recovery_available: false,
10286 }
10287 cc_library {
10288 name: "libbar",
10289 srcs: ["libbar.cc"],
10290 stubs: {
10291 symbol_file: "libbar.map.txt",
10292 versions: [
10293 "29",
10294 ],
10295 },
10296 }
10297 cc_library {
10298 name: "libbaz",
10299 srcs: ["libbaz.cc"],
10300 apex_available: ["myapex"],
10301 min_sdk_version: "29",
10302 stubs: {
10303 symbol_file: "libbaz.map.txt",
10304 versions: [
10305 "29",
10306 ],
10307 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010308 }
10309 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010310 name: "libbar",
10311 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010312 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010313 variants: ["apex.29"],
10314 }
10315 cc_api_variant {
10316 name: "libbar",
10317 variant: "apex",
10318 version: "29",
10319 src: "libbar_apex_29.so",
10320 }
10321 cc_api_library {
10322 name: "libbaz",
10323 src: "libbaz_stub.so",
10324 min_sdk_version: "29",
10325 variants: ["apex.29"],
10326 }
10327 cc_api_variant {
10328 name: "libbaz",
10329 variant: "apex",
10330 version: "29",
10331 src: "libbaz_apex_29.so",
10332 }
10333 cc_api_library {
10334 name: "libqux",
10335 src: "libqux_stub.so",
10336 min_sdk_version: "29",
10337 variants: ["apex.29"],
10338 }
10339 cc_api_variant {
10340 name: "libqux",
10341 variant: "apex",
10342 version: "29",
10343 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010344 }
10345 api_imports {
10346 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010347 apex_shared_libs: [
10348 "libbar",
10349 "libbaz",
10350 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010351 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010352 }
10353 `
10354 result := testApex(t, bp)
10355
10356 hasDep := func(m android.Module, wantDep android.Module) bool {
10357 t.Helper()
10358 var found bool
10359 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10360 if dep == wantDep {
10361 found = true
10362 }
10363 })
10364 return found
10365 }
10366
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010367 // Library defines stubs and cc_api_library should be used with cc_api_library
10368 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10369 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10370 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010371
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010372 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10373 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010374
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010375 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10376 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10377 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10378 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10379
10380 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10381 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10382 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10383 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10384 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10385
10386 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10387 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10388 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10389
10390 // cc_api_library defined without original library should be linked with cc_api_library
10391 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10392 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10393 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10394}
10395
10396func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10397 bp := `
10398 apex {
10399 name: "myapex",
10400 key: "myapex.key",
10401 native_shared_libs: ["libbar"],
10402 min_sdk_version: "29",
10403 }
10404 apex_key {
10405 name: "myapex.key",
10406 }
10407 cc_binary {
10408 name: "binfoo",
10409 shared_libs: ["libbar"],
10410 recovery_available: false,
10411 }
10412 cc_library {
10413 name: "libbar",
10414 srcs: ["libbar.cc"],
10415 apex_available: ["myapex"],
10416 min_sdk_version: "29",
10417 stubs: {
10418 symbol_file: "libbar.map.txt",
10419 versions: [
10420 "29",
10421 ],
10422 },
10423 }
10424 cc_api_library {
10425 name: "libbar",
10426 src: "libbar_stub.so",
10427 variants: ["apex.29"],
10428 }
10429 cc_api_variant {
10430 name: "libbar",
10431 variant: "apex",
10432 version: "29",
10433 src: "libbar_apex_29.so",
10434 }
10435 api_imports {
10436 name: "api_imports",
10437 apex_shared_libs: [
10438 "libbar",
10439 ],
10440 }
10441 `
10442
10443 result := testApex(t, bp)
10444
10445 hasDep := func(m android.Module, wantDep android.Module) bool {
10446 t.Helper()
10447 var found bool
10448 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10449 if dep == wantDep {
10450 found = true
10451 }
10452 })
10453 return found
10454 }
10455
10456 // Library defines stubs and cc_api_library should be used with cc_api_library
10457 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10458 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10459 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10460
10461 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10462 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10463
10464 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10465 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10466 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10467 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010468}
Dennis Shend4f5d932023-01-31 20:27:21 +000010469
10470func TestTrimmedApex(t *testing.T) {
10471 bp := `
10472 apex {
10473 name: "myapex",
10474 key: "myapex.key",
10475 native_shared_libs: ["libfoo","libbaz"],
10476 min_sdk_version: "29",
10477 trim_against: "mydcla",
10478 }
10479 apex {
10480 name: "mydcla",
10481 key: "myapex.key",
10482 native_shared_libs: ["libfoo","libbar"],
10483 min_sdk_version: "29",
10484 file_contexts: ":myapex-file_contexts",
10485 dynamic_common_lib_apex: true,
10486 }
10487 apex_key {
10488 name: "myapex.key",
10489 }
10490 cc_library {
10491 name: "libfoo",
10492 shared_libs: ["libc"],
10493 apex_available: ["myapex","mydcla"],
10494 min_sdk_version: "29",
10495 }
10496 cc_library {
10497 name: "libbar",
10498 shared_libs: ["libc"],
10499 apex_available: ["myapex","mydcla"],
10500 min_sdk_version: "29",
10501 }
10502 cc_library {
10503 name: "libbaz",
10504 shared_libs: ["libc"],
10505 apex_available: ["myapex","mydcla"],
10506 min_sdk_version: "29",
10507 }
10508 cc_api_library {
10509 name: "libc",
10510 src: "libc.so",
10511 min_sdk_version: "29",
10512 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010513 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010514 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010515 }
10516 api_imports {
10517 name: "api_imports",
10518 shared_libs: [
10519 "libc",
10520 ],
10521 header_libs: [],
10522 }
10523 `
10524 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010525 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010526 apexRule := module.MaybeRule("apexRule")
10527 if apexRule.Rule == nil {
10528 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10529 }
10530
10531 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010532 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010533 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10534 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10535 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10536 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10537}
Jingwen Chendea7a642023-03-28 11:30:50 +000010538
10539func TestCannedFsConfig(t *testing.T) {
10540 ctx := testApex(t, `
10541 apex {
10542 name: "myapex",
10543 key: "myapex.key",
10544 updatable: false,
10545 }
10546
10547 apex_key {
10548 name: "myapex.key",
10549 public_key: "testkey.avbpubkey",
10550 private_key: "testkey.pem",
10551 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010552 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010553 generateFsRule := mod.Rule("generateFsConfig")
10554 cmd := generateFsRule.RuleParams.Command
10555
10556 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10557}
10558
10559func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10560 ctx := testApex(t, `
10561 apex {
10562 name: "myapex",
10563 key: "myapex.key",
10564 canned_fs_config: "my_config",
10565 updatable: false,
10566 }
10567
10568 apex_key {
10569 name: "myapex.key",
10570 public_key: "testkey.avbpubkey",
10571 private_key: "testkey.pem",
10572 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010573 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010574 generateFsRule := mod.Rule("generateFsConfig")
10575 cmd := generateFsRule.RuleParams.Command
10576
10577 // Ensure that canned_fs_config has "cat my_config" at the end
10578 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10579}
Spandan Das20fce2d2023-04-12 17:21:39 +000010580
10581func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10582 testCases := []struct {
10583 desc string
10584 hasStubs bool
10585 apexAvailable string
10586 expectedError string
10587 }{
10588 {
10589 desc: "non-stub library can have multiple apex_available",
10590 hasStubs: false,
10591 apexAvailable: `["myapex", "otherapex"]`,
10592 },
10593 {
10594 desc: "stub library should not be available to anyapex",
10595 hasStubs: true,
10596 apexAvailable: `["//apex_available:anyapex"]`,
10597 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10598 },
10599 {
10600 desc: "stub library should not be available to multiple apexes",
10601 hasStubs: true,
10602 apexAvailable: `["myapex", "otherapex"]`,
10603 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10604 },
10605 {
10606 desc: "stub library can be available to a core apex and a test apex",
10607 hasStubs: true,
10608 apexAvailable: `["myapex", "test_myapex"]`,
10609 },
10610 }
10611 bpTemplate := `
10612 cc_library {
10613 name: "libfoo",
10614 %v
10615 apex_available: %v,
10616 }
10617 apex {
10618 name: "myapex",
10619 key: "apex.key",
10620 updatable: false,
10621 native_shared_libs: ["libfoo"],
10622 }
10623 apex {
10624 name: "otherapex",
10625 key: "apex.key",
10626 updatable: false,
10627 }
10628 apex_test {
10629 name: "test_myapex",
10630 key: "apex.key",
10631 updatable: false,
10632 native_shared_libs: ["libfoo"],
10633 }
10634 apex_key {
10635 name: "apex.key",
10636 }
10637 `
10638 for _, tc := range testCases {
10639 stubs := ""
10640 if tc.hasStubs {
10641 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10642 }
10643 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10644 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10645 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10646 })
10647 if tc.expectedError == "" {
10648 testApex(t, bp, mockFsFixturePreparer)
10649 } else {
10650 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10651 }
10652 }
10653}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010654
10655func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10656 context := android.GroupFixturePreparers(
10657 android.PrepareForIntegrationTestWithAndroid,
10658 cc.PrepareForIntegrationTestWithCc,
10659 PrepareForTestWithApexBuildComponents,
10660 prepareForTestWithMyapex,
10661 filesystem.PrepareForTestWithFilesystemBuildComponents,
10662 )
10663 result := context.RunTestWithBp(t, `
10664 android_system_image {
10665 name: "myfilesystem",
10666 deps: [
10667 "libfoo",
10668 ],
10669 linker_config_src: "linker.config.json",
10670 }
10671
10672 cc_library {
10673 name: "libfoo",
10674 shared_libs: [
10675 "libbar",
10676 ],
10677 stl: "none",
10678 }
10679
10680 cc_library {
10681 name: "libbar",
10682 stl: "none",
10683 apex_available: ["myapex"],
10684 }
10685
10686 apex {
10687 name: "myapex",
10688 native_shared_libs: ["libbar"],
10689 key: "myapex.key",
10690 updatable: false,
10691 }
10692
10693 apex_key {
10694 name: "myapex.key",
10695 public_key: "testkey.avbpubkey",
10696 private_key: "testkey.pem",
10697 }
10698 `)
10699
Cole Faust3b806d32024-03-11 15:15:03 -070010700 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010701 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10702 inputs.Strings(),
10703 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10704}
Yu Liueae7b362023-11-16 17:05:47 -080010705
10706var apex_default_bp = `
10707 apex_key {
10708 name: "myapex.key",
10709 public_key: "testkey.avbpubkey",
10710 private_key: "testkey.pem",
10711 }
10712
10713 filegroup {
10714 name: "myapex.manifest",
10715 srcs: ["apex_manifest.json"],
10716 }
10717
10718 filegroup {
10719 name: "myapex.androidmanifest",
10720 srcs: ["AndroidManifest.xml"],
10721 }
10722`
10723
10724func TestAconfigFilesJavaDeps(t *testing.T) {
10725 ctx := testApex(t, apex_default_bp+`
10726 apex {
10727 name: "myapex",
10728 manifest: ":myapex.manifest",
10729 androidManifest: ":myapex.androidmanifest",
10730 key: "myapex.key",
10731 java_libs: [
10732 "my_java_library_foo",
10733 "my_java_library_bar",
10734 ],
10735 updatable: false,
10736 }
10737
10738 java_library {
10739 name: "my_java_library_foo",
10740 srcs: ["foo/bar/MyClass.java"],
10741 sdk_version: "none",
10742 system_modules: "none",
10743 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010744 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010745 "myapex",
10746 ],
10747 }
10748
10749 java_library {
10750 name: "my_java_library_bar",
10751 srcs: ["foo/bar/MyClass.java"],
10752 sdk_version: "none",
10753 system_modules: "none",
10754 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010755 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010756 "myapex",
10757 ],
10758 }
10759
10760 aconfig_declarations {
10761 name: "my_aconfig_declarations_foo",
10762 package: "com.example.package",
10763 container: "myapex",
10764 srcs: ["foo.aconfig"],
10765 }
10766
10767 java_aconfig_library {
10768 name: "my_java_aconfig_library_foo",
10769 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010770 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010771 "myapex",
10772 ],
10773 }
10774
10775 aconfig_declarations {
10776 name: "my_aconfig_declarations_bar",
10777 package: "com.example.package",
10778 container: "myapex",
10779 srcs: ["bar.aconfig"],
10780 }
10781
10782 java_aconfig_library {
10783 name: "my_java_aconfig_library_bar",
10784 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010785 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010786 "myapex",
10787 ],
10788 }
10789 `)
10790
10791 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10792 s := mod.Rule("apexRule").Args["copy_commands"]
10793 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010794 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080010795 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10796 }
10797
Yu Liuab31c822024-02-28 22:21:31 +000010798 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10799 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
10800 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
10801 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010802
Yu Liubba555e2024-02-17 00:36:42 +000010803 inputs := []string{
10804 "my_aconfig_declarations_foo/intermediate.pb",
10805 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010806 }
Yu Liubba555e2024-02-17 00:36:42 +000010807 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10808 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10809 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10810 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010811}
10812
10813func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10814 ctx := testApex(t, apex_default_bp+`
10815 apex {
10816 name: "myapex",
10817 manifest: ":myapex.manifest",
10818 androidManifest: ":myapex.androidmanifest",
10819 key: "myapex.key",
10820 java_libs: [
10821 "my_java_library_foo",
10822 ],
10823 native_shared_libs: [
10824 "my_cc_library_bar",
10825 ],
10826 binaries: [
10827 "my_cc_binary_baz",
10828 ],
10829 updatable: false,
10830 }
10831
10832 java_library {
10833 name: "my_java_library_foo",
10834 srcs: ["foo/bar/MyClass.java"],
10835 sdk_version: "none",
10836 system_modules: "none",
10837 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010838 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010839 "myapex",
10840 ],
10841 }
10842
10843 cc_library {
10844 name: "my_cc_library_bar",
10845 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010846 static_libs: [
10847 "my_cc_aconfig_library_bar",
10848 "my_cc_aconfig_library_baz",
10849 ],
Yu Liueae7b362023-11-16 17:05:47 -080010850 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010851 "myapex",
10852 ],
10853 }
10854
10855 cc_binary {
10856 name: "my_cc_binary_baz",
10857 srcs: ["foo/bar/MyClass.cc"],
10858 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010859 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010860 "myapex",
10861 ],
10862 }
10863
10864 aconfig_declarations {
10865 name: "my_aconfig_declarations_foo",
10866 package: "com.example.package",
10867 container: "myapex",
10868 srcs: ["foo.aconfig"],
10869 }
10870
10871 java_aconfig_library {
10872 name: "my_java_aconfig_library_foo",
10873 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010874 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010875 "myapex",
10876 ],
10877 }
10878
10879 aconfig_declarations {
10880 name: "my_aconfig_declarations_bar",
10881 package: "com.example.package",
10882 container: "myapex",
10883 srcs: ["bar.aconfig"],
10884 }
10885
10886 cc_aconfig_library {
10887 name: "my_cc_aconfig_library_bar",
10888 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010889 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010890 "myapex",
10891 ],
10892 }
10893
10894 aconfig_declarations {
10895 name: "my_aconfig_declarations_baz",
10896 package: "com.example.package",
10897 container: "myapex",
10898 srcs: ["baz.aconfig"],
10899 }
10900
10901 cc_aconfig_library {
10902 name: "my_cc_aconfig_library_baz",
10903 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010904 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010905 "myapex",
10906 ],
10907 }
10908
10909 cc_library {
10910 name: "server_configurable_flags",
10911 srcs: ["server_configurable_flags.cc"],
10912 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010913 cc_library {
10914 name: "libbase",
10915 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010916 apex_available: [
10917 "myapex",
10918 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010919 }
10920 cc_library {
10921 name: "libaconfig_storage_read_api_cc",
10922 srcs: ["libaconfig_storage_read_api_cc.cc"],
10923 }
Yu Liueae7b362023-11-16 17:05:47 -080010924 `)
10925
10926 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10927 s := mod.Rule("apexRule").Args["copy_commands"]
10928 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010929 if len(copyCmds) != 12 {
10930 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010931 }
10932
Yu Liuab31c822024-02-28 22:21:31 +000010933 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10934 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
10935 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
10936 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010937
Yu Liubba555e2024-02-17 00:36:42 +000010938 inputs := []string{
10939 "my_aconfig_declarations_foo/intermediate.pb",
10940 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10941 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010942 }
Yu Liubba555e2024-02-17 00:36:42 +000010943 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10944 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10945 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10946 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010947}
10948
Yu Liucec0e412023-11-30 16:45:50 -080010949func TestAconfigFilesRustDeps(t *testing.T) {
10950 ctx := testApex(t, apex_default_bp+`
10951 apex {
10952 name: "myapex",
10953 manifest: ":myapex.manifest",
10954 androidManifest: ":myapex.androidmanifest",
10955 key: "myapex.key",
10956 native_shared_libs: [
10957 "libmy_rust_library",
10958 ],
10959 binaries: [
10960 "my_rust_binary",
10961 ],
10962 rust_dyn_libs: [
10963 "libmy_rust_dylib",
10964 ],
10965 updatable: false,
10966 }
10967
10968 rust_library {
10969 name: "libflags_rust", // test mock
10970 crate_name: "flags_rust",
10971 srcs: ["lib.rs"],
10972 apex_available: [
10973 "myapex",
10974 ],
10975 }
10976
10977 rust_library {
10978 name: "liblazy_static", // test mock
10979 crate_name: "lazy_static",
10980 srcs: ["src/lib.rs"],
10981 apex_available: [
10982 "myapex",
10983 ],
10984 }
10985
Ted Bauer02d475c2024-03-27 20:56:26 +000010986 rust_library {
10987 name: "libaconfig_storage_read_api", // test mock
10988 crate_name: "aconfig_storage_read_api",
10989 srcs: ["src/lib.rs"],
10990 apex_available: [
10991 "myapex",
10992 ],
10993 }
10994
Ted Bauer6ef40db2024-03-29 14:04:10 +000010995 rust_library {
10996 name: "liblogger", // test mock
10997 crate_name: "logger",
10998 srcs: ["src/lib.rs"],
10999 apex_available: [
11000 "myapex",
11001 ],
11002 }
11003
11004 rust_library {
11005 name: "liblog_rust", // test mock
11006 crate_name: "log_rust",
11007 srcs: ["src/lib.rs"],
11008 apex_available: [
11009 "myapex",
11010 ],
11011 }
11012
Yu Liucec0e412023-11-30 16:45:50 -080011013 rust_ffi_shared {
11014 name: "libmy_rust_library",
11015 srcs: ["src/lib.rs"],
11016 rustlibs: ["libmy_rust_aconfig_library_foo"],
11017 crate_name: "my_rust_library",
11018 apex_available: [
11019 "myapex",
11020 ],
11021 }
11022
11023 rust_library_dylib {
11024 name: "libmy_rust_dylib",
11025 srcs: ["foo/bar/MyClass.rs"],
11026 rustlibs: ["libmy_rust_aconfig_library_bar"],
11027 crate_name: "my_rust_dylib",
11028 apex_available: [
11029 "myapex",
11030 ],
11031 }
11032
11033 rust_binary {
11034 name: "my_rust_binary",
11035 srcs: ["foo/bar/MyClass.rs"],
11036 rustlibs: [
11037 "libmy_rust_aconfig_library_baz",
11038 "libmy_rust_dylib",
11039 ],
11040 apex_available: [
11041 "myapex",
11042 ],
11043 }
11044
11045 aconfig_declarations {
11046 name: "my_aconfig_declarations_foo",
11047 package: "com.example.package",
11048 container: "myapex",
11049 srcs: ["foo.aconfig"],
11050 }
11051
11052 aconfig_declarations {
11053 name: "my_aconfig_declarations_bar",
11054 package: "com.example.package",
11055 container: "myapex",
11056 srcs: ["bar.aconfig"],
11057 }
11058
11059 aconfig_declarations {
11060 name: "my_aconfig_declarations_baz",
11061 package: "com.example.package",
11062 container: "myapex",
11063 srcs: ["baz.aconfig"],
11064 }
11065
11066 rust_aconfig_library {
11067 name: "libmy_rust_aconfig_library_foo",
11068 aconfig_declarations: "my_aconfig_declarations_foo",
11069 crate_name: "my_rust_aconfig_library_foo",
11070 apex_available: [
11071 "myapex",
11072 ],
11073 }
11074
11075 rust_aconfig_library {
11076 name: "libmy_rust_aconfig_library_bar",
11077 aconfig_declarations: "my_aconfig_declarations_bar",
11078 crate_name: "my_rust_aconfig_library_bar",
11079 apex_available: [
11080 "myapex",
11081 ],
11082 }
11083
11084 rust_aconfig_library {
11085 name: "libmy_rust_aconfig_library_baz",
11086 aconfig_declarations: "my_aconfig_declarations_baz",
11087 crate_name: "my_rust_aconfig_library_baz",
11088 apex_available: [
11089 "myapex",
11090 ],
11091 }
11092 `)
11093
11094 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11095 s := mod.Rule("apexRule").Args["copy_commands"]
11096 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ted Bauer6ef40db2024-03-29 14:04:10 +000011097 if len(copyCmds) != 32 {
Ted Bauer02d475c2024-03-27 20:56:26 +000011098 t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080011099 }
11100
Ted Bauer6ef40db2024-03-29 14:04:10 +000011101 ensureMatches(t, copyCmds[28], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11102 ensureMatches(t, copyCmds[29], "^cp -f .*/package.map .*/image.apex/etc$")
11103 ensureMatches(t, copyCmds[30], "^cp -f .*/flag.map .*/image.apex/etc$")
11104 ensureMatches(t, copyCmds[31], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080011105
Yu Liubba555e2024-02-17 00:36:42 +000011106 inputs := []string{
11107 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011108 "my_aconfig_declarations_bar/intermediate.pb",
11109 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011110 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11111 }
11112 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11113 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11114 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11115 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
11116}
11117
11118func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11119 aconfigRule := mod.Description(desc)
11120 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011121 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011122 if len(aconfigArgs) != len(inputs) {
11123 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011124 }
Yu Liucec0e412023-11-30 16:45:50 -080011125
Yu Liubba555e2024-02-17 00:36:42 +000011126 ensureEquals(t, container, aconfigRule.Args["container"])
11127 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11128
11129 buildParams := aconfigRule.BuildParams
11130 for _, input := range inputs {
11131 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11132 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011133 }
Yu Liubba555e2024-02-17 00:36:42 +000011134
11135 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011136}
11137
Yu Liueae7b362023-11-16 17:05:47 -080011138func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11139 ctx := testApex(t, apex_default_bp+`
11140 apex {
11141 name: "myapex",
11142 manifest: ":myapex.manifest",
11143 androidManifest: ":myapex.androidmanifest",
11144 key: "myapex.key",
11145 java_libs: [
11146 "my_java_library_foo",
11147 "other_java_library_bar",
11148 ],
11149 updatable: false,
11150 }
11151
11152 java_library {
11153 name: "my_java_library_foo",
11154 srcs: ["foo/bar/MyClass.java"],
11155 sdk_version: "none",
11156 system_modules: "none",
11157 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011158 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011159 "myapex",
11160 ],
11161 }
11162
11163 java_library {
11164 name: "other_java_library_bar",
11165 srcs: ["foo/bar/MyClass.java"],
11166 sdk_version: "none",
11167 system_modules: "none",
11168 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011169 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011170 "myapex",
11171 ],
11172 }
11173
11174 aconfig_declarations {
11175 name: "my_aconfig_declarations_foo",
11176 package: "com.example.package",
11177 container: "myapex",
11178 srcs: ["foo.aconfig"],
11179 }
11180
11181 java_aconfig_library {
11182 name: "my_java_aconfig_library_foo",
11183 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011184 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011185 "myapex",
11186 ],
11187 }
11188
11189 aconfig_declarations {
11190 name: "other_aconfig_declarations_bar",
11191 package: "com.example.package",
11192 container: "otherapex",
11193 srcs: ["bar.aconfig"],
11194 }
11195
11196 java_aconfig_library {
11197 name: "other_java_aconfig_library_bar",
11198 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011199 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011200 "myapex",
11201 ],
11202 }
11203 `)
11204
11205 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11206 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11207 s := " " + combineAconfigRule.Args["cache_files"]
11208 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11209 if len(aconfigArgs) != 1 {
11210 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11211 }
11212 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11213
11214 buildParams := combineAconfigRule.BuildParams
11215 if len(buildParams.Inputs) != 1 {
11216 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11217 }
11218 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11219 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11220}
11221
11222func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11223 ctx := testApex(t, apex_default_bp+`
11224 apex {
11225 name: "myapex",
11226 manifest: ":myapex.manifest",
11227 androidManifest: ":myapex.androidmanifest",
11228 key: "myapex.key",
11229 java_libs: [
11230 "my_java_library_foo",
11231 "my_java_library_bar",
11232 ],
11233 updatable: false,
11234 }
11235
11236 java_library {
11237 name: "my_java_library_foo",
11238 srcs: ["foo/bar/MyClass.java"],
11239 sdk_version: "none",
11240 system_modules: "none",
11241 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011242 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011243 "myapex",
11244 ],
11245 }
11246
11247 java_library {
11248 name: "my_java_library_bar",
11249 srcs: ["foo/bar/MyClass.java"],
11250 sdk_version: "none",
11251 system_modules: "none",
11252 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011253 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011254 "myapex",
11255 ],
11256 }
11257
11258 aconfig_declarations {
11259 name: "my_aconfig_declarations_foo",
11260 package: "com.example.package",
11261 container: "myapex",
11262 srcs: ["foo.aconfig"],
11263 }
11264
11265 java_aconfig_library {
11266 name: "my_java_aconfig_library_foo",
11267 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011268 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011269 "myapex",
11270 ],
11271 }
11272
11273 java_aconfig_library {
11274 name: "my_java_aconfig_library_bar",
11275 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011276 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011277 "myapex",
11278 ],
11279 }
11280 `)
11281
11282 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11283 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11284 s := " " + combineAconfigRule.Args["cache_files"]
11285 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11286 if len(aconfigArgs) != 1 {
11287 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11288 }
11289 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11290
11291 buildParams := combineAconfigRule.BuildParams
11292 if len(buildParams.Inputs) != 1 {
11293 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11294 }
11295 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11296 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11297}
Spandan Das5be63332023-12-13 00:06:32 +000011298
11299// Test that the boot jars come from the _selected_ apex prebuilt
11300// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11301func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11302 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11303 t.Helper()
11304 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11305 foundLibfooJar := false
11306 base := stem + ".jar"
11307 for _, output := range s.AllOutputs() {
11308 if filepath.Base(output) == base {
11309 foundLibfooJar = true
11310 buildRule := s.Output(output)
11311 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11312 }
11313 }
11314 if !foundLibfooJar {
11315 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11316 }
11317 }
11318
Spandan Das64c9e0c2023-12-20 20:13:34 +000011319 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11320 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11321 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11322 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11323 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11324 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)
11325 }
11326
11327 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11328 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11329 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11330 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11331 }
11332
Spandan Das5be63332023-12-13 00:06:32 +000011333 bp := `
11334 // Source APEX.
11335
11336 java_library {
11337 name: "framework-foo",
11338 srcs: ["foo.java"],
11339 installable: true,
11340 apex_available: [
11341 "com.android.foo",
11342 ],
11343 }
11344
11345 bootclasspath_fragment {
11346 name: "foo-bootclasspath-fragment",
11347 contents: ["framework-foo"],
11348 apex_available: [
11349 "com.android.foo",
11350 ],
11351 hidden_api: {
11352 split_packages: ["*"],
11353 },
11354 }
11355
11356 apex_key {
11357 name: "com.android.foo.key",
11358 public_key: "com.android.foo.avbpubkey",
11359 private_key: "com.android.foo.pem",
11360 }
11361
11362 apex {
11363 name: "com.android.foo",
11364 key: "com.android.foo.key",
11365 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11366 updatable: false,
11367 }
11368
11369 // Prebuilt APEX.
11370
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011371 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011372 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011373 public: {
11374 jars: ["foo.jar"],
11375 },
Spandan Das5be63332023-12-13 00:06:32 +000011376 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011377 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011378 }
11379
11380 prebuilt_bootclasspath_fragment {
11381 name: "foo-bootclasspath-fragment",
11382 contents: ["framework-foo"],
11383 hidden_api: {
11384 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11385 metadata: "my-bootclasspath-fragment/metadata.csv",
11386 index: "my-bootclasspath-fragment/index.csv",
11387 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11388 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11389 },
11390 apex_available: [
11391 "com.android.foo",
11392 ],
11393 }
11394
11395 prebuilt_apex {
11396 name: "com.android.foo",
11397 apex_name: "com.android.foo",
11398 src: "com.android.foo-arm.apex",
11399 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11400 }
11401
11402 // Another Prebuilt ART APEX
11403 prebuilt_apex {
11404 name: "com.android.foo.v2",
11405 apex_name: "com.android.foo", // Used to determine the API domain
11406 src: "com.android.foo-arm.apex",
11407 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11408 }
11409
11410 // APEX contribution modules
11411
11412 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011413 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011414 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011415 contents: ["com.android.foo"],
11416 }
11417
11418 apex_contributions {
11419 name: "foo.prebuilt.contributions",
11420 api_domain: "com.android.foo",
11421 contents: ["prebuilt_com.android.foo"],
11422 }
11423
11424 apex_contributions {
11425 name: "foo.prebuilt.v2.contributions",
11426 api_domain: "com.android.foo",
11427 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011428 }
11429 `
11430
11431 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011432 desc string
11433 selectedApexContributions string
11434 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011435 }{
11436 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011437 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11438 selectedApexContributions: "foo.source.contributions",
11439 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011440 },
11441 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011442 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11443 selectedApexContributions: "foo.prebuilt.contributions",
11444 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011445 },
11446 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011447 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11448 selectedApexContributions: "foo.prebuilt.v2.contributions",
11449 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011450 },
11451 }
11452
11453 fragment := java.ApexVariantReference{
11454 Apex: proptools.StringPtr("com.android.foo"),
11455 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11456 }
11457
11458 for _, tc := range testCases {
11459 preparer := android.GroupFixturePreparers(
11460 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11461 android.FixtureMergeMockFs(map[string][]byte{
11462 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11463 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011464 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11465 // file creation.
11466 java.FixtureConfigureBootJars("platform:foo"),
11467 android.FixtureModifyMockFS(func(fs android.MockFS) {
11468 fs["platform/Android.bp"] = []byte(`
11469 java_library {
11470 name: "foo",
11471 srcs: ["Test.java"],
11472 compile_dex: true,
11473 }
11474 `)
11475 fs["platform/Test.java"] = nil
11476 }),
11477
Colin Crossa66b4632024-08-08 15:50:47 -070011478 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011479 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011480 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011481 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011482 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11483 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011484 }
11485}
Spandan Das3576e762024-01-03 18:57:03 +000011486
11487// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11488// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11489func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000011490 // for a mainline module family, check that only the flagged soong module is visible to make
11491 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11492 variation := func(moduleName string) string {
11493 ret := "android_common_com.android.foo"
11494 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011495 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011496 }
11497 return ret
11498 }
11499
11500 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11501 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11502
11503 for _, hiddenModuleName := range hiddenModuleNames {
11504 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11505 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11506
11507 }
11508 }
11509
11510 bp := `
11511 apex_key {
11512 name: "com.android.foo.key",
11513 public_key: "com.android.foo.avbpubkey",
11514 private_key: "com.android.foo.pem",
11515 }
11516
11517 // AOSP source apex
11518 apex {
11519 name: "com.android.foo",
11520 key: "com.android.foo.key",
11521 updatable: false,
11522 }
11523
11524 // Google source apex
11525 override_apex {
11526 name: "com.google.android.foo",
11527 base: "com.android.foo",
11528 key: "com.android.foo.key",
11529 }
11530
11531 // Prebuilt Google APEX.
11532
11533 prebuilt_apex {
11534 name: "com.google.android.foo",
11535 apex_name: "com.android.foo",
11536 src: "com.android.foo-arm.apex",
11537 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11538 }
11539
11540 // Another Prebuilt Google APEX
11541 prebuilt_apex {
11542 name: "com.google.android.foo.v2",
11543 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011544 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011545 src: "com.android.foo-arm.apex",
11546 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11547 }
11548
11549 // APEX contribution modules
11550
11551 apex_contributions {
11552 name: "foo.source.contributions",
11553 api_domain: "com.android.foo",
11554 contents: ["com.google.android.foo"],
11555 }
11556
11557 apex_contributions {
11558 name: "foo.prebuilt.contributions",
11559 api_domain: "com.android.foo",
11560 contents: ["prebuilt_com.google.android.foo"],
11561 }
11562
11563 apex_contributions {
11564 name: "foo.prebuilt.v2.contributions",
11565 api_domain: "com.android.foo",
11566 contents: ["prebuilt_com.google.android.foo.v2"],
11567 }
11568
11569 // This is an incompatible module because it selects multiple versions of the same mainline module
11570 apex_contributions {
11571 name: "foo.prebuilt.duplicate.contributions",
11572 api_domain: "com.android.foo",
11573 contents: [
11574 "prebuilt_com.google.android.foo",
11575 "prebuilt_com.google.android.foo.v2",
11576 ],
11577 }
11578 `
11579
11580 testCases := []struct {
11581 desc string
11582 selectedApexContributions string
11583 expectedVisibleModuleName string
11584 expectedHiddenModuleNames []string
11585 expectedError string
11586 }{
11587 {
11588 desc: "Source apex is selected, prebuilts should be hidden from make",
11589 selectedApexContributions: "foo.source.contributions",
11590 expectedVisibleModuleName: "com.google.android.foo",
11591 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11592 },
11593 {
11594 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11595 selectedApexContributions: "foo.prebuilt.contributions",
11596 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11597 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11598 },
11599 {
11600 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11601 selectedApexContributions: "foo.prebuilt.v2.contributions",
11602 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11603 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11604 },
11605 {
11606 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11607 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11608 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11609 },
11610 }
11611
11612 for _, tc := range testCases {
11613 preparer := android.GroupFixturePreparers(
11614 android.FixtureMergeMockFs(map[string][]byte{
11615 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11616 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011617 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011618 )
11619 if tc.expectedError != "" {
11620 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11621 testApex(t, bp, preparer)
11622 return
11623 }
11624 ctx := testApex(t, bp, preparer)
11625
Spandan Das3576e762024-01-03 18:57:03 +000011626 // Check that
11627 // 1. The contents of the selected apex_contributions are visible to make
11628 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11629 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11630 }
11631}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011632
Spandan Das85bd4622024-08-01 00:51:20 +000011633// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11634func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
11635 // for a mainline module family, check that only the flagged soong module is visible to make
11636 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11637 variation := func(moduleName string) string {
11638 ret := "android_common_com.android.adservices"
11639 if moduleName == "com.google.android.foo" {
11640 ret = "android_common_com.google.android.foo_com.google.android.foo"
11641 }
11642 return ret
11643 }
11644
11645 for _, visibleModuleName := range visibleModuleNames {
11646 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11647 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11648 }
11649
11650 for _, hiddenModuleName := range hiddenModuleNames {
11651 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11652 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11653
11654 }
11655 }
11656
11657 bp := `
11658 apex_key {
11659 name: "com.android.adservices.key",
11660 public_key: "com.android.adservices.avbpubkey",
11661 private_key: "com.android.adservices.pem",
11662 }
11663
11664 // AOSP source apex
11665 apex {
11666 name: "com.android.adservices",
11667 key: "com.android.adservices.key",
11668 updatable: false,
11669 }
11670
11671 // Prebuilt Google APEX.
11672
11673 prebuilt_apex {
11674 name: "com.google.android.adservices",
11675 apex_name: "com.android.adservices",
11676 src: "com.android.foo-arm.apex",
11677 }
11678
11679 // Another Prebuilt Google APEX
11680 prebuilt_apex {
11681 name: "com.google.android.adservices.v2",
11682 apex_name: "com.android.adservices",
11683 src: "com.android.foo-arm.apex",
11684 }
11685
11686 // APEX contribution modules
11687
11688
11689 apex_contributions {
11690 name: "adservices.prebuilt.contributions",
11691 api_domain: "com.android.adservices",
11692 contents: ["prebuilt_com.google.android.adservices"],
11693 }
11694
11695 apex_contributions {
11696 name: "adservices.prebuilt.v2.contributions",
11697 api_domain: "com.android.adservices",
11698 contents: ["prebuilt_com.google.android.adservices.v2"],
11699 }
11700 `
11701
11702 testCases := []struct {
11703 desc string
11704 selectedApexContributions string
11705 expectedVisibleModuleNames []string
11706 expectedHiddenModuleNames []string
11707 }{
11708 {
11709 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11710 selectedApexContributions: "",
11711 expectedVisibleModuleNames: []string{"com.android.adservices"},
11712 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11713 },
11714 {
11715 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11716 selectedApexContributions: "adservices.prebuilt.contributions",
11717 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11718 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11719 },
11720 {
11721 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11722 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11723 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11724 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11725 },
11726 }
11727
11728 for _, tc := range testCases {
11729 preparer := android.GroupFixturePreparers(
11730 android.FixtureMergeMockFs(map[string][]byte{
11731 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11732 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011733 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011734 )
11735 ctx := testApex(t, bp, preparer)
11736
11737 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11738 }
11739}
11740
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011741func TestAconfifDeclarationsValidation(t *testing.T) {
11742 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11743 for _, moduleName := range moduleNames {
11744 ret += fmt.Sprintf(`
11745 aconfig_declarations {
11746 name: "%[1]s",
11747 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011748 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011749 srcs: [
11750 "%[1]s.aconfig",
11751 ],
11752 }
11753 java_aconfig_library {
11754 name: "%[1]s-lib",
11755 aconfig_declarations: "%[1]s",
11756 }
11757 `, moduleName)
11758 }
11759 return ret
11760 }
11761
11762 result := android.GroupFixturePreparers(
11763 prepareForApexTest,
11764 java.PrepareForTestWithJavaSdkLibraryFiles,
11765 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011766 ).RunTestWithBp(t, `
11767 java_library {
11768 name: "baz-java-lib",
11769 static_libs: [
11770 "baz-lib",
11771 ],
11772 }
11773 filegroup {
11774 name: "qux-filegroup",
11775 srcs: [
11776 ":qux-lib{.generated_srcjars}",
11777 ],
11778 }
11779 filegroup {
11780 name: "qux-another-filegroup",
11781 srcs: [
11782 ":qux-filegroup",
11783 ],
11784 }
11785 java_library {
11786 name: "quux-java-lib",
11787 srcs: [
11788 "a.java",
11789 ],
11790 libs: [
11791 "quux-lib",
11792 ],
11793 }
11794 java_sdk_library {
11795 name: "foo",
11796 srcs: [
11797 ":qux-another-filegroup",
11798 ],
11799 api_packages: ["foo"],
11800 system: {
11801 enabled: true,
11802 },
11803 module_lib: {
11804 enabled: true,
11805 },
11806 test: {
11807 enabled: true,
11808 },
11809 static_libs: [
11810 "bar-lib",
11811 ],
11812 libs: [
11813 "baz-java-lib",
11814 "quux-java-lib",
11815 ],
11816 aconfig_declarations: [
11817 "bar",
11818 ],
11819 }
11820 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11821
11822 m := result.ModuleForTests("foo.stubs.source", "android_common")
11823 outDir := "out/soong/.intermediates"
11824
11825 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11826 // textproto files
11827 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11828
11829 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11830 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11831 // to aconfig.
11832 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11833 "passed as an input",
11834 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11835
11836 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11837 // to metalava as classpath. Thus the cache file provided by the associated
11838 // aconfig_declarations module "baz" should be passed to aconfig.
11839 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11840 "java_aconfig_library passed as an input",
11841 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11842
11843 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11844 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11845 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11846 "input",
11847 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11848
11849 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11850 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11851 // aconfig_declarations module "quux" should not be passed to aconfig.
11852 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11853 "depend on java_aconfig_library not passed as an input",
11854 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11855}
Cole Faust7c991b42024-05-15 11:17:55 -070011856
11857func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11858 ctx := testApex(t, `
11859 apex {
11860 name: "myapex",
11861 key: "myapex.key",
11862 prebuilts: ["myetc", "myetc2"],
11863 min_sdk_version: "29",
11864 }
11865 apex_key {
11866 name: "myapex.key",
11867 public_key: "testkey.avbpubkey",
11868 private_key: "testkey.pem",
11869 }
11870
11871 prebuilt_etc {
11872 name: "myetc",
11873 src: "myprebuilt",
11874 filename: "myfilename",
11875 }
11876 prebuilt_etc {
11877 name: "myetc2",
11878 sub_dir: "mysubdir",
11879 src: "myprebuilt",
11880 filename: "myfilename",
11881 }
11882 `, withFiles(android.MockFS{
11883 "packages/modules/common/build/allowed_deps.txt": nil,
11884 }))
11885
11886 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11887 data := android.AndroidMkDataForTest(t, ctx, ab)
11888 var builder strings.Builder
11889 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11890 androidMk := builder.String()
11891
11892 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11893 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11894}
Spandan Das50801e22024-05-13 18:29:45 +000011895
11896func TestApexMinSdkVersionOverride(t *testing.T) {
11897 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11898 args := module.Rule("apexRule").Args
11899 optFlags := args["opt_flags"]
11900 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11901 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11902 }
11903 }
11904
11905 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11906 t.Helper()
11907 found := false
11908 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11909 if dep == wantDep {
11910 found = true
11911 }
11912 })
11913 if !found {
11914 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11915 }
11916 }
11917
11918 ctx := testApex(t, `
11919 apex {
11920 name: "com.android.apex30",
11921 min_sdk_version: "30",
11922 key: "apex30.key",
11923 java_libs: ["javalib"],
11924 }
11925
11926 java_library {
11927 name: "javalib",
11928 srcs: ["A.java"],
11929 apex_available: ["com.android.apex30"],
11930 min_sdk_version: "30",
11931 sdk_version: "current",
11932 }
11933
11934 override_apex {
11935 name: "com.mycompany.android.apex30",
11936 base: "com.android.apex30",
11937 }
11938
11939 override_apex {
11940 name: "com.mycompany.android.apex31",
11941 base: "com.android.apex30",
11942 min_sdk_version: "31",
11943 }
11944
11945 apex_key {
11946 name: "apex30.key",
11947 public_key: "testkey.avbpubkey",
11948 private_key: "testkey.pem",
11949 }
11950
11951 `, android.FixtureMergeMockFs(android.MockFS{
11952 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11953 }),
11954 )
11955
11956 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11957 checkMinSdkVersion(t, baseModule, "30")
11958
11959 // Override module, but uses same min_sdk_version
11960 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11961 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11962 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11963 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11964
11965 // Override module, uses different min_sdk_version
11966 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11967 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11968 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11969 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11970}
Spandan Das0b28fa02024-05-28 23:40:17 +000011971
11972func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11973 context := android.GroupFixturePreparers(
11974 android.PrepareForIntegrationTestWithAndroid,
11975 PrepareForTestWithApexBuildComponents,
11976 android.FixtureMergeMockFs(android.MockFS{
11977 "system/sepolicy/apex/foo-file_contexts": nil,
11978 }),
11979 )
11980 res := context.RunTestWithBp(t, `
11981 apex {
11982 name: "foo",
11983 key: "myapex.key",
11984 apex_available_name: "com.android.foo",
11985 variant_version: "0",
11986 updatable: false,
11987 }
11988 apex_key {
11989 name: "myapex.key",
11990 public_key: "testkey.avbpubkey",
11991 private_key: "testkey.pem",
11992 }
11993 prebuilt_apex {
11994 name: "foo",
11995 src: "foo.apex",
11996 prefer: true,
11997 }
11998 override_apex {
11999 name: "myoverrideapex",
12000 base: "foo",
12001 }
12002 `)
12003
12004 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
12005}
Spandan Dasca1d63e2024-07-01 22:53:49 +000012006
12007func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
12008 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`, `
12009 apex {
12010 name: "myapex",
12011 key: "myapex.key",
12012 updatable: true,
12013 min_sdk_version: "current",
12014 }
12015
12016 apex_key {
12017 name: "myapex.key",
12018 public_key: "testkey.avbpubkey",
12019 private_key: "testkey.pem",
12020 }
12021 `)
12022}
Spandan Das2f68f192024-07-22 19:25:50 +000012023
12024func TestPrebuiltStubNoinstall(t *testing.T) {
12025 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
12026 result := android.GroupFixturePreparers(
12027 prepareForApexTest,
12028 android.PrepareForTestWithAndroidMk,
12029 android.PrepareForTestWithMakevars,
12030 android.FixtureMergeMockFs(fs),
12031 ).RunTest(t)
12032
12033 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000012034 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000012035
12036 installRules := result.InstallMakeRulesForTesting(t)
12037
12038 var installedlibRule *android.InstallMakeRule
12039 for i, rule := range installRules {
12040 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
12041 if installedlibRule != nil {
12042 t.Errorf("Duplicate install rules for %s", rule.Target)
12043 }
12044 installedlibRule = &installRules[i]
12045 }
12046 }
12047 if installedlibRule == nil {
12048 t.Errorf("No install rule found for installedlib")
12049 return
12050 }
12051
12052 if expectLibfooOnSystemLib {
12053 android.AssertStringListContains(t,
12054 "installedlib doesn't have install dependency on libfoo impl",
12055 installedlibRule.OrderOnlyDeps,
12056 "out/target/product/test_device/system/lib/libfoo.so")
12057 } else {
12058 android.AssertStringListDoesNotContain(t,
12059 "installedlib has install dependency on libfoo stub",
12060 installedlibRule.Deps,
12061 "out/target/product/test_device/system/lib/libfoo.so")
12062 android.AssertStringListDoesNotContain(t,
12063 "installedlib has order-only install dependency on libfoo stub",
12064 installedlibRule.OrderOnlyDeps,
12065 "out/target/product/test_device/system/lib/libfoo.so")
12066 }
12067 }
12068
12069 prebuiltLibfooBp := []byte(`
12070 cc_prebuilt_library {
12071 name: "libfoo",
12072 prefer: true,
12073 srcs: ["libfoo.so"],
12074 stubs: {
12075 versions: ["1"],
12076 },
12077 apex_available: ["apexfoo"],
12078 }
12079 `)
12080
12081 apexfooBp := []byte(`
12082 apex {
12083 name: "apexfoo",
12084 key: "apexfoo.key",
12085 native_shared_libs: ["libfoo"],
12086 updatable: false,
12087 compile_multilib: "both",
12088 }
12089 apex_key {
12090 name: "apexfoo.key",
12091 public_key: "testkey.avbpubkey",
12092 private_key: "testkey.pem",
12093 }
12094 `)
12095
12096 installedlibBp := []byte(`
12097 cc_library {
12098 name: "installedlib",
12099 shared_libs: ["libfoo"],
12100 }
12101 `)
12102
12103 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
12104 testFunc(
12105 t,
12106 /*expectLibfooOnSystemLib=*/ false,
12107 android.MockFS{
12108 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12109 "apexfoo/Android.bp": apexfooBp,
12110 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12111 "Android.bp": installedlibBp,
12112 },
12113 )
12114 })
12115
12116 disabledSourceLibfooBp := []byte(`
12117 cc_library {
12118 name: "libfoo",
12119 enabled: false,
12120 stubs: {
12121 versions: ["1"],
12122 },
12123 apex_available: ["apexfoo"],
12124 }
12125 `)
12126
12127 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
12128 testFunc(
12129 t,
12130 /*expectLibfooOnSystemLib=*/ false,
12131 android.MockFS{
12132 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12133 "impl/Android.bp": disabledSourceLibfooBp,
12134 "apexfoo/Android.bp": apexfooBp,
12135 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12136 "Android.bp": installedlibBp,
12137 },
12138 )
12139 })
12140}