blob: 3df43b1c3348dfc539d4ed303e08f7a43066e4e9 [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"],
909 shared_libs: ["mylib2", "mylib3"],
910 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: {
922 versions: ["1", "2", "3"],
923 },
924 }
925
926 cc_library {
927 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900928 srcs: ["mylib.cpp"],
929 shared_libs: ["mylib4"],
930 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931 stl: "none",
932 stubs: {
933 versions: ["10", "11", "12"],
934 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000935 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900937
938 cc_library {
939 name: "mylib4",
940 srcs: ["mylib.cpp"],
941 system_shared_libs: [],
942 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000943 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900944 }
Jiyong Park105dc322021-06-11 17:22:09 +0900945
946 rust_binary {
947 name: "foo.rust",
948 srcs: ["foo.rs"],
949 shared_libs: ["libfoo.shared_from_rust"],
950 prefer_rlib: true,
951 apex_available: ["myapex"],
952 }
953
954 cc_library_shared {
955 name: "libfoo.shared_from_rust",
956 srcs: ["mylib.cpp"],
957 system_shared_libs: [],
958 stl: "none",
959 stubs: {
960 versions: ["10", "11", "12"],
961 },
962 }
963
Jiyong Park25fc6a92018-11-18 18:02:45 +0900964 `)
965
Jooyung Hana0503a52023-08-23 13:12:50 +0900966 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967 copyCmds := apexRule.Args["copy_commands"]
968
969 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800970 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900971
972 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800973 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900974
975 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800976 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900977
Colin Crossaede88c2020-08-11 12:17:01 -0700978 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900979
980 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900981 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900982 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900983 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900984
985 // 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 -0700986 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700988 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900989
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700990 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
991 // is replaced by sharing of "cFlags" in cc/builder.go.
992 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
993 // module variable representing "cflags". So it was not detected by ensureNotContains.
994 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
995 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
996 // including the original cflags's "-include mylib.h".
997 //
Jiyong Park64379952018-12-13 18:37:29 +0900998 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700999 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1000 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001001
Jiyong Park85cc35a2022-07-17 11:30:47 +09001002 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1003 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1004 // Ensure that genstub for apex-provided lib is invoked with --apex
1005 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001006
Jooyung Hana0503a52023-08-23 13:12:50 +09001007 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001008 "lib64/mylib.so",
1009 "lib64/mylib3.so",
1010 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001011 "bin/foo.rust",
1012 "lib64/libc++.so", // by the implicit dependency from foo.rust
1013 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001014 })
Jiyong Park105dc322021-06-11 17:22:09 +09001015
1016 // Ensure that stub dependency from a rust module is not included
1017 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1018 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001019 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001020 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1021 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001022
Jooyung Hana0503a52023-08-23 13:12:50 +09001023 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001024 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001025}
1026
Jooyung Han20348752023-12-05 15:23:56 +09001027func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1028 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1029 apex {
1030 name: "myapex",
1031 key: "myapex.key",
1032 vendor: true,
1033 updatable: false,
1034 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1035 }
1036
1037 apex_key {
1038 name: "myapex.key",
1039 public_key: "testkey.avbpubkey",
1040 private_key: "testkey.pem",
1041 }
1042
1043 cc_library {
1044 name: "libbar",
1045 srcs: ["mylib.cpp"],
1046 llndk: {
1047 symbol_file: "libbar.map.txt",
1048 }
1049 }
1050 `)
1051}
1052
Jiyong Park1bc84122021-06-22 20:23:05 +09001053func TestApexCanUsePrivateApis(t *testing.T) {
1054 ctx := testApex(t, `
1055 apex {
1056 name: "myapex",
1057 key: "myapex.key",
1058 native_shared_libs: ["mylib"],
1059 binaries: ["foo.rust"],
1060 updatable: false,
1061 platform_apis: true,
1062 }
1063
1064 apex_key {
1065 name: "myapex.key",
1066 public_key: "testkey.avbpubkey",
1067 private_key: "testkey.pem",
1068 }
1069
1070 cc_library {
1071 name: "mylib",
1072 srcs: ["mylib.cpp"],
1073 shared_libs: ["mylib2"],
1074 system_shared_libs: [],
1075 stl: "none",
1076 apex_available: [ "myapex" ],
1077 }
1078
1079 cc_library {
1080 name: "mylib2",
1081 srcs: ["mylib.cpp"],
1082 cflags: ["-include mylib.h"],
1083 system_shared_libs: [],
1084 stl: "none",
1085 stubs: {
1086 versions: ["1", "2", "3"],
1087 },
1088 }
1089
1090 rust_binary {
1091 name: "foo.rust",
1092 srcs: ["foo.rs"],
1093 shared_libs: ["libfoo.shared_from_rust"],
1094 prefer_rlib: true,
1095 apex_available: ["myapex"],
1096 }
1097
1098 cc_library_shared {
1099 name: "libfoo.shared_from_rust",
1100 srcs: ["mylib.cpp"],
1101 system_shared_libs: [],
1102 stl: "none",
1103 stubs: {
1104 versions: ["10", "11", "12"],
1105 },
1106 }
1107 `)
1108
Jooyung Hana0503a52023-08-23 13:12:50 +09001109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that indirect stubs dep is not included
1113 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1114 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1115
1116 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1117 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001118 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001119 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1120 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001121 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001122 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1123 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1124}
1125
Colin Cross7812fd32020-09-25 12:35:10 -07001126func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1127 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001128 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001129 apex {
1130 name: "myapex",
1131 key: "myapex.key",
1132 native_shared_libs: ["mylib", "mylib3"],
1133 min_sdk_version: "29",
1134 }
1135
1136 apex_key {
1137 name: "myapex.key",
1138 public_key: "testkey.avbpubkey",
1139 private_key: "testkey.pem",
1140 }
1141
1142 cc_library {
1143 name: "mylib",
1144 srcs: ["mylib.cpp"],
1145 shared_libs: ["mylib2", "mylib3"],
1146 system_shared_libs: [],
1147 stl: "none",
1148 apex_available: [ "myapex" ],
1149 min_sdk_version: "28",
1150 }
1151
1152 cc_library {
1153 name: "mylib2",
1154 srcs: ["mylib.cpp"],
1155 cflags: ["-include mylib.h"],
1156 system_shared_libs: [],
1157 stl: "none",
1158 stubs: {
1159 versions: ["28", "29", "30", "current"],
1160 },
1161 min_sdk_version: "28",
1162 }
1163
1164 cc_library {
1165 name: "mylib3",
1166 srcs: ["mylib.cpp"],
1167 shared_libs: ["mylib4"],
1168 system_shared_libs: [],
1169 stl: "none",
1170 stubs: {
1171 versions: ["28", "29", "30", "current"],
1172 },
1173 apex_available: [ "myapex" ],
1174 min_sdk_version: "28",
1175 }
1176
1177 cc_library {
1178 name: "mylib4",
1179 srcs: ["mylib.cpp"],
1180 system_shared_libs: [],
1181 stl: "none",
1182 apex_available: [ "myapex" ],
1183 min_sdk_version: "28",
1184 }
1185 `)
1186
Jooyung Hana0503a52023-08-23 13:12:50 +09001187 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001188 copyCmds := apexRule.Args["copy_commands"]
1189
1190 // Ensure that direct non-stubs dep is always included
1191 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1192
1193 // Ensure that indirect stubs dep is not included
1194 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1195
1196 // Ensure that direct stubs dep is included
1197 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1198
1199 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1200
Jiyong Park55549df2021-02-26 23:57:23 +09001201 // Ensure that mylib is linking with the latest version of stub for mylib2
1202 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001203 // ... and not linking to the non-stub (impl) variant of mylib2
1204 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1205
1206 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1207 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1208 // .. and not linking to the stubs variant of mylib3
1209 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1210
1211 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001212 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001213 ensureNotContains(t, mylib2Cflags, "-include ")
1214
Jiyong Park85cc35a2022-07-17 11:30:47 +09001215 // Ensure that genstub is invoked with --systemapi
1216 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001217
Jooyung Hana0503a52023-08-23 13:12:50 +09001218 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001219 "lib64/mylib.so",
1220 "lib64/mylib3.so",
1221 "lib64/mylib4.so",
1222 })
1223}
1224
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001225func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1226 t.Parallel()
1227 // myapex (Z)
1228 // mylib -----------------.
1229 // |
1230 // otherapex (29) |
1231 // libstub's versions: 29 Z current
1232 // |
1233 // <platform> |
1234 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001235 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001236 apex {
1237 name: "myapex",
1238 key: "myapex.key",
1239 native_shared_libs: ["mylib"],
1240 min_sdk_version: "Z", // non-final
1241 }
1242
1243 cc_library {
1244 name: "mylib",
1245 srcs: ["mylib.cpp"],
1246 shared_libs: ["libstub"],
1247 apex_available: ["myapex"],
1248 min_sdk_version: "Z",
1249 }
1250
1251 apex_key {
1252 name: "myapex.key",
1253 public_key: "testkey.avbpubkey",
1254 private_key: "testkey.pem",
1255 }
1256
1257 apex {
1258 name: "otherapex",
1259 key: "myapex.key",
1260 native_shared_libs: ["libstub"],
1261 min_sdk_version: "29",
1262 }
1263
1264 cc_library {
1265 name: "libstub",
1266 srcs: ["mylib.cpp"],
1267 stubs: {
1268 versions: ["29", "Z", "current"],
1269 },
1270 apex_available: ["otherapex"],
1271 min_sdk_version: "29",
1272 }
1273
1274 // platform module depending on libstub from otherapex should use the latest stub("current")
1275 cc_library {
1276 name: "libplatform",
1277 srcs: ["mylib.cpp"],
1278 shared_libs: ["libstub"],
1279 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001280 `,
1281 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1282 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1283 variables.Platform_sdk_final = proptools.BoolPtr(false)
1284 variables.Platform_version_active_codenames = []string{"Z"}
1285 }),
1286 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001287
Jiyong Park55549df2021-02-26 23:57:23 +09001288 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001289 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001290 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001291 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001292 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001293
1294 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1295 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1296 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1297 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1298 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1299}
1300
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001301func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001302 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001303 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001304 name: "myapex2",
1305 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001306 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001307 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001308 }
1309
1310 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001311 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 public_key: "testkey.avbpubkey",
1313 private_key: "testkey.pem",
1314 }
1315
1316 cc_library {
1317 name: "mylib",
1318 srcs: ["mylib.cpp"],
1319 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001320 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001321 system_shared_libs: [],
1322 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001323 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001324 }
1325
1326 cc_library {
1327 name: "libfoo",
1328 srcs: ["mylib.cpp"],
1329 shared_libs: ["libbar"],
1330 system_shared_libs: [],
1331 stl: "none",
1332 stubs: {
1333 versions: ["10", "20", "30"],
1334 },
1335 }
1336
1337 cc_library {
1338 name: "libbar",
1339 srcs: ["mylib.cpp"],
1340 system_shared_libs: [],
1341 stl: "none",
1342 }
1343
Jiyong Park678c8812020-02-07 17:25:49 +09001344 cc_library_static {
1345 name: "libbaz",
1346 srcs: ["mylib.cpp"],
1347 system_shared_libs: [],
1348 stl: "none",
1349 apex_available: [ "myapex2" ],
1350 }
1351
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001352 `)
1353
Jooyung Hana0503a52023-08-23 13:12:50 +09001354 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001355 copyCmds := apexRule.Args["copy_commands"]
1356
1357 // Ensure that direct non-stubs dep is always included
1358 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1359
1360 // Ensure that indirect stubs dep is not included
1361 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1362
1363 // Ensure that dependency of stubs is not included
1364 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1365
Colin Crossaede88c2020-08-11 12:17:01 -07001366 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001367
1368 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001369 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001370 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001371 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001372
Jiyong Park3ff16992019-12-27 14:11:47 +09001373 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001374
1375 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1376 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001377
Colin Crossf61d03d2023-11-02 16:56:39 -07001378 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1379 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001380 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001381
Colin Crossf61d03d2023-11-02 16:56:39 -07001382 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1383 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001384 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001385}
1386
Jooyung Hand3639552019-08-09 12:57:43 +09001387func TestApexWithRuntimeLibsDependency(t *testing.T) {
1388 /*
1389 myapex
1390 |
1391 v (runtime_libs)
1392 mylib ------+------> libfoo [provides stub]
1393 |
1394 `------> libbar
1395 */
Colin Cross1c460562021-02-16 17:55:47 -08001396 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001397 apex {
1398 name: "myapex",
1399 key: "myapex.key",
1400 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001401 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001402 }
1403
1404 apex_key {
1405 name: "myapex.key",
1406 public_key: "testkey.avbpubkey",
1407 private_key: "testkey.pem",
1408 }
1409
1410 cc_library {
1411 name: "mylib",
1412 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001413 static_libs: ["libstatic"],
1414 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001415 runtime_libs: ["libfoo", "libbar"],
1416 system_shared_libs: [],
1417 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001418 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001419 }
1420
1421 cc_library {
1422 name: "libfoo",
1423 srcs: ["mylib.cpp"],
1424 system_shared_libs: [],
1425 stl: "none",
1426 stubs: {
1427 versions: ["10", "20", "30"],
1428 },
1429 }
1430
1431 cc_library {
1432 name: "libbar",
1433 srcs: ["mylib.cpp"],
1434 system_shared_libs: [],
1435 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001436 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001437 }
1438
Liz Kammer5f108fa2023-05-11 14:33:17 -04001439 cc_library {
1440 name: "libstatic",
1441 srcs: ["mylib.cpp"],
1442 system_shared_libs: [],
1443 stl: "none",
1444 apex_available: [ "myapex" ],
1445 runtime_libs: ["libstatic_to_runtime"],
1446 }
1447
1448 cc_library {
1449 name: "libshared",
1450 srcs: ["mylib.cpp"],
1451 system_shared_libs: [],
1452 stl: "none",
1453 apex_available: [ "myapex" ],
1454 runtime_libs: ["libshared_to_runtime"],
1455 }
1456
1457 cc_library {
1458 name: "libstatic_to_runtime",
1459 srcs: ["mylib.cpp"],
1460 system_shared_libs: [],
1461 stl: "none",
1462 apex_available: [ "myapex" ],
1463 }
1464
1465 cc_library {
1466 name: "libshared_to_runtime",
1467 srcs: ["mylib.cpp"],
1468 system_shared_libs: [],
1469 stl: "none",
1470 apex_available: [ "myapex" ],
1471 }
Jooyung Hand3639552019-08-09 12:57:43 +09001472 `)
1473
Jooyung Hana0503a52023-08-23 13:12:50 +09001474 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001475 copyCmds := apexRule.Args["copy_commands"]
1476
1477 // Ensure that direct non-stubs dep is always included
1478 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1479
1480 // Ensure that indirect stubs dep is not included
1481 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1482
1483 // Ensure that runtime_libs dep in included
1484 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001485 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1486 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1487
1488 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001489
Jooyung Hana0503a52023-08-23 13:12:50 +09001490 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001491 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1492 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001493}
1494
Paul Duffina02cae32021-03-09 01:44:06 +00001495var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1496 cc.PrepareForTestWithCcBuildComponents,
1497 PrepareForTestWithApexBuildComponents,
1498 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001499 apex {
1500 name: "com.android.runtime",
1501 key: "com.android.runtime.key",
1502 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001503 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001504 }
1505
1506 apex_key {
1507 name: "com.android.runtime.key",
1508 public_key: "testkey.avbpubkey",
1509 private_key: "testkey.pem",
1510 }
Paul Duffina02cae32021-03-09 01:44:06 +00001511 `),
1512 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1513)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514
Paul Duffina02cae32021-03-09 01:44:06 +00001515func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001516 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001517 cc_library {
1518 name: "libc",
1519 no_libcrt: true,
1520 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001521 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522 stl: "none",
1523 system_shared_libs: [],
1524 stubs: { versions: ["1"] },
1525 apex_available: ["com.android.runtime"],
1526
1527 sanitize: {
1528 hwaddress: true,
1529 }
1530 }
1531
1532 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001533 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001534 no_libcrt: true,
1535 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001536 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001537 stl: "none",
1538 system_shared_libs: [],
1539 srcs: [""],
1540 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001541 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001542
1543 sanitize: {
1544 never: true,
1545 },
Spandan Das4de7b492023-05-05 21:13:01 +00001546 apex_available: [
1547 "//apex_available:anyapex",
1548 "//apex_available:platform",
1549 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001550 } `)
1551 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001552
Jooyung Hana0503a52023-08-23 13:12:50 +09001553 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001554 "lib64/bionic/libc.so",
1555 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1556 })
1557
Colin Cross4c4c1be2022-02-10 11:41:18 -08001558 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
1560 installed := hwasan.Description("install libclang_rt.hwasan")
1561 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1562
1563 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1564 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1565 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1566}
1567
1568func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001569 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001570 prepareForTestOfRuntimeApexWithHwasan,
1571 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1572 variables.SanitizeDevice = []string{"hwaddress"}
1573 }),
1574 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001575 cc_library {
1576 name: "libc",
1577 no_libcrt: true,
1578 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001579 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001580 stl: "none",
1581 system_shared_libs: [],
1582 stubs: { versions: ["1"] },
1583 apex_available: ["com.android.runtime"],
1584 }
1585
1586 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001587 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588 no_libcrt: true,
1589 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001590 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001591 stl: "none",
1592 system_shared_libs: [],
1593 srcs: [""],
1594 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001595 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001596
1597 sanitize: {
1598 never: true,
1599 },
Spandan Das4de7b492023-05-05 21:13:01 +00001600 apex_available: [
1601 "//apex_available:anyapex",
1602 "//apex_available:platform",
1603 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001604 }
Paul Duffina02cae32021-03-09 01:44:06 +00001605 `)
1606 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001607
Jooyung Hana0503a52023-08-23 13:12:50 +09001608 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001609 "lib64/bionic/libc.so",
1610 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1611 })
1612
Colin Cross4c4c1be2022-02-10 11:41:18 -08001613 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001614
1615 installed := hwasan.Description("install libclang_rt.hwasan")
1616 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1617
1618 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1619 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1620 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1621}
1622
Jooyung Han61b66e92020-03-21 14:21:46 +00001623func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1624 testcases := []struct {
1625 name string
1626 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001627 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001628 shouldLink string
1629 shouldNotLink []string
1630 }{
1631 {
Jiyong Park55549df2021-02-26 23:57:23 +09001632 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001633 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001634 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001635 shouldLink: "current",
1636 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001637 },
1638 {
Jiyong Park55549df2021-02-26 23:57:23 +09001639 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001640 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001641 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001642 shouldLink: "current",
1643 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001644 },
1645 }
1646 for _, tc := range testcases {
1647 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001648 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001649 apex {
1650 name: "myapex",
1651 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001652 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001653 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001654 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001655 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001656
Jooyung Han61b66e92020-03-21 14:21:46 +00001657 apex_key {
1658 name: "myapex.key",
1659 public_key: "testkey.avbpubkey",
1660 private_key: "testkey.pem",
1661 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001662
Jooyung Han61b66e92020-03-21 14:21:46 +00001663 cc_library {
1664 name: "mylib",
1665 srcs: ["mylib.cpp"],
1666 vendor_available: true,
1667 shared_libs: ["libbar"],
1668 system_shared_libs: [],
1669 stl: "none",
1670 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001671 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001672 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001673
Jooyung Han61b66e92020-03-21 14:21:46 +00001674 cc_library {
1675 name: "libbar",
1676 srcs: ["mylib.cpp"],
1677 system_shared_libs: [],
1678 stl: "none",
1679 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001680 llndk: {
1681 symbol_file: "libbar.map.txt",
1682 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001683 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001684 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001685 withUnbundledBuild,
1686 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001687
Jooyung Han61b66e92020-03-21 14:21:46 +00001688 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001689 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001690 "lib64/mylib.so",
1691 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001692
Jooyung Han61b66e92020-03-21 14:21:46 +00001693 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001694 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001695 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1696 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001697
Steven Moreland2c4000c2021-04-27 02:08:49 +00001698 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1699 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001700 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001701 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001702 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001703
Steven Moreland2c4000c2021-04-27 02:08:49 +00001704 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001705 ver := tc.shouldLink
1706 if tc.shouldLink == "current" {
1707 ver = strconv.Itoa(android.FutureApiLevelInt)
1708 }
1709 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 })
1711 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001712}
1713
Jiyong Park25fc6a92018-11-18 18:02:45 +09001714func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001715 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001716 apex {
1717 name: "myapex",
1718 key: "myapex.key",
1719 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001720 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001721 }
1722
1723 apex_key {
1724 name: "myapex.key",
1725 public_key: "testkey.avbpubkey",
1726 private_key: "testkey.pem",
1727 }
1728
1729 cc_library {
1730 name: "mylib",
1731 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001732 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001733 shared_libs: ["libdl#27"],
1734 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001735 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001736 }
1737
1738 cc_library_shared {
1739 name: "mylib_shared",
1740 srcs: ["mylib.cpp"],
1741 shared_libs: ["libdl#27"],
1742 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001743 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 }
1745
1746 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001747 name: "libBootstrap",
1748 srcs: ["mylib.cpp"],
1749 stl: "none",
1750 bootstrap: true,
1751 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001752 `)
1753
Jooyung Hana0503a52023-08-23 13:12:50 +09001754 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001755 copyCmds := apexRule.Args["copy_commands"]
1756
1757 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001758 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001759 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1760 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001761
1762 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001763 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001764
Colin Crossaede88c2020-08-11 12:17:01 -07001765 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1766 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1767 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001768
1769 // For dependency to libc
1770 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001771 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001772 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001773 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001774 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001775 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1776 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001777
1778 // For dependency to libm
1779 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001780 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001781 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001782 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001783 // ... and is not compiling with the stub
1784 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1785 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1786
1787 // For dependency to libdl
1788 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001789 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001790 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001791 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1792 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001793 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001794 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001795 // ... Cflags from stub is correctly exported to mylib
1796 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1797 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001798
1799 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001800 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1801 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1802 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1803 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001805
Jooyung Han749dc692020-04-15 11:03:39 +09001806func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001807 // there are three links between liba --> libz.
1808 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001809 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001810 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001811 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001812 apex {
1813 name: "myapex",
1814 key: "myapex.key",
1815 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001816 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001817 }
1818
1819 apex {
1820 name: "otherapex",
1821 key: "myapex.key",
1822 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001823 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001824 }
1825
1826 apex_key {
1827 name: "myapex.key",
1828 public_key: "testkey.avbpubkey",
1829 private_key: "testkey.pem",
1830 }
1831
1832 cc_library {
1833 name: "libx",
1834 shared_libs: ["liba"],
1835 system_shared_libs: [],
1836 stl: "none",
1837 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001838 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001839 }
1840
1841 cc_library {
1842 name: "liby",
1843 shared_libs: ["liba"],
1844 system_shared_libs: [],
1845 stl: "none",
1846 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001847 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001848 }
1849
1850 cc_library {
1851 name: "liba",
1852 shared_libs: ["libz"],
1853 system_shared_libs: [],
1854 stl: "none",
1855 apex_available: [
1856 "//apex_available:anyapex",
1857 "//apex_available:platform",
1858 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001859 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001860 }
1861
1862 cc_library {
1863 name: "libz",
1864 system_shared_libs: [],
1865 stl: "none",
1866 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001867 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001868 },
1869 }
Jooyung Han749dc692020-04-15 11:03:39 +09001870 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001871
1872 expectLink := func(from, from_variant, to, to_variant string) {
1873 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1874 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1875 }
1876 expectNoLink := func(from, from_variant, to, to_variant string) {
1877 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1878 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1879 }
1880 // platform liba is linked to non-stub version
1881 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001882 // liba in myapex is linked to current
1883 expectLink("liba", "shared_apex29", "libz", "shared_current")
1884 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001885 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001886 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 // liba in otherapex is linked to current
1888 expectLink("liba", "shared_apex30", "libz", "shared_current")
1889 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1891 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001892}
1893
Jooyung Hanaed150d2020-04-02 01:41:41 +09001894func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001895 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001896 apex {
1897 name: "myapex",
1898 key: "myapex.key",
1899 native_shared_libs: ["libx"],
1900 min_sdk_version: "R",
1901 }
1902
1903 apex_key {
1904 name: "myapex.key",
1905 public_key: "testkey.avbpubkey",
1906 private_key: "testkey.pem",
1907 }
1908
1909 cc_library {
1910 name: "libx",
1911 shared_libs: ["libz"],
1912 system_shared_libs: [],
1913 stl: "none",
1914 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001915 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001916 }
1917
1918 cc_library {
1919 name: "libz",
1920 system_shared_libs: [],
1921 stl: "none",
1922 stubs: {
1923 versions: ["29", "R"],
1924 },
1925 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001926 `,
1927 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1928 variables.Platform_version_active_codenames = []string{"R"}
1929 }),
1930 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001931
1932 expectLink := func(from, from_variant, to, to_variant string) {
1933 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1934 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1935 }
1936 expectNoLink := func(from, from_variant, to, to_variant string) {
1937 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1938 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1939 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001940 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1941 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001942 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1943 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001944}
1945
Jooyung Han4c4da062021-06-23 10:23:16 +09001946func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1947 testApex(t, `
1948 apex {
1949 name: "myapex",
1950 key: "myapex.key",
1951 java_libs: ["libx"],
1952 min_sdk_version: "S",
1953 }
1954
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960
1961 java_library {
1962 name: "libx",
1963 srcs: ["a.java"],
1964 apex_available: [ "myapex" ],
1965 sdk_version: "current",
1966 min_sdk_version: "S", // should be okay
1967 }
1968 `,
1969 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1970 variables.Platform_version_active_codenames = []string{"S"}
1971 variables.Platform_sdk_codename = proptools.StringPtr("S")
1972 }),
1973 )
1974}
1975
Jooyung Han749dc692020-04-15 11:03:39 +09001976func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001977 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001978 apex {
1979 name: "myapex",
1980 key: "myapex.key",
1981 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001982 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001983 }
1984
1985 apex_key {
1986 name: "myapex.key",
1987 public_key: "testkey.avbpubkey",
1988 private_key: "testkey.pem",
1989 }
1990
1991 cc_library {
1992 name: "libx",
1993 shared_libs: ["libz"],
1994 system_shared_libs: [],
1995 stl: "none",
1996 apex_available: [ "myapex" ],
1997 }
1998
1999 cc_library {
2000 name: "libz",
2001 system_shared_libs: [],
2002 stl: "none",
2003 stubs: {
2004 versions: ["1", "2"],
2005 },
2006 }
2007 `)
2008
2009 expectLink := func(from, from_variant, to, to_variant string) {
2010 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2011 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2012 }
2013 expectNoLink := func(from, from_variant, to, to_variant string) {
2014 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2015 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2016 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002017 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002018 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002019 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002020 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002021}
2022
Jooyung Handfc864c2023-03-20 18:19:07 +09002023func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002024 ctx := testApex(t, `
2025 apex {
2026 name: "myapex",
2027 key: "myapex.key",
2028 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002029 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002030 vendor: true,
2031 min_sdk_version: "29",
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library {
2041 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002042 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002043 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002044 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002045 shared_libs: ["libbar"],
2046 }
2047
2048 cc_library {
2049 name: "libbar",
2050 stubs: { versions: ["29", "30"] },
2051 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002052 }
2053 `)
2054
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002055 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002056
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002057 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002058
2059 // Ensure that mylib links with "current" LLNDK
2060 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002061 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002062
2063 // Ensure that mylib is targeting 29
2064 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2065 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2066
2067 // Ensure that the correct variant of crtbegin_so is used.
2068 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2069 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002070
2071 // Ensure that the crtbegin_so used by the APEX is targeting 29
2072 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2073 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2074}
2075
Jooyung Han4495f842023-04-25 16:39:59 +09002076func TestTrackAllowedDeps(t *testing.T) {
2077 ctx := testApex(t, `
2078 apex {
2079 name: "myapex",
2080 key: "myapex.key",
2081 updatable: true,
2082 native_shared_libs: [
2083 "mylib",
2084 "yourlib",
2085 ],
2086 min_sdk_version: "29",
2087 }
2088
2089 apex {
2090 name: "myapex2",
2091 key: "myapex.key",
2092 updatable: false,
2093 native_shared_libs: ["yourlib"],
2094 }
2095
2096 apex_key {
2097 name: "myapex.key",
2098 public_key: "testkey.avbpubkey",
2099 private_key: "testkey.pem",
2100 }
2101
2102 cc_library {
2103 name: "mylib",
2104 srcs: ["mylib.cpp"],
2105 shared_libs: ["libbar"],
2106 min_sdk_version: "29",
2107 apex_available: ["myapex"],
2108 }
2109
2110 cc_library {
2111 name: "libbar",
2112 stubs: { versions: ["29", "30"] },
2113 }
2114
2115 cc_library {
2116 name: "yourlib",
2117 srcs: ["mylib.cpp"],
2118 min_sdk_version: "29",
2119 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2120 }
2121 `, withFiles(android.MockFS{
2122 "packages/modules/common/build/allowed_deps.txt": nil,
2123 }))
2124
2125 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2126 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2127 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002128 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002129 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002130 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002131
Jooyung Hana0503a52023-08-23 13:12:50 +09002132 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002133 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2134 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002135 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2136 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2137 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2138 flatlist, "mylib:(minSdkVersion:29)")
2139 android.AssertStringListContains(t, "track platform-available lib",
2140 flatlist, "yourlib(minSdkVersion:29)")
2141}
2142
2143func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2144 ctx := testApex(t, `
2145 apex {
2146 name: "myapex",
2147 key: "myapex.key",
2148 updatable: true,
2149 min_sdk_version: "29",
2150 }
2151
2152 apex_key {
2153 name: "myapex.key",
2154 public_key: "testkey.avbpubkey",
2155 private_key: "testkey.pem",
2156 }
2157 `)
2158 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2159 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2160 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2161 }
2162}
2163
Jooyung Han03b51852020-02-26 22:45:42 +09002164func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002165 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002166 apex {
2167 name: "myapex",
2168 key: "myapex.key",
2169 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002170 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "libx",
2181 system_shared_libs: [],
2182 stl: "none",
2183 apex_available: [ "myapex" ],
2184 stubs: {
2185 versions: ["1", "2"],
2186 },
2187 }
2188
2189 cc_library {
2190 name: "libz",
2191 shared_libs: ["libx"],
2192 system_shared_libs: [],
2193 stl: "none",
2194 }
2195 `)
2196
2197 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002198 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002199 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2200 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2201 }
2202 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002203 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002204 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2205 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2206 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002207 expectLink("libz", "shared", "libx", "shared_current")
2208 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002209 expectNoLink("libz", "shared", "libz", "shared_1")
2210 expectNoLink("libz", "shared", "libz", "shared")
2211}
2212
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002213var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2214 func(variables android.FixtureProductVariables) {
2215 variables.SanitizeDevice = []string{"hwaddress"}
2216 },
2217)
2218
Jooyung Han75568392020-03-20 04:29:24 +09002219func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002220 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002221 apex {
2222 name: "myapex",
2223 key: "myapex.key",
2224 native_shared_libs: ["libx"],
2225 min_sdk_version: "29",
2226 }
2227
2228 apex_key {
2229 name: "myapex.key",
2230 public_key: "testkey.avbpubkey",
2231 private_key: "testkey.pem",
2232 }
2233
2234 cc_library {
2235 name: "libx",
2236 shared_libs: ["libbar"],
2237 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002238 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002239 }
2240
2241 cc_library {
2242 name: "libbar",
2243 stubs: {
2244 versions: ["29", "30"],
2245 },
2246 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002247 `,
2248 prepareForTestWithSantitizeHwaddress,
2249 )
Jooyung Han03b51852020-02-26 22:45:42 +09002250 expectLink := func(from, from_variant, to, to_variant string) {
2251 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2252 libFlags := ld.Args["libFlags"]
2253 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2254 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002255 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002256}
2257
Jooyung Han75568392020-03-20 04:29:24 +09002258func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002259 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002260 apex {
2261 name: "myapex",
2262 key: "myapex.key",
2263 native_shared_libs: ["libx"],
2264 min_sdk_version: "29",
2265 }
2266
2267 apex_key {
2268 name: "myapex.key",
2269 public_key: "testkey.avbpubkey",
2270 private_key: "testkey.pem",
2271 }
2272
2273 cc_library {
2274 name: "libx",
2275 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002276 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002277 }
Jooyung Han75568392020-03-20 04:29:24 +09002278 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002279
2280 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002281 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002282 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002283 // note that platform variant is not.
2284 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002285 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002286}
2287
Jooyung Han749dc692020-04-15 11:03:39 +09002288func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2289 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002290 apex {
2291 name: "myapex",
2292 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002293 native_shared_libs: ["mylib"],
2294 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002295 }
2296
2297 apex_key {
2298 name: "myapex.key",
2299 public_key: "testkey.avbpubkey",
2300 private_key: "testkey.pem",
2301 }
Jooyung Han749dc692020-04-15 11:03:39 +09002302
2303 cc_library {
2304 name: "mylib",
2305 srcs: ["mylib.cpp"],
2306 system_shared_libs: [],
2307 stl: "none",
2308 apex_available: [
2309 "myapex",
2310 ],
2311 min_sdk_version: "30",
2312 }
2313 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002314
2315 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2316 apex {
2317 name: "myapex",
2318 key: "myapex.key",
2319 native_shared_libs: ["libfoo.ffi"],
2320 min_sdk_version: "29",
2321 }
2322
2323 apex_key {
2324 name: "myapex.key",
2325 public_key: "testkey.avbpubkey",
2326 private_key: "testkey.pem",
2327 }
2328
2329 rust_ffi_shared {
2330 name: "libfoo.ffi",
2331 srcs: ["foo.rs"],
2332 crate_name: "foo",
2333 apex_available: [
2334 "myapex",
2335 ],
2336 min_sdk_version: "30",
2337 }
2338 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002339
2340 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2341 apex {
2342 name: "myapex",
2343 key: "myapex.key",
2344 java_libs: ["libfoo"],
2345 min_sdk_version: "29",
2346 }
2347
2348 apex_key {
2349 name: "myapex.key",
2350 public_key: "testkey.avbpubkey",
2351 private_key: "testkey.pem",
2352 }
2353
2354 java_import {
2355 name: "libfoo",
2356 jars: ["libfoo.jar"],
2357 apex_available: [
2358 "myapex",
2359 ],
2360 min_sdk_version: "30",
2361 }
2362 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002363
2364 // Skip check for modules compiling against core API surface
2365 testApex(t, `
2366 apex {
2367 name: "myapex",
2368 key: "myapex.key",
2369 java_libs: ["libfoo"],
2370 min_sdk_version: "29",
2371 }
2372
2373 apex_key {
2374 name: "myapex.key",
2375 public_key: "testkey.avbpubkey",
2376 private_key: "testkey.pem",
2377 }
2378
2379 java_library {
2380 name: "libfoo",
2381 srcs: ["Foo.java"],
2382 apex_available: [
2383 "myapex",
2384 ],
2385 // Compile against core API surface
2386 sdk_version: "core_current",
2387 min_sdk_version: "30",
2388 }
2389 `)
2390
Jooyung Han749dc692020-04-15 11:03:39 +09002391}
2392
2393func TestApexMinSdkVersion_Okay(t *testing.T) {
2394 testApex(t, `
2395 apex {
2396 name: "myapex",
2397 key: "myapex.key",
2398 native_shared_libs: ["libfoo"],
2399 java_libs: ["libbar"],
2400 min_sdk_version: "29",
2401 }
2402
2403 apex_key {
2404 name: "myapex.key",
2405 public_key: "testkey.avbpubkey",
2406 private_key: "testkey.pem",
2407 }
2408
2409 cc_library {
2410 name: "libfoo",
2411 srcs: ["mylib.cpp"],
2412 shared_libs: ["libfoo_dep"],
2413 apex_available: ["myapex"],
2414 min_sdk_version: "29",
2415 }
2416
2417 cc_library {
2418 name: "libfoo_dep",
2419 srcs: ["mylib.cpp"],
2420 apex_available: ["myapex"],
2421 min_sdk_version: "29",
2422 }
2423
2424 java_library {
2425 name: "libbar",
2426 sdk_version: "current",
2427 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002428 static_libs: [
2429 "libbar_dep",
2430 "libbar_import_dep",
2431 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002432 apex_available: ["myapex"],
2433 min_sdk_version: "29",
2434 }
2435
2436 java_library {
2437 name: "libbar_dep",
2438 sdk_version: "current",
2439 srcs: ["a.java"],
2440 apex_available: ["myapex"],
2441 min_sdk_version: "29",
2442 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002443
2444 java_import {
2445 name: "libbar_import_dep",
2446 jars: ["libbar.jar"],
2447 apex_available: ["myapex"],
2448 min_sdk_version: "29",
2449 }
Jooyung Han03b51852020-02-26 22:45:42 +09002450 `)
2451}
2452
Colin Cross8ca61c12022-10-06 21:00:14 -07002453func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2454 // Tests that an apex dependency with min_sdk_version higher than the
2455 // min_sdk_version of the apex is allowed as long as the dependency's
2456 // min_sdk_version is less than or equal to the api level that the
2457 // architecture was introduced in. In this case, arm64 didn't exist
2458 // until api level 21, so the arm64 code will never need to run on
2459 // an api level 20 device, even if other architectures of the apex
2460 // will.
2461 testApex(t, `
2462 apex {
2463 name: "myapex",
2464 key: "myapex.key",
2465 native_shared_libs: ["libfoo"],
2466 min_sdk_version: "20",
2467 }
2468
2469 apex_key {
2470 name: "myapex.key",
2471 public_key: "testkey.avbpubkey",
2472 private_key: "testkey.pem",
2473 }
2474
2475 cc_library {
2476 name: "libfoo",
2477 srcs: ["mylib.cpp"],
2478 apex_available: ["myapex"],
2479 min_sdk_version: "21",
2480 stl: "none",
2481 }
2482 `)
2483}
2484
Artur Satayev8cf899a2020-04-15 17:29:42 +01002485func TestJavaStableSdkVersion(t *testing.T) {
2486 testCases := []struct {
2487 name string
2488 expectedError string
2489 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002490 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002491 }{
2492 {
2493 name: "Non-updatable apex with non-stable dep",
2494 bp: `
2495 apex {
2496 name: "myapex",
2497 java_libs: ["myjar"],
2498 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002499 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002500 }
2501 apex_key {
2502 name: "myapex.key",
2503 public_key: "testkey.avbpubkey",
2504 private_key: "testkey.pem",
2505 }
2506 java_library {
2507 name: "myjar",
2508 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002509 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002510 apex_available: ["myapex"],
2511 }
2512 `,
2513 },
2514 {
2515 name: "Updatable apex with stable dep",
2516 bp: `
2517 apex {
2518 name: "myapex",
2519 java_libs: ["myjar"],
2520 key: "myapex.key",
2521 updatable: true,
2522 min_sdk_version: "29",
2523 }
2524 apex_key {
2525 name: "myapex.key",
2526 public_key: "testkey.avbpubkey",
2527 private_key: "testkey.pem",
2528 }
2529 java_library {
2530 name: "myjar",
2531 srcs: ["foo/bar/MyClass.java"],
2532 sdk_version: "current",
2533 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002534 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002535 }
2536 `,
2537 },
2538 {
2539 name: "Updatable apex with non-stable dep",
2540 expectedError: "cannot depend on \"myjar\"",
2541 bp: `
2542 apex {
2543 name: "myapex",
2544 java_libs: ["myjar"],
2545 key: "myapex.key",
2546 updatable: true,
2547 }
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }
2553 java_library {
2554 name: "myjar",
2555 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002556 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002557 apex_available: ["myapex"],
2558 }
2559 `,
2560 },
2561 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002562 name: "Updatable apex with non-stable legacy core platform dep",
2563 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2564 bp: `
2565 apex {
2566 name: "myapex",
2567 java_libs: ["myjar-uses-legacy"],
2568 key: "myapex.key",
2569 updatable: true,
2570 }
2571 apex_key {
2572 name: "myapex.key",
2573 public_key: "testkey.avbpubkey",
2574 private_key: "testkey.pem",
2575 }
2576 java_library {
2577 name: "myjar-uses-legacy",
2578 srcs: ["foo/bar/MyClass.java"],
2579 sdk_version: "core_platform",
2580 apex_available: ["myapex"],
2581 }
2582 `,
2583 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2584 },
2585 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002586 name: "Updatable apex with non-stable transitive dep",
2587 // This is not actually detecting that the transitive dependency is unstable, rather it is
2588 // detecting that the transitive dependency is building against a wider API surface than the
2589 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002590 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002591 bp: `
2592 apex {
2593 name: "myapex",
2594 java_libs: ["myjar"],
2595 key: "myapex.key",
2596 updatable: true,
2597 }
2598 apex_key {
2599 name: "myapex.key",
2600 public_key: "testkey.avbpubkey",
2601 private_key: "testkey.pem",
2602 }
2603 java_library {
2604 name: "myjar",
2605 srcs: ["foo/bar/MyClass.java"],
2606 sdk_version: "current",
2607 apex_available: ["myapex"],
2608 static_libs: ["transitive-jar"],
2609 }
2610 java_library {
2611 name: "transitive-jar",
2612 srcs: ["foo/bar/MyClass.java"],
2613 sdk_version: "core_platform",
2614 apex_available: ["myapex"],
2615 }
2616 `,
2617 },
2618 }
2619
2620 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002621 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2622 continue
2623 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002624 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002625 errorHandler := android.FixtureExpectsNoErrors
2626 if test.expectedError != "" {
2627 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002628 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002629 android.GroupFixturePreparers(
2630 java.PrepareForTestWithJavaDefaultModules,
2631 PrepareForTestWithApexBuildComponents,
2632 prepareForTestWithMyapex,
2633 android.OptionalFixturePreparer(test.preparer),
2634 ).
2635 ExtendWithErrorHandler(errorHandler).
2636 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002637 })
2638 }
2639}
2640
Jooyung Han749dc692020-04-15 11:03:39 +09002641func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2642 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2643 apex {
2644 name: "myapex",
2645 key: "myapex.key",
2646 native_shared_libs: ["mylib"],
2647 min_sdk_version: "29",
2648 }
2649
2650 apex_key {
2651 name: "myapex.key",
2652 public_key: "testkey.avbpubkey",
2653 private_key: "testkey.pem",
2654 }
2655
2656 cc_library {
2657 name: "mylib",
2658 srcs: ["mylib.cpp"],
2659 shared_libs: ["mylib2"],
2660 system_shared_libs: [],
2661 stl: "none",
2662 apex_available: [
2663 "myapex",
2664 ],
2665 min_sdk_version: "29",
2666 }
2667
2668 // indirect part of the apex
2669 cc_library {
2670 name: "mylib2",
2671 srcs: ["mylib.cpp"],
2672 system_shared_libs: [],
2673 stl: "none",
2674 apex_available: [
2675 "myapex",
2676 ],
2677 min_sdk_version: "30",
2678 }
2679 `)
2680}
2681
2682func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2683 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2684 apex {
2685 name: "myapex",
2686 key: "myapex.key",
2687 apps: ["AppFoo"],
2688 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002689 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002690 }
2691
2692 apex_key {
2693 name: "myapex.key",
2694 public_key: "testkey.avbpubkey",
2695 private_key: "testkey.pem",
2696 }
2697
2698 android_app {
2699 name: "AppFoo",
2700 srcs: ["foo/bar/MyClass.java"],
2701 sdk_version: "current",
2702 min_sdk_version: "29",
2703 system_modules: "none",
2704 stl: "none",
2705 static_libs: ["bar"],
2706 apex_available: [ "myapex" ],
2707 }
2708
2709 java_library {
2710 name: "bar",
2711 sdk_version: "current",
2712 srcs: ["a.java"],
2713 apex_available: [ "myapex" ],
2714 }
2715 `)
2716}
2717
2718func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002719 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002720 apex {
2721 name: "myapex",
2722 key: "myapex.key",
2723 native_shared_libs: ["mylib"],
2724 min_sdk_version: "29",
2725 }
2726
2727 apex_key {
2728 name: "myapex.key",
2729 public_key: "testkey.avbpubkey",
2730 private_key: "testkey.pem",
2731 }
2732
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002733 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002734 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2735 cc_library {
2736 name: "mylib",
2737 srcs: ["mylib.cpp"],
2738 shared_libs: ["mylib2"],
2739 system_shared_libs: [],
2740 stl: "none",
2741 apex_available: ["myapex", "otherapex"],
2742 min_sdk_version: "29",
2743 }
2744
2745 cc_library {
2746 name: "mylib2",
2747 srcs: ["mylib.cpp"],
2748 system_shared_libs: [],
2749 stl: "none",
2750 apex_available: ["otherapex"],
2751 stubs: { versions: ["29", "30"] },
2752 min_sdk_version: "30",
2753 }
2754
2755 apex {
2756 name: "otherapex",
2757 key: "myapex.key",
2758 native_shared_libs: ["mylib", "mylib2"],
2759 min_sdk_version: "30",
2760 }
2761 `)
2762 expectLink := func(from, from_variant, to, to_variant string) {
2763 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2764 libFlags := ld.Args["libFlags"]
2765 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2766 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002767 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002768 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002769}
2770
Jooyung Haned124c32021-01-26 11:43:46 +09002771func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002772 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2773 func(variables android.FixtureProductVariables) {
2774 variables.Platform_sdk_codename = proptools.StringPtr("S")
2775 variables.Platform_version_active_codenames = []string{"S"}
2776 },
2777 )
Jooyung Haned124c32021-01-26 11:43:46 +09002778 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2779 apex {
2780 name: "myapex",
2781 key: "myapex.key",
2782 native_shared_libs: ["libfoo"],
2783 min_sdk_version: "S",
2784 }
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790 cc_library {
2791 name: "libfoo",
2792 shared_libs: ["libbar"],
2793 apex_available: ["myapex"],
2794 min_sdk_version: "29",
2795 }
2796 cc_library {
2797 name: "libbar",
2798 apex_available: ["myapex"],
2799 }
2800 `, withSAsActiveCodeNames)
2801}
2802
2803func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002804 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2805 variables.Platform_sdk_codename = proptools.StringPtr("S")
2806 variables.Platform_version_active_codenames = []string{"S", "T"}
2807 })
Colin Cross1c460562021-02-16 17:55:47 -08002808 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002809 apex {
2810 name: "myapex",
2811 key: "myapex.key",
2812 native_shared_libs: ["libfoo"],
2813 min_sdk_version: "S",
2814 }
2815 apex_key {
2816 name: "myapex.key",
2817 public_key: "testkey.avbpubkey",
2818 private_key: "testkey.pem",
2819 }
2820 cc_library {
2821 name: "libfoo",
2822 shared_libs: ["libbar"],
2823 apex_available: ["myapex"],
2824 min_sdk_version: "S",
2825 }
2826 cc_library {
2827 name: "libbar",
2828 stubs: {
2829 symbol_file: "libbar.map.txt",
2830 versions: ["30", "S", "T"],
2831 },
2832 }
2833 `, withSAsActiveCodeNames)
2834
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002835 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002836 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2837 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002838 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002839}
2840
Jiyong Park7c2ee712018-12-07 00:42:25 +09002841func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002842 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002843 apex {
2844 name: "myapex",
2845 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002846 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002847 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002848 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002849 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002850 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002851 }
2852
2853 apex_key {
2854 name: "myapex.key",
2855 public_key: "testkey.avbpubkey",
2856 private_key: "testkey.pem",
2857 }
2858
2859 prebuilt_etc {
2860 name: "myetc",
2861 src: "myprebuilt",
2862 sub_dir: "foo/bar",
2863 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002864
2865 cc_library {
2866 name: "mylib",
2867 srcs: ["mylib.cpp"],
2868 relative_install_path: "foo/bar",
2869 system_shared_libs: [],
2870 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002871 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002872 }
2873
2874 cc_binary {
2875 name: "mybin",
2876 srcs: ["mylib.cpp"],
2877 relative_install_path: "foo/bar",
2878 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002879 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002880 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002881 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002882
2883 rust_binary {
2884 name: "mybin.rust",
2885 srcs: ["foo.rs"],
2886 relative_install_path: "rust_subdir",
2887 apex_available: [ "myapex" ],
2888 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002889 `)
2890
Jooyung Hana0503a52023-08-23 13:12:50 +09002891 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002892 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002893
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002894 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002895 ensureContains(t, cmd, "/etc ")
2896 ensureContains(t, cmd, "/etc/foo ")
2897 ensureContains(t, cmd, "/etc/foo/bar ")
2898 ensureContains(t, cmd, "/lib64 ")
2899 ensureContains(t, cmd, "/lib64/foo ")
2900 ensureContains(t, cmd, "/lib64/foo/bar ")
2901 ensureContains(t, cmd, "/lib ")
2902 ensureContains(t, cmd, "/lib/foo ")
2903 ensureContains(t, cmd, "/lib/foo/bar ")
2904 ensureContains(t, cmd, "/bin ")
2905 ensureContains(t, cmd, "/bin/foo ")
2906 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002907 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002908}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002909
Jooyung Han35155c42020-02-06 17:33:20 +09002910func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002911 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002912 apex {
2913 name: "myapex",
2914 key: "myapex.key",
2915 multilib: {
2916 both: {
2917 native_shared_libs: ["mylib"],
2918 binaries: ["mybin"],
2919 },
2920 },
2921 compile_multilib: "both",
2922 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002923 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002924 }
2925
2926 apex_key {
2927 name: "myapex.key",
2928 public_key: "testkey.avbpubkey",
2929 private_key: "testkey.pem",
2930 }
2931
2932 cc_library {
2933 name: "mylib",
2934 relative_install_path: "foo/bar",
2935 system_shared_libs: [],
2936 stl: "none",
2937 apex_available: [ "myapex" ],
2938 native_bridge_supported: true,
2939 }
2940
2941 cc_binary {
2942 name: "mybin",
2943 relative_install_path: "foo/bar",
2944 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002945 stl: "none",
2946 apex_available: [ "myapex" ],
2947 native_bridge_supported: true,
2948 compile_multilib: "both", // default is "first" for binary
2949 multilib: {
2950 lib64: {
2951 suffix: "64",
2952 },
2953 },
2954 }
2955 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002956 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002957 "bin/foo/bar/mybin",
2958 "bin/foo/bar/mybin64",
2959 "bin/arm/foo/bar/mybin",
2960 "bin/arm64/foo/bar/mybin64",
2961 "lib/foo/bar/mylib.so",
2962 "lib/arm/foo/bar/mylib.so",
2963 "lib64/foo/bar/mylib.so",
2964 "lib64/arm64/foo/bar/mylib.so",
2965 })
2966}
2967
Jooyung Han85d61762020-06-24 23:50:26 +09002968func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002969 result := android.GroupFixturePreparers(
2970 prepareForApexTest,
2971 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2972 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002973 apex {
2974 name: "myapex",
2975 key: "myapex.key",
2976 binaries: ["mybin"],
2977 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002978 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002979 }
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985 cc_binary {
2986 name: "mybin",
2987 vendor: true,
2988 shared_libs: ["libfoo"],
2989 }
2990 cc_library {
2991 name: "libfoo",
2992 proprietary: true,
2993 }
2994 `)
2995
Jooyung Hana0503a52023-08-23 13:12:50 +09002996 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002997 "bin/mybin",
2998 "lib64/libfoo.so",
2999 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3000 "lib64/libc++.so",
3001 })
3002
Jooyung Hana0503a52023-08-23 13:12:50 +09003003 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003004 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003005 name := apexBundle.BaseModuleName()
3006 prefix := "TARGET_"
3007 var builder strings.Builder
3008 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003009 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003010 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003011 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003012
Jooyung Hana0503a52023-08-23 13:12:50 +09003013 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003014 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3015 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003016}
3017
Justin Yun13decfb2021-03-08 19:25:55 +09003018func TestProductVariant(t *testing.T) {
3019 ctx := testApex(t, `
3020 apex {
3021 name: "myapex",
3022 key: "myapex.key",
3023 updatable: false,
3024 product_specific: true,
3025 binaries: ["foo"],
3026 }
3027
3028 apex_key {
3029 name: "myapex.key",
3030 public_key: "testkey.avbpubkey",
3031 private_key: "testkey.pem",
3032 }
3033
3034 cc_binary {
3035 name: "foo",
3036 product_available: true,
3037 apex_available: ["myapex"],
3038 srcs: ["foo.cpp"],
3039 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003040 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003041
3042 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003043 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003044 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3045 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3046 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3047 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3048}
3049
Jooyung Han8e5685d2020-09-21 11:02:57 +09003050func TestApex_withPrebuiltFirmware(t *testing.T) {
3051 testCases := []struct {
3052 name string
3053 additionalProp string
3054 }{
3055 {"system apex with prebuilt_firmware", ""},
3056 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3057 }
3058 for _, tc := range testCases {
3059 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003060 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003061 apex {
3062 name: "myapex",
3063 key: "myapex.key",
3064 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003065 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003066 `+tc.additionalProp+`
3067 }
3068 apex_key {
3069 name: "myapex.key",
3070 public_key: "testkey.avbpubkey",
3071 private_key: "testkey.pem",
3072 }
3073 prebuilt_firmware {
3074 name: "myfirmware",
3075 src: "myfirmware.bin",
3076 filename_from_src: true,
3077 `+tc.additionalProp+`
3078 }
3079 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003080 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003081 "etc/firmware/myfirmware.bin",
3082 })
3083 })
3084 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003085}
3086
Jooyung Hanefb184e2020-06-25 17:14:25 +09003087func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003088 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003089 apex {
3090 name: "myapex",
3091 key: "myapex.key",
3092 vendor: true,
3093 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003094 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003095 }
3096
3097 apex_key {
3098 name: "myapex.key",
3099 public_key: "testkey.avbpubkey",
3100 private_key: "testkey.pem",
3101 }
3102
3103 cc_library {
3104 name: "mylib",
3105 vendor_available: true,
3106 }
3107 `)
3108
Jooyung Hana0503a52023-08-23 13:12:50 +09003109 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003110 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003111 name := apexBundle.BaseModuleName()
3112 prefix := "TARGET_"
3113 var builder strings.Builder
3114 data.Custom(&builder, name, prefix, "", data)
3115 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003116 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 +09003117}
3118
Jooyung Han2ed99d02020-06-24 23:26:26 +09003119func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003120 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003121 apex {
3122 name: "myapex",
3123 key: "myapex.key",
3124 vintf_fragments: ["fragment.xml"],
3125 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003126 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003127 }
3128 apex_key {
3129 name: "myapex.key",
3130 public_key: "testkey.avbpubkey",
3131 private_key: "testkey.pem",
3132 }
3133 cc_binary {
3134 name: "mybin",
3135 }
3136 `)
3137
Jooyung Hana0503a52023-08-23 13:12:50 +09003138 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003139 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003140 name := apexBundle.BaseModuleName()
3141 prefix := "TARGET_"
3142 var builder strings.Builder
3143 data.Custom(&builder, name, prefix, "", data)
3144 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003145 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003146 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003147}
3148
Jiyong Park16e91a02018-12-20 18:18:08 +09003149func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003150 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003151 apex {
3152 name: "myapex",
3153 key: "myapex.key",
3154 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003155 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003156 }
3157
3158 apex_key {
3159 name: "myapex.key",
3160 public_key: "testkey.avbpubkey",
3161 private_key: "testkey.pem",
3162 }
3163
3164 cc_library {
3165 name: "mylib",
3166 srcs: ["mylib.cpp"],
3167 system_shared_libs: [],
3168 stl: "none",
3169 stubs: {
3170 versions: ["1", "2", "3"],
3171 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003172 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003173 }
3174
3175 cc_binary {
3176 name: "not_in_apex",
3177 srcs: ["mylib.cpp"],
3178 static_libs: ["mylib"],
3179 static_executable: true,
3180 system_shared_libs: [],
3181 stl: "none",
3182 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003183 `)
3184
Colin Cross7113d202019-11-20 16:39:12 -08003185 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003186
3187 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003188 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003189}
Jiyong Park9335a262018-12-24 11:31:58 +09003190
3191func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003192 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003193 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003194 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003195 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003196 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003197 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003198 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003199 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003200 }
3201
3202 cc_library {
3203 name: "mylib",
3204 srcs: ["mylib.cpp"],
3205 system_shared_libs: [],
3206 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003207 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003208 }
3209
3210 apex_key {
3211 name: "myapex.key",
3212 public_key: "testkey.avbpubkey",
3213 private_key: "testkey.pem",
3214 }
3215
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003216 android_app_certificate {
3217 name: "myapex.certificate",
3218 certificate: "testkey",
3219 }
3220
3221 android_app_certificate {
3222 name: "myapex.certificate.override",
3223 certificate: "testkey.override",
3224 }
3225
Jiyong Park9335a262018-12-24 11:31:58 +09003226 `)
3227
3228 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003229 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003230
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003231 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3232 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003233 "vendor/foo/devkeys/testkey.avbpubkey")
3234 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003235 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3236 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003237 "vendor/foo/devkeys/testkey.pem")
3238 }
3239
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003240 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003241 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003242 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003243 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003244 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003245 }
3246}
Jiyong Park58e364a2019-01-19 19:24:06 +09003247
Jooyung Hanf121a652019-12-17 14:30:11 +09003248func TestCertificate(t *testing.T) {
3249 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003250 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003251 apex {
3252 name: "myapex",
3253 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003254 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003255 }
3256 apex_key {
3257 name: "myapex.key",
3258 public_key: "testkey.avbpubkey",
3259 private_key: "testkey.pem",
3260 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003261 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003262 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3263 if actual := rule.Args["certificates"]; actual != expected {
3264 t.Errorf("certificates should be %q, not %q", expected, actual)
3265 }
3266 })
3267 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003268 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003269 apex {
3270 name: "myapex_keytest",
3271 key: "myapex.key",
3272 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003273 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003274 }
3275 apex_key {
3276 name: "myapex.key",
3277 public_key: "testkey.avbpubkey",
3278 private_key: "testkey.pem",
3279 }
3280 android_app_certificate {
3281 name: "myapex.certificate.override",
3282 certificate: "testkey.override",
3283 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003284 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003285 expected := "testkey.override.x509.pem testkey.override.pk8"
3286 if actual := rule.Args["certificates"]; actual != expected {
3287 t.Errorf("certificates should be %q, not %q", expected, actual)
3288 }
3289 })
3290 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003291 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003292 apex {
3293 name: "myapex",
3294 key: "myapex.key",
3295 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003296 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003297 }
3298 apex_key {
3299 name: "myapex.key",
3300 public_key: "testkey.avbpubkey",
3301 private_key: "testkey.pem",
3302 }
3303 android_app_certificate {
3304 name: "myapex.certificate",
3305 certificate: "testkey",
3306 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003307 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003308 expected := "testkey.x509.pem testkey.pk8"
3309 if actual := rule.Args["certificates"]; actual != expected {
3310 t.Errorf("certificates should be %q, not %q", expected, actual)
3311 }
3312 })
3313 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003314 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003315 apex {
3316 name: "myapex_keytest",
3317 key: "myapex.key",
3318 file_contexts: ":myapex-file_contexts",
3319 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003320 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003321 }
3322 apex_key {
3323 name: "myapex.key",
3324 public_key: "testkey.avbpubkey",
3325 private_key: "testkey.pem",
3326 }
3327 android_app_certificate {
3328 name: "myapex.certificate.override",
3329 certificate: "testkey.override",
3330 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003331 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003332 expected := "testkey.override.x509.pem testkey.override.pk8"
3333 if actual := rule.Args["certificates"]; actual != expected {
3334 t.Errorf("certificates should be %q, not %q", expected, actual)
3335 }
3336 })
3337 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003338 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003339 apex {
3340 name: "myapex",
3341 key: "myapex.key",
3342 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003343 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003344 }
3345 apex_key {
3346 name: "myapex.key",
3347 public_key: "testkey.avbpubkey",
3348 private_key: "testkey.pem",
3349 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003350 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3352 if actual := rule.Args["certificates"]; actual != expected {
3353 t.Errorf("certificates should be %q, not %q", expected, actual)
3354 }
3355 })
3356 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003357 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003358 apex {
3359 name: "myapex_keytest",
3360 key: "myapex.key",
3361 file_contexts: ":myapex-file_contexts",
3362 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003363 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003364 }
3365 apex_key {
3366 name: "myapex.key",
3367 public_key: "testkey.avbpubkey",
3368 private_key: "testkey.pem",
3369 }
3370 android_app_certificate {
3371 name: "myapex.certificate.override",
3372 certificate: "testkey.override",
3373 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003374 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003375 expected := "testkey.override.x509.pem testkey.override.pk8"
3376 if actual := rule.Args["certificates"]; actual != expected {
3377 t.Errorf("certificates should be %q, not %q", expected, actual)
3378 }
3379 })
3380}
3381
Jiyong Park58e364a2019-01-19 19:24:06 +09003382func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003383 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003384 apex {
3385 name: "myapex",
3386 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003387 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003388 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003389 }
3390
3391 apex {
3392 name: "otherapex",
3393 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003394 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003395 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003396 }
3397
3398 apex_key {
3399 name: "myapex.key",
3400 public_key: "testkey.avbpubkey",
3401 private_key: "testkey.pem",
3402 }
3403
3404 cc_library {
3405 name: "mylib",
3406 srcs: ["mylib.cpp"],
3407 system_shared_libs: [],
3408 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003409 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003410 "myapex",
3411 "otherapex",
3412 ],
Jooyung Han24282772020-03-21 23:20:55 +09003413 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003414 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003415 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003416 cc_library {
3417 name: "mylib2",
3418 srcs: ["mylib.cpp"],
3419 system_shared_libs: [],
3420 stl: "none",
3421 apex_available: [
3422 "myapex",
3423 "otherapex",
3424 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003425 static_libs: ["mylib3"],
3426 recovery_available: true,
3427 min_sdk_version: "29",
3428 }
3429 cc_library {
3430 name: "mylib3",
3431 srcs: ["mylib.cpp"],
3432 system_shared_libs: [],
3433 stl: "none",
3434 apex_available: [
3435 "myapex",
3436 "otherapex",
3437 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003438 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003439 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003440 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003441 `)
3442
Jooyung Hanc87a0592020-03-02 17:44:33 +09003443 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003444 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003445 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003446
Vinh Tranf9754732023-01-19 22:41:46 -05003447 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003448 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003449 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003450
Vinh Tranf9754732023-01-19 22:41:46 -05003451 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003452 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003453 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003454
Colin Crossaede88c2020-08-11 12:17:01 -07003455 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3456 // each variant defines additional macros to distinguish which apex variant it is built for
3457
3458 // non-APEX variant does not have __ANDROID_APEX__ defined
3459 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3460 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3461
Vinh Tranf9754732023-01-19 22:41:46 -05003462 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003463 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3464 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003465
Jooyung Hanc87a0592020-03-02 17:44:33 +09003466 // non-APEX variant does not have __ANDROID_APEX__ defined
3467 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3468 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3469
Vinh Tranf9754732023-01-19 22:41:46 -05003470 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003471 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003472 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003473}
Jiyong Park7e636d02019-01-28 16:16:54 +09003474
3475func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003476 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003477 apex {
3478 name: "myapex",
3479 key: "myapex.key",
3480 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003481 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003482 }
3483
3484 apex_key {
3485 name: "myapex.key",
3486 public_key: "testkey.avbpubkey",
3487 private_key: "testkey.pem",
3488 }
3489
3490 cc_library_headers {
3491 name: "mylib_headers",
3492 export_include_dirs: ["my_include"],
3493 system_shared_libs: [],
3494 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003495 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003496 }
3497
3498 cc_library {
3499 name: "mylib",
3500 srcs: ["mylib.cpp"],
3501 system_shared_libs: [],
3502 stl: "none",
3503 header_libs: ["mylib_headers"],
3504 export_header_lib_headers: ["mylib_headers"],
3505 stubs: {
3506 versions: ["1", "2", "3"],
3507 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003508 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003509 }
3510
3511 cc_library {
3512 name: "otherlib",
3513 srcs: ["mylib.cpp"],
3514 system_shared_libs: [],
3515 stl: "none",
3516 shared_libs: ["mylib"],
3517 }
3518 `)
3519
Colin Cross7113d202019-11-20 16:39:12 -08003520 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003521
3522 // Ensure that the include path of the header lib is exported to 'otherlib'
3523 ensureContains(t, cFlags, "-Imy_include")
3524}
Alex Light9670d332019-01-29 18:07:33 -08003525
Jiyong Park7cd10e32020-01-14 09:22:18 +09003526type fileInApex struct {
3527 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003528 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003529 isLink bool
3530}
3531
Jooyung Han1724d582022-12-21 10:17:44 +09003532func (f fileInApex) String() string {
3533 return f.src + ":" + f.path
3534}
3535
3536func (f fileInApex) match(expectation string) bool {
3537 parts := strings.Split(expectation, ":")
3538 if len(parts) == 1 {
3539 match, _ := path.Match(parts[0], f.path)
3540 return match
3541 }
3542 if len(parts) == 2 {
3543 matchSrc, _ := path.Match(parts[0], f.src)
3544 matchDst, _ := path.Match(parts[1], f.path)
3545 return matchSrc && matchDst
3546 }
3547 panic("invalid expected file specification: " + expectation)
3548}
3549
Jooyung Hana57af4a2020-01-23 05:36:59 +00003550func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003551 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003552 module := ctx.ModuleForTests(moduleName, variant)
3553 apexRule := module.MaybeRule("apexRule")
3554 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003555 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003556 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003557 for _, cmd := range strings.Split(copyCmds, "&&") {
3558 cmd = strings.TrimSpace(cmd)
3559 if cmd == "" {
3560 continue
3561 }
3562 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003563 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003564 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003565 switch terms[0] {
3566 case "mkdir":
3567 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003568 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003569 t.Fatal("copyCmds contains invalid cp command", cmd)
3570 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003571 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003572 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003573 isLink = false
3574 case "ln":
3575 if len(terms) != 3 && len(terms) != 4 {
3576 // ln LINK TARGET or ln -s LINK TARGET
3577 t.Fatal("copyCmds contains invalid ln command", cmd)
3578 }
3579 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003580 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003581 isLink = true
3582 default:
3583 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3584 }
3585 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003586 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003587 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003588 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003589 }
Jooyung Han1724d582022-12-21 10:17:44 +09003590 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003591 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003592 }
3593 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003594 return ret
3595}
3596
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003597func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003598 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003599 var failed bool
3600 var surplus []string
3601 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003602 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003603 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003604 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003605 if file.match(expected) {
3606 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003607 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003608 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 }
3610 }
Jooyung Han1724d582022-12-21 10:17:44 +09003611 if !matchFound {
3612 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003613 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003614 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003615
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003617 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003618 t.Log("surplus files", surplus)
3619 failed = true
3620 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003621
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003622 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003623 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003624 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003625 if !filesMatched[expected] {
3626 missing = append(missing, expected)
3627 }
3628 }
3629 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003630 t.Log("missing files", missing)
3631 failed = true
3632 }
3633 if failed {
3634 t.Fail()
3635 }
3636}
3637
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003638func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3639 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3640}
3641
3642func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003643 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003644 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3645 if deapexer.Output != nil {
3646 outputs = append(outputs, deapexer.Output.String())
3647 }
3648 for _, output := range deapexer.ImplicitOutputs {
3649 outputs = append(outputs, output.String())
3650 }
3651 actualFiles := make([]fileInApex, 0, len(outputs))
3652 for _, output := range outputs {
3653 dir := "/deapexer/"
3654 pos := strings.LastIndex(output, dir)
3655 if pos == -1 {
3656 t.Fatal("Unknown deapexer output ", output)
3657 }
3658 path := output[pos+len(dir):]
3659 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3660 }
3661 assertFileListEquals(t, files, actualFiles)
3662}
3663
Jooyung Han39edb6c2019-11-06 16:53:07 +09003664func vndkLibrariesTxtFiles(vers ...string) (result string) {
3665 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003666 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003667 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003668 prebuilt_etc {
3669 name: "` + txt + `.libraries.` + v + `.txt",
3670 src: "dummy.txt",
3671 }
3672 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003673 }
3674 }
3675 return
3676}
3677
Jooyung Han344d5432019-08-23 11:17:39 +09003678func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003679 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003680 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003681 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003682 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003683 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003684 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003685 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003686 }
3687
3688 apex_key {
3689 name: "myapex.key",
3690 public_key: "testkey.avbpubkey",
3691 private_key: "testkey.pem",
3692 }
3693
Jooyung Han31c470b2019-10-18 16:26:59 +09003694 vndk_prebuilt_shared {
3695 name: "libvndk27",
3696 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003697 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003698 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003699 vndk: {
3700 enabled: true,
3701 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003702 target_arch: "arm64",
3703 arch: {
3704 arm: {
3705 srcs: ["libvndk27_arm.so"],
3706 },
3707 arm64: {
3708 srcs: ["libvndk27_arm64.so"],
3709 },
3710 },
Colin Cross2807f002021-03-02 10:15:29 -08003711 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003712 }
3713
3714 vndk_prebuilt_shared {
3715 name: "libvndk27",
3716 version: "27",
3717 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003718 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003719 vndk: {
3720 enabled: true,
3721 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003722 target_arch: "x86_64",
3723 arch: {
3724 x86: {
3725 srcs: ["libvndk27_x86.so"],
3726 },
3727 x86_64: {
3728 srcs: ["libvndk27_x86_64.so"],
3729 },
3730 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003731 }
3732 `+vndkLibrariesTxtFiles("27"),
3733 withFiles(map[string][]byte{
3734 "libvndk27_arm.so": nil,
3735 "libvndk27_arm64.so": nil,
3736 "libvndk27_x86.so": nil,
3737 "libvndk27_x86_64.so": nil,
3738 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003739
Jooyung Hana0503a52023-08-23 13:12:50 +09003740 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003741 "lib/libvndk27_arm.so",
3742 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003743 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003744 })
Jooyung Han344d5432019-08-23 11:17:39 +09003745}
3746
Jooyung Han90eee022019-10-01 20:02:42 +09003747func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003748 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003749 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003750 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003751 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003752 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003753 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003754 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003755 }
3756 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003757 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003758 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003759 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003760 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003761 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003762 }
3763 apex_key {
3764 name: "myapex.key",
3765 public_key: "testkey.avbpubkey",
3766 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003767 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003768
3769 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003770 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003771 apexManifestRule := module.Rule("apexManifestRule")
3772 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003773 }
3774
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003775 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003776 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003777}
3778
Jooyung Han344d5432019-08-23 11:17:39 +09003779func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003780 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003781 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003782 name: "com.android.vndk.v30",
3783 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003784 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003785 native_bridge_supported: true,
3786 }
3787
3788 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003789 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003790 public_key: "testkey.avbpubkey",
3791 private_key: "testkey.pem",
3792 }
3793
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003794 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003795 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003796 version: "30",
3797 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003798 srcs: ["mylib.cpp"],
3799 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003800 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003801 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003802 vndk: {
3803 enabled: true,
3804 },
Jooyung Han344d5432019-08-23 11:17:39 +09003805 }
3806 `)
3807}
3808
Jooyung Han31c470b2019-10-18 16:26:59 +09003809func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003810 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003813 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003814 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003815 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003816 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003817 }
3818
3819 apex_key {
3820 name: "myapex.key",
3821 public_key: "testkey.avbpubkey",
3822 private_key: "testkey.pem",
3823 }
3824
3825 vndk_prebuilt_shared {
3826 name: "libvndk27",
3827 version: "27",
3828 target_arch: "arm",
3829 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003830 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003831 vndk: {
3832 enabled: true,
3833 },
3834 arch: {
3835 arm: {
3836 srcs: ["libvndk27.so"],
3837 }
3838 },
3839 }
3840
3841 vndk_prebuilt_shared {
3842 name: "libvndk27",
3843 version: "27",
3844 target_arch: "arm",
3845 binder32bit: true,
3846 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003847 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003848 vndk: {
3849 enabled: true,
3850 },
3851 arch: {
3852 arm: {
3853 srcs: ["libvndk27binder32.so"],
3854 }
3855 },
Colin Cross2807f002021-03-02 10:15:29 -08003856 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003857 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003858 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003859 withFiles(map[string][]byte{
3860 "libvndk27.so": nil,
3861 "libvndk27binder32.so": nil,
3862 }),
3863 withBinder32bit,
3864 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003865 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003866 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3867 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 },
3869 }),
3870 )
3871
Jooyung Hana0503a52023-08-23 13:12:50 +09003872 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003873 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003874 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 })
3876}
3877
Jooyung Hane1633032019-08-01 17:41:43 +09003878func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003879 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003880 apex {
3881 name: "myapex_nodep",
3882 key: "myapex.key",
3883 native_shared_libs: ["lib_nodep"],
3884 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003885 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003886 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003887 }
3888
3889 apex {
3890 name: "myapex_dep",
3891 key: "myapex.key",
3892 native_shared_libs: ["lib_dep"],
3893 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003894 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003895 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003896 }
3897
3898 apex {
3899 name: "myapex_provider",
3900 key: "myapex.key",
3901 native_shared_libs: ["libfoo"],
3902 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003903 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003904 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003905 }
3906
3907 apex {
3908 name: "myapex_selfcontained",
3909 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00003910 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09003911 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003912 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003913 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003914 }
3915
3916 apex_key {
3917 name: "myapex.key",
3918 public_key: "testkey.avbpubkey",
3919 private_key: "testkey.pem",
3920 }
3921
3922 cc_library {
3923 name: "lib_nodep",
3924 srcs: ["mylib.cpp"],
3925 system_shared_libs: [],
3926 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003927 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003928 }
3929
3930 cc_library {
3931 name: "lib_dep",
3932 srcs: ["mylib.cpp"],
3933 shared_libs: ["libfoo"],
3934 system_shared_libs: [],
3935 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003936 apex_available: [
3937 "myapex_dep",
3938 "myapex_provider",
3939 "myapex_selfcontained",
3940 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003941 }
3942
3943 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00003944 name: "lib_dep_on_bar",
3945 srcs: ["mylib.cpp"],
3946 shared_libs: ["libbar"],
3947 system_shared_libs: [],
3948 stl: "none",
3949 apex_available: [
3950 "myapex_selfcontained",
3951 ],
3952 }
3953
3954
3955 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09003956 name: "libfoo",
3957 srcs: ["mytest.cpp"],
3958 stubs: {
3959 versions: ["1"],
3960 },
3961 system_shared_libs: [],
3962 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003963 apex_available: [
3964 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00003965 ],
3966 }
3967
3968 cc_library {
3969 name: "libbar",
3970 srcs: ["mytest.cpp"],
3971 stubs: {
3972 versions: ["1"],
3973 },
3974 system_shared_libs: [],
3975 stl: "none",
3976 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003977 "myapex_selfcontained",
3978 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003979 }
Spandan Das20fce2d2023-04-12 17:21:39 +00003980
Jooyung Hane1633032019-08-01 17:41:43 +09003981 `)
3982
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003983 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003984 var provideNativeLibs, requireNativeLibs []string
3985
Jooyung Hana0503a52023-08-23 13:12:50 +09003986 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003987 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3988 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003989 ensureListEmpty(t, provideNativeLibs)
3990 ensureListEmpty(t, requireNativeLibs)
3991
Jooyung Hana0503a52023-08-23 13:12:50 +09003992 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003993 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3994 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003995 ensureListEmpty(t, provideNativeLibs)
3996 ensureListContains(t, requireNativeLibs, "libfoo.so")
3997
Jooyung Hana0503a52023-08-23 13:12:50 +09003998 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003999 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4000 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004001 ensureListContains(t, provideNativeLibs, "libfoo.so")
4002 ensureListEmpty(t, requireNativeLibs)
4003
Jooyung Hana0503a52023-08-23 13:12:50 +09004004 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004005 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4006 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004007 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004008 ensureListEmpty(t, requireNativeLibs)
4009}
4010
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004011func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4012 ctx := testApex(t, `
4013 apex {
4014 name: "myapex",
4015 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004016 native_shared_libs: ["mylib"],
4017 updatable: false,
4018 }
4019
4020 apex_key {
4021 name: "myapex.key",
4022 public_key: "testkey.avbpubkey",
4023 private_key: "testkey.pem",
4024 }
4025
4026 cc_library {
4027 name: "mylib",
4028 srcs: ["mylib.cpp"],
4029 system_shared_libs: [],
4030 stl: "none",
4031 apex_available: [
4032 "//apex_available:platform",
4033 "myapex",
4034 ],
4035 }
4036 `, android.FixtureMergeEnv(map[string]string{
4037 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4038 }))
4039
Jooyung Hana0503a52023-08-23 13:12:50 +09004040 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004041 apexManifestRule := module.Rule("apexManifestRule")
4042 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4043}
4044
Vinh Tran8f5310f2022-10-07 18:16:47 -04004045func TestCompileMultilibProp(t *testing.T) {
4046 testCases := []struct {
4047 compileMultiLibProp string
4048 containedLibs []string
4049 notContainedLibs []string
4050 }{
4051 {
4052 containedLibs: []string{
4053 "image.apex/lib64/mylib.so",
4054 "image.apex/lib/mylib.so",
4055 },
4056 compileMultiLibProp: `compile_multilib: "both",`,
4057 },
4058 {
4059 containedLibs: []string{"image.apex/lib64/mylib.so"},
4060 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4061 compileMultiLibProp: `compile_multilib: "first",`,
4062 },
4063 {
4064 containedLibs: []string{"image.apex/lib64/mylib.so"},
4065 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4066 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4067 },
4068 {
4069 containedLibs: []string{"image.apex/lib64/mylib.so"},
4070 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4071 compileMultiLibProp: `compile_multilib: "64",`,
4072 },
4073 {
4074 containedLibs: []string{"image.apex/lib/mylib.so"},
4075 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4076 compileMultiLibProp: `compile_multilib: "32",`,
4077 },
4078 }
4079 for _, testCase := range testCases {
4080 ctx := testApex(t, fmt.Sprintf(`
4081 apex {
4082 name: "myapex",
4083 key: "myapex.key",
4084 %s
4085 native_shared_libs: ["mylib"],
4086 updatable: false,
4087 }
4088 apex_key {
4089 name: "myapex.key",
4090 public_key: "testkey.avbpubkey",
4091 private_key: "testkey.pem",
4092 }
4093 cc_library {
4094 name: "mylib",
4095 srcs: ["mylib.cpp"],
4096 apex_available: [
4097 "//apex_available:platform",
4098 "myapex",
4099 ],
4100 }
4101 `, testCase.compileMultiLibProp),
4102 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004103 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004104 apexRule := module.Rule("apexRule")
4105 copyCmds := apexRule.Args["copy_commands"]
4106 for _, containedLib := range testCase.containedLibs {
4107 ensureContains(t, copyCmds, containedLib)
4108 }
4109 for _, notContainedLib := range testCase.notContainedLibs {
4110 ensureNotContains(t, copyCmds, notContainedLib)
4111 }
4112 }
4113}
4114
Alex Light0851b882019-02-07 13:20:53 -08004115func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004116 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004117 apex {
4118 name: "myapex",
4119 key: "myapex.key",
4120 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004121 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004122 }
4123
4124 apex_key {
4125 name: "myapex.key",
4126 public_key: "testkey.avbpubkey",
4127 private_key: "testkey.pem",
4128 }
4129
4130 cc_library {
4131 name: "mylib_common",
4132 srcs: ["mylib.cpp"],
4133 system_shared_libs: [],
4134 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004135 apex_available: [
4136 "//apex_available:platform",
4137 "myapex",
4138 ],
Alex Light0851b882019-02-07 13:20:53 -08004139 }
4140 `)
4141
Jooyung Hana0503a52023-08-23 13:12:50 +09004142 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004143 apexRule := module.Rule("apexRule")
4144 copyCmds := apexRule.Args["copy_commands"]
4145
4146 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4147 t.Log("Apex was a test apex!")
4148 t.Fail()
4149 }
4150 // Ensure that main rule creates an output
4151 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4152
4153 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004154 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004155
4156 // Ensure that both direct and indirect deps are copied into apex
4157 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4158
Colin Cross7113d202019-11-20 16:39:12 -08004159 // Ensure that the platform variant ends with _shared
4160 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004161
Colin Cross56a83212020-09-15 18:30:11 -07004162 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004163 t.Log("Found mylib_common not in any apex!")
4164 t.Fail()
4165 }
4166}
4167
4168func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004169 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004170 apex_test {
4171 name: "myapex",
4172 key: "myapex.key",
4173 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004174 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004175 }
4176
4177 apex_key {
4178 name: "myapex.key",
4179 public_key: "testkey.avbpubkey",
4180 private_key: "testkey.pem",
4181 }
4182
4183 cc_library {
4184 name: "mylib_common_test",
4185 srcs: ["mylib.cpp"],
4186 system_shared_libs: [],
4187 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004188 // TODO: remove //apex_available:platform
4189 apex_available: [
4190 "//apex_available:platform",
4191 "myapex",
4192 ],
Alex Light0851b882019-02-07 13:20:53 -08004193 }
4194 `)
4195
Jooyung Hana0503a52023-08-23 13:12:50 +09004196 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004197 apexRule := module.Rule("apexRule")
4198 copyCmds := apexRule.Args["copy_commands"]
4199
4200 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4201 t.Log("Apex was not a test apex!")
4202 t.Fail()
4203 }
4204 // Ensure that main rule creates an output
4205 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4206
4207 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004208 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004209
4210 // Ensure that both direct and indirect deps are copied into apex
4211 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4212
Colin Cross7113d202019-11-20 16:39:12 -08004213 // Ensure that the platform variant ends with _shared
4214 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004215}
4216
Jooyung Han85707de2023-12-01 14:21:13 +09004217func TestLibzVendorIsntStable(t *testing.T) {
4218 ctx := testApex(t, `
4219 apex {
4220 name: "myapex",
4221 key: "myapex.key",
4222 updatable: false,
4223 binaries: ["mybin"],
4224 }
4225 apex {
4226 name: "myvendorapex",
4227 key: "myapex.key",
4228 file_contexts: "myvendorapex_file_contexts",
4229 vendor: true,
4230 updatable: false,
4231 binaries: ["mybin"],
4232 }
4233 apex_key {
4234 name: "myapex.key",
4235 public_key: "testkey.avbpubkey",
4236 private_key: "testkey.pem",
4237 }
4238 cc_binary {
4239 name: "mybin",
4240 vendor_available: true,
4241 system_shared_libs: [],
4242 stl: "none",
4243 shared_libs: ["libz"],
4244 apex_available: ["//apex_available:anyapex"],
4245 }
4246 cc_library {
4247 name: "libz",
4248 vendor_available: true,
4249 system_shared_libs: [],
4250 stl: "none",
4251 stubs: {
4252 versions: ["28", "30"],
4253 },
4254 target: {
4255 vendor: {
4256 no_stubs: true,
4257 },
4258 },
4259 }
4260 `, withFiles(map[string][]byte{
4261 "myvendorapex_file_contexts": nil,
4262 }))
4263
4264 // libz provides stubs for core variant.
4265 {
4266 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4267 "bin/mybin",
4268 })
4269 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4270 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4271 }
4272 // libz doesn't provide stubs for vendor variant.
4273 {
4274 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4275 "bin/mybin",
4276 "lib64/libz.so",
4277 })
4278 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4279 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4280 }
4281}
4282
Alex Light9670d332019-01-29 18:07:33 -08004283func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004284 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004285 apex {
4286 name: "myapex",
4287 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004288 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004289 multilib: {
4290 first: {
4291 native_shared_libs: ["mylib_common"],
4292 }
4293 },
4294 target: {
4295 android: {
4296 multilib: {
4297 first: {
4298 native_shared_libs: ["mylib"],
4299 }
4300 }
4301 },
4302 host: {
4303 multilib: {
4304 first: {
4305 native_shared_libs: ["mylib2"],
4306 }
4307 }
4308 }
4309 }
4310 }
4311
4312 apex_key {
4313 name: "myapex.key",
4314 public_key: "testkey.avbpubkey",
4315 private_key: "testkey.pem",
4316 }
4317
4318 cc_library {
4319 name: "mylib",
4320 srcs: ["mylib.cpp"],
4321 system_shared_libs: [],
4322 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004323 // TODO: remove //apex_available:platform
4324 apex_available: [
4325 "//apex_available:platform",
4326 "myapex",
4327 ],
Alex Light9670d332019-01-29 18:07:33 -08004328 }
4329
4330 cc_library {
4331 name: "mylib_common",
4332 srcs: ["mylib.cpp"],
4333 system_shared_libs: [],
4334 stl: "none",
4335 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004336 // TODO: remove //apex_available:platform
4337 apex_available: [
4338 "//apex_available:platform",
4339 "myapex",
4340 ],
Alex Light9670d332019-01-29 18:07:33 -08004341 }
4342
4343 cc_library {
4344 name: "mylib2",
4345 srcs: ["mylib.cpp"],
4346 system_shared_libs: [],
4347 stl: "none",
4348 compile_multilib: "first",
4349 }
4350 `)
4351
Jooyung Hana0503a52023-08-23 13:12:50 +09004352 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004353 copyCmds := apexRule.Args["copy_commands"]
4354
4355 // Ensure that main rule creates an output
4356 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4357
4358 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004359 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4360 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4361 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004362
4363 // Ensure that both direct and indirect deps are copied into apex
4364 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4365 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4366 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4367
Colin Cross7113d202019-11-20 16:39:12 -08004368 // Ensure that the platform variant ends with _shared
4369 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4370 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4371 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004372}
Jiyong Park04480cf2019-02-06 00:16:29 +09004373
Jiyong Park59140302020-12-14 18:44:04 +09004374func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004375 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004376 apex {
4377 name: "myapex",
4378 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004379 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004380 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004381 arch: {
4382 arm64: {
4383 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004384 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004385 },
4386 x86_64: {
4387 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004388 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004389 },
4390 }
4391 }
4392
4393 apex_key {
4394 name: "myapex.key",
4395 public_key: "testkey.avbpubkey",
4396 private_key: "testkey.pem",
4397 }
4398
4399 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004400 name: "mylib.generic",
4401 srcs: ["mylib.cpp"],
4402 system_shared_libs: [],
4403 stl: "none",
4404 // TODO: remove //apex_available:platform
4405 apex_available: [
4406 "//apex_available:platform",
4407 "myapex",
4408 ],
4409 }
4410
4411 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004412 name: "mylib.arm64",
4413 srcs: ["mylib.cpp"],
4414 system_shared_libs: [],
4415 stl: "none",
4416 // TODO: remove //apex_available:platform
4417 apex_available: [
4418 "//apex_available:platform",
4419 "myapex",
4420 ],
4421 }
4422
4423 cc_library {
4424 name: "mylib.x64",
4425 srcs: ["mylib.cpp"],
4426 system_shared_libs: [],
4427 stl: "none",
4428 // TODO: remove //apex_available:platform
4429 apex_available: [
4430 "//apex_available:platform",
4431 "myapex",
4432 ],
4433 }
4434 `)
4435
Jooyung Hana0503a52023-08-23 13:12:50 +09004436 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004437 copyCmds := apexRule.Args["copy_commands"]
4438
4439 // Ensure that apex variant is created for the direct dep
4440 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004441 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004442 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4443
4444 // Ensure that both direct and indirect deps are copied into apex
4445 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4446 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4447}
4448
Jiyong Park04480cf2019-02-06 00:16:29 +09004449func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004450 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004451 apex {
4452 name: "myapex",
4453 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004454 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004455 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004456 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004457 }
4458
4459 apex_key {
4460 name: "myapex.key",
4461 public_key: "testkey.avbpubkey",
4462 private_key: "testkey.pem",
4463 }
4464
4465 sh_binary {
4466 name: "myscript",
4467 src: "mylib.cpp",
4468 filename: "myscript.sh",
4469 sub_dir: "script",
4470 }
4471 `)
4472
Jooyung Hana0503a52023-08-23 13:12:50 +09004473 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004474 copyCmds := apexRule.Args["copy_commands"]
4475
4476 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4477}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004478
Jooyung Han91df2082019-11-20 01:49:42 +09004479func TestApexInVariousPartition(t *testing.T) {
4480 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004481 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004482 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004483 {"", "system"},
4484 {"product_specific: true", "product"},
4485 {"soc_specific: true", "vendor"},
4486 {"proprietary: true", "vendor"},
4487 {"vendor: true", "vendor"},
4488 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004489 }
4490 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004491 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004492 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004493 apex {
4494 name: "myapex",
4495 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004496 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004497 `+tc.propName+`
4498 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004499
Jooyung Han91df2082019-11-20 01:49:42 +09004500 apex_key {
4501 name: "myapex.key",
4502 public_key: "testkey.avbpubkey",
4503 private_key: "testkey.pem",
4504 }
4505 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004506
Jooyung Hana0503a52023-08-23 13:12:50 +09004507 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004508 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004509 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004510 if actual != expected {
4511 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4512 }
Jooyung Han91df2082019-11-20 01:49:42 +09004513 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004514 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004515}
Jiyong Park67882562019-03-21 01:11:21 +09004516
Jooyung Han580eb4f2020-06-24 19:33:06 +09004517func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004518 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004519 apex {
4520 name: "myapex",
4521 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004522 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004523 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004524
Jooyung Han580eb4f2020-06-24 19:33:06 +09004525 apex_key {
4526 name: "myapex.key",
4527 public_key: "testkey.avbpubkey",
4528 private_key: "testkey.pem",
4529 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004530 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004531 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004532 rule := module.Output("file_contexts")
4533 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4534}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004535
Jooyung Han580eb4f2020-06-24 19:33:06 +09004536func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004537 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004538 apex {
4539 name: "myapex",
4540 key: "myapex.key",
4541 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004542 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004543 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004544
Jooyung Han580eb4f2020-06-24 19:33:06 +09004545 apex_key {
4546 name: "myapex.key",
4547 public_key: "testkey.avbpubkey",
4548 private_key: "testkey.pem",
4549 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004550 `, withFiles(map[string][]byte{
4551 "my_own_file_contexts": nil,
4552 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004553}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004554
Jooyung Han580eb4f2020-06-24 19:33:06 +09004555func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004556 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004557 apex {
4558 name: "myapex",
4559 key: "myapex.key",
4560 product_specific: true,
4561 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004562 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004563 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004564
Jooyung Han580eb4f2020-06-24 19:33:06 +09004565 apex_key {
4566 name: "myapex.key",
4567 public_key: "testkey.avbpubkey",
4568 private_key: "testkey.pem",
4569 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004570 `)
4571
Colin Cross1c460562021-02-16 17:55:47 -08004572 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004573 apex {
4574 name: "myapex",
4575 key: "myapex.key",
4576 product_specific: true,
4577 file_contexts: "product_specific_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 "product_specific_file_contexts": nil,
4588 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004589 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004590 rule := module.Output("file_contexts")
4591 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4592}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004593
Jooyung Han580eb4f2020-06-24 19:33:06 +09004594func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004595 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004596 apex {
4597 name: "myapex",
4598 key: "myapex.key",
4599 product_specific: true,
4600 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004601 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004602 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004603
Jooyung Han580eb4f2020-06-24 19:33:06 +09004604 apex_key {
4605 name: "myapex.key",
4606 public_key: "testkey.avbpubkey",
4607 private_key: "testkey.pem",
4608 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004609
Jooyung Han580eb4f2020-06-24 19:33:06 +09004610 filegroup {
4611 name: "my-file-contexts",
4612 srcs: ["product_specific_file_contexts"],
4613 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004614 `, withFiles(map[string][]byte{
4615 "product_specific_file_contexts": nil,
4616 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004617 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004618 rule := module.Output("file_contexts")
4619 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004620}
4621
Jiyong Park67882562019-03-21 01:11:21 +09004622func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004623 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004624 apex_key {
4625 name: "myapex.key",
4626 public_key: ":my.avbpubkey",
4627 private_key: ":my.pem",
4628 product_specific: true,
4629 }
4630
4631 filegroup {
4632 name: "my.avbpubkey",
4633 srcs: ["testkey2.avbpubkey"],
4634 }
4635
4636 filegroup {
4637 name: "my.pem",
4638 srcs: ["testkey2.pem"],
4639 }
4640 `)
4641
4642 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4643 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004644 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004645 if actual_pubkey != expected_pubkey {
4646 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4647 }
4648 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004649 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004650 if actual_privkey != expected_privkey {
4651 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4652 }
4653}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004654
4655func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004656 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004657 prebuilt_apex {
4658 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004659 arch: {
4660 arm64: {
4661 src: "myapex-arm64.apex",
4662 },
4663 arm: {
4664 src: "myapex-arm.apex",
4665 },
4666 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004667 }
4668 `)
4669
Wei Li340ee8e2022-03-18 17:33:24 -07004670 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4671 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004672
Jiyong Parkc95714e2019-03-29 14:23:10 +09004673 expectedInput := "myapex-arm64.apex"
4674 if prebuilt.inputApex.String() != expectedInput {
4675 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4676 }
Wei Li340ee8e2022-03-18 17:33:24 -07004677 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4678 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4679 rule := testingModule.Rule("genProvenanceMetaData")
4680 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4681 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4682 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4683 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004684
4685 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4686 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004687}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004688
Paul Duffinc0609c62021-03-01 17:27:16 +00004689func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004690 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004691 prebuilt_apex {
4692 name: "myapex",
4693 }
4694 `)
4695}
4696
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004697func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004698 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004699 prebuilt_apex {
4700 name: "myapex",
4701 src: "myapex-arm.apex",
4702 filename: "notmyapex.apex",
4703 }
4704 `)
4705
Wei Li340ee8e2022-03-18 17:33:24 -07004706 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4707 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004708
4709 expected := "notmyapex.apex"
4710 if p.installFilename != expected {
4711 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4712 }
Wei Li340ee8e2022-03-18 17:33:24 -07004713 rule := testingModule.Rule("genProvenanceMetaData")
4714 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4715 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4716 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4717 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004718}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004719
Samiul Islam7c02e262021-09-08 17:48:28 +01004720func TestApexSetFilenameOverride(t *testing.T) {
4721 testApex(t, `
4722 apex_set {
4723 name: "com.company.android.myapex",
4724 apex_name: "com.android.myapex",
4725 set: "company-myapex.apks",
4726 filename: "com.company.android.myapex.apex"
4727 }
4728 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4729
4730 testApex(t, `
4731 apex_set {
4732 name: "com.company.android.myapex",
4733 apex_name: "com.android.myapex",
4734 set: "company-myapex.apks",
4735 filename: "com.company.android.myapex.capex"
4736 }
4737 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4738
4739 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4740 apex_set {
4741 name: "com.company.android.myapex",
4742 apex_name: "com.android.myapex",
4743 set: "company-myapex.apks",
4744 filename: "some-random-suffix"
4745 }
4746 `)
4747}
4748
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004749func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004750 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004751 prebuilt_apex {
4752 name: "myapex.prebuilt",
4753 src: "myapex-arm.apex",
4754 overrides: [
4755 "myapex",
4756 ],
4757 }
4758 `)
4759
Wei Li340ee8e2022-03-18 17:33:24 -07004760 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4761 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004762
4763 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004764 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004765 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004766 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004767 }
Wei Li340ee8e2022-03-18 17:33:24 -07004768 rule := testingModule.Rule("genProvenanceMetaData")
4769 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4770 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4771 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4772 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004773}
4774
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004775func TestPrebuiltApexName(t *testing.T) {
4776 testApex(t, `
4777 prebuilt_apex {
4778 name: "com.company.android.myapex",
4779 apex_name: "com.android.myapex",
4780 src: "company-myapex-arm.apex",
4781 }
4782 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4783
4784 testApex(t, `
4785 apex_set {
4786 name: "com.company.android.myapex",
4787 apex_name: "com.android.myapex",
4788 set: "company-myapex.apks",
4789 }
4790 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4791}
4792
4793func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4794 _ = android.GroupFixturePreparers(
4795 java.PrepareForTestWithJavaDefaultModules,
4796 PrepareForTestWithApexBuildComponents,
4797 android.FixtureWithRootAndroidBp(`
4798 platform_bootclasspath {
4799 name: "platform-bootclasspath",
4800 fragments: [
4801 {
4802 apex: "com.android.art",
4803 module: "art-bootclasspath-fragment",
4804 },
4805 ],
4806 }
4807
4808 prebuilt_apex {
4809 name: "com.company.android.art",
4810 apex_name: "com.android.art",
4811 src: "com.company.android.art-arm.apex",
4812 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4813 }
4814
4815 prebuilt_bootclasspath_fragment {
4816 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004817 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004818 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004819 hidden_api: {
4820 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4821 metadata: "my-bootclasspath-fragment/metadata.csv",
4822 index: "my-bootclasspath-fragment/index.csv",
4823 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4824 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4825 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004826 }
4827
4828 java_import {
4829 name: "core-oj",
4830 jars: ["prebuilt.jar"],
4831 }
4832 `),
4833 ).RunTest(t)
4834}
4835
Spandan Das59a4a2b2024-01-09 21:35:56 +00004836// A minimal context object for use with DexJarBuildPath
4837type moduleErrorfTestCtx struct {
4838}
4839
4840func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4841}
4842
Paul Duffin092153d2021-01-26 11:42:39 +00004843// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4844// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004845func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004846 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004847
Paul Duffin89886cb2021-02-05 16:44:03 +00004848 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004849 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004850 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004851 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00004852 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004853 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004854 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00004855 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09004856 android.NormalizePathForTesting(dexJarBuildPath))
4857 }
4858
4859 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004860 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004861 // Make sure the import has been given the correct path to the dex jar.
4862 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4863 dexJarBuildPath := p.DexJarInstallPath()
4864 stem := android.RemoveOptionalPrebuiltPrefix(name)
4865 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4866 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4867 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004868 }
4869
Paul Duffin39853512021-02-26 11:09:39 +00004870 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004871 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004872 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004873 android.AssertArrayString(t, "Check if there is no source variant",
4874 []string{"android_common"},
4875 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004876 }
4877
4878 t.Run("prebuilt only", func(t *testing.T) {
4879 bp := `
4880 prebuilt_apex {
4881 name: "myapex",
4882 arch: {
4883 arm64: {
4884 src: "myapex-arm64.apex",
4885 },
4886 arm: {
4887 src: "myapex-arm.apex",
4888 },
4889 },
Paul Duffin39853512021-02-26 11:09:39 +00004890 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004891 }
4892
4893 java_import {
4894 name: "libfoo",
4895 jars: ["libfoo.jar"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00004896 sdk_version: "core_current",
Paul Duffin064b70c2020-11-02 17:32:38 +00004897 }
Paul Duffin39853512021-02-26 11:09:39 +00004898
4899 java_sdk_library_import {
4900 name: "libbar",
4901 public: {
4902 jars: ["libbar.jar"],
4903 },
4904 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004905 `
4906
4907 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4908 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4909
Spandan Das3576e762024-01-03 18:57:03 +00004910 deapexerName := deapexerModuleName("prebuilt_myapex")
4911 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01004912
Paul Duffinf6932af2021-02-26 18:21:56 +00004913 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004914 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004915 rule := deapexer.Rule("deapexer")
4916 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4917 t.Errorf("expected: %q, found: %q", expected, actual)
4918 }
4919
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004920 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004921 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004922 rule = prebuiltApex.Rule("android/soong/android.Cp")
4923 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4924 t.Errorf("expected: %q, found: %q", expected, actual)
4925 }
4926
Paul Duffin89886cb2021-02-05 16:44:03 +00004927 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004928 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004929
4930 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004931 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004932 })
4933
4934 t.Run("prebuilt with source preferred", func(t *testing.T) {
4935
4936 bp := `
Jihoon Kangbb678f82024-07-01 17:04:46 +00004937 apex {
4938 name: "myapex",
4939 key: "myapex.key",
4940 updatable: false,
4941 java_libs: [
4942 "libfoo",
4943 "libbar",
4944 ],
4945 }
4946
4947 apex_key {
4948 name: "myapex.key",
4949 public_key: "testkey.avbpubkey",
4950 private_key: "testkey.pem",
4951 }
4952
Paul Duffin064b70c2020-11-02 17:32:38 +00004953 prebuilt_apex {
4954 name: "myapex",
4955 arch: {
4956 arm64: {
4957 src: "myapex-arm64.apex",
4958 },
4959 arm: {
4960 src: "myapex-arm.apex",
4961 },
4962 },
Paul Duffin39853512021-02-26 11:09:39 +00004963 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004964 }
4965
4966 java_import {
4967 name: "libfoo",
4968 jars: ["libfoo.jar"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00004969 apex_available: [
4970 "myapex",
4971 ],
4972 compile_dex: true,
4973 sdk_version: "core_current",
Paul Duffin064b70c2020-11-02 17:32:38 +00004974 }
4975
4976 java_library {
4977 name: "libfoo",
Jihoon Kangbb678f82024-07-01 17:04:46 +00004978 srcs: ["foo/bar/MyClass.java"],
4979 apex_available: [
4980 "myapex",
4981 ],
4982 compile_dex: true,
4983 sdk_version: "core_current",
Paul Duffin064b70c2020-11-02 17:32:38 +00004984 }
Paul Duffin39853512021-02-26 11:09:39 +00004985
4986 java_sdk_library_import {
4987 name: "libbar",
4988 public: {
4989 jars: ["libbar.jar"],
4990 },
Jihoon Kangbb678f82024-07-01 17:04:46 +00004991 apex_available: [
4992 "myapex",
4993 ],
4994 compile_dex: true,
Paul Duffin39853512021-02-26 11:09:39 +00004995 }
4996
4997 java_sdk_library {
4998 name: "libbar",
4999 srcs: ["foo/bar/MyClass.java"],
5000 unsafe_ignore_missing_latest_api: true,
Jihoon Kangbb678f82024-07-01 17:04:46 +00005001 apex_available: [
5002 "myapex",
5003 ],
5004 compile_dex: true,
5005 sdk_version: "core_current",
Paul Duffin39853512021-02-26 11:09:39 +00005006 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005007 `
5008
5009 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5010 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5011
Paul Duffin89886cb2021-02-05 16:44:03 +00005012 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005013 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005014
5015 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005016 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005017 })
5018
5019 t.Run("prebuilt preferred with source", func(t *testing.T) {
5020 bp := `
5021 prebuilt_apex {
5022 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005023 arch: {
5024 arm64: {
5025 src: "myapex-arm64.apex",
5026 },
5027 arm: {
5028 src: "myapex-arm.apex",
5029 },
5030 },
Paul Duffin39853512021-02-26 11:09:39 +00005031 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005032 }
5033
5034 java_import {
5035 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005036 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005037 jars: ["libfoo.jar"],
5038 }
5039
5040 java_library {
5041 name: "libfoo",
Jihoon Kangbb678f82024-07-01 17:04:46 +00005042 sdk_version: "core_current",
Paul Duffin064b70c2020-11-02 17:32:38 +00005043 }
Paul Duffin39853512021-02-26 11:09:39 +00005044
5045 java_sdk_library_import {
5046 name: "libbar",
5047 prefer: true,
5048 public: {
5049 jars: ["libbar.jar"],
5050 },
5051 }
5052
5053 java_sdk_library {
5054 name: "libbar",
5055 srcs: ["foo/bar/MyClass.java"],
5056 unsafe_ignore_missing_latest_api: true,
5057 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005058 `
5059
5060 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5061 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5062
Paul Duffin89886cb2021-02-05 16:44:03 +00005063 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005064 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005065 ensureNoSourceVariant(t, ctx, "libfoo")
5066
5067 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005068 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005069 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005070 })
5071}
5072
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005073func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005074 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005075 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005076 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5077 // is disabled.
5078 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005079
5080 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5081 // file creation.
5082 java.FixtureConfigureBootJars("platform:foo"),
5083 android.FixtureModifyMockFS(func(fs android.MockFS) {
5084 fs["platform/Android.bp"] = []byte(`
5085 java_library {
5086 name: "foo",
5087 srcs: ["Test.java"],
5088 compile_dex: true,
5089 }
5090 `)
5091 fs["platform/Test.java"] = nil
5092 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005093 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005094
Paul Duffin37856732021-02-26 14:24:15 +00005095 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5096 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005097 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005098 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005099 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005100 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005101 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005102 foundLibfooJar = true
5103 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005104 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005105 }
5106 }
5107 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005108 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 +00005109 }
5110 }
5111
Paul Duffin40a3f652021-07-19 13:11:24 +01005112 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005113 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005114 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005115 var rule android.TestingBuildParams
5116
5117 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5118 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005119 }
5120
Paul Duffin40a3f652021-07-19 13:11:24 +01005121 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5122 t.Helper()
5123 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5124 var rule android.TestingBuildParams
5125
5126 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5127 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5128 }
5129
Paul Duffin89f570a2021-06-16 01:42:33 +01005130 fragment := java.ApexVariantReference{
5131 Apex: proptools.StringPtr("myapex"),
5132 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5133 }
5134
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005135 t.Run("prebuilt only", func(t *testing.T) {
5136 bp := `
5137 prebuilt_apex {
5138 name: "myapex",
5139 arch: {
5140 arm64: {
5141 src: "myapex-arm64.apex",
5142 },
5143 arm: {
5144 src: "myapex-arm.apex",
5145 },
5146 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005147 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5148 }
5149
5150 prebuilt_bootclasspath_fragment {
5151 name: "my-bootclasspath-fragment",
5152 contents: ["libfoo", "libbar"],
5153 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005154 hidden_api: {
5155 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5156 metadata: "my-bootclasspath-fragment/metadata.csv",
5157 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005158 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5159 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5160 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005161 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005162 }
5163
5164 java_import {
5165 name: "libfoo",
5166 jars: ["libfoo.jar"],
5167 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005168 permitted_packages: ["foo"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00005169 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005170 }
Paul Duffin37856732021-02-26 14:24:15 +00005171
5172 java_sdk_library_import {
5173 name: "libbar",
5174 public: {
5175 jars: ["libbar.jar"],
5176 },
5177 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005178 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005179 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005180 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005181 `
5182
Paul Duffin89f570a2021-06-16 01:42:33 +01005183 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005184 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5185 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005186
Paul Duffin537ea3d2021-05-14 10:38:00 +01005187 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005188 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005189 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005190 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005191 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005192 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 +01005193 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005194 })
5195
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005196 t.Run("apex_set only", func(t *testing.T) {
5197 bp := `
5198 apex_set {
5199 name: "myapex",
5200 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005201 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005202 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005203 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5204 }
5205
5206 java_import {
5207 name: "myjavalib",
5208 jars: ["myjavalib.jar"],
5209 apex_available: ["myapex"],
5210 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005211 }
5212
5213 prebuilt_bootclasspath_fragment {
5214 name: "my-bootclasspath-fragment",
5215 contents: ["libfoo", "libbar"],
5216 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005217 hidden_api: {
5218 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5219 metadata: "my-bootclasspath-fragment/metadata.csv",
5220 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005221 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5222 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5223 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005224 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005225 }
5226
Liz Kammer2dc72442023-04-20 10:10:48 -04005227 prebuilt_systemserverclasspath_fragment {
5228 name: "my-systemserverclasspath-fragment",
5229 contents: ["libbaz"],
5230 apex_available: ["myapex"],
5231 }
5232
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005233 java_import {
5234 name: "libfoo",
5235 jars: ["libfoo.jar"],
5236 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005237 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005238 }
5239
5240 java_sdk_library_import {
5241 name: "libbar",
5242 public: {
5243 jars: ["libbar.jar"],
5244 },
5245 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005246 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005247 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005248 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005249
5250 java_sdk_library_import {
5251 name: "libbaz",
5252 public: {
5253 jars: ["libbaz.jar"],
5254 },
5255 apex_available: ["myapex"],
5256 shared_library: false,
5257 permitted_packages: ["baz"],
5258 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005259 `
5260
Paul Duffin89f570a2021-06-16 01:42:33 +01005261 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005262 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5263 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005264
Paul Duffin537ea3d2021-05-14 10:38:00 +01005265 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005266 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005267 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005268 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005269 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005270 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 +01005271 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005272
5273 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5274
5275 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005276 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005277 "myjavalib.myapex",
5278 "libfoo.myapex",
5279 "libbar.myapex",
5280 "libbaz.myapex",
5281 }
5282 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5283 for i, e := range mkEntries {
5284 g := e.OverrideName
5285 if w := overrideNames[i]; w != g {
5286 t.Errorf("Expected override name %q, got %q", w, g)
5287 }
5288 }
5289
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005290 })
5291
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005292 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5293 bp := `
5294 prebuilt_apex {
5295 name: "myapex",
5296 arch: {
5297 arm64: {
5298 src: "myapex-arm64.apex",
5299 },
5300 arm: {
5301 src: "myapex-arm.apex",
5302 },
5303 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005304 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5305 }
5306
5307 prebuilt_bootclasspath_fragment {
5308 name: "my-bootclasspath-fragment",
5309 contents: ["libfoo", "libbar"],
5310 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005311 hidden_api: {
5312 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5313 metadata: "my-bootclasspath-fragment/metadata.csv",
5314 index: "my-bootclasspath-fragment/index.csv",
5315 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5316 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5317 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005318 }
5319
5320 java_import {
5321 name: "libfoo",
5322 jars: ["libfoo.jar"],
5323 apex_available: ["myapex"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00005324 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005325 }
5326
5327 java_library {
5328 name: "libfoo",
5329 srcs: ["foo/bar/MyClass.java"],
5330 apex_available: ["myapex"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00005331 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005332 }
Paul Duffin37856732021-02-26 14:24:15 +00005333
5334 java_sdk_library_import {
5335 name: "libbar",
5336 public: {
5337 jars: ["libbar.jar"],
5338 },
5339 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005340 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005341 }
5342
5343 java_sdk_library {
5344 name: "libbar",
5345 srcs: ["foo/bar/MyClass.java"],
5346 unsafe_ignore_missing_latest_api: true,
5347 apex_available: ["myapex"],
5348 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005349 `
5350
5351 // In this test the source (java_library) libfoo is active since the
5352 // prebuilt (java_import) defaults to prefer:false. However the
5353 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5354 // find the dex boot jar in it. We either need to disable the source libfoo
5355 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005356 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005357 // dexbootjar check is skipped if AllowMissingDependencies is true
5358 preparerAllowMissingDeps := android.GroupFixturePreparers(
5359 preparer,
5360 android.PrepareForTestWithAllowMissingDependencies,
5361 )
5362 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005363 })
5364
5365 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5366 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005367 apex {
5368 name: "myapex",
5369 key: "myapex.key",
5370 updatable: false,
5371 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5372 }
5373
5374 apex_key {
5375 name: "myapex.key",
5376 public_key: "testkey.avbpubkey",
5377 private_key: "testkey.pem",
5378 }
5379
5380 bootclasspath_fragment {
5381 name: "my-bootclasspath-fragment",
5382 contents: ["libfoo", "libbar"],
5383 apex_available: ["myapex"],
5384 hidden_api: {
5385 split_packages: ["*"],
5386 },
5387 }
5388
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005389 prebuilt_apex {
5390 name: "myapex",
5391 arch: {
5392 arm64: {
5393 src: "myapex-arm64.apex",
5394 },
5395 arm: {
5396 src: "myapex-arm.apex",
5397 },
5398 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005399 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5400 }
5401
5402 prebuilt_bootclasspath_fragment {
5403 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005404 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005405 contents: ["libfoo", "libbar"],
5406 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005407 hidden_api: {
5408 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5409 metadata: "my-bootclasspath-fragment/metadata.csv",
5410 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005411 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5412 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5413 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005414 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005415 }
5416
5417 java_import {
5418 name: "libfoo",
5419 prefer: true,
5420 jars: ["libfoo.jar"],
5421 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005422 permitted_packages: ["foo"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00005423 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005424 }
5425
5426 java_library {
5427 name: "libfoo",
5428 srcs: ["foo/bar/MyClass.java"],
5429 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005430 installable: true,
Jihoon Kangbb678f82024-07-01 17:04:46 +00005431 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005432 }
Paul Duffin37856732021-02-26 14:24:15 +00005433
5434 java_sdk_library_import {
5435 name: "libbar",
5436 prefer: true,
5437 public: {
5438 jars: ["libbar.jar"],
5439 },
5440 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005441 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005442 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005443 }
5444
5445 java_sdk_library {
5446 name: "libbar",
5447 srcs: ["foo/bar/MyClass.java"],
5448 unsafe_ignore_missing_latest_api: true,
5449 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005450 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005451 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005452 `
5453
Paul Duffin89f570a2021-06-16 01:42:33 +01005454 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005455 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5456 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005457
Paul Duffin537ea3d2021-05-14 10:38:00 +01005458 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005459 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005460 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005461 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005462 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005463 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 +01005464 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 })
5466
5467 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5468 bp := `
5469 apex {
5470 name: "myapex",
5471 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005472 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005473 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005474 }
5475
5476 apex_key {
5477 name: "myapex.key",
5478 public_key: "testkey.avbpubkey",
5479 private_key: "testkey.pem",
5480 }
5481
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005482 bootclasspath_fragment {
5483 name: "my-bootclasspath-fragment",
5484 contents: ["libfoo", "libbar"],
5485 apex_available: ["myapex"],
5486 hidden_api: {
5487 split_packages: ["*"],
5488 },
5489 }
5490
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005491 prebuilt_apex {
5492 name: "myapex",
5493 arch: {
5494 arm64: {
5495 src: "myapex-arm64.apex",
5496 },
5497 arm: {
5498 src: "myapex-arm.apex",
5499 },
5500 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005501 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5502 }
5503
5504 prebuilt_bootclasspath_fragment {
5505 name: "my-bootclasspath-fragment",
5506 contents: ["libfoo", "libbar"],
5507 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005508 hidden_api: {
5509 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5510 metadata: "my-bootclasspath-fragment/metadata.csv",
5511 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005512 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5513 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5514 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005515 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005516 }
5517
5518 java_import {
5519 name: "libfoo",
5520 jars: ["libfoo.jar"],
5521 apex_available: ["myapex"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00005522 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005523 }
5524
5525 java_library {
5526 name: "libfoo",
5527 srcs: ["foo/bar/MyClass.java"],
5528 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005529 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005530 installable: true,
Jihoon Kangbb678f82024-07-01 17:04:46 +00005531 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005532 }
Paul Duffin37856732021-02-26 14:24:15 +00005533
5534 java_sdk_library_import {
5535 name: "libbar",
5536 public: {
5537 jars: ["libbar.jar"],
5538 },
5539 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005540 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005541 }
5542
5543 java_sdk_library {
5544 name: "libbar",
5545 srcs: ["foo/bar/MyClass.java"],
5546 unsafe_ignore_missing_latest_api: true,
5547 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005548 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005549 compile_dex: true,
Jihoon Kangbb678f82024-07-01 17:04:46 +00005550 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005551 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005552 `
5553
Paul Duffin89f570a2021-06-16 01:42:33 +01005554 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005555 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5556 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 +00005557
Paul Duffin537ea3d2021-05-14 10:38:00 +01005558 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005559 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005560 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5561 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005562 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5563 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 +01005564 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005565 })
5566
5567 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5568 bp := `
5569 apex {
5570 name: "myapex",
5571 enabled: false,
5572 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005573 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 }
5575
5576 apex_key {
5577 name: "myapex.key",
5578 public_key: "testkey.avbpubkey",
5579 private_key: "testkey.pem",
5580 }
5581
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005582 bootclasspath_fragment {
5583 name: "my-bootclasspath-fragment",
5584 enabled: false,
5585 contents: ["libfoo", "libbar"],
5586 apex_available: ["myapex"],
5587 hidden_api: {
5588 split_packages: ["*"],
5589 },
5590 }
5591
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005592 prebuilt_apex {
5593 name: "myapex",
5594 arch: {
5595 arm64: {
5596 src: "myapex-arm64.apex",
5597 },
5598 arm: {
5599 src: "myapex-arm.apex",
5600 },
5601 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005602 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5603 }
5604
5605 prebuilt_bootclasspath_fragment {
5606 name: "my-bootclasspath-fragment",
5607 contents: ["libfoo", "libbar"],
5608 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005609 hidden_api: {
5610 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5611 metadata: "my-bootclasspath-fragment/metadata.csv",
5612 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005613 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5614 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5615 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005616 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005617 }
5618
5619 java_import {
5620 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005621 jars: ["libfoo.jar"],
5622 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005623 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005624 }
5625
5626 java_library {
5627 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005628 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005629 srcs: ["foo/bar/MyClass.java"],
5630 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005631 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005632 }
Paul Duffin37856732021-02-26 14:24:15 +00005633
5634 java_sdk_library_import {
5635 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005636 public: {
5637 jars: ["libbar.jar"],
5638 },
5639 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005640 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005641 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005642 }
5643
5644 java_sdk_library {
5645 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005646 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005647 srcs: ["foo/bar/MyClass.java"],
5648 unsafe_ignore_missing_latest_api: true,
5649 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005650 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005651 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005652 `
Cole Fausta963b942024-04-11 17:43:00 -07005653 // This test disables libbar, which causes the ComponentDepsMutator to add
5654 // deps on libbar.stubs and other sub-modules that don't exist. We can
5655 // enable AllowMissingDependencies to work around that, but enabling that
5656 // causes extra checks for missing source files to dex_bootjars, so add those
5657 // to the mock fs as well.
5658 preparer2 := android.GroupFixturePreparers(
5659 preparer,
5660 android.PrepareForTestWithAllowMissingDependencies,
5661 android.FixtureMergeMockFs(map[string][]byte{
5662 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5663 "frameworks/base/config/boot-profile.txt": nil,
5664 }),
5665 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005666
Cole Fausta963b942024-04-11 17:43:00 -07005667 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005668 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5669 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005670
Paul Duffin537ea3d2021-05-14 10:38:00 +01005671 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005672 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005673 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005674 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005675 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005676 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 +01005677 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005678 })
Spandan Das3a392012024-01-17 18:26:27 +00005679
Spandan Dasf2c10572024-02-27 04:49:52 +00005680 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005681 bp := `
5682 // Source
5683 apex {
5684 name: "myapex",
5685 enabled: false,
5686 key: "myapex.key",
5687 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5688 }
5689
5690 apex_key {
5691 name: "myapex.key",
5692 public_key: "testkey.avbpubkey",
5693 private_key: "testkey.pem",
5694 }
5695
5696 // Prebuilt
5697 prebuilt_apex {
5698 name: "myapex.v1",
5699 source_apex_name: "myapex",
5700 arch: {
5701 arm64: {
5702 src: "myapex-arm64.apex",
5703 },
5704 arm: {
5705 src: "myapex-arm.apex",
5706 },
5707 },
5708 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5709 prefer: true,
5710 }
5711 prebuilt_apex {
5712 name: "myapex.v2",
5713 source_apex_name: "myapex",
5714 arch: {
5715 arm64: {
5716 src: "myapex-arm64.apex",
5717 },
5718 arm: {
5719 src: "myapex-arm.apex",
5720 },
5721 },
5722 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5723 prefer: true,
5724 }
5725
5726 prebuilt_bootclasspath_fragment {
5727 name: "my-bootclasspath-fragment",
5728 contents: ["libfoo", "libbar"],
5729 apex_available: ["myapex"],
5730 hidden_api: {
5731 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5732 metadata: "my-bootclasspath-fragment/metadata.csv",
5733 index: "my-bootclasspath-fragment/index.csv",
5734 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5735 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5736 },
5737 prefer: true,
5738 }
5739
5740 java_import {
5741 name: "libfoo",
5742 jars: ["libfoo.jar"],
5743 apex_available: ["myapex"],
5744 prefer: true,
5745 }
5746 java_import {
5747 name: "libbar",
5748 jars: ["libbar.jar"],
5749 apex_available: ["myapex"],
5750 prefer: true,
5751 }
5752 `
5753
Spandan Dasf2c10572024-02-27 04:49:52 +00005754 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 +00005755 })
5756
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005757}
5758
Roland Levillain630846d2019-06-26 12:48:34 +01005759func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005760 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005761 apex_test {
5762 name: "myapex",
5763 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005764 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005765 tests: [
5766 "mytest",
5767 ],
5768 }
5769
5770 apex_key {
5771 name: "myapex.key",
5772 public_key: "testkey.avbpubkey",
5773 private_key: "testkey.pem",
5774 }
5775
Liz Kammer1c14a212020-05-12 15:26:55 -07005776 filegroup {
5777 name: "fg",
5778 srcs: [
5779 "baz",
5780 "bar/baz"
5781 ],
5782 }
5783
Roland Levillain630846d2019-06-26 12:48:34 +01005784 cc_test {
5785 name: "mytest",
5786 gtest: false,
5787 srcs: ["mytest.cpp"],
5788 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005789 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005790 system_shared_libs: [],
5791 static_executable: true,
5792 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005793 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005794 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005795
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005796 cc_library {
5797 name: "mylib",
5798 srcs: ["mylib.cpp"],
5799 system_shared_libs: [],
5800 stl: "none",
5801 }
5802
Liz Kammer5bd365f2020-05-27 15:15:11 -07005803 filegroup {
5804 name: "fg2",
5805 srcs: [
5806 "testdata/baz"
5807 ],
5808 }
Roland Levillain630846d2019-06-26 12:48:34 +01005809 `)
5810
Jooyung Hana0503a52023-08-23 13:12:50 +09005811 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005812 copyCmds := apexRule.Args["copy_commands"]
5813
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005814 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005815 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005816 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005817
Liz Kammer1c14a212020-05-12 15:26:55 -07005818 //Ensure that test data are copied into apex.
5819 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5820 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5821
Roland Levillainf89cd092019-07-29 16:22:59 +01005822 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005823 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005824 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005825 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005826 prefix := "TARGET_"
5827 var builder strings.Builder
5828 data.Custom(&builder, name, prefix, "", data)
5829 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005830 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005831 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005832}
5833
Jooyung Hand48f3c32019-08-23 11:18:57 +09005834func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5835 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5836 apex {
5837 name: "myapex",
5838 key: "myapex.key",
5839 native_shared_libs: ["libfoo"],
5840 }
5841
5842 apex_key {
5843 name: "myapex.key",
5844 public_key: "testkey.avbpubkey",
5845 private_key: "testkey.pem",
5846 }
5847
5848 cc_library {
5849 name: "libfoo",
5850 stl: "none",
5851 system_shared_libs: [],
5852 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005853 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005854 }
5855 `)
5856 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5857 apex {
5858 name: "myapex",
5859 key: "myapex.key",
5860 java_libs: ["myjar"],
5861 }
5862
5863 apex_key {
5864 name: "myapex.key",
5865 public_key: "testkey.avbpubkey",
5866 private_key: "testkey.pem",
5867 }
5868
5869 java_library {
5870 name: "myjar",
5871 srcs: ["foo/bar/MyClass.java"],
5872 sdk_version: "none",
5873 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005874 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005875 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005876 }
5877 `)
5878}
5879
Bill Peckhama41a6962021-01-11 10:58:54 -08005880func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005881 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005882 apex {
5883 name: "myapex",
5884 key: "myapex.key",
5885 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005886 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005887 }
5888
5889 apex_key {
5890 name: "myapex.key",
5891 public_key: "testkey.avbpubkey",
5892 private_key: "testkey.pem",
5893 }
5894
5895 java_import {
5896 name: "myjavaimport",
5897 apex_available: ["myapex"],
5898 jars: ["my.jar"],
5899 compile_dex: true,
5900 }
5901 `)
5902
Jooyung Hana0503a52023-08-23 13:12:50 +09005903 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005904 apexRule := module.Rule("apexRule")
5905 copyCmds := apexRule.Args["copy_commands"]
5906 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5907}
5908
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005909func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005910 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005911 apex {
5912 name: "myapex",
5913 key: "myapex.key",
5914 apps: [
5915 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005916 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005917 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005918 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005919 }
5920
5921 apex_key {
5922 name: "myapex.key",
5923 public_key: "testkey.avbpubkey",
5924 private_key: "testkey.pem",
5925 }
5926
5927 android_app {
5928 name: "AppFoo",
5929 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005930 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005931 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005932 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005933 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005934 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005935 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005936 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005937
5938 android_app {
5939 name: "AppFooPriv",
5940 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005941 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005942 system_modules: "none",
5943 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005944 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005945 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005946 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005947 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005948
5949 cc_library_shared {
5950 name: "libjni",
5951 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005952 shared_libs: ["libfoo"],
5953 stl: "none",
5954 system_shared_libs: [],
5955 apex_available: [ "myapex" ],
5956 sdk_version: "current",
5957 }
5958
5959 cc_library_shared {
5960 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005961 stl: "none",
5962 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005963 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005964 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005965 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005966 `)
5967
Jooyung Hana0503a52023-08-23 13:12:50 +09005968 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005969 apexRule := module.Rule("apexRule")
5970 copyCmds := apexRule.Args["copy_commands"]
5971
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005972 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5973 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005974 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005975
Colin Crossaede88c2020-08-11 12:17:01 -07005976 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005977 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005978 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005979 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005980 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005981 // JNI libraries including transitive deps are
5982 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005983 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005984 // ... embedded inside APK (jnilibs.zip)
5985 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5986 // ... and not directly inside the APEX
5987 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5988 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005989
5990 apexBundle := module.Module().(*apexBundle)
5991 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5992 var builder strings.Builder
5993 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5994 androidMk := builder.String()
5995 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5996 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5997 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5998 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5999 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6000 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 +01006001}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006002
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006003func TestApexWithAppImportBuildId(t *testing.T) {
6004 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6005 for _, id := range invalidBuildIds {
6006 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6007 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6008 variables.BuildId = proptools.StringPtr(id)
6009 })
6010 testApexError(t, message, `apex {
6011 name: "myapex",
6012 key: "myapex.key",
6013 apps: ["AppFooPrebuilt"],
6014 updatable: false,
6015 }
6016
6017 apex_key {
6018 name: "myapex.key",
6019 public_key: "testkey.avbpubkey",
6020 private_key: "testkey.pem",
6021 }
6022
6023 android_app_import {
6024 name: "AppFooPrebuilt",
6025 apk: "PrebuiltAppFoo.apk",
6026 presigned: true,
6027 apex_available: ["myapex"],
6028 }
6029 `, fixture)
6030 }
6031}
6032
Dario Frenicde2a032019-10-27 00:29:22 +01006033func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006034 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006035 apex {
6036 name: "myapex",
6037 key: "myapex.key",
6038 apps: [
6039 "AppFooPrebuilt",
6040 "AppFooPrivPrebuilt",
6041 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006042 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006043 }
6044
6045 apex_key {
6046 name: "myapex.key",
6047 public_key: "testkey.avbpubkey",
6048 private_key: "testkey.pem",
6049 }
6050
6051 android_app_import {
6052 name: "AppFooPrebuilt",
6053 apk: "PrebuiltAppFoo.apk",
6054 presigned: true,
6055 dex_preopt: {
6056 enabled: false,
6057 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006058 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006059 }
6060
6061 android_app_import {
6062 name: "AppFooPrivPrebuilt",
6063 apk: "PrebuiltAppFooPriv.apk",
6064 privileged: true,
6065 presigned: true,
6066 dex_preopt: {
6067 enabled: false,
6068 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006069 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006070 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006071 }
6072 `)
6073
Jooyung Hana0503a52023-08-23 13:12:50 +09006074 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006075 apexRule := module.Rule("apexRule")
6076 copyCmds := apexRule.Args["copy_commands"]
6077
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006078 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6079 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006080}
6081
6082func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006083 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006084 apex {
6085 name: "myapex",
6086 key: "myapex.key",
6087 apps: [
6088 "AppFoo",
6089 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006090 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006091 }
6092
6093 apex_key {
6094 name: "myapex.key",
6095 public_key: "testkey.avbpubkey",
6096 private_key: "testkey.pem",
6097 }
6098
6099 android_app {
6100 name: "AppFoo",
6101 srcs: ["foo/bar/MyClass.java"],
6102 sdk_version: "none",
6103 system_modules: "none",
6104 apex_available: [ "myapex" ],
6105 }
6106
6107 android_app_import {
6108 name: "AppFoo",
6109 apk: "AppFooPrebuilt.apk",
6110 filename: "AppFooPrebuilt.apk",
6111 presigned: true,
6112 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006113 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006114 }
6115 `, withFiles(map[string][]byte{
6116 "AppFooPrebuilt.apk": nil,
6117 }))
6118
Jooyung Hana0503a52023-08-23 13:12:50 +09006119 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006120 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006121 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006122}
6123
Dario Freni6f3937c2019-12-20 22:58:03 +00006124func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006125 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006126 apex {
6127 name: "myapex",
6128 key: "myapex.key",
6129 apps: [
6130 "TesterHelpAppFoo",
6131 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006132 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006133 }
6134
6135 apex_key {
6136 name: "myapex.key",
6137 public_key: "testkey.avbpubkey",
6138 private_key: "testkey.pem",
6139 }
6140
6141 android_test_helper_app {
6142 name: "TesterHelpAppFoo",
6143 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006144 apex_available: [ "myapex" ],
Jihoon Kangbb678f82024-07-01 17:04:46 +00006145 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006146 }
6147
6148 `)
6149
Jooyung Hana0503a52023-08-23 13:12:50 +09006150 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006151 apexRule := module.Rule("apexRule")
6152 copyCmds := apexRule.Args["copy_commands"]
6153
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006154 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006155}
6156
Jooyung Han18020ea2019-11-13 10:50:48 +09006157func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6158 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006159 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006160 apex {
6161 name: "myapex",
6162 key: "myapex.key",
6163 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006164 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006165 }
6166
6167 apex_key {
6168 name: "myapex.key",
6169 public_key: "testkey.avbpubkey",
6170 private_key: "testkey.pem",
6171 }
6172
6173 apex {
6174 name: "otherapex",
6175 key: "myapex.key",
6176 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006177 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006178 }
6179
6180 cc_defaults {
6181 name: "libfoo-defaults",
6182 apex_available: ["otherapex"],
6183 }
6184
6185 cc_library {
6186 name: "libfoo",
6187 defaults: ["libfoo-defaults"],
6188 stl: "none",
6189 system_shared_libs: [],
6190 }`)
6191}
6192
Paul Duffine52e66f2020-03-30 17:54:29 +01006193func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006194 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006195 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006196 apex {
6197 name: "myapex",
6198 key: "myapex.key",
6199 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006200 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +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: "otherapex.key",
6212 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006213 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006214 }
6215
6216 apex_key {
6217 name: "otherapex.key",
6218 public_key: "testkey.avbpubkey",
6219 private_key: "testkey.pem",
6220 }
6221
6222 cc_library {
6223 name: "libfoo",
6224 stl: "none",
6225 system_shared_libs: [],
6226 apex_available: ["otherapex"],
6227 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006228}
Jiyong Park127b40b2019-09-30 16:04:35 +09006229
Paul Duffine52e66f2020-03-30 17:54:29 +01006230func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006231 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006232 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006233.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006234.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006235.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006236.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006237.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006238.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006239 apex {
6240 name: "myapex",
6241 key: "myapex.key",
6242 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006243 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006244 }
6245
6246 apex_key {
6247 name: "myapex.key",
6248 public_key: "testkey.avbpubkey",
6249 private_key: "testkey.pem",
6250 }
6251
Jiyong Park127b40b2019-09-30 16:04:35 +09006252 cc_library {
6253 name: "libfoo",
6254 stl: "none",
6255 shared_libs: ["libbar"],
6256 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006257 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006258 }
6259
6260 cc_library {
6261 name: "libbar",
6262 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006263 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006264 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006265 apex_available: ["myapex"],
6266 }
6267
6268 cc_library {
6269 name: "libbaz",
6270 stl: "none",
6271 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006272 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006273}
Jiyong Park127b40b2019-09-30 16:04:35 +09006274
Liz Kammer5f108fa2023-05-11 14:33:17 -04006275func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6276 testApex(t, `
6277 apex {
6278 name: "myapex",
6279 key: "myapex.key",
6280 native_shared_libs: ["libfoo"],
6281 updatable: false,
6282 }
6283
6284 apex_key {
6285 name: "myapex.key",
6286 public_key: "testkey.avbpubkey",
6287 private_key: "testkey.pem",
6288 }
6289
6290 cc_library {
6291 name: "libfoo",
6292 stl: "none",
6293 static_libs: ["libbar"],
6294 system_shared_libs: [],
6295 apex_available: ["myapex"],
6296 }
6297
6298 cc_library {
6299 name: "libbar",
6300 stl: "none",
6301 shared_libs: ["libbaz"],
6302 system_shared_libs: [],
6303 apex_available: ["myapex"],
6304 }
6305
6306 cc_library {
6307 name: "libbaz",
6308 stl: "none",
6309 system_shared_libs: [],
6310 }`)
6311
6312 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
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 system_shared_libs: [],
6338 }`)
6339}
6340
Paul Duffine52e66f2020-03-30 17:54:29 +01006341func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006342 testApexError(t, "\"otherapex\" is not a valid module name", `
6343 apex {
6344 name: "myapex",
6345 key: "myapex.key",
6346 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006347 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006348 }
6349
6350 apex_key {
6351 name: "myapex.key",
6352 public_key: "testkey.avbpubkey",
6353 private_key: "testkey.pem",
6354 }
6355
6356 cc_library {
6357 name: "libfoo",
6358 stl: "none",
6359 system_shared_libs: [],
6360 apex_available: ["otherapex"],
6361 }`)
6362
Paul Duffine52e66f2020-03-30 17:54:29 +01006363 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006364 apex {
6365 name: "myapex",
6366 key: "myapex.key",
6367 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006368 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006369 }
6370
6371 apex_key {
6372 name: "myapex.key",
6373 public_key: "testkey.avbpubkey",
6374 private_key: "testkey.pem",
6375 }
6376
6377 cc_library {
6378 name: "libfoo",
6379 stl: "none",
6380 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006381 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006382 apex_available: ["myapex"],
6383 }
6384
6385 cc_library {
6386 name: "libbar",
6387 stl: "none",
6388 system_shared_libs: [],
6389 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006390 }
6391
6392 cc_library {
6393 name: "libbaz",
6394 stl: "none",
6395 system_shared_libs: [],
6396 stubs: {
6397 versions: ["10", "20", "30"],
6398 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006399 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006400}
Jiyong Park127b40b2019-09-30 16:04:35 +09006401
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006402func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6403 t.Run("negative variant_version produces error", func(t *testing.T) {
6404 testApexError(t, "expected an integer between 0-9; got -1", `
6405 apex {
6406 name: "myapex",
6407 key: "myapex.key",
6408 apex_available_name: "com.android.foo",
6409 variant_version: "-1",
6410 updatable: false,
6411 }
6412 apex_key {
6413 name: "myapex.key",
6414 public_key: "testkey.avbpubkey",
6415 private_key: "testkey.pem",
6416 }
6417 `)
6418 })
6419
6420 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6421 testApexError(t, "expected an integer between 0-9; got 10", `
6422 apex {
6423 name: "myapex",
6424 key: "myapex.key",
6425 apex_available_name: "com.android.foo",
6426 variant_version: "10",
6427 updatable: false,
6428 }
6429 apex_key {
6430 name: "myapex.key",
6431 public_key: "testkey.avbpubkey",
6432 private_key: "testkey.pem",
6433 }
6434 `)
6435 })
6436}
6437
6438func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6439 context := android.GroupFixturePreparers(
6440 android.PrepareForIntegrationTestWithAndroid,
6441 PrepareForTestWithApexBuildComponents,
6442 android.FixtureMergeMockFs(android.MockFS{
6443 "system/sepolicy/apex/foo-file_contexts": nil,
6444 "system/sepolicy/apex/bar-file_contexts": nil,
6445 }),
6446 )
6447 result := context.RunTestWithBp(t, `
6448 apex {
6449 name: "foo",
6450 key: "myapex.key",
6451 apex_available_name: "com.android.foo",
6452 variant_version: "0",
6453 updatable: false,
6454 }
6455 apex {
6456 name: "bar",
6457 key: "myapex.key",
6458 apex_available_name: "com.android.foo",
6459 variant_version: "3",
6460 updatable: false,
6461 }
6462 apex_key {
6463 name: "myapex.key",
6464 public_key: "testkey.avbpubkey",
6465 private_key: "testkey.pem",
6466 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006467 override_apex {
6468 name: "myoverrideapex",
6469 base: "bar",
6470 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006471 `)
6472
Jooyung Hana0503a52023-08-23 13:12:50 +09006473 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006474 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6475 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6476 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6477 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6478 }
6479
Jooyung Hana0503a52023-08-23 13:12:50 +09006480 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006481 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6482 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6483 barActualDefaultVersion := barManifestRule.Args["default_version"]
6484 if barActualDefaultVersion != barExpectedDefaultVersion {
6485 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6486 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006487
Spandan Das50801e22024-05-13 18:29:45 +00006488 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006489 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6490 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6491 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6492 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006493}
6494
Sam Delmericoca816532023-06-02 14:09:50 -04006495func TestApexAvailable_ApexAvailableName(t *testing.T) {
6496 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6497 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6498 apex {
6499 name: "myapex_sminus",
6500 key: "myapex.key",
6501 apps: ["AppFoo"],
6502 apex_available_name: "myapex",
6503 updatable: false,
6504 }
6505 apex {
6506 name: "myapex",
6507 key: "myapex.key",
6508 apps: ["AppFoo"],
6509 updatable: false,
6510 }
6511 apex_key {
6512 name: "myapex.key",
6513 public_key: "testkey.avbpubkey",
6514 private_key: "testkey.pem",
6515 }
6516 android_app {
6517 name: "AppFoo",
6518 srcs: ["foo/bar/MyClass.java"],
6519 sdk_version: "none",
6520 system_modules: "none",
6521 apex_available: [ "myapex_sminus" ],
6522 }`,
6523 android.FixtureMergeMockFs(android.MockFS{
6524 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6525 }),
6526 )
6527 })
6528
6529 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6530 testApex(t, `
6531 apex {
6532 name: "myapex_sminus",
6533 key: "myapex.key",
6534 apps: ["AppFoo"],
6535 apex_available_name: "myapex",
6536 updatable: false,
6537 }
6538 apex {
6539 name: "myapex",
6540 key: "myapex.key",
6541 apps: ["AppFoo"],
6542 updatable: false,
6543 }
6544 apex_key {
6545 name: "myapex.key",
6546 public_key: "testkey.avbpubkey",
6547 private_key: "testkey.pem",
6548 }
6549 android_app {
6550 name: "AppFoo",
6551 srcs: ["foo/bar/MyClass.java"],
6552 sdk_version: "none",
6553 system_modules: "none",
6554 apex_available: [ "myapex" ],
6555 }`,
6556 android.FixtureMergeMockFs(android.MockFS{
6557 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6558 }),
6559 )
6560 })
6561
6562 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6563 testApex(t, `
6564 override_apex {
6565 name: "myoverrideapex_sminus",
6566 base: "myapex_sminus",
6567 key: "myapex.key",
6568 apps: ["AppFooOverride"],
6569 }
6570 override_apex {
6571 name: "myoverrideapex",
6572 base: "myapex",
6573 key: "myapex.key",
6574 apps: ["AppFooOverride"],
6575 }
6576 apex {
6577 name: "myapex_sminus",
6578 key: "myapex.key",
6579 apps: ["AppFoo"],
6580 apex_available_name: "myapex",
6581 updatable: false,
6582 }
6583 apex {
6584 name: "myapex",
6585 key: "myapex.key",
6586 apps: ["AppFoo"],
6587 updatable: false,
6588 }
6589 apex_key {
6590 name: "myapex.key",
6591 public_key: "testkey.avbpubkey",
6592 private_key: "testkey.pem",
6593 }
6594 android_app {
6595 name: "AppFooOverride",
6596 srcs: ["foo/bar/MyClass.java"],
6597 sdk_version: "none",
6598 system_modules: "none",
6599 apex_available: [ "myapex" ],
6600 }
6601 android_app {
6602 name: "AppFoo",
6603 srcs: ["foo/bar/MyClass.java"],
6604 sdk_version: "none",
6605 system_modules: "none",
6606 apex_available: [ "myapex" ],
6607 }`,
6608 android.FixtureMergeMockFs(android.MockFS{
6609 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6610 }),
6611 )
6612 })
6613}
6614
6615func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6616 context := android.GroupFixturePreparers(
6617 android.PrepareForIntegrationTestWithAndroid,
6618 PrepareForTestWithApexBuildComponents,
6619 java.PrepareForTestWithDexpreopt,
6620 android.FixtureMergeMockFs(android.MockFS{
6621 "system/sepolicy/apex/myapex-file_contexts": nil,
6622 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6623 }),
6624 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6625 variables.BuildId = proptools.StringPtr("buildid")
6626 }),
6627 )
6628 context.RunTestWithBp(t, `
6629 override_apex {
6630 name: "myoverrideapex_sminus",
6631 base: "myapex_sminus",
6632 }
6633 override_apex {
6634 name: "myoverrideapex",
6635 base: "myapex",
6636 }
6637 apex {
6638 name: "myapex",
6639 key: "myapex.key",
6640 apps: ["AppFoo"],
6641 updatable: false,
6642 }
6643 apex {
6644 name: "myapex_sminus",
6645 apex_available_name: "myapex",
6646 key: "myapex.key",
6647 apps: ["AppFoo_sminus"],
6648 updatable: false,
6649 }
6650 apex_key {
6651 name: "myapex.key",
6652 public_key: "testkey.avbpubkey",
6653 private_key: "testkey.pem",
6654 }
6655 android_app {
6656 name: "AppFoo",
6657 srcs: ["foo/bar/MyClass.java"],
6658 sdk_version: "none",
6659 system_modules: "none",
6660 apex_available: [ "myapex" ],
6661 }
6662 android_app {
6663 name: "AppFoo_sminus",
6664 srcs: ["foo/bar/MyClass.java"],
6665 sdk_version: "none",
6666 min_sdk_version: "29",
6667 system_modules: "none",
6668 apex_available: [ "myapex" ],
6669 }`)
6670}
6671
Jiyong Park89e850a2020-04-07 16:37:39 +09006672func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006673 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006674 apex {
6675 name: "myapex",
6676 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006677 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006678 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006679 }
6680
6681 apex_key {
6682 name: "myapex.key",
6683 public_key: "testkey.avbpubkey",
6684 private_key: "testkey.pem",
6685 }
6686
6687 cc_library {
6688 name: "libfoo",
6689 stl: "none",
6690 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006691 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006692 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006693 }
6694
6695 cc_library {
6696 name: "libfoo2",
6697 stl: "none",
6698 system_shared_libs: [],
6699 shared_libs: ["libbaz"],
6700 apex_available: ["//apex_available:platform"],
6701 }
6702
6703 cc_library {
6704 name: "libbar",
6705 stl: "none",
6706 system_shared_libs: [],
6707 apex_available: ["myapex"],
6708 }
6709
6710 cc_library {
6711 name: "libbaz",
6712 stl: "none",
6713 system_shared_libs: [],
6714 apex_available: ["myapex"],
6715 stubs: {
6716 versions: ["1"],
6717 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006718 }`)
6719
Jiyong Park89e850a2020-04-07 16:37:39 +09006720 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6721 // because it depends on libbar which isn't available to platform
6722 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6723 if libfoo.NotAvailableForPlatform() != true {
6724 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6725 }
6726
6727 // libfoo2 however can be available to platform because it depends on libbaz which provides
6728 // stubs
6729 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6730 if libfoo2.NotAvailableForPlatform() == true {
6731 t.Errorf("%q should be available to platform", libfoo2.String())
6732 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006733}
Jiyong Parka90ca002019-10-07 15:47:24 +09006734
Paul Duffine52e66f2020-03-30 17:54:29 +01006735func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006736 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006737 apex {
6738 name: "myapex",
6739 key: "myapex.key",
6740 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006741 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006742 }
6743
6744 apex_key {
6745 name: "myapex.key",
6746 public_key: "testkey.avbpubkey",
6747 private_key: "testkey.pem",
6748 }
6749
6750 cc_library {
6751 name: "libfoo",
6752 stl: "none",
6753 system_shared_libs: [],
6754 apex_available: ["myapex"],
6755 static: {
6756 apex_available: ["//apex_available:platform"],
6757 },
6758 }`)
6759
Jiyong Park89e850a2020-04-07 16:37:39 +09006760 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6761 if libfooShared.NotAvailableForPlatform() != true {
6762 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6763 }
6764 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6765 if libfooStatic.NotAvailableForPlatform() != false {
6766 t.Errorf("%q should be available to platform", libfooStatic.String())
6767 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006768}
6769
Jooyung Han9a419e22024-08-16 17:14:21 +09006770func TestApexAvailable_PrefixMatch(t *testing.T) {
6771
6772 for _, tc := range []struct {
6773 name string
6774 apexAvailable string
6775 expectedError string
6776 }{
6777 {
6778 name: "prefix matches correctly",
6779 apexAvailable: "com.foo.*",
6780 },
6781 {
6782 name: "prefix doesn't match",
6783 apexAvailable: "com.bar.*",
6784 expectedError: `Consider .* "com.foo\.\*"`,
6785 },
6786 {
6787 name: "short prefix",
6788 apexAvailable: "com.*",
6789 expectedError: "requires two or more components",
6790 },
6791 {
6792 name: "wildcard not in the end",
6793 apexAvailable: "com.*.foo",
6794 expectedError: "should end with .*",
6795 },
6796 {
6797 name: "wildcard in the middle",
6798 apexAvailable: "com.foo*.*",
6799 expectedError: "not allowed in the middle",
6800 },
6801 {
6802 name: "hint with prefix pattern",
6803 apexAvailable: "//apex_available:platform",
6804 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6805 },
6806 } {
6807 t.Run(tc.name, func(t *testing.T) {
6808 errorHandler := android.FixtureExpectsNoErrors
6809 if tc.expectedError != "" {
6810 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6811 }
6812 context := android.GroupFixturePreparers(
6813 prepareForApexTest,
6814 android.FixtureMergeMockFs(android.MockFS{
6815 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6816 }),
6817 ).ExtendWithErrorHandler(errorHandler)
6818
6819 context.RunTestWithBp(t, `
6820 apex {
6821 name: "com.foo.bar",
6822 key: "myapex.key",
6823 native_shared_libs: ["libfoo"],
6824 updatable: false,
6825 }
6826
6827 apex_key {
6828 name: "myapex.key",
6829 public_key: "testkey.avbpubkey",
6830 private_key: "testkey.pem",
6831 }
6832
6833 cc_library {
6834 name: "libfoo",
6835 stl: "none",
6836 system_shared_libs: [],
6837 apex_available: ["`+tc.apexAvailable+`"],
6838 }`)
6839 })
6840 }
6841 testApexError(t, `Consider adding "com.foo" to`, `
6842 apex {
6843 name: "com.foo", // too short for a partner apex
6844 key: "myapex.key",
6845 native_shared_libs: ["libfoo"],
6846 updatable: false,
6847 }
6848
6849 apex_key {
6850 name: "myapex.key",
6851 public_key: "testkey.avbpubkey",
6852 private_key: "testkey.pem",
6853 }
6854
6855 cc_library {
6856 name: "libfoo",
6857 stl: "none",
6858 system_shared_libs: [],
6859 }
6860 `)
6861}
6862
Jiyong Park5d790c32019-11-15 18:40:32 +09006863func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006864 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006865 apex {
6866 name: "myapex",
6867 key: "myapex.key",
6868 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006869 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006870 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006871 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006872 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006873 }
6874
6875 override_apex {
6876 name: "override_myapex",
6877 base: "myapex",
6878 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006879 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006880 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006881 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006882 compile_multilib: "first",
6883 multilib: {
6884 lib32: {
6885 native_shared_libs: ["mylib32"],
6886 },
6887 lib64: {
6888 native_shared_libs: ["mylib64"],
6889 },
6890 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006891 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006892 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006893 key: "mynewapex.key",
6894 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006895 }
6896
6897 apex_key {
6898 name: "myapex.key",
6899 public_key: "testkey.avbpubkey",
6900 private_key: "testkey.pem",
6901 }
6902
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006903 apex_key {
6904 name: "mynewapex.key",
6905 public_key: "testkey2.avbpubkey",
6906 private_key: "testkey2.pem",
6907 }
6908
6909 android_app_certificate {
6910 name: "myapex.certificate",
6911 certificate: "testkey",
6912 }
6913
Jiyong Park5d790c32019-11-15 18:40:32 +09006914 android_app {
6915 name: "app",
6916 srcs: ["foo/bar/MyClass.java"],
6917 package_name: "foo",
6918 sdk_version: "none",
6919 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006920 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006921 }
6922
6923 override_android_app {
6924 name: "override_app",
6925 base: "app",
6926 package_name: "bar",
6927 }
markchien7c803b82021-08-26 22:10:06 +08006928
6929 bpf {
6930 name: "bpf",
6931 srcs: ["bpf.c"],
6932 }
6933
6934 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006935 name: "overrideBpf",
6936 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006937 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006938
6939 prebuilt_etc {
6940 name: "myetc",
6941 src: "myprebuilt",
6942 }
6943
6944 prebuilt_etc {
6945 name: "override_myetc",
6946 src: "override_myprebuilt",
6947 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006948
6949 cc_library {
6950 name: "mylib32",
6951 apex_available: [ "myapex" ],
6952 }
6953
6954 cc_library {
6955 name: "mylib64",
6956 apex_available: [ "myapex" ],
6957 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006958 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006959
Jooyung Hana0503a52023-08-23 13:12:50 +09006960 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00006961 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006962 if originalVariant.GetOverriddenBy() != "" {
6963 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6964 }
6965 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6966 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6967 }
6968
Spandan Das50801e22024-05-13 18:29:45 +00006969 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006970 apexRule := module.Rule("apexRule")
6971 copyCmds := apexRule.Args["copy_commands"]
6972
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006973 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6974 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006975
markchien7c803b82021-08-26 22:10:06 +08006976 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006977 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006978
Daniel Norman5a3ce132021-08-26 15:44:43 -07006979 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6980 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6981
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006982 apexBundle := module.Module().(*apexBundle)
6983 name := apexBundle.Name()
6984 if name != "override_myapex" {
6985 t.Errorf("name should be \"override_myapex\", but was %q", name)
6986 }
6987
Baligh Uddin004d7172020-02-19 21:29:28 -08006988 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6989 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6990 }
6991
Jiyong Park20bacab2020-03-03 11:45:41 +09006992 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006993 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006994 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6995
6996 signApkRule := module.Rule("signapk")
6997 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006998
Colin Crossaa255532020-07-03 13:18:24 -07006999 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007000 var builder strings.Builder
7001 data.Custom(&builder, name, "TARGET_", "", data)
7002 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007003 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7004 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007005 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007006 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007007 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007008 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007009 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007010 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007011}
7012
Albert Martineefabcf2022-03-21 20:11:16 +00007013func TestMinSdkVersionOverride(t *testing.T) {
7014 // Override from 29 to 31
7015 minSdkOverride31 := "31"
7016 ctx := testApex(t, `
7017 apex {
7018 name: "myapex",
7019 key: "myapex.key",
7020 native_shared_libs: ["mylib"],
7021 updatable: true,
7022 min_sdk_version: "29"
7023 }
7024
7025 override_apex {
7026 name: "override_myapex",
7027 base: "myapex",
7028 logging_parent: "com.foo.bar",
7029 package_name: "test.overridden.package"
7030 }
7031
7032 apex_key {
7033 name: "myapex.key",
7034 public_key: "testkey.avbpubkey",
7035 private_key: "testkey.pem",
7036 }
7037
7038 cc_library {
7039 name: "mylib",
7040 srcs: ["mylib.cpp"],
7041 runtime_libs: ["libbar"],
7042 system_shared_libs: [],
7043 stl: "none",
7044 apex_available: [ "myapex" ],
7045 min_sdk_version: "apex_inherit"
7046 }
7047
7048 cc_library {
7049 name: "libbar",
7050 srcs: ["mylib.cpp"],
7051 system_shared_libs: [],
7052 stl: "none",
7053 apex_available: [ "myapex" ],
7054 min_sdk_version: "apex_inherit"
7055 }
7056
7057 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7058
Jooyung Hana0503a52023-08-23 13:12:50 +09007059 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007060 copyCmds := apexRule.Args["copy_commands"]
7061
7062 // Ensure that direct non-stubs dep is always included
7063 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7064
7065 // Ensure that runtime_libs dep in included
7066 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7067
7068 // Ensure libraries target overridden min_sdk_version value
7069 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7070}
7071
7072func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7073 // Attempt to override from 31 to 29, should be a NOOP
7074 minSdkOverride29 := "29"
7075 ctx := testApex(t, `
7076 apex {
7077 name: "myapex",
7078 key: "myapex.key",
7079 native_shared_libs: ["mylib"],
7080 updatable: true,
7081 min_sdk_version: "31"
7082 }
7083
7084 override_apex {
7085 name: "override_myapex",
7086 base: "myapex",
7087 logging_parent: "com.foo.bar",
7088 package_name: "test.overridden.package"
7089 }
7090
7091 apex_key {
7092 name: "myapex.key",
7093 public_key: "testkey.avbpubkey",
7094 private_key: "testkey.pem",
7095 }
7096
7097 cc_library {
7098 name: "mylib",
7099 srcs: ["mylib.cpp"],
7100 runtime_libs: ["libbar"],
7101 system_shared_libs: [],
7102 stl: "none",
7103 apex_available: [ "myapex" ],
7104 min_sdk_version: "apex_inherit"
7105 }
7106
7107 cc_library {
7108 name: "libbar",
7109 srcs: ["mylib.cpp"],
7110 system_shared_libs: [],
7111 stl: "none",
7112 apex_available: [ "myapex" ],
7113 min_sdk_version: "apex_inherit"
7114 }
7115
7116 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7117
Jooyung Hana0503a52023-08-23 13:12:50 +09007118 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007119 copyCmds := apexRule.Args["copy_commands"]
7120
7121 // Ensure that direct non-stubs dep is always included
7122 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7123
7124 // Ensure that runtime_libs dep in included
7125 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7126
7127 // Ensure libraries target the original min_sdk_version value rather than the overridden
7128 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7129}
7130
Jooyung Han214bf372019-11-12 13:03:50 +09007131func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007132 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007133 apex {
7134 name: "myapex",
7135 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007136 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007137 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007138 }
7139
7140 apex_key {
7141 name: "myapex.key",
7142 public_key: "testkey.avbpubkey",
7143 private_key: "testkey.pem",
7144 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007145
7146 cc_library {
7147 name: "mylib",
7148 srcs: ["mylib.cpp"],
7149 stl: "libc++",
7150 system_shared_libs: [],
7151 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007152 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007153 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007154 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007155
Jooyung Hana0503a52023-08-23 13:12:50 +09007156 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007157 args := module.Rule("apexRule").Args
7158 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007159 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007160
7161 // The copies of the libraries in the apex should have one more dependency than
7162 // the ones outside the apex, namely the unwinder. Ideally we should check
7163 // the dependency names directly here but for some reason the names are blank in
7164 // this test.
7165 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007166 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007167 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7168 if len(apexImplicits) != len(nonApexImplicits)+1 {
7169 t.Errorf("%q missing unwinder dep", lib)
7170 }
7171 }
Jooyung Han214bf372019-11-12 13:03:50 +09007172}
7173
Paul Duffine05480a2021-03-08 15:07:14 +00007174var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007175 "api/current.txt": nil,
7176 "api/removed.txt": nil,
7177 "api/system-current.txt": nil,
7178 "api/system-removed.txt": nil,
7179 "api/test-current.txt": nil,
7180 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007181
Anton Hanssondff2c782020-12-21 17:10:01 +00007182 "100/public/api/foo.txt": nil,
7183 "100/public/api/foo-removed.txt": nil,
7184 "100/system/api/foo.txt": nil,
7185 "100/system/api/foo-removed.txt": nil,
7186
Paul Duffineedc5d52020-06-12 17:46:39 +01007187 // For java_sdk_library_import
7188 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007189}
7190
Jooyung Han58f26ab2019-12-18 15:34:32 +09007191func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007192 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007193 apex {
7194 name: "myapex",
7195 key: "myapex.key",
7196 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007197 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007198 }
7199
7200 apex_key {
7201 name: "myapex.key",
7202 public_key: "testkey.avbpubkey",
7203 private_key: "testkey.pem",
7204 }
7205
7206 java_sdk_library {
7207 name: "foo",
7208 srcs: ["a.java"],
7209 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007210 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007211 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007212
7213 prebuilt_apis {
7214 name: "sdk",
7215 api_dirs: ["100"],
7216 }
Paul Duffin9b879592020-05-26 13:21:35 +01007217 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007218
7219 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007220 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007221 "javalib/foo.jar",
7222 "etc/permissions/foo.xml",
7223 })
7224 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007225 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7226 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7227 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007228}
7229
Spandan Das3ee19692024-06-19 04:47:40 +00007230func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7231 ctx := testApex(t, `
7232 override_apex {
7233 name: "mycompanyapex",
7234 base: "myapex",
7235 }
7236 apex {
7237 name: "myapex",
7238 key: "myapex.key",
7239 java_libs: ["foo"],
7240 updatable: false,
7241 }
7242
7243 apex_key {
7244 name: "myapex.key",
7245 public_key: "testkey.avbpubkey",
7246 private_key: "testkey.pem",
7247 }
7248
7249 java_sdk_library {
7250 name: "foo",
7251 srcs: ["a.java"],
7252 api_packages: ["foo"],
7253 apex_available: [ "myapex" ],
7254 }
7255
7256 prebuilt_apis {
7257 name: "sdk",
7258 api_dirs: ["100"],
7259 }
7260 `, withFiles(filesForSdkLibrary))
7261
7262 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7263 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7264 // (com.android.foo), the filepath should not contain override apex name.
7265 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7266 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7267 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7268}
7269
Paul Duffin9b879592020-05-26 13:21:35 +01007270func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007271 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007272 apex {
7273 name: "myapex",
7274 key: "myapex.key",
7275 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007276 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007277 }
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 sdk_version: "none",
7291 system_modules: "none",
7292 }
7293
7294 java_library {
7295 name: "bar",
7296 srcs: ["a.java"],
7297 libs: ["foo"],
7298 apex_available: ["myapex"],
7299 sdk_version: "none",
7300 system_modules: "none",
7301 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007302
7303 prebuilt_apis {
7304 name: "sdk",
7305 api_dirs: ["100"],
7306 }
Paul Duffin9b879592020-05-26 13:21:35 +01007307 `, withFiles(filesForSdkLibrary))
7308
7309 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007310 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007311 "javalib/bar.jar",
7312 "javalib/foo.jar",
7313 "etc/permissions/foo.xml",
7314 })
7315
7316 // The bar library should depend on the implementation jar.
7317 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007318 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007319 t.Errorf("expected %q, found %#q", expected, actual)
7320 }
7321}
7322
7323func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007324 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007325 apex {
7326 name: "myapex",
7327 key: "myapex.key",
7328 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007329 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007330 }
7331
7332 apex_key {
7333 name: "myapex.key",
7334 public_key: "testkey.avbpubkey",
7335 private_key: "testkey.pem",
7336 }
7337
7338 java_sdk_library {
7339 name: "foo",
7340 srcs: ["a.java"],
7341 api_packages: ["foo"],
7342 apex_available: ["myapex"],
7343 sdk_version: "none",
7344 system_modules: "none",
7345 }
7346
7347 java_library {
7348 name: "bar",
7349 srcs: ["a.java"],
7350 libs: ["foo"],
7351 sdk_version: "none",
7352 system_modules: "none",
7353 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007354
7355 prebuilt_apis {
7356 name: "sdk",
7357 api_dirs: ["100"],
7358 }
Paul Duffin9b879592020-05-26 13:21:35 +01007359 `, withFiles(filesForSdkLibrary))
7360
7361 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007362 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007363 "javalib/foo.jar",
7364 "etc/permissions/foo.xml",
7365 })
7366
7367 // The bar library should depend on the stubs jar.
7368 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007369 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007370 t.Errorf("expected %q, found %#q", expected, actual)
7371 }
7372}
7373
Paul Duffineedc5d52020-06-12 17:46:39 +01007374func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007375 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007376 prebuilt_apis {
7377 name: "sdk",
7378 api_dirs: ["100"],
7379 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007380 withFiles(map[string][]byte{
7381 "apex/a.java": nil,
7382 "apex/apex_manifest.json": nil,
7383 "apex/Android.bp": []byte(`
7384 package {
7385 default_visibility: ["//visibility:private"],
7386 }
7387
7388 apex {
7389 name: "myapex",
7390 key: "myapex.key",
7391 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007392 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007393 }
7394
7395 apex_key {
7396 name: "myapex.key",
7397 public_key: "testkey.avbpubkey",
7398 private_key: "testkey.pem",
7399 }
7400
7401 java_library {
7402 name: "bar",
7403 srcs: ["a.java"],
7404 libs: ["foo"],
7405 apex_available: ["myapex"],
7406 sdk_version: "none",
7407 system_modules: "none",
7408 }
7409`),
7410 "source/a.java": nil,
7411 "source/api/current.txt": nil,
7412 "source/api/removed.txt": nil,
7413 "source/Android.bp": []byte(`
7414 package {
7415 default_visibility: ["//visibility:private"],
7416 }
7417
7418 java_sdk_library {
7419 name: "foo",
7420 visibility: ["//apex"],
7421 srcs: ["a.java"],
7422 api_packages: ["foo"],
7423 apex_available: ["myapex"],
7424 sdk_version: "none",
7425 system_modules: "none",
7426 public: {
7427 enabled: true,
7428 },
7429 }
7430`),
7431 "prebuilt/a.jar": nil,
7432 "prebuilt/Android.bp": []byte(`
7433 package {
7434 default_visibility: ["//visibility:private"],
7435 }
7436
7437 java_sdk_library_import {
7438 name: "foo",
7439 visibility: ["//apex", "//source"],
7440 apex_available: ["myapex"],
7441 prefer: true,
7442 public: {
7443 jars: ["a.jar"],
7444 },
7445 }
7446`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007447 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007448 )
7449
7450 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007451 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007452 "javalib/bar.jar",
7453 "javalib/foo.jar",
7454 "etc/permissions/foo.xml",
7455 })
7456
7457 // The bar library should depend on the implementation jar.
7458 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007459 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007460 t.Errorf("expected %q, found %#q", expected, actual)
7461 }
7462}
7463
7464func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7465 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7466 apex {
7467 name: "myapex",
7468 key: "myapex.key",
7469 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007470 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007471 }
7472
7473 apex_key {
7474 name: "myapex.key",
7475 public_key: "testkey.avbpubkey",
7476 private_key: "testkey.pem",
7477 }
7478
7479 java_sdk_library_import {
7480 name: "foo",
7481 apex_available: ["myapex"],
7482 prefer: true,
7483 public: {
7484 jars: ["a.jar"],
7485 },
7486 }
7487
7488 `, withFiles(filesForSdkLibrary))
7489}
7490
atrost6e126252020-01-27 17:01:16 +00007491func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007492 result := android.GroupFixturePreparers(
7493 prepareForApexTest,
7494 java.PrepareForTestWithPlatformCompatConfig,
7495 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007496 apex {
7497 name: "myapex",
7498 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007499 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007500 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007501 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007502 }
7503
7504 apex_key {
7505 name: "myapex.key",
7506 public_key: "testkey.avbpubkey",
7507 private_key: "testkey.pem",
7508 }
7509
7510 platform_compat_config {
7511 name: "myjar-platform-compat-config",
7512 src: ":myjar",
7513 }
7514
7515 java_library {
7516 name: "myjar",
7517 srcs: ["foo/bar/MyClass.java"],
7518 sdk_version: "none",
7519 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007520 apex_available: [ "myapex" ],
7521 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007522
7523 // Make sure that a preferred prebuilt does not affect the apex contents.
7524 prebuilt_platform_compat_config {
7525 name: "myjar-platform-compat-config",
7526 metadata: "compat-config/metadata.xml",
7527 prefer: true,
7528 }
atrost6e126252020-01-27 17:01:16 +00007529 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007530 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007531 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007532 "etc/compatconfig/myjar-platform-compat-config.xml",
7533 "javalib/myjar.jar",
7534 })
7535}
7536
Jooyung Han862c0d62022-12-21 10:15:37 +09007537func TestNoDupeApexFiles(t *testing.T) {
7538 android.GroupFixturePreparers(
7539 android.PrepareForTestWithAndroidBuildComponents,
7540 PrepareForTestWithApexBuildComponents,
7541 prepareForTestWithMyapex,
7542 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7543 ).
7544 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7545 RunTestWithBp(t, `
7546 apex {
7547 name: "myapex",
7548 key: "myapex.key",
7549 prebuilts: ["foo", "bar"],
7550 updatable: false,
7551 }
7552
7553 apex_key {
7554 name: "myapex.key",
7555 public_key: "testkey.avbpubkey",
7556 private_key: "testkey.pem",
7557 }
7558
7559 prebuilt_etc {
7560 name: "foo",
7561 src: "myprebuilt",
7562 filename_from_src: true,
7563 }
7564
7565 prebuilt_etc {
7566 name: "bar",
7567 src: "myprebuilt",
7568 filename_from_src: true,
7569 }
7570 `)
7571}
7572
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007573func TestApexUnwantedTransitiveDeps(t *testing.T) {
7574 bp := `
7575 apex {
7576 name: "myapex",
7577 key: "myapex.key",
7578 native_shared_libs: ["libfoo"],
7579 updatable: false,
7580 unwanted_transitive_deps: ["libbar"],
7581 }
7582
7583 apex_key {
7584 name: "myapex.key",
7585 public_key: "testkey.avbpubkey",
7586 private_key: "testkey.pem",
7587 }
7588
7589 cc_library {
7590 name: "libfoo",
7591 srcs: ["foo.cpp"],
7592 shared_libs: ["libbar"],
7593 apex_available: ["myapex"],
7594 }
7595
7596 cc_library {
7597 name: "libbar",
7598 srcs: ["bar.cpp"],
7599 apex_available: ["myapex"],
7600 }`
7601 ctx := testApex(t, bp)
7602 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7603 "*/libc++.so",
7604 "*/libfoo.so",
7605 // not libbar.so
7606 })
7607}
7608
Jiyong Park479321d2019-12-16 11:47:12 +09007609func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7610 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7611 apex {
7612 name: "myapex",
7613 key: "myapex.key",
7614 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007615 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007616 }
7617
7618 apex_key {
7619 name: "myapex.key",
7620 public_key: "testkey.avbpubkey",
7621 private_key: "testkey.pem",
7622 }
7623
7624 java_library {
7625 name: "myjar",
7626 srcs: ["foo/bar/MyClass.java"],
7627 sdk_version: "none",
7628 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007629 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007630 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007631 }
7632 `)
7633}
7634
Jiyong Park7afd1072019-12-30 16:56:33 +09007635func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007636 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007637 apex {
7638 name: "myapex",
7639 key: "myapex.key",
7640 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007641 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007642 }
7643
7644 apex_key {
7645 name: "myapex.key",
7646 public_key: "testkey.avbpubkey",
7647 private_key: "testkey.pem",
7648 }
7649
7650 cc_library {
7651 name: "mylib",
7652 srcs: ["mylib.cpp"],
7653 system_shared_libs: [],
7654 stl: "none",
7655 required: ["a", "b"],
7656 host_required: ["c", "d"],
7657 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007658 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007659 }
7660 `)
7661
Jooyung Hana0503a52023-08-23 13:12:50 +09007662 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007663 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007664 name := apexBundle.BaseModuleName()
7665 prefix := "TARGET_"
7666 var builder strings.Builder
7667 data.Custom(&builder, name, prefix, "", data)
7668 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007669 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007670 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7671 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007672}
7673
Jiyong Park7cd10e32020-01-14 09:22:18 +09007674func TestSymlinksFromApexToSystem(t *testing.T) {
7675 bp := `
7676 apex {
7677 name: "myapex",
7678 key: "myapex.key",
7679 native_shared_libs: ["mylib"],
7680 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007681 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007682 }
7683
Jiyong Park9d677202020-02-19 16:29:35 +09007684 apex {
7685 name: "myapex.updatable",
7686 key: "myapex.key",
7687 native_shared_libs: ["mylib"],
7688 java_libs: ["myjar"],
7689 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007690 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007691 }
7692
Jiyong Park7cd10e32020-01-14 09:22:18 +09007693 apex_key {
7694 name: "myapex.key",
7695 public_key: "testkey.avbpubkey",
7696 private_key: "testkey.pem",
7697 }
7698
7699 cc_library {
7700 name: "mylib",
7701 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007702 shared_libs: [
7703 "myotherlib",
7704 "myotherlib_ext",
7705 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007706 system_shared_libs: [],
7707 stl: "none",
7708 apex_available: [
7709 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007710 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007711 "//apex_available:platform",
7712 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007713 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007714 }
7715
7716 cc_library {
7717 name: "myotherlib",
7718 srcs: ["mylib.cpp"],
7719 system_shared_libs: [],
7720 stl: "none",
7721 apex_available: [
7722 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007723 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007724 "//apex_available:platform",
7725 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007726 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007727 }
7728
Jiyong Parkce243632023-02-17 18:22:25 +09007729 cc_library {
7730 name: "myotherlib_ext",
7731 srcs: ["mylib.cpp"],
7732 system_shared_libs: [],
7733 system_ext_specific: true,
7734 stl: "none",
7735 apex_available: [
7736 "myapex",
7737 "myapex.updatable",
7738 "//apex_available:platform",
7739 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007740 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007741 }
7742
Jiyong Park7cd10e32020-01-14 09:22:18 +09007743 java_library {
7744 name: "myjar",
7745 srcs: ["foo/bar/MyClass.java"],
7746 sdk_version: "none",
7747 system_modules: "none",
Jihoon Kangbb678f82024-07-01 17:04:46 +00007748 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007749 apex_available: [
7750 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007751 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007752 "//apex_available:platform",
7753 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007754 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007755 }
7756
7757 java_library {
7758 name: "myotherjar",
7759 srcs: ["foo/bar/MyClass.java"],
7760 sdk_version: "none",
7761 system_modules: "none",
7762 apex_available: [
7763 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007764 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007765 "//apex_available:platform",
7766 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007767 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007768 }
7769 `
7770
7771 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7772 for _, f := range files {
7773 if f.path == file {
7774 if f.isLink {
7775 t.Errorf("%q is not a real file", file)
7776 }
7777 return
7778 }
7779 }
7780 t.Errorf("%q is not found", file)
7781 }
7782
Jiyong Parkce243632023-02-17 18:22:25 +09007783 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007784 for _, f := range files {
7785 if f.path == file {
7786 if !f.isLink {
7787 t.Errorf("%q is not a symlink", file)
7788 }
Jiyong Parkce243632023-02-17 18:22:25 +09007789 if f.src != target {
7790 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7791 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007792 return
7793 }
7794 }
7795 t.Errorf("%q is not found", file)
7796 }
7797
Jiyong Park9d677202020-02-19 16:29:35 +09007798 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7799 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007800 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007801 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007802 ensureRealfileExists(t, files, "javalib/myjar.jar")
7803 ensureRealfileExists(t, files, "lib64/mylib.so")
7804 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007805 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007806
Jooyung Hana0503a52023-08-23 13:12:50 +09007807 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007808 ensureRealfileExists(t, files, "javalib/myjar.jar")
7809 ensureRealfileExists(t, files, "lib64/mylib.so")
7810 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007811 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007812
7813 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007814 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007815 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007816 ensureRealfileExists(t, files, "javalib/myjar.jar")
7817 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007818 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7819 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007820
Jooyung Hana0503a52023-08-23 13:12:50 +09007821 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007822 ensureRealfileExists(t, files, "javalib/myjar.jar")
7823 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007824 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7825 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007826}
7827
Yo Chiange8128052020-07-23 20:09:18 +08007828func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007829 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007830 apex {
7831 name: "myapex",
7832 key: "myapex.key",
7833 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007834 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007835 }
7836
7837 apex_key {
7838 name: "myapex.key",
7839 public_key: "testkey.avbpubkey",
7840 private_key: "testkey.pem",
7841 }
7842
7843 cc_library_shared {
7844 name: "mylib",
7845 srcs: ["mylib.cpp"],
7846 shared_libs: ["myotherlib"],
7847 system_shared_libs: [],
7848 stl: "none",
7849 apex_available: [
7850 "myapex",
7851 "//apex_available:platform",
7852 ],
7853 }
7854
7855 cc_prebuilt_library_shared {
7856 name: "myotherlib",
7857 srcs: ["prebuilt.so"],
7858 system_shared_libs: [],
7859 stl: "none",
7860 apex_available: [
7861 "myapex",
7862 "//apex_available:platform",
7863 ],
7864 }
7865 `)
7866
Jooyung Hana0503a52023-08-23 13:12:50 +09007867 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007868 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007869 var builder strings.Builder
7870 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7871 androidMk := builder.String()
7872 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007873 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007874 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7875 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7876 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007877 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007878}
7879
Jooyung Han643adc42020-02-27 13:50:06 +09007880func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007881 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007882 apex {
7883 name: "myapex",
7884 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007885 binaries: ["mybin"],
7886 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007887 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007888 }
7889
7890 apex_key {
7891 name: "myapex.key",
7892 public_key: "testkey.avbpubkey",
7893 private_key: "testkey.pem",
7894 }
7895
7896 cc_library {
7897 name: "mylib",
7898 srcs: ["mylib.cpp"],
7899 shared_libs: ["mylib2"],
7900 system_shared_libs: [],
7901 stl: "none",
7902 apex_available: [ "myapex" ],
7903 }
7904
7905 cc_library {
7906 name: "mylib2",
7907 srcs: ["mylib.cpp"],
7908 system_shared_libs: [],
7909 stl: "none",
7910 apex_available: [ "myapex" ],
7911 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007912
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007913 // Used as both a JNI library and a regular shared library.
7914 cc_library {
7915 name: "mylib3",
7916 srcs: ["mylib.cpp"],
7917 system_shared_libs: [],
7918 stl: "none",
7919 apex_available: [ "myapex" ],
7920 }
7921
7922 cc_binary {
7923 name: "mybin",
7924 srcs: ["mybin.cpp"],
7925 shared_libs: ["mylib3"],
7926 system_shared_libs: [],
7927 stl: "none",
7928 apex_available: [ "myapex" ],
7929 }
7930
Jiyong Park34d5c332022-02-24 18:02:44 +09007931 rust_ffi_shared {
7932 name: "libfoo.rust",
7933 crate_name: "foo",
7934 srcs: ["foo.rs"],
7935 shared_libs: ["libfoo.shared_from_rust"],
7936 prefer_rlib: true,
7937 apex_available: ["myapex"],
7938 }
7939
7940 cc_library_shared {
7941 name: "libfoo.shared_from_rust",
7942 srcs: ["mylib.cpp"],
7943 system_shared_libs: [],
7944 stl: "none",
7945 stubs: {
7946 versions: ["10", "11", "12"],
7947 },
7948 }
7949
Jooyung Han643adc42020-02-27 13:50:06 +09007950 `)
7951
Jooyung Hana0503a52023-08-23 13:12:50 +09007952 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007953 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007954 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007955 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007956 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007957 "lib64/mylib.so",
7958 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007959 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007960 "lib64/libfoo.rust.so",
7961 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7962 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007963 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007964
7965 // b/220397949
7966 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007967}
7968
Jooyung Han49f67012020-04-17 13:43:10 +09007969func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007970 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007971 apex {
7972 name: "myapex",
7973 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007974 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007975 }
7976 apex_key {
7977 name: "myapex.key",
7978 public_key: "testkey.avbpubkey",
7979 private_key: "testkey.pem",
7980 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007981 `,
7982 android.FixtureModifyConfig(func(config android.Config) {
7983 delete(config.Targets, android.Android)
7984 config.AndroidCommonTarget = android.Target{}
7985 }),
7986 )
Jooyung Han49f67012020-04-17 13:43:10 +09007987
7988 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7989 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7990 }
7991}
7992
Jiyong Parkbd159612020-02-28 15:22:21 +09007993func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007994 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007995 apex {
7996 name: "myapex",
7997 key: "myapex.key",
7998 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007999 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008000 }
8001
8002 apex_key {
8003 name: "myapex.key",
8004 public_key: "testkey.avbpubkey",
8005 private_key: "testkey.pem",
8006 }
8007
8008 android_app {
8009 name: "AppFoo",
8010 srcs: ["foo/bar/MyClass.java"],
8011 sdk_version: "none",
8012 system_modules: "none",
8013 apex_available: [ "myapex" ],
8014 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008015 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008016
Jooyung Hana0503a52023-08-23 13:12:50 +09008017 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008018 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008019
8020 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008021 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 +09008022}
8023
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008024func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008025 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008026 apex {
8027 name: "myapex",
8028 key: "myapex.key",
8029 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008030 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008031 }
8032
8033 apex_key {
8034 name: "myapex.key",
8035 public_key: "testkey.avbpubkey",
8036 private_key: "testkey.pem",
8037 }
8038
8039 android_app_set {
8040 name: "AppSet",
8041 set: "AppSet.apks",
8042 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008043 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008044 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008045 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008046 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8047 s := mod.Rule("apexRule").Args["copy_commands"]
8048 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008049 if len(copyCmds) != 4 {
8050 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008051 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008052 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8053 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008054 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8055 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008056
8057 // Ensure that canned_fs_config has an entry for the app set zip file
8058 generateFsRule := mod.Rule("generateFsConfig")
8059 cmd := generateFsRule.RuleParams.Command
8060 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008061}
8062
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008063func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008064 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008065 apex_set {
8066 name: "myapex",
8067 filename: "foo_v2.apex",
8068 sanitized: {
8069 none: { set: "myapex.apks", },
8070 hwaddress: { set: "myapex.hwasan.apks", },
8071 },
Paul Duffin24704672021-04-06 16:09:30 +01008072 }
8073 `
8074 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008075
Paul Duffin24704672021-04-06 16:09:30 +01008076 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008077 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008078
Spandan Das3576e762024-01-03 18:57:03 +00008079 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008080 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008081
Paul Duffin24704672021-04-06 16:09:30 +01008082 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8083
8084 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008085 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8086 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008087
8088 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008089}
8090
Pranav Guptaeba03b02022-09-27 00:27:08 +00008091func TestApexSetApksModuleAssignment(t *testing.T) {
8092 ctx := testApex(t, `
8093 apex_set {
8094 name: "myapex",
8095 set: ":myapex_apks_file",
8096 }
8097
8098 filegroup {
8099 name: "myapex_apks_file",
8100 srcs: ["myapex.apks"],
8101 }
8102 `)
8103
Spandan Das3576e762024-01-03 18:57:03 +00008104 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008105
8106 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008107 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008108 extractedApex := m.Output(extractorOutput)
8109
8110 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8111}
8112
Paul Duffin89f570a2021-06-16 01:42:33 +01008113func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008114 t.Helper()
8115
Paul Duffin55607122021-03-30 23:32:51 +01008116 fs := android.MockFS{
8117 "a.java": nil,
8118 "a.jar": nil,
8119 "apex_manifest.json": nil,
8120 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008121 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008122 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8123 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8124 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008125 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008126 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008127
Paul Duffin55607122021-03-30 23:32:51 +01008128 errorHandler := android.FixtureExpectsNoErrors
8129 if errmsg != "" {
8130 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008131 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008132
Paul Duffin55607122021-03-30 23:32:51 +01008133 result := android.GroupFixturePreparers(
8134 cc.PrepareForTestWithCcDefaultModules,
8135 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008136 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008137 java.PrepareForTestWithJavaSdkLibraryFiles,
8138 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008139 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008140 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008141 android.FixtureModifyMockFS(func(fs android.MockFS) {
8142 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8143 insert := ""
8144 for _, fragment := range fragments {
8145 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8146 }
8147 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8148 platform_bootclasspath {
8149 name: "platform-bootclasspath",
8150 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008151 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008152 %s
8153 ],
8154 }
8155 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008156 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008157 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008158 // Dexpreopt for boot jars requires the ART boot image profile.
8159 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8160 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008161 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008162 ).
8163 ExtendWithErrorHandler(errorHandler).
8164 RunTestWithBp(t, bp)
8165
8166 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008167}
8168
Paul Duffin5556c5f2022-06-09 17:32:21 +00008169func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008170 preparers := android.GroupFixturePreparers(
8171 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008172 prepareForTestWithBootclasspathFragment,
8173 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008174 PrepareForTestWithApexBuildComponents,
8175 ).
8176 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008177 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008178
8179 bpBase := `
8180 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008181 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008182 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008183 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008184 set: "myapex.apks",
8185 }
8186
8187 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008188 name: "com.mycompany.android.art",
8189 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008190 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008191 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008192 set: "company-myapex.apks",
8193 }
8194
8195 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008196 name: "art-bootclasspath-fragment",
8197 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008198 hidden_api: {
8199 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8200 metadata: "my-bootclasspath-fragment/metadata.csv",
8201 index: "my-bootclasspath-fragment/index.csv",
8202 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8203 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8204 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008205 %s
8206 }
8207 `
8208
8209 t.Run("java_import", func(t *testing.T) {
8210 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8211 java_import {
8212 name: "libfoo",
8213 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008214 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008215 }
8216 `)
8217 })
8218
8219 t.Run("java_sdk_library_import", func(t *testing.T) {
8220 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8221 java_sdk_library_import {
8222 name: "libfoo",
8223 public: {
8224 jars: ["libbar.jar"],
8225 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008226 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008227 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008228 }
8229 `)
8230 })
8231
8232 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8233 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8234 image_name: "art",
8235 contents: ["libfoo"],
8236 `)+`
8237 java_sdk_library_import {
8238 name: "libfoo",
8239 public: {
8240 jars: ["libbar.jar"],
8241 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008242 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008243 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008244 }
8245 `)
8246 })
8247}
8248
Paul Duffin5556c5f2022-06-09 17:32:21 +00008249func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8250 preparers := android.GroupFixturePreparers(
8251 java.PrepareForTestWithJavaDefaultModules,
8252 PrepareForTestWithApexBuildComponents,
8253 )
8254
Spandan Das59a4a2b2024-01-09 21:35:56 +00008255 errCtx := moduleErrorfTestCtx{}
8256
Paul Duffin5556c5f2022-06-09 17:32:21 +00008257 bpBase := `
8258 apex_set {
8259 name: "com.android.myapex",
8260 installable: true,
8261 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8262 set: "myapex.apks",
8263 }
8264
8265 apex_set {
8266 name: "com.android.myapex_compressed",
8267 apex_name: "com.android.myapex",
8268 installable: true,
8269 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8270 set: "myapex_compressed.apks",
8271 }
8272
8273 prebuilt_bootclasspath_fragment {
8274 name: "my-bootclasspath-fragment",
8275 apex_available: [
8276 "com.android.myapex",
8277 "com.android.myapex_compressed",
8278 ],
8279 hidden_api: {
8280 annotation_flags: "annotation-flags.csv",
8281 metadata: "metadata.csv",
8282 index: "index.csv",
8283 signature_patterns: "signature_patterns.csv",
8284 },
8285 %s
8286 }
8287 `
8288
8289 t.Run("java_import", func(t *testing.T) {
8290 result := preparers.RunTestWithBp(t,
8291 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8292 java_import {
8293 name: "libfoo",
8294 jars: ["libfoo.jar"],
8295 apex_available: [
8296 "com.android.myapex",
8297 "com.android.myapex_compressed",
8298 ],
8299 }
8300 `)
8301
8302 module := result.Module("libfoo", "android_common_com.android.myapex")
8303 usesLibraryDep := module.(java.UsesLibraryDependency)
8304 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008305 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008306 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008307 })
8308
8309 t.Run("java_sdk_library_import", func(t *testing.T) {
8310 result := preparers.RunTestWithBp(t,
8311 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8312 java_sdk_library_import {
8313 name: "libfoo",
8314 public: {
8315 jars: ["libbar.jar"],
8316 },
8317 apex_available: [
8318 "com.android.myapex",
8319 "com.android.myapex_compressed",
8320 ],
8321 compile_dex: true,
8322 }
8323 `)
8324
8325 module := result.Module("libfoo", "android_common_com.android.myapex")
8326 usesLibraryDep := module.(java.UsesLibraryDependency)
8327 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008328 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008329 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008330 })
8331
8332 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8333 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8334 image_name: "art",
8335 contents: ["libfoo"],
8336 `)+`
8337 java_sdk_library_import {
8338 name: "libfoo",
8339 public: {
8340 jars: ["libbar.jar"],
8341 },
8342 apex_available: [
8343 "com.android.myapex",
8344 "com.android.myapex_compressed",
8345 ],
8346 compile_dex: true,
8347 }
8348 `)
8349 })
8350}
8351
Jooyung Han548640b2020-04-27 12:10:30 +09008352func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8353 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8354 apex {
8355 name: "myapex",
8356 key: "myapex.key",
8357 updatable: true,
8358 }
8359
8360 apex_key {
8361 name: "myapex.key",
8362 public_key: "testkey.avbpubkey",
8363 private_key: "testkey.pem",
8364 }
8365 `)
8366}
8367
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008368func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8369 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8370 apex {
8371 name: "myapex",
8372 key: "myapex.key",
8373 }
8374
8375 apex_key {
8376 name: "myapex.key",
8377 public_key: "testkey.avbpubkey",
8378 private_key: "testkey.pem",
8379 }
8380 `)
8381}
8382
satayevb98371c2021-06-15 16:49:50 +01008383func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8384 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8385 apex {
8386 name: "myapex",
8387 key: "myapex.key",
8388 systemserverclasspath_fragments: [
8389 "mysystemserverclasspathfragment",
8390 ],
8391 min_sdk_version: "29",
8392 updatable: true,
8393 }
8394
8395 apex_key {
8396 name: "myapex.key",
8397 public_key: "testkey.avbpubkey",
8398 private_key: "testkey.pem",
8399 }
8400
8401 java_library {
8402 name: "foo",
8403 srcs: ["b.java"],
8404 min_sdk_version: "29",
8405 installable: true,
8406 apex_available: [
8407 "myapex",
8408 ],
Jihoon Kangbb678f82024-07-01 17:04:46 +00008409 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008410 }
8411
8412 systemserverclasspath_fragment {
8413 name: "mysystemserverclasspathfragment",
8414 generate_classpaths_proto: false,
8415 contents: [
8416 "foo",
8417 ],
8418 apex_available: [
8419 "myapex",
8420 ],
8421 }
satayevabcd5972021-08-06 17:49:46 +01008422 `,
8423 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8424 )
satayevb98371c2021-06-15 16:49:50 +01008425}
8426
Paul Duffin064b70c2020-11-02 17:32:38 +00008427func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008428 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008429 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008430 fragment := java.ApexVariantReference{
8431 Apex: proptools.StringPtr("myapex"),
8432 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8433 }
8434
Paul Duffin064b70c2020-11-02 17:32:38 +00008435 testDexpreoptWithApexes(t, `
8436 prebuilt_apex {
8437 name: "myapex" ,
8438 arch: {
8439 arm64: {
8440 src: "myapex-arm64.apex",
8441 },
8442 arm: {
8443 src: "myapex-arm.apex",
8444 },
8445 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008446 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8447 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008448
Paul Duffin89f570a2021-06-16 01:42:33 +01008449 prebuilt_bootclasspath_fragment {
8450 name: "my-bootclasspath-fragment",
8451 contents: ["libfoo"],
8452 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008453 hidden_api: {
8454 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8455 metadata: "my-bootclasspath-fragment/metadata.csv",
8456 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008457 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8458 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8459 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008460 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008461 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008462
Paul Duffin89f570a2021-06-16 01:42:33 +01008463 java_import {
8464 name: "libfoo",
8465 jars: ["libfoo.jar"],
8466 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008467 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008468 }
8469 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008470 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008471}
8472
Spandan Dasf14e2542021-11-12 00:01:37 +00008473func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008474 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008475 bp += `
8476 apex_key {
8477 name: "myapex.key",
8478 public_key: "testkey.avbpubkey",
8479 private_key: "testkey.pem",
8480 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008481 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008482 "lib1/src/A.java": nil,
8483 "lib2/src/B.java": nil,
8484 "system/sepolicy/apex/myapex-file_contexts": nil,
8485 }
8486
Paul Duffin45338f02021-03-30 23:07:52 +01008487 errorHandler := android.FixtureExpectsNoErrors
8488 if errmsg != "" {
8489 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008490 }
Colin Crossae8600b2020-10-29 17:09:13 -07008491
Paul Duffin45338f02021-03-30 23:07:52 +01008492 android.GroupFixturePreparers(
8493 android.PrepareForTestWithAndroidBuildComponents,
8494 java.PrepareForTestWithJavaBuildComponents,
8495 PrepareForTestWithApexBuildComponents,
8496 android.PrepareForTestWithNeverallowRules(rules),
8497 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008498 apexBootJars := make([]string, 0, len(bootJars))
8499 for _, apexBootJar := range bootJars {
8500 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008501 }
satayevd604b212021-07-21 14:23:52 +01008502 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008503 }),
8504 fs.AddToFixture(),
8505 ).
8506 ExtendWithErrorHandler(errorHandler).
8507 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008508}
8509
8510func TestApexPermittedPackagesRules(t *testing.T) {
8511 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008512 name string
8513 expectedError string
8514 bp string
8515 bootJars []string
8516 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008517 }{
8518
8519 {
8520 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8521 expectedError: "",
8522 bp: `
8523 java_library {
8524 name: "bcp_lib1",
8525 srcs: ["lib1/src/*.java"],
8526 permitted_packages: ["foo.bar"],
8527 apex_available: ["myapex"],
8528 sdk_version: "none",
8529 system_modules: "none",
8530 }
8531 java_library {
8532 name: "nonbcp_lib2",
8533 srcs: ["lib2/src/*.java"],
8534 apex_available: ["myapex"],
8535 permitted_packages: ["a.b"],
8536 sdk_version: "none",
8537 system_modules: "none",
8538 }
8539 apex {
8540 name: "myapex",
8541 key: "myapex.key",
8542 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008543 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008544 }`,
8545 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008546 bcpPermittedPackages: map[string][]string{
8547 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008548 "foo.bar",
8549 },
8550 },
8551 },
8552 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008553 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008554 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 +01008555 bp: `
8556 java_library {
8557 name: "bcp_lib1",
8558 srcs: ["lib1/src/*.java"],
8559 apex_available: ["myapex"],
8560 permitted_packages: ["foo.bar"],
8561 sdk_version: "none",
8562 system_modules: "none",
8563 }
8564 java_library {
8565 name: "bcp_lib2",
8566 srcs: ["lib2/src/*.java"],
8567 apex_available: ["myapex"],
8568 permitted_packages: ["foo.bar", "bar.baz"],
8569 sdk_version: "none",
8570 system_modules: "none",
8571 }
8572 apex {
8573 name: "myapex",
8574 key: "myapex.key",
8575 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008576 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008577 }
8578 `,
8579 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008580 bcpPermittedPackages: map[string][]string{
8581 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008582 "foo.bar",
8583 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008584 "bcp_lib2": []string{
8585 "foo.bar",
8586 },
8587 },
8588 },
8589 {
8590 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8591 expectedError: "",
8592 bp: `
8593 java_library {
8594 name: "bcp_lib_restricted",
8595 srcs: ["lib1/src/*.java"],
8596 apex_available: ["myapex"],
8597 permitted_packages: ["foo.bar"],
8598 sdk_version: "none",
8599 min_sdk_version: "29",
8600 system_modules: "none",
8601 }
8602 java_library {
8603 name: "bcp_lib_unrestricted",
8604 srcs: ["lib2/src/*.java"],
8605 apex_available: ["myapex"],
8606 permitted_packages: ["foo.bar", "bar.baz"],
8607 sdk_version: "none",
8608 min_sdk_version: "29",
8609 system_modules: "none",
8610 }
8611 apex {
8612 name: "myapex",
8613 key: "myapex.key",
8614 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8615 updatable: true,
8616 min_sdk_version: "29",
8617 }
8618 `,
8619 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8620 bcpPermittedPackages: map[string][]string{
8621 "bcp_lib1_non_updateable": []string{
8622 "foo.bar",
8623 },
8624 // 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 +01008625 },
8626 },
8627 }
8628 for _, tc := range testcases {
8629 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008630 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8631 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008632 })
8633 }
8634}
8635
Jiyong Park62304bb2020-04-13 16:19:48 +09008636func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008637 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008638 apex {
8639 name: "myapex",
8640 key: "myapex.key",
8641 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008642 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008643 }
8644
8645 apex_key {
8646 name: "myapex.key",
8647 public_key: "testkey.avbpubkey",
8648 private_key: "testkey.pem",
8649 }
8650
8651 cc_library {
8652 name: "mylib",
8653 srcs: ["mylib.cpp"],
8654 system_shared_libs: [],
8655 stl: "none",
8656 stubs: {
8657 versions: ["1"],
8658 },
8659 apex_available: ["myapex"],
8660 }
8661
8662 cc_library {
8663 name: "myprivlib",
8664 srcs: ["mylib.cpp"],
8665 system_shared_libs: [],
8666 stl: "none",
8667 apex_available: ["myapex"],
8668 }
8669
8670
8671 cc_test {
8672 name: "mytest",
8673 gtest: false,
8674 srcs: ["mylib.cpp"],
8675 system_shared_libs: [],
8676 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008677 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008678 test_for: ["myapex"]
8679 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008680
8681 cc_library {
8682 name: "mytestlib",
8683 srcs: ["mylib.cpp"],
8684 system_shared_libs: [],
8685 shared_libs: ["mylib", "myprivlib"],
8686 stl: "none",
8687 test_for: ["myapex"],
8688 }
8689
8690 cc_benchmark {
8691 name: "mybench",
8692 srcs: ["mylib.cpp"],
8693 system_shared_libs: [],
8694 shared_libs: ["mylib", "myprivlib"],
8695 stl: "none",
8696 test_for: ["myapex"],
8697 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008698 `)
8699
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008700 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008701 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008702 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8703 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8704 }
8705
8706 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008707 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008708 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8709 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8710 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8711}
Jiyong Park46a512f2020-12-04 18:02:13 +09008712
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008713func TestIndirectTestFor(t *testing.T) {
8714 ctx := testApex(t, `
8715 apex {
8716 name: "myapex",
8717 key: "myapex.key",
8718 native_shared_libs: ["mylib", "myprivlib"],
8719 updatable: false,
8720 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008721
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008722 apex_key {
8723 name: "myapex.key",
8724 public_key: "testkey.avbpubkey",
8725 private_key: "testkey.pem",
8726 }
8727
8728 cc_library {
8729 name: "mylib",
8730 srcs: ["mylib.cpp"],
8731 system_shared_libs: [],
8732 stl: "none",
8733 stubs: {
8734 versions: ["1"],
8735 },
8736 apex_available: ["myapex"],
8737 }
8738
8739 cc_library {
8740 name: "myprivlib",
8741 srcs: ["mylib.cpp"],
8742 system_shared_libs: [],
8743 stl: "none",
8744 shared_libs: ["mylib"],
8745 apex_available: ["myapex"],
8746 }
8747
8748 cc_library {
8749 name: "mytestlib",
8750 srcs: ["mylib.cpp"],
8751 system_shared_libs: [],
8752 shared_libs: ["myprivlib"],
8753 stl: "none",
8754 test_for: ["myapex"],
8755 }
8756 `)
8757
8758 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008759 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008760 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8761 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8762 }
8763
8764 // The platform variant of mytestlib links to the platform variant of the
8765 // internal myprivlib.
8766 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8767
8768 // The platform variant of myprivlib links to the platform variant of mylib
8769 // and bypasses its stubs.
8770 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 +09008771}
8772
Martin Stjernholmec009002021-03-27 15:18:31 +00008773func TestTestForForLibInOtherApex(t *testing.T) {
8774 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8775 _ = testApex(t, `
8776 apex {
8777 name: "com.android.art",
8778 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008779 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008780 updatable: false,
8781 }
8782
8783 apex {
8784 name: "com.android.art.debug",
8785 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008786 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008787 updatable: false,
8788 }
8789
8790 apex_key {
8791 name: "myapex.key",
8792 public_key: "testkey.avbpubkey",
8793 private_key: "testkey.pem",
8794 }
8795
8796 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008797 name: "libnativebridge",
8798 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008799 system_shared_libs: [],
8800 stl: "none",
8801 stubs: {
8802 versions: ["1"],
8803 },
8804 apex_available: ["com.android.art", "com.android.art.debug"],
8805 }
8806
8807 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008808 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008809 srcs: ["mylib.cpp"],
8810 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008811 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008812 stl: "none",
8813 apex_available: ["com.android.art.debug"],
8814 test_for: ["com.android.art"],
8815 }
8816 `,
8817 android.MockFS{
8818 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8819 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8820 }.AddToFixture())
8821}
8822
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008823// TODO(jungjw): Move this to proptools
8824func intPtr(i int) *int {
8825 return &i
8826}
8827
8828func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008829 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008830 apex_set {
8831 name: "myapex",
8832 set: "myapex.apks",
8833 filename: "foo_v2.apex",
8834 overrides: ["foo"],
8835 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008836 `,
8837 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8838 variables.Platform_sdk_version = intPtr(30)
8839 }),
8840 android.FixtureModifyConfig(func(config android.Config) {
8841 config.Targets[android.Android] = []android.Target{
8842 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8843 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8844 }
8845 }),
8846 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008847
Spandan Das3576e762024-01-03 18:57:03 +00008848 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008849
8850 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008851 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008852 actual := extractedApex.Args["abis"]
8853 expected := "ARMEABI_V7A,ARM64_V8A"
8854 if actual != expected {
8855 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8856 }
8857 actual = extractedApex.Args["sdk-version"]
8858 expected = "30"
8859 if actual != expected {
8860 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8861 }
8862
Paul Duffin6717d882021-06-15 19:09:41 +01008863 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008864 a := m.Module().(*ApexSet)
8865 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008866 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008867 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8868 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8869 }
8870}
8871
Anton Hansson805e0a52022-11-25 14:06:46 +00008872func TestApexSet_NativeBridge(t *testing.T) {
8873 ctx := testApex(t, `
8874 apex_set {
8875 name: "myapex",
8876 set: "myapex.apks",
8877 filename: "foo_v2.apex",
8878 overrides: ["foo"],
8879 }
8880 `,
8881 android.FixtureModifyConfig(func(config android.Config) {
8882 config.Targets[android.Android] = []android.Target{
8883 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8884 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8885 }
8886 }),
8887 )
8888
Spandan Das3576e762024-01-03 18:57:03 +00008889 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008890
8891 // Check extract_apks tool parameters. No native bridge arch expected
8892 extractedApex := m.Output("extracted/myapex.apks")
8893 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8894}
8895
Jiyong Park7d95a512020-05-10 15:16:24 +09008896func TestNoStaticLinkingToStubsLib(t *testing.T) {
8897 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8898 apex {
8899 name: "myapex",
8900 key: "myapex.key",
8901 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008902 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008903 }
8904
8905 apex_key {
8906 name: "myapex.key",
8907 public_key: "testkey.avbpubkey",
8908 private_key: "testkey.pem",
8909 }
8910
8911 cc_library {
8912 name: "mylib",
8913 srcs: ["mylib.cpp"],
8914 static_libs: ["otherlib"],
8915 system_shared_libs: [],
8916 stl: "none",
8917 apex_available: [ "myapex" ],
8918 }
8919
8920 cc_library {
8921 name: "otherlib",
8922 srcs: ["mylib.cpp"],
8923 system_shared_libs: [],
8924 stl: "none",
8925 stubs: {
8926 versions: ["1", "2", "3"],
8927 },
8928 apex_available: [ "myapex" ],
8929 }
8930 `)
8931}
8932
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008933func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008934 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008935 apex {
8936 name: "myapex",
8937 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008938 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008939 custom_sign_tool: "sign_myapex",
8940 }
8941
8942 apex_key {
8943 name: "myapex.key",
8944 public_key: "testkey.avbpubkey",
8945 private_key: "testkey.pem",
8946 }
8947 `)
8948
Jooyung Han286957d2023-10-30 16:17:56 +09008949 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008950 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008951 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 +09008952}
8953
8954func TestApexKeysTxtOverrides(t *testing.T) {
8955 ctx := testApex(t, `
8956 apex {
8957 name: "myapex",
8958 key: "myapex.key",
8959 updatable: false,
8960 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008961 }
8962
8963 apex_key {
8964 name: "myapex.key",
8965 public_key: "testkey.avbpubkey",
8966 private_key: "testkey.pem",
8967 }
8968
8969 prebuilt_apex {
8970 name: "myapex",
8971 prefer: true,
8972 arch: {
8973 arm64: {
8974 src: "myapex-arm64.apex",
8975 },
8976 arm: {
8977 src: "myapex-arm.apex",
8978 },
8979 },
8980 }
8981
8982 apex_set {
8983 name: "myapex_set",
8984 set: "myapex.apks",
8985 filename: "myapex_set.apex",
8986 overrides: ["myapex"],
8987 }
8988 `)
8989
Colin Crossf61d03d2023-11-02 16:56:39 -07008990 content := android.ContentFromFileRuleForTests(t, ctx,
8991 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008992 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 -07008993 content = android.ContentFromFileRuleForTests(t, ctx,
8994 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008995 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 +09008996}
8997
Jooyung Han938b5932020-06-20 12:47:47 +09008998func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008999 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009000 apex {
9001 name: "myapex",
9002 key: "myapex.key",
9003 apps: ["app"],
9004 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009005 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009006 }
9007
9008 apex_key {
9009 name: "myapex.key",
9010 public_key: "testkey.avbpubkey",
9011 private_key: "testkey.pem",
9012 }
9013
9014 android_app {
9015 name: "app",
9016 srcs: ["foo/bar/MyClass.java"],
9017 package_name: "foo",
9018 sdk_version: "none",
9019 system_modules: "none",
9020 apex_available: [ "myapex" ],
9021 }
9022 `, withFiles(map[string][]byte{
9023 "sub/Android.bp": []byte(`
9024 override_apex {
9025 name: "override_myapex",
9026 base: "myapex",
9027 apps: ["override_app"],
9028 allowed_files: ":allowed",
9029 }
9030 // Overridable "path" property should be referenced indirectly
9031 filegroup {
9032 name: "allowed",
9033 srcs: ["allowed.txt"],
9034 }
9035 override_android_app {
9036 name: "override_app",
9037 base: "app",
9038 package_name: "bar",
9039 }
9040 `),
9041 }))
9042
Jooyung Hana0503a52023-08-23 13:12:50 +09009043 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009044 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9045 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9046 }
9047
Spandan Das50801e22024-05-13 18:29:45 +00009048 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009049 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9050 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9051 }
9052}
9053
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009054func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009055 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009056 apex {
9057 name: "myapex",
9058 key: "myapex.key",
9059 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009060 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009061 }
9062
9063 apex_key {
9064 name: "myapex.key",
9065 public_key: "testkey.avbpubkey",
9066 private_key: "testkey.pem",
9067 }
9068
9069 cc_library {
9070 name: "mylib",
9071 srcs: ["mylib.cpp"],
9072 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009073 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009074 },
9075 apex_available: ["myapex"],
9076 }
9077
9078 cc_prebuilt_library_shared {
9079 name: "mylib",
9080 prefer: false,
9081 srcs: ["prebuilt.so"],
9082 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009083 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009084 },
9085 apex_available: ["myapex"],
9086 }
9087 `)
9088}
9089
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009090func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009091 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009092 apex {
9093 name: "myapex",
9094 key: "myapex.key",
9095 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009096 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009097 }
9098 apex_key {
9099 name: "myapex.key",
9100 public_key: "testkey.avbpubkey",
9101 private_key: "testkey.pem",
9102 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009103 `,
9104 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9105 variables.CompressedApex = proptools.BoolPtr(true)
9106 }),
9107 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009108
Jooyung Hana0503a52023-08-23 13:12:50 +09009109 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009110 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9111
Jooyung Hana0503a52023-08-23 13:12:50 +09009112 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009113 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9114
9115 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009116 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009117 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9118
9119 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009120 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009121 var builder strings.Builder
9122 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9123 androidMk := builder.String()
9124 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9125}
9126
Jooyung Han26ec8482024-07-31 15:04:05 +09009127func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
9128 for _, compressionEnabled := range []bool{true, false} {
9129 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
9130 ctx := testApex(t, `
9131 apex_set {
9132 name: "com.company.android.myapex",
9133 apex_name: "com.android.myapex",
9134 set: "company-myapex.apks",
9135 }
9136 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9137 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9138 }),
9139 )
9140
9141 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9142 if compressionEnabled {
9143 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9144 } else {
9145 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9146 }
9147 })
9148 }
9149}
9150
Martin Stjernholm2856c662020-12-02 15:03:42 +00009151func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009152 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009153 apex {
9154 name: "myapex",
9155 key: "myapex.key",
9156 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009157 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009158 }
9159
9160 apex_key {
9161 name: "myapex.key",
9162 public_key: "testkey.avbpubkey",
9163 private_key: "testkey.pem",
9164 }
9165
9166 cc_library {
9167 name: "mylib",
9168 srcs: ["mylib.cpp"],
9169 apex_available: ["myapex"],
9170 shared_libs: ["otherlib"],
9171 system_shared_libs: [],
9172 }
9173
9174 cc_library {
9175 name: "otherlib",
9176 srcs: ["mylib.cpp"],
9177 stubs: {
9178 versions: ["current"],
9179 },
9180 }
9181
9182 cc_prebuilt_library_shared {
9183 name: "otherlib",
9184 prefer: true,
9185 srcs: ["prebuilt.so"],
9186 stubs: {
9187 versions: ["current"],
9188 },
9189 }
9190 `)
9191
Jooyung Hana0503a52023-08-23 13:12:50 +09009192 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009193 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009194 var builder strings.Builder
9195 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9196 androidMk := builder.String()
9197
9198 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9199 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009200 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009201}
9202
Jiyong Parke3867542020-12-03 17:28:25 +09009203func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009204 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009205 apex {
9206 name: "myapex",
9207 key: "myapex.key",
9208 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009209 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009210 }
9211
9212 apex_key {
9213 name: "myapex.key",
9214 public_key: "testkey.avbpubkey",
9215 private_key: "testkey.pem",
9216 }
9217
9218 cc_library {
9219 name: "mylib",
9220 srcs: ["mylib.cpp"],
9221 system_shared_libs: [],
9222 stl: "none",
9223 apex_available: ["myapex"],
9224 shared_libs: ["mylib2"],
9225 target: {
9226 apex: {
9227 exclude_shared_libs: ["mylib2"],
9228 },
9229 },
9230 }
9231
9232 cc_library {
9233 name: "mylib2",
9234 srcs: ["mylib.cpp"],
9235 system_shared_libs: [],
9236 stl: "none",
9237 }
9238 `)
9239
9240 // Check if mylib is linked to mylib2 for the non-apex target
9241 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9242 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9243
9244 // Make sure that the link doesn't occur for the apex target
9245 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9246 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9247
9248 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009249 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009250 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9251}
9252
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009253func TestPrebuiltStubLibDep(t *testing.T) {
9254 bpBase := `
9255 apex {
9256 name: "myapex",
9257 key: "myapex.key",
9258 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009259 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009260 }
9261 apex_key {
9262 name: "myapex.key",
9263 public_key: "testkey.avbpubkey",
9264 private_key: "testkey.pem",
9265 }
9266 cc_library {
9267 name: "mylib",
9268 srcs: ["mylib.cpp"],
9269 apex_available: ["myapex"],
9270 shared_libs: ["stublib"],
9271 system_shared_libs: [],
9272 }
9273 apex {
9274 name: "otherapex",
9275 enabled: %s,
9276 key: "myapex.key",
9277 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009278 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009279 }
9280 `
9281
9282 stublibSourceBp := `
9283 cc_library {
9284 name: "stublib",
9285 srcs: ["mylib.cpp"],
9286 apex_available: ["otherapex"],
9287 system_shared_libs: [],
9288 stl: "none",
9289 stubs: {
9290 versions: ["1"],
9291 },
9292 }
9293 `
9294
9295 stublibPrebuiltBp := `
9296 cc_prebuilt_library_shared {
9297 name: "stublib",
9298 srcs: ["prebuilt.so"],
9299 apex_available: ["otherapex"],
9300 stubs: {
9301 versions: ["1"],
9302 },
9303 %s
9304 }
9305 `
9306
9307 tests := []struct {
9308 name string
9309 stublibBp string
9310 usePrebuilt bool
9311 modNames []string // Modules to collect AndroidMkEntries for
9312 otherApexEnabled []string
9313 }{
9314 {
9315 name: "only_source",
9316 stublibBp: stublibSourceBp,
9317 usePrebuilt: false,
9318 modNames: []string{"stublib"},
9319 otherApexEnabled: []string{"true", "false"},
9320 },
9321 {
9322 name: "source_preferred",
9323 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9324 usePrebuilt: false,
9325 modNames: []string{"stublib", "prebuilt_stublib"},
9326 otherApexEnabled: []string{"true", "false"},
9327 },
9328 {
9329 name: "prebuilt_preferred",
9330 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9331 usePrebuilt: true,
9332 modNames: []string{"stublib", "prebuilt_stublib"},
9333 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9334 },
9335 {
9336 name: "only_prebuilt",
9337 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9338 usePrebuilt: true,
9339 modNames: []string{"stublib"},
9340 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9341 },
9342 }
9343
9344 for _, test := range tests {
9345 t.Run(test.name, func(t *testing.T) {
9346 for _, otherApexEnabled := range test.otherApexEnabled {
9347 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009348 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009349
9350 type modAndMkEntries struct {
9351 mod *cc.Module
9352 mkEntries android.AndroidMkEntries
9353 }
9354 entries := []*modAndMkEntries{}
9355
9356 // Gather shared lib modules that are installable
9357 for _, modName := range test.modNames {
9358 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9359 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9360 continue
9361 }
9362 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009363 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009364 continue
9365 }
Colin Crossaa255532020-07-03 13:18:24 -07009366 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009367 if ent.Disabled {
9368 continue
9369 }
9370 entries = append(entries, &modAndMkEntries{
9371 mod: mod,
9372 mkEntries: ent,
9373 })
9374 }
9375 }
9376 }
9377
9378 var entry *modAndMkEntries = nil
9379 for _, ent := range entries {
9380 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9381 if entry != nil {
9382 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9383 } else {
9384 entry = ent
9385 }
9386 }
9387 }
9388
9389 if entry == nil {
9390 t.Errorf("AndroidMk entry for \"stublib\" missing")
9391 } else {
9392 isPrebuilt := entry.mod.Prebuilt() != nil
9393 if isPrebuilt != test.usePrebuilt {
9394 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9395 }
9396 if !entry.mod.IsStubs() {
9397 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9398 }
9399 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9400 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9401 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009402 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009403 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009404 if !android.InList(expected, cflags) {
9405 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9406 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009407 }
9408 })
9409 }
9410 })
9411 }
9412}
9413
Colin Crossc33e5212021-05-25 18:16:02 -07009414func TestApexJavaCoverage(t *testing.T) {
9415 bp := `
9416 apex {
9417 name: "myapex",
9418 key: "myapex.key",
9419 java_libs: ["mylib"],
9420 bootclasspath_fragments: ["mybootclasspathfragment"],
9421 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9422 updatable: false,
9423 }
9424
9425 apex_key {
9426 name: "myapex.key",
9427 public_key: "testkey.avbpubkey",
9428 private_key: "testkey.pem",
9429 }
9430
9431 java_library {
9432 name: "mylib",
9433 srcs: ["mylib.java"],
9434 apex_available: ["myapex"],
9435 compile_dex: true,
9436 }
9437
9438 bootclasspath_fragment {
9439 name: "mybootclasspathfragment",
9440 contents: ["mybootclasspathlib"],
9441 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009442 hidden_api: {
9443 split_packages: ["*"],
9444 },
Colin Crossc33e5212021-05-25 18:16:02 -07009445 }
9446
9447 java_library {
9448 name: "mybootclasspathlib",
9449 srcs: ["mybootclasspathlib.java"],
9450 apex_available: ["myapex"],
9451 compile_dex: true,
Jihoon Kangbb678f82024-07-01 17:04:46 +00009452 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009453 }
9454
9455 systemserverclasspath_fragment {
9456 name: "mysystemserverclasspathfragment",
9457 contents: ["mysystemserverclasspathlib"],
9458 apex_available: ["myapex"],
9459 }
9460
9461 java_library {
9462 name: "mysystemserverclasspathlib",
9463 srcs: ["mysystemserverclasspathlib.java"],
9464 apex_available: ["myapex"],
9465 compile_dex: true,
9466 }
9467 `
9468
9469 result := android.GroupFixturePreparers(
9470 PrepareForTestWithApexBuildComponents,
9471 prepareForTestWithMyapex,
9472 java.PrepareForTestWithJavaDefaultModules,
9473 android.PrepareForTestWithAndroidBuildComponents,
9474 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009475 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9476 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009477 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009478 ).RunTest(t)
9479
9480 // Make sure jacoco ran on both mylib and mybootclasspathlib
9481 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9482 t.Errorf("Failed to find jacoco rule for mylib")
9483 }
9484 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9485 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9486 }
9487 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9488 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9489 }
9490}
9491
Jiyong Park192600a2021-08-03 07:52:17 +00009492func TestProhibitStaticExecutable(t *testing.T) {
9493 testApexError(t, `executable mybin is static`, `
9494 apex {
9495 name: "myapex",
9496 key: "myapex.key",
9497 binaries: ["mybin"],
9498 min_sdk_version: "29",
9499 }
9500
9501 apex_key {
9502 name: "myapex.key",
9503 public_key: "testkey.avbpubkey",
9504 private_key: "testkey.pem",
9505 }
9506
9507 cc_binary {
9508 name: "mybin",
9509 srcs: ["mylib.cpp"],
9510 relative_install_path: "foo/bar",
9511 static_executable: true,
9512 system_shared_libs: [],
9513 stl: "none",
9514 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009515 min_sdk_version: "29",
9516 }
9517 `)
9518
9519 testApexError(t, `executable mybin.rust is static`, `
9520 apex {
9521 name: "myapex",
9522 key: "myapex.key",
9523 binaries: ["mybin.rust"],
9524 min_sdk_version: "29",
9525 }
9526
9527 apex_key {
9528 name: "myapex.key",
9529 public_key: "testkey.avbpubkey",
9530 private_key: "testkey.pem",
9531 }
9532
9533 rust_binary {
9534 name: "mybin.rust",
9535 srcs: ["foo.rs"],
9536 static_executable: true,
9537 apex_available: ["myapex"],
9538 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009539 }
9540 `)
9541}
9542
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009543func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9544 ctx := testApex(t, `
9545 apex {
9546 name: "myapex",
9547 key: "myapex.key",
9548 updatable: false,
9549 java_libs: ["foo"],
9550 }
9551
9552 apex_key {
9553 name: "myapex.key",
9554 public_key: "testkey.avbpubkey",
9555 private_key: "testkey.pem",
9556 }
9557
9558 java_library {
9559 name: "foo",
9560 srcs: ["foo.java"],
9561 apex_available: ["myapex"],
9562 installable: true,
9563 }
9564 `,
9565 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9566 )
9567
Jooyung Hana0503a52023-08-23 13:12:50 +09009568 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009569 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9570 var builder strings.Builder
9571 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9572 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009573 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 +00009574}
9575
9576func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9577 ctx := testApex(t, `
9578 prebuilt_apex {
9579 name: "myapex",
9580 arch: {
9581 arm64: {
9582 src: "myapex-arm64.apex",
9583 },
9584 arm: {
9585 src: "myapex-arm.apex",
9586 },
9587 },
9588 exported_java_libs: ["foo"],
9589 }
9590
9591 java_import {
9592 name: "foo",
9593 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009594 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009595 }
9596 `,
9597 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9598 )
9599
9600 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9601 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9602 mainModuleEntries := entriesList[0]
9603 android.AssertArrayString(t,
9604 "LOCAL_REQUIRED_MODULES",
9605 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9606 []string{
9607 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9608 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9609 })
9610}
9611
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009612func TestAndroidMk_RequiredModules(t *testing.T) {
9613 ctx := testApex(t, `
9614 apex {
9615 name: "myapex",
9616 key: "myapex.key",
9617 updatable: false,
9618 java_libs: ["foo"],
9619 required: ["otherapex"],
9620 }
9621
9622 apex {
9623 name: "otherapex",
9624 key: "myapex.key",
9625 updatable: false,
9626 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009627 }
9628
9629 apex_key {
9630 name: "myapex.key",
9631 public_key: "testkey.avbpubkey",
9632 private_key: "testkey.pem",
9633 }
9634
9635 java_library {
9636 name: "foo",
9637 srcs: ["foo.java"],
9638 apex_available: ["myapex", "otherapex"],
9639 installable: true,
9640 }
9641 `)
9642
Jooyung Hana0503a52023-08-23 13:12:50 +09009643 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009644 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9645 var builder strings.Builder
9646 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9647 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009648 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009649}
9650
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009651func TestAndroidMk_RequiredDeps(t *testing.T) {
9652 ctx := testApex(t, `
9653 apex {
9654 name: "myapex",
9655 key: "myapex.key",
9656 updatable: false,
9657 }
9658
9659 apex_key {
9660 name: "myapex.key",
9661 public_key: "testkey.avbpubkey",
9662 private_key: "testkey.pem",
9663 }
9664 `)
9665
Jooyung Hana0503a52023-08-23 13:12:50 +09009666 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009667 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009668 data := android.AndroidMkDataForTest(t, ctx, bundle)
9669 var builder strings.Builder
9670 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9671 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009672 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009673}
9674
Jooyung Hana6d36672022-02-24 13:58:07 +09009675func TestApexOutputFileProducer(t *testing.T) {
9676 for _, tc := range []struct {
9677 name string
9678 ref string
9679 expected_data []string
9680 }{
9681 {
9682 name: "test_using_output",
9683 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009684 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009685 },
9686 {
9687 name: "test_using_apex",
9688 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009689 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009690 },
9691 } {
9692 t.Run(tc.name, func(t *testing.T) {
9693 ctx := testApex(t, `
9694 apex {
9695 name: "myapex",
9696 key: "myapex.key",
9697 compressible: true,
9698 updatable: false,
9699 }
9700
9701 apex_key {
9702 name: "myapex.key",
9703 public_key: "testkey.avbpubkey",
9704 private_key: "testkey.pem",
9705 }
9706
9707 java_test {
9708 name: "`+tc.name+`",
9709 srcs: ["a.java"],
9710 data: ["`+tc.ref+`"],
9711 }
9712 `,
9713 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9714 variables.CompressedApex = proptools.BoolPtr(true)
9715 }))
9716 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9717 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9718 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9719 })
9720 }
9721}
9722
satayev758968a2021-12-06 11:42:40 +00009723func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9724 preparer := android.GroupFixturePreparers(
9725 PrepareForTestWithApexBuildComponents,
9726 prepareForTestWithMyapex,
9727 java.PrepareForTestWithJavaSdkLibraryFiles,
9728 java.PrepareForTestWithJavaDefaultModules,
9729 android.PrepareForTestWithAndroidBuildComponents,
9730 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9731 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9732 )
9733
9734 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9735 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9736 preparer.RunTestWithBp(t, `
9737 apex {
9738 name: "myapex",
9739 key: "myapex.key",
9740 bootclasspath_fragments: ["mybootclasspathfragment"],
9741 min_sdk_version: "30",
9742 updatable: false,
9743 }
9744
9745 apex_key {
9746 name: "myapex.key",
9747 public_key: "testkey.avbpubkey",
9748 private_key: "testkey.pem",
9749 }
9750
9751 bootclasspath_fragment {
9752 name: "mybootclasspathfragment",
9753 contents: ["mybootclasspathlib"],
9754 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009755 hidden_api: {
9756 split_packages: ["*"],
9757 },
satayev758968a2021-12-06 11:42:40 +00009758 }
9759
9760 java_sdk_library {
9761 name: "mybootclasspathlib",
9762 srcs: ["mybootclasspathlib.java"],
9763 apex_available: ["myapex"],
9764 compile_dex: true,
9765 unsafe_ignore_missing_latest_api: true,
9766 min_sdk_version: "31",
9767 static_libs: ["util"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00009768 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009769 }
9770
9771 java_library {
9772 name: "util",
9773 srcs: ["a.java"],
9774 apex_available: ["myapex"],
9775 min_sdk_version: "31",
9776 static_libs: ["another_util"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00009777 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009778 }
9779
9780 java_library {
9781 name: "another_util",
9782 srcs: ["a.java"],
9783 min_sdk_version: "31",
9784 apex_available: ["myapex"],
Jihoon Kangbb678f82024-07-01 17:04:46 +00009785 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009786 }
9787 `)
9788 })
9789
9790 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9791 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9792 preparer.RunTestWithBp(t, `
9793 apex {
9794 name: "myapex",
9795 key: "myapex.key",
9796 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9797 min_sdk_version: "30",
9798 updatable: false,
9799 }
9800
9801 apex_key {
9802 name: "myapex.key",
9803 public_key: "testkey.avbpubkey",
9804 private_key: "testkey.pem",
9805 }
9806
9807 systemserverclasspath_fragment {
9808 name: "mysystemserverclasspathfragment",
9809 contents: ["mysystemserverclasspathlib"],
9810 apex_available: ["myapex"],
9811 }
9812
9813 java_sdk_library {
9814 name: "mysystemserverclasspathlib",
9815 srcs: ["mysystemserverclasspathlib.java"],
9816 apex_available: ["myapex"],
9817 compile_dex: true,
9818 min_sdk_version: "32",
9819 unsafe_ignore_missing_latest_api: true,
9820 static_libs: ["util"],
9821 }
9822
9823 java_library {
9824 name: "util",
9825 srcs: ["a.java"],
9826 apex_available: ["myapex"],
9827 min_sdk_version: "31",
9828 static_libs: ["another_util"],
9829 }
9830
9831 java_library {
9832 name: "another_util",
9833 srcs: ["a.java"],
9834 min_sdk_version: "31",
9835 apex_available: ["myapex"],
9836 }
9837 `)
9838 })
9839
9840 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Jihoon Kangbb678f82024-07-01 17:04:46 +00009841 preparer.
satayev758968a2021-12-06 11:42:40 +00009842 RunTestWithBp(t, `
9843 apex {
9844 name: "myapex",
9845 key: "myapex.key",
9846 bootclasspath_fragments: ["mybootclasspathfragment"],
9847 min_sdk_version: "30",
9848 updatable: false,
9849 }
9850
9851 apex_key {
9852 name: "myapex.key",
9853 public_key: "testkey.avbpubkey",
9854 private_key: "testkey.pem",
9855 }
9856
9857 bootclasspath_fragment {
9858 name: "mybootclasspathfragment",
9859 contents: ["mybootclasspathlib"],
9860 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009861 hidden_api: {
9862 split_packages: ["*"],
9863 },
satayev758968a2021-12-06 11:42:40 +00009864 }
9865
9866 java_sdk_library {
9867 name: "mybootclasspathlib",
9868 srcs: ["mybootclasspathlib.java"],
9869 apex_available: ["myapex"],
9870 compile_dex: true,
9871 unsafe_ignore_missing_latest_api: true,
Jihoon Kangbb678f82024-07-01 17:04:46 +00009872 sdk_version: "current",
9873 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009874 }
9875 `)
9876 })
9877
9878 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9879 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9880 RunTestWithBp(t, `
9881 apex {
9882 name: "myapex",
9883 key: "myapex.key",
9884 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9885 min_sdk_version: "30",
9886 updatable: false,
9887 }
9888
9889 apex_key {
9890 name: "myapex.key",
9891 public_key: "testkey.avbpubkey",
9892 private_key: "testkey.pem",
9893 }
9894
9895 systemserverclasspath_fragment {
9896 name: "mysystemserverclasspathfragment",
9897 contents: ["mysystemserverclasspathlib"],
9898 apex_available: ["myapex"],
9899 }
9900
9901 java_sdk_library {
9902 name: "mysystemserverclasspathlib",
9903 srcs: ["mysystemserverclasspathlib.java"],
9904 apex_available: ["myapex"],
9905 compile_dex: true,
9906 unsafe_ignore_missing_latest_api: true,
9907 }
9908 `)
9909 })
9910}
9911
Jiakai Zhang6decef92022-01-12 17:56:19 +00009912// Verifies that the APEX depends on all the Make modules in the list.
9913func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9914 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9915 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009916 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009917 }
9918}
9919
9920// Verifies that the APEX does not depend on any of the Make modules in the list.
9921func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9922 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9923 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009924 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009925 }
9926}
9927
Cole Faust24e25c02024-01-19 14:12:17 -08009928func TestApexStrictUpdtabilityLint(t *testing.T) {
9929 bpTemplate := `
9930 apex {
9931 name: "myapex",
9932 key: "myapex.key",
9933 java_libs: ["myjavalib"],
9934 updatable: %v,
9935 min_sdk_version: "29",
9936 }
9937 apex_key {
9938 name: "myapex.key",
9939 }
9940 java_library {
9941 name: "myjavalib",
9942 srcs: ["MyClass.java"],
9943 apex_available: [ "myapex" ],
9944 lint: {
9945 strict_updatability_linting: %v,
9946 %s
9947 },
9948 sdk_version: "current",
9949 min_sdk_version: "29",
9950 }
9951 `
9952 fs := android.MockFS{
9953 "lint-baseline.xml": nil,
9954 }
9955
9956 testCases := []struct {
9957 testCaseName string
9958 apexUpdatable bool
9959 javaStrictUpdtabilityLint bool
9960 lintFileExists bool
9961 disallowedFlagExpected bool
9962 }{
9963 {
9964 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9965 apexUpdatable: true,
9966 javaStrictUpdtabilityLint: true,
9967 lintFileExists: false,
9968 disallowedFlagExpected: false,
9969 },
9970 {
9971 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9972 apexUpdatable: false,
9973 javaStrictUpdtabilityLint: false,
9974 lintFileExists: true,
9975 disallowedFlagExpected: false,
9976 },
9977 {
9978 testCaseName: "non-updatable apex respects strict updatability of javalib",
9979 apexUpdatable: false,
9980 javaStrictUpdtabilityLint: true,
9981 lintFileExists: true,
9982 disallowedFlagExpected: true,
9983 },
9984 {
9985 testCaseName: "updatable apex sets strict updatability of javalib to true",
9986 apexUpdatable: true,
9987 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9988 lintFileExists: true,
9989 disallowedFlagExpected: true,
9990 },
9991 }
9992
9993 for _, testCase := range testCases {
9994 fixtures := []android.FixturePreparer{}
9995 baselineProperty := ""
9996 if testCase.lintFileExists {
9997 fixtures = append(fixtures, fs.AddToFixture())
9998 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9999 }
10000 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
10001
10002 result := testApex(t, bp, fixtures...)
10003 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10004 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10005 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10006
10007 if disallowedFlagActual != testCase.disallowedFlagExpected {
10008 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10009 }
10010 }
10011}
10012
10013func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10014 bp := `
10015 apex {
10016 name: "myapex",
10017 key: "myapex.key",
10018 java_libs: ["myjavalib"],
10019 updatable: true,
10020 min_sdk_version: "29",
10021 }
10022 apex_key {
10023 name: "myapex.key",
10024 }
10025 java_library {
10026 name: "myjavalib",
10027 srcs: ["MyClass.java"],
10028 apex_available: [ "myapex" ],
10029 sdk_version: "current",
10030 min_sdk_version: "29",
10031 lint: {
10032 baseline_filename: "lint-baseline.xml",
10033 }
10034 }
10035 `
10036
10037 testCases := []struct {
10038 testCaseName string
10039 moduleDirectory string
10040 disallowedFlagExpected bool
10041 }{
10042 {
10043 testCaseName: "lintable module defined outside libcore",
10044 moduleDirectory: "",
10045 disallowedFlagExpected: true,
10046 },
10047 {
10048 testCaseName: "lintable module defined in libcore root directory",
10049 moduleDirectory: "libcore/",
10050 disallowedFlagExpected: false,
10051 },
10052 {
10053 testCaseName: "lintable module defined in libcore child directory",
10054 moduleDirectory: "libcore/childdir/",
10055 disallowedFlagExpected: true,
10056 },
10057 }
10058
10059 for _, testCase := range testCases {
10060 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10061 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10062 result := testApex(t, "", lintFileCreator, bpFileCreator)
10063 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10064 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10065 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10066 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10067
10068 if disallowedFlagActual != testCase.disallowedFlagExpected {
10069 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10070 }
10071 }
10072}
10073
10074// checks transtive deps of an apex coming from bootclasspath_fragment
10075func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10076 bp := `
10077 apex {
10078 name: "myapex",
10079 key: "myapex.key",
10080 bootclasspath_fragments: ["mybootclasspathfragment"],
10081 updatable: true,
10082 min_sdk_version: "29",
10083 }
10084 apex_key {
10085 name: "myapex.key",
10086 }
10087 bootclasspath_fragment {
10088 name: "mybootclasspathfragment",
10089 contents: ["myjavalib"],
10090 apex_available: ["myapex"],
10091 hidden_api: {
10092 split_packages: ["*"],
10093 },
10094 }
10095 java_library {
10096 name: "myjavalib",
10097 srcs: ["MyClass.java"],
10098 apex_available: [ "myapex" ],
10099 sdk_version: "current",
10100 min_sdk_version: "29",
10101 compile_dex: true,
10102 lint: {
10103 baseline_filename: "lint-baseline.xml",
10104 }
10105 }
10106 `
10107 fs := android.MockFS{
10108 "lint-baseline.xml": nil,
10109 }
10110
10111 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10112 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10113 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10114 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10115 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10116 }
10117}
Spandan Das66773252022-01-15 00:23:18 +000010118
Jihoon Kang784c0052024-06-25 22:15:39 +000010119func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
10120 bp := `
10121 apex {
10122 name: "myapex",
10123 key: "myapex.key",
10124 bootclasspath_fragments: ["mybootclasspathfragment"],
10125 min_sdk_version: "29",
Jihoon Kangbb678f82024-07-01 17:04:46 +000010126 java_libs: [
10127 "jacocoagent",
10128 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010129 }
10130 apex_key {
10131 name: "myapex.key",
10132 }
10133 bootclasspath_fragment {
10134 name: "mybootclasspathfragment",
10135 contents: ["foo"],
10136 apex_available: ["myapex"],
10137 hidden_api: {
10138 split_packages: ["*"],
10139 },
10140 }
10141 java_sdk_library {
10142 name: "foo",
10143 srcs: ["MyClass.java"],
10144 apex_available: [ "myapex" ],
10145 sdk_version: "current",
10146 min_sdk_version: "29",
10147 compile_dex: true,
10148 }
10149 `
10150 fs := android.MockFS{
10151 "lint-baseline.xml": nil,
10152 }
10153
10154 result := android.GroupFixturePreparers(
10155 prepareForApexTest,
10156 java.PrepareForTestWithJavaSdkLibraryFiles,
10157 java.PrepareForTestWithJacocoInstrumentation,
10158 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010159 android.FixtureMergeMockFs(fs),
10160 ).RunTestWithBp(t, bp)
10161
10162 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10163 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10164 android.AssertStringDoesContain(t,
10165 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10166 lintReportInputs, "foo.impl")
10167}
10168
Spandan Das42e89502022-05-06 22:12:55 +000010169// updatable apexes should propagate updatable=true to its apps
10170func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10171 bp := `
10172 apex {
10173 name: "myapex",
10174 key: "myapex.key",
10175 updatable: %v,
10176 apps: [
10177 "myapp",
10178 ],
10179 min_sdk_version: "30",
10180 }
10181 apex_key {
10182 name: "myapex.key",
10183 }
10184 android_app {
10185 name: "myapp",
10186 updatable: %v,
10187 apex_available: [
10188 "myapex",
10189 ],
10190 sdk_version: "current",
10191 min_sdk_version: "30",
10192 }
10193 `
10194 testCases := []struct {
10195 name string
10196 apex_is_updatable_bp bool
10197 app_is_updatable_bp bool
10198 app_is_updatable_expected bool
10199 }{
10200 {
10201 name: "Non-updatable apex respects updatable property of non-updatable app",
10202 apex_is_updatable_bp: false,
10203 app_is_updatable_bp: false,
10204 app_is_updatable_expected: false,
10205 },
10206 {
10207 name: "Non-updatable apex respects updatable property of updatable app",
10208 apex_is_updatable_bp: false,
10209 app_is_updatable_bp: true,
10210 app_is_updatable_expected: true,
10211 },
10212 {
10213 name: "Updatable apex respects updatable property of updatable app",
10214 apex_is_updatable_bp: true,
10215 app_is_updatable_bp: true,
10216 app_is_updatable_expected: true,
10217 },
10218 {
10219 name: "Updatable apex sets updatable=true on non-updatable app",
10220 apex_is_updatable_bp: true,
10221 app_is_updatable_bp: false,
10222 app_is_updatable_expected: true,
10223 },
10224 }
10225 for _, testCase := range testCases {
10226 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10227 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10228 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10229 }
10230}
10231
Kiyoung Kim487689e2022-07-26 09:48:22 +090010232func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10233 bp := `
10234 apex {
10235 name: "myapex",
10236 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010237 native_shared_libs: ["libbaz"],
10238 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010239 min_sdk_version: "29",
10240 }
10241 apex_key {
10242 name: "myapex.key",
10243 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010244 cc_binary {
10245 name: "binfoo",
10246 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010247 apex_available: ["myapex"],
10248 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010249 recovery_available: false,
10250 }
10251 cc_library {
10252 name: "libbar",
10253 srcs: ["libbar.cc"],
10254 stubs: {
10255 symbol_file: "libbar.map.txt",
10256 versions: [
10257 "29",
10258 ],
10259 },
10260 }
10261 cc_library {
10262 name: "libbaz",
10263 srcs: ["libbaz.cc"],
10264 apex_available: ["myapex"],
10265 min_sdk_version: "29",
10266 stubs: {
10267 symbol_file: "libbaz.map.txt",
10268 versions: [
10269 "29",
10270 ],
10271 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010272 }
10273 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010274 name: "libbar",
10275 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010276 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010277 variants: ["apex.29"],
10278 }
10279 cc_api_variant {
10280 name: "libbar",
10281 variant: "apex",
10282 version: "29",
10283 src: "libbar_apex_29.so",
10284 }
10285 cc_api_library {
10286 name: "libbaz",
10287 src: "libbaz_stub.so",
10288 min_sdk_version: "29",
10289 variants: ["apex.29"],
10290 }
10291 cc_api_variant {
10292 name: "libbaz",
10293 variant: "apex",
10294 version: "29",
10295 src: "libbaz_apex_29.so",
10296 }
10297 cc_api_library {
10298 name: "libqux",
10299 src: "libqux_stub.so",
10300 min_sdk_version: "29",
10301 variants: ["apex.29"],
10302 }
10303 cc_api_variant {
10304 name: "libqux",
10305 variant: "apex",
10306 version: "29",
10307 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010308 }
10309 api_imports {
10310 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010311 apex_shared_libs: [
10312 "libbar",
10313 "libbaz",
10314 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010315 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010316 }
10317 `
10318 result := testApex(t, bp)
10319
10320 hasDep := func(m android.Module, wantDep android.Module) bool {
10321 t.Helper()
10322 var found bool
10323 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10324 if dep == wantDep {
10325 found = true
10326 }
10327 })
10328 return found
10329 }
10330
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010331 // Library defines stubs and cc_api_library should be used with cc_api_library
10332 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10333 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10334 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010335
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010336 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10337 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010338
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010339 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10340 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10341 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10342 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10343
10344 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10345 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10346 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10347 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10348 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10349
10350 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10351 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10352 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10353
10354 // cc_api_library defined without original library should be linked with cc_api_library
10355 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10356 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10357 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10358}
10359
10360func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10361 bp := `
10362 apex {
10363 name: "myapex",
10364 key: "myapex.key",
10365 native_shared_libs: ["libbar"],
10366 min_sdk_version: "29",
10367 }
10368 apex_key {
10369 name: "myapex.key",
10370 }
10371 cc_binary {
10372 name: "binfoo",
10373 shared_libs: ["libbar"],
10374 recovery_available: false,
10375 }
10376 cc_library {
10377 name: "libbar",
10378 srcs: ["libbar.cc"],
10379 apex_available: ["myapex"],
10380 min_sdk_version: "29",
10381 stubs: {
10382 symbol_file: "libbar.map.txt",
10383 versions: [
10384 "29",
10385 ],
10386 },
10387 }
10388 cc_api_library {
10389 name: "libbar",
10390 src: "libbar_stub.so",
10391 variants: ["apex.29"],
10392 }
10393 cc_api_variant {
10394 name: "libbar",
10395 variant: "apex",
10396 version: "29",
10397 src: "libbar_apex_29.so",
10398 }
10399 api_imports {
10400 name: "api_imports",
10401 apex_shared_libs: [
10402 "libbar",
10403 ],
10404 }
10405 `
10406
10407 result := testApex(t, bp)
10408
10409 hasDep := func(m android.Module, wantDep android.Module) bool {
10410 t.Helper()
10411 var found bool
10412 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10413 if dep == wantDep {
10414 found = true
10415 }
10416 })
10417 return found
10418 }
10419
10420 // Library defines stubs and cc_api_library should be used with cc_api_library
10421 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10422 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10423 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10424
10425 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10426 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10427
10428 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10429 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10430 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10431 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010432}
Dennis Shend4f5d932023-01-31 20:27:21 +000010433
10434func TestTrimmedApex(t *testing.T) {
10435 bp := `
10436 apex {
10437 name: "myapex",
10438 key: "myapex.key",
10439 native_shared_libs: ["libfoo","libbaz"],
10440 min_sdk_version: "29",
10441 trim_against: "mydcla",
10442 }
10443 apex {
10444 name: "mydcla",
10445 key: "myapex.key",
10446 native_shared_libs: ["libfoo","libbar"],
10447 min_sdk_version: "29",
10448 file_contexts: ":myapex-file_contexts",
10449 dynamic_common_lib_apex: true,
10450 }
10451 apex_key {
10452 name: "myapex.key",
10453 }
10454 cc_library {
10455 name: "libfoo",
10456 shared_libs: ["libc"],
10457 apex_available: ["myapex","mydcla"],
10458 min_sdk_version: "29",
10459 }
10460 cc_library {
10461 name: "libbar",
10462 shared_libs: ["libc"],
10463 apex_available: ["myapex","mydcla"],
10464 min_sdk_version: "29",
10465 }
10466 cc_library {
10467 name: "libbaz",
10468 shared_libs: ["libc"],
10469 apex_available: ["myapex","mydcla"],
10470 min_sdk_version: "29",
10471 }
10472 cc_api_library {
10473 name: "libc",
10474 src: "libc.so",
10475 min_sdk_version: "29",
10476 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010477 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010478 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010479 }
10480 api_imports {
10481 name: "api_imports",
10482 shared_libs: [
10483 "libc",
10484 ],
10485 header_libs: [],
10486 }
10487 `
10488 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010489 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010490 apexRule := module.MaybeRule("apexRule")
10491 if apexRule.Rule == nil {
10492 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10493 }
10494
10495 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010496 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010497 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10498 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10499 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10500 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10501}
Jingwen Chendea7a642023-03-28 11:30:50 +000010502
10503func TestCannedFsConfig(t *testing.T) {
10504 ctx := testApex(t, `
10505 apex {
10506 name: "myapex",
10507 key: "myapex.key",
10508 updatable: false,
10509 }
10510
10511 apex_key {
10512 name: "myapex.key",
10513 public_key: "testkey.avbpubkey",
10514 private_key: "testkey.pem",
10515 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010516 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010517 generateFsRule := mod.Rule("generateFsConfig")
10518 cmd := generateFsRule.RuleParams.Command
10519
10520 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10521}
10522
10523func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10524 ctx := testApex(t, `
10525 apex {
10526 name: "myapex",
10527 key: "myapex.key",
10528 canned_fs_config: "my_config",
10529 updatable: false,
10530 }
10531
10532 apex_key {
10533 name: "myapex.key",
10534 public_key: "testkey.avbpubkey",
10535 private_key: "testkey.pem",
10536 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010537 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010538 generateFsRule := mod.Rule("generateFsConfig")
10539 cmd := generateFsRule.RuleParams.Command
10540
10541 // Ensure that canned_fs_config has "cat my_config" at the end
10542 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10543}
Spandan Das20fce2d2023-04-12 17:21:39 +000010544
10545func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10546 testCases := []struct {
10547 desc string
10548 hasStubs bool
10549 apexAvailable string
10550 expectedError string
10551 }{
10552 {
10553 desc: "non-stub library can have multiple apex_available",
10554 hasStubs: false,
10555 apexAvailable: `["myapex", "otherapex"]`,
10556 },
10557 {
10558 desc: "stub library should not be available to anyapex",
10559 hasStubs: true,
10560 apexAvailable: `["//apex_available:anyapex"]`,
10561 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10562 },
10563 {
10564 desc: "stub library should not be available to multiple apexes",
10565 hasStubs: true,
10566 apexAvailable: `["myapex", "otherapex"]`,
10567 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10568 },
10569 {
10570 desc: "stub library can be available to a core apex and a test apex",
10571 hasStubs: true,
10572 apexAvailable: `["myapex", "test_myapex"]`,
10573 },
10574 }
10575 bpTemplate := `
10576 cc_library {
10577 name: "libfoo",
10578 %v
10579 apex_available: %v,
10580 }
10581 apex {
10582 name: "myapex",
10583 key: "apex.key",
10584 updatable: false,
10585 native_shared_libs: ["libfoo"],
10586 }
10587 apex {
10588 name: "otherapex",
10589 key: "apex.key",
10590 updatable: false,
10591 }
10592 apex_test {
10593 name: "test_myapex",
10594 key: "apex.key",
10595 updatable: false,
10596 native_shared_libs: ["libfoo"],
10597 }
10598 apex_key {
10599 name: "apex.key",
10600 }
10601 `
10602 for _, tc := range testCases {
10603 stubs := ""
10604 if tc.hasStubs {
10605 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10606 }
10607 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10608 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10609 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10610 })
10611 if tc.expectedError == "" {
10612 testApex(t, bp, mockFsFixturePreparer)
10613 } else {
10614 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10615 }
10616 }
10617}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010618
10619func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10620 context := android.GroupFixturePreparers(
10621 android.PrepareForIntegrationTestWithAndroid,
10622 cc.PrepareForIntegrationTestWithCc,
10623 PrepareForTestWithApexBuildComponents,
10624 prepareForTestWithMyapex,
10625 filesystem.PrepareForTestWithFilesystemBuildComponents,
10626 )
10627 result := context.RunTestWithBp(t, `
10628 android_system_image {
10629 name: "myfilesystem",
10630 deps: [
10631 "libfoo",
10632 ],
10633 linker_config_src: "linker.config.json",
10634 }
10635
10636 cc_library {
10637 name: "libfoo",
10638 shared_libs: [
10639 "libbar",
10640 ],
10641 stl: "none",
10642 }
10643
10644 cc_library {
10645 name: "libbar",
10646 stl: "none",
10647 apex_available: ["myapex"],
10648 }
10649
10650 apex {
10651 name: "myapex",
10652 native_shared_libs: ["libbar"],
10653 key: "myapex.key",
10654 updatable: false,
10655 }
10656
10657 apex_key {
10658 name: "myapex.key",
10659 public_key: "testkey.avbpubkey",
10660 private_key: "testkey.pem",
10661 }
10662 `)
10663
Cole Faust3b806d32024-03-11 15:15:03 -070010664 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010665 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10666 inputs.Strings(),
10667 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10668}
Yu Liueae7b362023-11-16 17:05:47 -080010669
10670var apex_default_bp = `
10671 apex_key {
10672 name: "myapex.key",
10673 public_key: "testkey.avbpubkey",
10674 private_key: "testkey.pem",
10675 }
10676
10677 filegroup {
10678 name: "myapex.manifest",
10679 srcs: ["apex_manifest.json"],
10680 }
10681
10682 filegroup {
10683 name: "myapex.androidmanifest",
10684 srcs: ["AndroidManifest.xml"],
10685 }
10686`
10687
10688func TestAconfigFilesJavaDeps(t *testing.T) {
10689 ctx := testApex(t, apex_default_bp+`
10690 apex {
10691 name: "myapex",
10692 manifest: ":myapex.manifest",
10693 androidManifest: ":myapex.androidmanifest",
10694 key: "myapex.key",
10695 java_libs: [
10696 "my_java_library_foo",
10697 "my_java_library_bar",
10698 ],
10699 updatable: false,
10700 }
10701
10702 java_library {
10703 name: "my_java_library_foo",
10704 srcs: ["foo/bar/MyClass.java"],
10705 sdk_version: "none",
10706 system_modules: "none",
10707 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010708 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010709 "myapex",
10710 ],
10711 }
10712
10713 java_library {
10714 name: "my_java_library_bar",
10715 srcs: ["foo/bar/MyClass.java"],
10716 sdk_version: "none",
10717 system_modules: "none",
10718 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010719 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010720 "myapex",
10721 ],
10722 }
10723
10724 aconfig_declarations {
10725 name: "my_aconfig_declarations_foo",
10726 package: "com.example.package",
10727 container: "myapex",
10728 srcs: ["foo.aconfig"],
10729 }
10730
10731 java_aconfig_library {
10732 name: "my_java_aconfig_library_foo",
10733 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010734 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010735 "myapex",
10736 ],
10737 }
10738
10739 aconfig_declarations {
10740 name: "my_aconfig_declarations_bar",
10741 package: "com.example.package",
10742 container: "myapex",
10743 srcs: ["bar.aconfig"],
10744 }
10745
10746 java_aconfig_library {
10747 name: "my_java_aconfig_library_bar",
10748 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010749 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010750 "myapex",
10751 ],
10752 }
10753 `)
10754
10755 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10756 s := mod.Rule("apexRule").Args["copy_commands"]
10757 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010758 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080010759 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10760 }
10761
Yu Liuab31c822024-02-28 22:21:31 +000010762 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10763 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
10764 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
10765 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010766
Yu Liubba555e2024-02-17 00:36:42 +000010767 inputs := []string{
10768 "my_aconfig_declarations_foo/intermediate.pb",
10769 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010770 }
Yu Liubba555e2024-02-17 00:36:42 +000010771 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10772 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10773 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10774 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010775}
10776
10777func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10778 ctx := testApex(t, apex_default_bp+`
10779 apex {
10780 name: "myapex",
10781 manifest: ":myapex.manifest",
10782 androidManifest: ":myapex.androidmanifest",
10783 key: "myapex.key",
10784 java_libs: [
10785 "my_java_library_foo",
10786 ],
10787 native_shared_libs: [
10788 "my_cc_library_bar",
10789 ],
10790 binaries: [
10791 "my_cc_binary_baz",
10792 ],
10793 updatable: false,
10794 }
10795
10796 java_library {
10797 name: "my_java_library_foo",
10798 srcs: ["foo/bar/MyClass.java"],
10799 sdk_version: "none",
10800 system_modules: "none",
10801 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010802 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010803 "myapex",
10804 ],
10805 }
10806
10807 cc_library {
10808 name: "my_cc_library_bar",
10809 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010810 static_libs: [
10811 "my_cc_aconfig_library_bar",
10812 "my_cc_aconfig_library_baz",
10813 ],
Yu Liueae7b362023-11-16 17:05:47 -080010814 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010815 "myapex",
10816 ],
10817 }
10818
10819 cc_binary {
10820 name: "my_cc_binary_baz",
10821 srcs: ["foo/bar/MyClass.cc"],
10822 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010823 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010824 "myapex",
10825 ],
10826 }
10827
10828 aconfig_declarations {
10829 name: "my_aconfig_declarations_foo",
10830 package: "com.example.package",
10831 container: "myapex",
10832 srcs: ["foo.aconfig"],
10833 }
10834
10835 java_aconfig_library {
10836 name: "my_java_aconfig_library_foo",
10837 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010838 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010839 "myapex",
10840 ],
10841 }
10842
10843 aconfig_declarations {
10844 name: "my_aconfig_declarations_bar",
10845 package: "com.example.package",
10846 container: "myapex",
10847 srcs: ["bar.aconfig"],
10848 }
10849
10850 cc_aconfig_library {
10851 name: "my_cc_aconfig_library_bar",
10852 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010853 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010854 "myapex",
10855 ],
10856 }
10857
10858 aconfig_declarations {
10859 name: "my_aconfig_declarations_baz",
10860 package: "com.example.package",
10861 container: "myapex",
10862 srcs: ["baz.aconfig"],
10863 }
10864
10865 cc_aconfig_library {
10866 name: "my_cc_aconfig_library_baz",
10867 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010868 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010869 "myapex",
10870 ],
10871 }
10872
10873 cc_library {
10874 name: "server_configurable_flags",
10875 srcs: ["server_configurable_flags.cc"],
10876 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010877 cc_library {
10878 name: "libbase",
10879 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010880 apex_available: [
10881 "myapex",
10882 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010883 }
10884 cc_library {
10885 name: "libaconfig_storage_read_api_cc",
10886 srcs: ["libaconfig_storage_read_api_cc.cc"],
10887 }
Yu Liueae7b362023-11-16 17:05:47 -080010888 `)
10889
10890 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10891 s := mod.Rule("apexRule").Args["copy_commands"]
10892 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010893 if len(copyCmds) != 12 {
10894 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010895 }
10896
Yu Liuab31c822024-02-28 22:21:31 +000010897 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10898 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
10899 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
10900 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010901
Yu Liubba555e2024-02-17 00:36:42 +000010902 inputs := []string{
10903 "my_aconfig_declarations_foo/intermediate.pb",
10904 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10905 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010906 }
Yu Liubba555e2024-02-17 00:36:42 +000010907 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10908 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10909 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10910 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010911}
10912
Yu Liucec0e412023-11-30 16:45:50 -080010913func TestAconfigFilesRustDeps(t *testing.T) {
10914 ctx := testApex(t, apex_default_bp+`
10915 apex {
10916 name: "myapex",
10917 manifest: ":myapex.manifest",
10918 androidManifest: ":myapex.androidmanifest",
10919 key: "myapex.key",
10920 native_shared_libs: [
10921 "libmy_rust_library",
10922 ],
10923 binaries: [
10924 "my_rust_binary",
10925 ],
10926 rust_dyn_libs: [
10927 "libmy_rust_dylib",
10928 ],
10929 updatable: false,
10930 }
10931
10932 rust_library {
10933 name: "libflags_rust", // test mock
10934 crate_name: "flags_rust",
10935 srcs: ["lib.rs"],
10936 apex_available: [
10937 "myapex",
10938 ],
10939 }
10940
10941 rust_library {
10942 name: "liblazy_static", // test mock
10943 crate_name: "lazy_static",
10944 srcs: ["src/lib.rs"],
10945 apex_available: [
10946 "myapex",
10947 ],
10948 }
10949
Ted Bauer02d475c2024-03-27 20:56:26 +000010950 rust_library {
10951 name: "libaconfig_storage_read_api", // test mock
10952 crate_name: "aconfig_storage_read_api",
10953 srcs: ["src/lib.rs"],
10954 apex_available: [
10955 "myapex",
10956 ],
10957 }
10958
Ted Bauer6ef40db2024-03-29 14:04:10 +000010959 rust_library {
10960 name: "liblogger", // test mock
10961 crate_name: "logger",
10962 srcs: ["src/lib.rs"],
10963 apex_available: [
10964 "myapex",
10965 ],
10966 }
10967
10968 rust_library {
10969 name: "liblog_rust", // test mock
10970 crate_name: "log_rust",
10971 srcs: ["src/lib.rs"],
10972 apex_available: [
10973 "myapex",
10974 ],
10975 }
10976
Yu Liucec0e412023-11-30 16:45:50 -080010977 rust_ffi_shared {
10978 name: "libmy_rust_library",
10979 srcs: ["src/lib.rs"],
10980 rustlibs: ["libmy_rust_aconfig_library_foo"],
10981 crate_name: "my_rust_library",
10982 apex_available: [
10983 "myapex",
10984 ],
10985 }
10986
10987 rust_library_dylib {
10988 name: "libmy_rust_dylib",
10989 srcs: ["foo/bar/MyClass.rs"],
10990 rustlibs: ["libmy_rust_aconfig_library_bar"],
10991 crate_name: "my_rust_dylib",
10992 apex_available: [
10993 "myapex",
10994 ],
10995 }
10996
10997 rust_binary {
10998 name: "my_rust_binary",
10999 srcs: ["foo/bar/MyClass.rs"],
11000 rustlibs: [
11001 "libmy_rust_aconfig_library_baz",
11002 "libmy_rust_dylib",
11003 ],
11004 apex_available: [
11005 "myapex",
11006 ],
11007 }
11008
11009 aconfig_declarations {
11010 name: "my_aconfig_declarations_foo",
11011 package: "com.example.package",
11012 container: "myapex",
11013 srcs: ["foo.aconfig"],
11014 }
11015
11016 aconfig_declarations {
11017 name: "my_aconfig_declarations_bar",
11018 package: "com.example.package",
11019 container: "myapex",
11020 srcs: ["bar.aconfig"],
11021 }
11022
11023 aconfig_declarations {
11024 name: "my_aconfig_declarations_baz",
11025 package: "com.example.package",
11026 container: "myapex",
11027 srcs: ["baz.aconfig"],
11028 }
11029
11030 rust_aconfig_library {
11031 name: "libmy_rust_aconfig_library_foo",
11032 aconfig_declarations: "my_aconfig_declarations_foo",
11033 crate_name: "my_rust_aconfig_library_foo",
11034 apex_available: [
11035 "myapex",
11036 ],
11037 }
11038
11039 rust_aconfig_library {
11040 name: "libmy_rust_aconfig_library_bar",
11041 aconfig_declarations: "my_aconfig_declarations_bar",
11042 crate_name: "my_rust_aconfig_library_bar",
11043 apex_available: [
11044 "myapex",
11045 ],
11046 }
11047
11048 rust_aconfig_library {
11049 name: "libmy_rust_aconfig_library_baz",
11050 aconfig_declarations: "my_aconfig_declarations_baz",
11051 crate_name: "my_rust_aconfig_library_baz",
11052 apex_available: [
11053 "myapex",
11054 ],
11055 }
11056 `)
11057
11058 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11059 s := mod.Rule("apexRule").Args["copy_commands"]
11060 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ted Bauer6ef40db2024-03-29 14:04:10 +000011061 if len(copyCmds) != 32 {
Ted Bauer02d475c2024-03-27 20:56:26 +000011062 t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080011063 }
11064
Ted Bauer6ef40db2024-03-29 14:04:10 +000011065 ensureMatches(t, copyCmds[28], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11066 ensureMatches(t, copyCmds[29], "^cp -f .*/package.map .*/image.apex/etc$")
11067 ensureMatches(t, copyCmds[30], "^cp -f .*/flag.map .*/image.apex/etc$")
11068 ensureMatches(t, copyCmds[31], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080011069
Yu Liubba555e2024-02-17 00:36:42 +000011070 inputs := []string{
11071 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011072 "my_aconfig_declarations_bar/intermediate.pb",
11073 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011074 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11075 }
11076 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11077 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11078 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11079 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
11080}
11081
11082func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11083 aconfigRule := mod.Description(desc)
11084 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011085 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011086 if len(aconfigArgs) != len(inputs) {
11087 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011088 }
Yu Liucec0e412023-11-30 16:45:50 -080011089
Yu Liubba555e2024-02-17 00:36:42 +000011090 ensureEquals(t, container, aconfigRule.Args["container"])
11091 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11092
11093 buildParams := aconfigRule.BuildParams
11094 for _, input := range inputs {
11095 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11096 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011097 }
Yu Liubba555e2024-02-17 00:36:42 +000011098
11099 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011100}
11101
Yu Liueae7b362023-11-16 17:05:47 -080011102func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11103 ctx := testApex(t, apex_default_bp+`
11104 apex {
11105 name: "myapex",
11106 manifest: ":myapex.manifest",
11107 androidManifest: ":myapex.androidmanifest",
11108 key: "myapex.key",
11109 java_libs: [
11110 "my_java_library_foo",
11111 "other_java_library_bar",
11112 ],
11113 updatable: false,
11114 }
11115
11116 java_library {
11117 name: "my_java_library_foo",
11118 srcs: ["foo/bar/MyClass.java"],
11119 sdk_version: "none",
11120 system_modules: "none",
11121 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011122 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011123 "myapex",
11124 ],
11125 }
11126
11127 java_library {
11128 name: "other_java_library_bar",
11129 srcs: ["foo/bar/MyClass.java"],
11130 sdk_version: "none",
11131 system_modules: "none",
11132 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011133 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011134 "myapex",
11135 ],
11136 }
11137
11138 aconfig_declarations {
11139 name: "my_aconfig_declarations_foo",
11140 package: "com.example.package",
11141 container: "myapex",
11142 srcs: ["foo.aconfig"],
11143 }
11144
11145 java_aconfig_library {
11146 name: "my_java_aconfig_library_foo",
11147 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011148 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011149 "myapex",
11150 ],
11151 }
11152
11153 aconfig_declarations {
11154 name: "other_aconfig_declarations_bar",
11155 package: "com.example.package",
11156 container: "otherapex",
11157 srcs: ["bar.aconfig"],
11158 }
11159
11160 java_aconfig_library {
11161 name: "other_java_aconfig_library_bar",
11162 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011163 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011164 "myapex",
11165 ],
11166 }
11167 `)
11168
11169 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11170 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11171 s := " " + combineAconfigRule.Args["cache_files"]
11172 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11173 if len(aconfigArgs) != 1 {
11174 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11175 }
11176 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11177
11178 buildParams := combineAconfigRule.BuildParams
11179 if len(buildParams.Inputs) != 1 {
11180 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11181 }
11182 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11183 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11184}
11185
11186func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11187 ctx := testApex(t, apex_default_bp+`
11188 apex {
11189 name: "myapex",
11190 manifest: ":myapex.manifest",
11191 androidManifest: ":myapex.androidmanifest",
11192 key: "myapex.key",
11193 java_libs: [
11194 "my_java_library_foo",
11195 "my_java_library_bar",
11196 ],
11197 updatable: false,
11198 }
11199
11200 java_library {
11201 name: "my_java_library_foo",
11202 srcs: ["foo/bar/MyClass.java"],
11203 sdk_version: "none",
11204 system_modules: "none",
11205 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011206 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011207 "myapex",
11208 ],
11209 }
11210
11211 java_library {
11212 name: "my_java_library_bar",
11213 srcs: ["foo/bar/MyClass.java"],
11214 sdk_version: "none",
11215 system_modules: "none",
11216 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011217 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011218 "myapex",
11219 ],
11220 }
11221
11222 aconfig_declarations {
11223 name: "my_aconfig_declarations_foo",
11224 package: "com.example.package",
11225 container: "myapex",
11226 srcs: ["foo.aconfig"],
11227 }
11228
11229 java_aconfig_library {
11230 name: "my_java_aconfig_library_foo",
11231 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011232 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011233 "myapex",
11234 ],
11235 }
11236
11237 java_aconfig_library {
11238 name: "my_java_aconfig_library_bar",
11239 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011240 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011241 "myapex",
11242 ],
11243 }
11244 `)
11245
11246 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11247 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11248 s := " " + combineAconfigRule.Args["cache_files"]
11249 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11250 if len(aconfigArgs) != 1 {
11251 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11252 }
11253 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11254
11255 buildParams := combineAconfigRule.BuildParams
11256 if len(buildParams.Inputs) != 1 {
11257 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11258 }
11259 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11260 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11261}
Spandan Das5be63332023-12-13 00:06:32 +000011262
11263// Test that the boot jars come from the _selected_ apex prebuilt
11264// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11265func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11266 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11267 t.Helper()
11268 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11269 foundLibfooJar := false
11270 base := stem + ".jar"
11271 for _, output := range s.AllOutputs() {
11272 if filepath.Base(output) == base {
11273 foundLibfooJar = true
11274 buildRule := s.Output(output)
11275 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11276 }
11277 }
11278 if !foundLibfooJar {
11279 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11280 }
11281 }
11282
Spandan Das64c9e0c2023-12-20 20:13:34 +000011283 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11284 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11285 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11286 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11287 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11288 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)
11289 }
11290
11291 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11292 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11293 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11294 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11295 }
11296
Spandan Das5be63332023-12-13 00:06:32 +000011297 bp := `
11298 // Source APEX.
11299
11300 java_library {
11301 name: "framework-foo",
11302 srcs: ["foo.java"],
11303 installable: true,
11304 apex_available: [
11305 "com.android.foo",
11306 ],
11307 }
11308
11309 bootclasspath_fragment {
11310 name: "foo-bootclasspath-fragment",
11311 contents: ["framework-foo"],
11312 apex_available: [
11313 "com.android.foo",
11314 ],
11315 hidden_api: {
11316 split_packages: ["*"],
11317 },
11318 }
11319
11320 apex_key {
11321 name: "com.android.foo.key",
11322 public_key: "com.android.foo.avbpubkey",
11323 private_key: "com.android.foo.pem",
11324 }
11325
11326 apex {
11327 name: "com.android.foo",
11328 key: "com.android.foo.key",
11329 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11330 updatable: false,
11331 }
11332
11333 // Prebuilt APEX.
11334
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011335 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011336 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011337 public: {
11338 jars: ["foo.jar"],
11339 },
Spandan Das5be63332023-12-13 00:06:32 +000011340 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011341 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011342 }
11343
11344 prebuilt_bootclasspath_fragment {
11345 name: "foo-bootclasspath-fragment",
11346 contents: ["framework-foo"],
11347 hidden_api: {
11348 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11349 metadata: "my-bootclasspath-fragment/metadata.csv",
11350 index: "my-bootclasspath-fragment/index.csv",
11351 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11352 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11353 },
11354 apex_available: [
11355 "com.android.foo",
11356 ],
11357 }
11358
11359 prebuilt_apex {
11360 name: "com.android.foo",
11361 apex_name: "com.android.foo",
11362 src: "com.android.foo-arm.apex",
11363 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11364 }
11365
11366 // Another Prebuilt ART APEX
11367 prebuilt_apex {
11368 name: "com.android.foo.v2",
11369 apex_name: "com.android.foo", // Used to determine the API domain
11370 src: "com.android.foo-arm.apex",
11371 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11372 }
11373
11374 // APEX contribution modules
11375
11376 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011377 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011378 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011379 contents: ["com.android.foo"],
11380 }
11381
11382 apex_contributions {
11383 name: "foo.prebuilt.contributions",
11384 api_domain: "com.android.foo",
11385 contents: ["prebuilt_com.android.foo"],
11386 }
11387
11388 apex_contributions {
11389 name: "foo.prebuilt.v2.contributions",
11390 api_domain: "com.android.foo",
11391 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011392 }
11393 `
11394
11395 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011396 desc string
11397 selectedApexContributions string
11398 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011399 }{
11400 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011401 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11402 selectedApexContributions: "foo.source.contributions",
11403 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011404 },
11405 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011406 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11407 selectedApexContributions: "foo.prebuilt.contributions",
11408 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011409 },
11410 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011411 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11412 selectedApexContributions: "foo.prebuilt.v2.contributions",
11413 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011414 },
11415 }
11416
11417 fragment := java.ApexVariantReference{
11418 Apex: proptools.StringPtr("com.android.foo"),
11419 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11420 }
11421
11422 for _, tc := range testCases {
11423 preparer := android.GroupFixturePreparers(
11424 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11425 android.FixtureMergeMockFs(map[string][]byte{
11426 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11427 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011428 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11429 // file creation.
11430 java.FixtureConfigureBootJars("platform:foo"),
11431 android.FixtureModifyMockFS(func(fs android.MockFS) {
11432 fs["platform/Android.bp"] = []byte(`
11433 java_library {
11434 name: "foo",
11435 srcs: ["Test.java"],
11436 compile_dex: true,
11437 }
11438 `)
11439 fs["platform/Test.java"] = nil
11440 }),
11441
Colin Crossa66b4632024-08-08 15:50:47 -070011442 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011443 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011444 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011445 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011446 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11447 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011448 }
11449}
Spandan Das3576e762024-01-03 18:57:03 +000011450
11451// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11452// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11453func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000011454 // for a mainline module family, check that only the flagged soong module is visible to make
11455 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11456 variation := func(moduleName string) string {
11457 ret := "android_common_com.android.foo"
11458 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011459 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011460 }
11461 return ret
11462 }
11463
11464 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11465 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11466
11467 for _, hiddenModuleName := range hiddenModuleNames {
11468 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11469 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11470
11471 }
11472 }
11473
11474 bp := `
11475 apex_key {
11476 name: "com.android.foo.key",
11477 public_key: "com.android.foo.avbpubkey",
11478 private_key: "com.android.foo.pem",
11479 }
11480
11481 // AOSP source apex
11482 apex {
11483 name: "com.android.foo",
11484 key: "com.android.foo.key",
11485 updatable: false,
11486 }
11487
11488 // Google source apex
11489 override_apex {
11490 name: "com.google.android.foo",
11491 base: "com.android.foo",
11492 key: "com.android.foo.key",
11493 }
11494
11495 // Prebuilt Google APEX.
11496
11497 prebuilt_apex {
11498 name: "com.google.android.foo",
11499 apex_name: "com.android.foo",
11500 src: "com.android.foo-arm.apex",
11501 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11502 }
11503
11504 // Another Prebuilt Google APEX
11505 prebuilt_apex {
11506 name: "com.google.android.foo.v2",
11507 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011508 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011509 src: "com.android.foo-arm.apex",
11510 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11511 }
11512
11513 // APEX contribution modules
11514
11515 apex_contributions {
11516 name: "foo.source.contributions",
11517 api_domain: "com.android.foo",
11518 contents: ["com.google.android.foo"],
11519 }
11520
11521 apex_contributions {
11522 name: "foo.prebuilt.contributions",
11523 api_domain: "com.android.foo",
11524 contents: ["prebuilt_com.google.android.foo"],
11525 }
11526
11527 apex_contributions {
11528 name: "foo.prebuilt.v2.contributions",
11529 api_domain: "com.android.foo",
11530 contents: ["prebuilt_com.google.android.foo.v2"],
11531 }
11532
11533 // This is an incompatible module because it selects multiple versions of the same mainline module
11534 apex_contributions {
11535 name: "foo.prebuilt.duplicate.contributions",
11536 api_domain: "com.android.foo",
11537 contents: [
11538 "prebuilt_com.google.android.foo",
11539 "prebuilt_com.google.android.foo.v2",
11540 ],
11541 }
11542 `
11543
11544 testCases := []struct {
11545 desc string
11546 selectedApexContributions string
11547 expectedVisibleModuleName string
11548 expectedHiddenModuleNames []string
11549 expectedError string
11550 }{
11551 {
11552 desc: "Source apex is selected, prebuilts should be hidden from make",
11553 selectedApexContributions: "foo.source.contributions",
11554 expectedVisibleModuleName: "com.google.android.foo",
11555 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11556 },
11557 {
11558 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11559 selectedApexContributions: "foo.prebuilt.contributions",
11560 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11561 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11562 },
11563 {
11564 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11565 selectedApexContributions: "foo.prebuilt.v2.contributions",
11566 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11567 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11568 },
11569 {
11570 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11571 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11572 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11573 },
11574 }
11575
11576 for _, tc := range testCases {
11577 preparer := android.GroupFixturePreparers(
11578 android.FixtureMergeMockFs(map[string][]byte{
11579 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11580 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011581 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011582 )
11583 if tc.expectedError != "" {
11584 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11585 testApex(t, bp, preparer)
11586 return
11587 }
11588 ctx := testApex(t, bp, preparer)
11589
Spandan Das3576e762024-01-03 18:57:03 +000011590 // Check that
11591 // 1. The contents of the selected apex_contributions are visible to make
11592 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11593 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11594 }
11595}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011596
Spandan Das85bd4622024-08-01 00:51:20 +000011597// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11598func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
11599 // for a mainline module family, check that only the flagged soong module is visible to make
11600 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11601 variation := func(moduleName string) string {
11602 ret := "android_common_com.android.adservices"
11603 if moduleName == "com.google.android.foo" {
11604 ret = "android_common_com.google.android.foo_com.google.android.foo"
11605 }
11606 return ret
11607 }
11608
11609 for _, visibleModuleName := range visibleModuleNames {
11610 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11611 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11612 }
11613
11614 for _, hiddenModuleName := range hiddenModuleNames {
11615 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11616 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11617
11618 }
11619 }
11620
11621 bp := `
11622 apex_key {
11623 name: "com.android.adservices.key",
11624 public_key: "com.android.adservices.avbpubkey",
11625 private_key: "com.android.adservices.pem",
11626 }
11627
11628 // AOSP source apex
11629 apex {
11630 name: "com.android.adservices",
11631 key: "com.android.adservices.key",
11632 updatable: false,
11633 }
11634
11635 // Prebuilt Google APEX.
11636
11637 prebuilt_apex {
11638 name: "com.google.android.adservices",
11639 apex_name: "com.android.adservices",
11640 src: "com.android.foo-arm.apex",
11641 }
11642
11643 // Another Prebuilt Google APEX
11644 prebuilt_apex {
11645 name: "com.google.android.adservices.v2",
11646 apex_name: "com.android.adservices",
11647 src: "com.android.foo-arm.apex",
11648 }
11649
11650 // APEX contribution modules
11651
11652
11653 apex_contributions {
11654 name: "adservices.prebuilt.contributions",
11655 api_domain: "com.android.adservices",
11656 contents: ["prebuilt_com.google.android.adservices"],
11657 }
11658
11659 apex_contributions {
11660 name: "adservices.prebuilt.v2.contributions",
11661 api_domain: "com.android.adservices",
11662 contents: ["prebuilt_com.google.android.adservices.v2"],
11663 }
11664 `
11665
11666 testCases := []struct {
11667 desc string
11668 selectedApexContributions string
11669 expectedVisibleModuleNames []string
11670 expectedHiddenModuleNames []string
11671 }{
11672 {
11673 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11674 selectedApexContributions: "",
11675 expectedVisibleModuleNames: []string{"com.android.adservices"},
11676 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11677 },
11678 {
11679 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11680 selectedApexContributions: "adservices.prebuilt.contributions",
11681 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11682 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11683 },
11684 {
11685 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11686 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11687 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11688 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11689 },
11690 }
11691
11692 for _, tc := range testCases {
11693 preparer := android.GroupFixturePreparers(
11694 android.FixtureMergeMockFs(map[string][]byte{
11695 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11696 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011697 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011698 )
11699 ctx := testApex(t, bp, preparer)
11700
11701 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11702 }
11703}
11704
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011705func TestAconfifDeclarationsValidation(t *testing.T) {
11706 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11707 for _, moduleName := range moduleNames {
11708 ret += fmt.Sprintf(`
11709 aconfig_declarations {
11710 name: "%[1]s",
11711 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011712 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011713 srcs: [
11714 "%[1]s.aconfig",
11715 ],
11716 }
11717 java_aconfig_library {
11718 name: "%[1]s-lib",
11719 aconfig_declarations: "%[1]s",
11720 }
11721 `, moduleName)
11722 }
11723 return ret
11724 }
11725
11726 result := android.GroupFixturePreparers(
11727 prepareForApexTest,
11728 java.PrepareForTestWithJavaSdkLibraryFiles,
11729 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011730 ).RunTestWithBp(t, `
11731 java_library {
11732 name: "baz-java-lib",
11733 static_libs: [
11734 "baz-lib",
11735 ],
11736 }
11737 filegroup {
11738 name: "qux-filegroup",
11739 srcs: [
11740 ":qux-lib{.generated_srcjars}",
11741 ],
11742 }
11743 filegroup {
11744 name: "qux-another-filegroup",
11745 srcs: [
11746 ":qux-filegroup",
11747 ],
11748 }
11749 java_library {
11750 name: "quux-java-lib",
11751 srcs: [
11752 "a.java",
11753 ],
11754 libs: [
11755 "quux-lib",
11756 ],
11757 }
11758 java_sdk_library {
11759 name: "foo",
11760 srcs: [
11761 ":qux-another-filegroup",
11762 ],
11763 api_packages: ["foo"],
11764 system: {
11765 enabled: true,
11766 },
11767 module_lib: {
11768 enabled: true,
11769 },
11770 test: {
11771 enabled: true,
11772 },
11773 static_libs: [
11774 "bar-lib",
11775 ],
11776 libs: [
11777 "baz-java-lib",
11778 "quux-java-lib",
11779 ],
11780 aconfig_declarations: [
11781 "bar",
11782 ],
11783 }
11784 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11785
11786 m := result.ModuleForTests("foo.stubs.source", "android_common")
11787 outDir := "out/soong/.intermediates"
11788
11789 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11790 // textproto files
11791 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11792
11793 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11794 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11795 // to aconfig.
11796 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11797 "passed as an input",
11798 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11799
11800 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11801 // to metalava as classpath. Thus the cache file provided by the associated
11802 // aconfig_declarations module "baz" should be passed to aconfig.
11803 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11804 "java_aconfig_library passed as an input",
11805 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11806
11807 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11808 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11809 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11810 "input",
11811 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11812
11813 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11814 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11815 // aconfig_declarations module "quux" should not be passed to aconfig.
11816 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11817 "depend on java_aconfig_library not passed as an input",
11818 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11819}
Cole Faust7c991b42024-05-15 11:17:55 -070011820
11821func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11822 ctx := testApex(t, `
11823 apex {
11824 name: "myapex",
11825 key: "myapex.key",
11826 prebuilts: ["myetc", "myetc2"],
11827 min_sdk_version: "29",
11828 }
11829 apex_key {
11830 name: "myapex.key",
11831 public_key: "testkey.avbpubkey",
11832 private_key: "testkey.pem",
11833 }
11834
11835 prebuilt_etc {
11836 name: "myetc",
11837 src: "myprebuilt",
11838 filename: "myfilename",
11839 }
11840 prebuilt_etc {
11841 name: "myetc2",
11842 sub_dir: "mysubdir",
11843 src: "myprebuilt",
11844 filename: "myfilename",
11845 }
11846 `, withFiles(android.MockFS{
11847 "packages/modules/common/build/allowed_deps.txt": nil,
11848 }))
11849
11850 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11851 data := android.AndroidMkDataForTest(t, ctx, ab)
11852 var builder strings.Builder
11853 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11854 androidMk := builder.String()
11855
11856 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11857 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11858}
Spandan Das50801e22024-05-13 18:29:45 +000011859
11860func TestApexMinSdkVersionOverride(t *testing.T) {
11861 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11862 args := module.Rule("apexRule").Args
11863 optFlags := args["opt_flags"]
11864 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11865 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11866 }
11867 }
11868
11869 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11870 t.Helper()
11871 found := false
11872 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11873 if dep == wantDep {
11874 found = true
11875 }
11876 })
11877 if !found {
11878 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11879 }
11880 }
11881
11882 ctx := testApex(t, `
11883 apex {
11884 name: "com.android.apex30",
11885 min_sdk_version: "30",
11886 key: "apex30.key",
11887 java_libs: ["javalib"],
11888 }
11889
11890 java_library {
11891 name: "javalib",
11892 srcs: ["A.java"],
11893 apex_available: ["com.android.apex30"],
11894 min_sdk_version: "30",
11895 sdk_version: "current",
11896 }
11897
11898 override_apex {
11899 name: "com.mycompany.android.apex30",
11900 base: "com.android.apex30",
11901 }
11902
11903 override_apex {
11904 name: "com.mycompany.android.apex31",
11905 base: "com.android.apex30",
11906 min_sdk_version: "31",
11907 }
11908
11909 apex_key {
11910 name: "apex30.key",
11911 public_key: "testkey.avbpubkey",
11912 private_key: "testkey.pem",
11913 }
11914
11915 `, android.FixtureMergeMockFs(android.MockFS{
11916 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11917 }),
11918 )
11919
11920 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11921 checkMinSdkVersion(t, baseModule, "30")
11922
11923 // Override module, but uses same min_sdk_version
11924 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11925 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11926 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11927 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11928
11929 // Override module, uses different min_sdk_version
11930 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11931 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11932 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11933 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11934}
Spandan Das0b28fa02024-05-28 23:40:17 +000011935
11936func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11937 context := android.GroupFixturePreparers(
11938 android.PrepareForIntegrationTestWithAndroid,
11939 PrepareForTestWithApexBuildComponents,
11940 android.FixtureMergeMockFs(android.MockFS{
11941 "system/sepolicy/apex/foo-file_contexts": nil,
11942 }),
11943 )
11944 res := context.RunTestWithBp(t, `
11945 apex {
11946 name: "foo",
11947 key: "myapex.key",
11948 apex_available_name: "com.android.foo",
11949 variant_version: "0",
11950 updatable: false,
11951 }
11952 apex_key {
11953 name: "myapex.key",
11954 public_key: "testkey.avbpubkey",
11955 private_key: "testkey.pem",
11956 }
11957 prebuilt_apex {
11958 name: "foo",
11959 src: "foo.apex",
11960 prefer: true,
11961 }
11962 override_apex {
11963 name: "myoverrideapex",
11964 base: "foo",
11965 }
11966 `)
11967
11968 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11969}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011970
11971func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11972 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`, `
11973 apex {
11974 name: "myapex",
11975 key: "myapex.key",
11976 updatable: true,
11977 min_sdk_version: "current",
11978 }
11979
11980 apex_key {
11981 name: "myapex.key",
11982 public_key: "testkey.avbpubkey",
11983 private_key: "testkey.pem",
11984 }
11985 `)
11986}
Spandan Das2f68f192024-07-22 19:25:50 +000011987
11988func TestPrebuiltStubNoinstall(t *testing.T) {
11989 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11990 result := android.GroupFixturePreparers(
11991 prepareForApexTest,
11992 android.PrepareForTestWithAndroidMk,
11993 android.PrepareForTestWithMakevars,
11994 android.FixtureMergeMockFs(fs),
11995 ).RunTest(t)
11996
11997 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
11998 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared/libfoo.so")
11999
12000 installRules := result.InstallMakeRulesForTesting(t)
12001
12002 var installedlibRule *android.InstallMakeRule
12003 for i, rule := range installRules {
12004 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
12005 if installedlibRule != nil {
12006 t.Errorf("Duplicate install rules for %s", rule.Target)
12007 }
12008 installedlibRule = &installRules[i]
12009 }
12010 }
12011 if installedlibRule == nil {
12012 t.Errorf("No install rule found for installedlib")
12013 return
12014 }
12015
12016 if expectLibfooOnSystemLib {
12017 android.AssertStringListContains(t,
12018 "installedlib doesn't have install dependency on libfoo impl",
12019 installedlibRule.OrderOnlyDeps,
12020 "out/target/product/test_device/system/lib/libfoo.so")
12021 } else {
12022 android.AssertStringListDoesNotContain(t,
12023 "installedlib has install dependency on libfoo stub",
12024 installedlibRule.Deps,
12025 "out/target/product/test_device/system/lib/libfoo.so")
12026 android.AssertStringListDoesNotContain(t,
12027 "installedlib has order-only install dependency on libfoo stub",
12028 installedlibRule.OrderOnlyDeps,
12029 "out/target/product/test_device/system/lib/libfoo.so")
12030 }
12031 }
12032
12033 prebuiltLibfooBp := []byte(`
12034 cc_prebuilt_library {
12035 name: "libfoo",
12036 prefer: true,
12037 srcs: ["libfoo.so"],
12038 stubs: {
12039 versions: ["1"],
12040 },
12041 apex_available: ["apexfoo"],
12042 }
12043 `)
12044
12045 apexfooBp := []byte(`
12046 apex {
12047 name: "apexfoo",
12048 key: "apexfoo.key",
12049 native_shared_libs: ["libfoo"],
12050 updatable: false,
12051 compile_multilib: "both",
12052 }
12053 apex_key {
12054 name: "apexfoo.key",
12055 public_key: "testkey.avbpubkey",
12056 private_key: "testkey.pem",
12057 }
12058 `)
12059
12060 installedlibBp := []byte(`
12061 cc_library {
12062 name: "installedlib",
12063 shared_libs: ["libfoo"],
12064 }
12065 `)
12066
12067 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
12068 testFunc(
12069 t,
12070 /*expectLibfooOnSystemLib=*/ false,
12071 android.MockFS{
12072 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12073 "apexfoo/Android.bp": apexfooBp,
12074 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12075 "Android.bp": installedlibBp,
12076 },
12077 )
12078 })
12079
12080 disabledSourceLibfooBp := []byte(`
12081 cc_library {
12082 name: "libfoo",
12083 enabled: false,
12084 stubs: {
12085 versions: ["1"],
12086 },
12087 apex_available: ["apexfoo"],
12088 }
12089 `)
12090
12091 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
12092 testFunc(
12093 t,
12094 /*expectLibfooOnSystemLib=*/ false,
12095 android.MockFS{
12096 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12097 "impl/Android.bp": disabledSourceLibfooBp,
12098 "apexfoo/Android.bp": apexfooBp,
12099 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12100 "Android.bp": installedlibBp,
12101 },
12102 )
12103 })
12104}