blob: cdf16ddce9884f43cfa4f0eac39b971693b2067f [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",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700387 apex_available: [ "myapex", "com.android.gki.*" ],
388 }
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
Yifan Hongd22a84a2020-07-28 17:37:46 -0700435 apex {
436 name: "com.android.gki.fake",
437 binaries: ["foo"],
438 key: "myapex.key",
439 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000440 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900444 name: "mylib2",
445 srcs: ["mylib.cpp"],
446 system_shared_libs: [],
447 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900448 static_libs: ["libstatic"],
449 // TODO: remove //apex_available:platform
450 apex_available: [
451 "//apex_available:platform",
452 "myapex",
453 ],
454 }
455
Paul Duffindddd5462020-04-07 15:25:44 +0100456 cc_prebuilt_library_shared {
457 name: "mylib2",
458 srcs: ["prebuilt.so"],
459 // TODO: remove //apex_available:platform
460 apex_available: [
461 "//apex_available:platform",
462 "myapex",
463 ],
464 }
465
Jiyong Park9918e1a2020-03-17 19:16:40 +0900466 cc_library_static {
467 name: "libstatic",
468 srcs: ["mylib.cpp"],
469 system_shared_libs: [],
470 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900476 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477
478 java_library {
479 name: "myjar",
480 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900481 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 sdk_version: "none",
483 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900485 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000486 // TODO: remove //apex_available:platform
487 apex_available: [
488 "//apex_available:platform",
489 "myapex",
490 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 }
492
Jiyong Park77acec62020-06-01 21:39:15 +0900493 dex_import {
494 name: "myjar_dex",
495 jars: ["prebuilt.jar"],
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
500 }
501
Jiyong Park7f7766d2019-07-25 22:02:35 +0900502 java_library {
503 name: "myotherjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900507 // TODO: remove //apex_available:platform
508 apex_available: [
509 "//apex_available:platform",
510 "myapex",
511 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900512 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900513
514 java_library {
515 name: "mysharedjar",
516 srcs: ["foo/bar/MyClass.java"],
517 sdk_version: "none",
518 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900519 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900520 `)
521
Jooyung Hana0503a52023-08-23 13:12:50 +0900522 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900523
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900524 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900525 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700526 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900527 var builder strings.Builder
528 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
529
530 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000531 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900532 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
533
Jiyong Park42cca6c2019-04-01 11:15:50 +0900534 optFlags := apexRule.Args["opt_flags"]
535 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700536 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900537 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900538
Jiyong Park25fc6a92018-11-18 18:02:45 +0900539 copyCmds := apexRule.Args["copy_commands"]
540
541 // Ensure that main rule creates an output
542 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
543
544 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700545 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900550
551 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900558
559 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800560 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
561 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
566 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900568 // .. but not for java libs
569 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900570 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800571
Colin Cross7113d202019-11-20 16:39:12 -0800572 // Ensure that the platform variant ends with _shared or _common
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
576 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900577 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
578
579 // Ensure that dynamic dependency to java libs are not included
580 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800581
582 // Ensure that all symlinks are present.
583 found_foo_link_64 := false
584 found_foo := false
585 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900586 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800587 if strings.HasSuffix(cmd, "bin/foo") {
588 found_foo = true
589 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
590 found_foo_link_64 = true
591 }
592 }
593 }
594 good := found_foo && found_foo_link_64
595 if !good {
596 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
597 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900598
Colin Crossf61d03d2023-11-02 16:56:39 -0700599 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
600 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
603 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
604 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100605
Colin Crossf61d03d2023-11-02 16:56:39 -0700606 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
607 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100608 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100609 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
610 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
611 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800612}
613
Jooyung Hanf21c7972019-12-16 22:32:06 +0900614func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800615 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616 apex_defaults {
617 name: "myapex-defaults",
618 key: "myapex.key",
619 prebuilts: ["myetc"],
620 native_shared_libs: ["mylib"],
621 java_libs: ["myjar"],
622 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900623 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800624 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000625 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900626 }
627
628 prebuilt_etc {
629 name: "myetc",
630 src: "myprebuilt",
631 }
632
633 apex {
634 name: "myapex",
635 defaults: ["myapex-defaults"],
636 }
637
638 apex_key {
639 name: "myapex.key",
640 public_key: "testkey.avbpubkey",
641 private_key: "testkey.pem",
642 }
643
644 cc_library {
645 name: "mylib",
646 system_shared_libs: [],
647 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000648 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 java_library {
652 name: "myjar",
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 }
658
659 android_app {
660 name: "AppFoo",
661 srcs: ["foo/bar/MyClass.java"],
662 sdk_version: "none",
663 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000664 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900665 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900666
667 runtime_resource_overlay {
668 name: "rro",
669 theme: "blue",
670 }
671
markchien2f59ec92020-09-02 16:23:38 +0800672 bpf {
673 name: "bpf",
674 srcs: ["bpf.c", "bpf2.c"],
675 }
676
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800678 name: "netdTest",
679 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800680 sub_dir: "netd",
681 }
682
Jooyung Hanf21c7972019-12-16 22:32:06 +0900683 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900684 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 "etc/myetc",
686 "javalib/myjar.jar",
687 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000688 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900689 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800690 "etc/bpf/bpf.o",
691 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800692 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900693 })
694}
695
Jooyung Han01a3ee22019-11-02 02:52:25 +0900696func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800697 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 apex {
699 name: "myapex",
700 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000701 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900702 }
703
704 apex_key {
705 name: "myapex.key",
706 public_key: "testkey.avbpubkey",
707 private_key: "testkey.pem",
708 }
709 `)
710
Jooyung Hana0503a52023-08-23 13:12:50 +0900711 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900712 args := module.Rule("apexRule").Args
713 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
714 t.Error("manifest should be apex_manifest.pb, but " + manifest)
715 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900716}
717
Liz Kammer4854a7d2021-05-27 14:28:27 -0400718func TestApexManifestMinSdkVersion(t *testing.T) {
719 ctx := testApex(t, `
720 apex_defaults {
721 name: "my_defaults",
722 key: "myapex.key",
723 product_specific: true,
724 file_contexts: ":my-file-contexts",
725 updatable: false,
726 }
727 apex {
728 name: "myapex_30",
729 min_sdk_version: "30",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_current",
735 min_sdk_version: "current",
736 defaults: ["my_defaults"],
737 }
738
739 apex {
740 name: "myapex_none",
741 defaults: ["my_defaults"],
742 }
743
744 apex_key {
745 name: "myapex.key",
746 public_key: "testkey.avbpubkey",
747 private_key: "testkey.pem",
748 }
749
750 filegroup {
751 name: "my-file-contexts",
752 srcs: ["product_specific_file_contexts"],
753 }
754 `, withFiles(map[string][]byte{
755 "product_specific_file_contexts": nil,
756 }), android.FixtureModifyProductVariables(
757 func(variables android.FixtureProductVariables) {
758 variables.Unbundled_build = proptools.BoolPtr(true)
759 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
760 }), android.FixtureMergeEnv(map[string]string{
761 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
762 }))
763
764 testCases := []struct {
765 module string
766 minSdkVersion string
767 }{
768 {
769 module: "myapex_30",
770 minSdkVersion: "30",
771 },
772 {
773 module: "myapex_current",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 {
777 module: "myapex_none",
778 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
779 },
780 }
781 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900782 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400783 args := module.Rule("apexRule").Args
784 optFlags := args["opt_flags"]
785 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
786 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
787 }
788 }
789}
790
Jihoon Kang842b9992024-02-08 01:41:51 +0000791func TestApexWithDessertSha(t *testing.T) {
792 ctx := testApex(t, `
793 apex_defaults {
794 name: "my_defaults",
795 key: "myapex.key",
796 product_specific: true,
797 file_contexts: ":my-file-contexts",
798 updatable: false,
799 }
800 apex {
801 name: "myapex_30",
802 min_sdk_version: "30",
803 defaults: ["my_defaults"],
804 }
805
806 apex {
807 name: "myapex_current",
808 min_sdk_version: "current",
809 defaults: ["my_defaults"],
810 }
811
812 apex {
813 name: "myapex_none",
814 defaults: ["my_defaults"],
815 }
816
817 apex_key {
818 name: "myapex.key",
819 public_key: "testkey.avbpubkey",
820 private_key: "testkey.pem",
821 }
822
823 filegroup {
824 name: "my-file-contexts",
825 srcs: ["product_specific_file_contexts"],
826 }
827 `, withFiles(map[string][]byte{
828 "product_specific_file_contexts": nil,
829 }), android.FixtureModifyProductVariables(
830 func(variables android.FixtureProductVariables) {
831 variables.Unbundled_build = proptools.BoolPtr(true)
832 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
833 }), android.FixtureMergeEnv(map[string]string{
834 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
835 }))
836
837 testCases := []struct {
838 module string
839 minSdkVersion string
840 }{
841 {
842 module: "myapex_30",
843 minSdkVersion: "30",
844 },
845 {
846 module: "myapex_current",
847 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
848 },
849 {
850 module: "myapex_none",
851 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
852 },
853 }
854 for _, tc := range testCases {
855 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
856 args := module.Rule("apexRule").Args
857 optFlags := args["opt_flags"]
858 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
859 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
860 }
861 }
862}
863
Jooyung Hanaf730952023-02-28 14:13:38 +0900864func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900865 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900866 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900867 if vendor {
868 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900869 }
870 ctx := testApex(t, `
871 apex {
872 name: "myapex",
873 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900874 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900875 `+prop+`
876 }
877
878 apex_key {
879 name: "myapex.key",
880 public_key: "testkey.avbpubkey",
881 private_key: "testkey.pem",
882 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900883 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900884
Jooyung Hana0503a52023-08-23 13:12:50 +0900885 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900886 if vendor {
887 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
888 rule.RuleParams.Command,
889 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900891 android.AssertStringDoesContain(t, "should force-label as system_file",
892 rule.RuleParams.Command,
893 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900894 }
895 }
896}
897
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800899 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900900 apex {
901 name: "myapex",
902 key: "myapex.key",
903 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900904 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000905 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900906 }
907
908 apex_key {
909 name: "myapex.key",
910 public_key: "testkey.avbpubkey",
911 private_key: "testkey.pem",
912 }
913
914 cc_library {
915 name: "mylib",
916 srcs: ["mylib.cpp"],
917 shared_libs: ["mylib2", "mylib3"],
918 system_shared_libs: [],
919 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000920 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 }
922
923 cc_library {
924 name: "mylib2",
925 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900926 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927 system_shared_libs: [],
928 stl: "none",
929 stubs: {
930 versions: ["1", "2", "3"],
931 },
932 }
933
934 cc_library {
935 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900936 srcs: ["mylib.cpp"],
937 shared_libs: ["mylib4"],
938 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900939 stl: "none",
940 stubs: {
941 versions: ["10", "11", "12"],
942 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000943 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900944 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900945
946 cc_library {
947 name: "mylib4",
948 srcs: ["mylib.cpp"],
949 system_shared_libs: [],
950 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000951 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900952 }
Jiyong Park105dc322021-06-11 17:22:09 +0900953
954 rust_binary {
955 name: "foo.rust",
956 srcs: ["foo.rs"],
957 shared_libs: ["libfoo.shared_from_rust"],
958 prefer_rlib: true,
959 apex_available: ["myapex"],
960 }
961
962 cc_library_shared {
963 name: "libfoo.shared_from_rust",
964 srcs: ["mylib.cpp"],
965 system_shared_libs: [],
966 stl: "none",
967 stubs: {
968 versions: ["10", "11", "12"],
969 },
970 }
971
Jiyong Park25fc6a92018-11-18 18:02:45 +0900972 `)
973
Jooyung Hana0503a52023-08-23 13:12:50 +0900974 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900975 copyCmds := apexRule.Args["copy_commands"]
976
977 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800978 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900979
980 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800981 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900982
983 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800984 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900985
Colin Crossaede88c2020-08-11 12:17:01 -0700986 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987
988 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900989 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900990 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900991 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992
993 // 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 -0700994 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900995 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700996 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900997
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700998 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
999 // is replaced by sharing of "cFlags" in cc/builder.go.
1000 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1001 // module variable representing "cflags". So it was not detected by ensureNotContains.
1002 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1003 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1004 // including the original cflags's "-include mylib.h".
1005 //
Jiyong Park64379952018-12-13 18:37:29 +09001006 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001007 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1008 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001009
Jiyong Park85cc35a2022-07-17 11:30:47 +09001010 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1011 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1012 // Ensure that genstub for apex-provided lib is invoked with --apex
1013 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001014
Jooyung Hana0503a52023-08-23 13:12:50 +09001015 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001016 "lib64/mylib.so",
1017 "lib64/mylib3.so",
1018 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001019 "bin/foo.rust",
1020 "lib64/libc++.so", // by the implicit dependency from foo.rust
1021 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001022 })
Jiyong Park105dc322021-06-11 17:22:09 +09001023
1024 // Ensure that stub dependency from a rust module is not included
1025 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1026 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001027 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001028 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1029 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001030
Jooyung Hana0503a52023-08-23 13:12:50 +09001031 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001032 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001033}
1034
Jooyung Han20348752023-12-05 15:23:56 +09001035func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1036 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1037 apex {
1038 name: "myapex",
1039 key: "myapex.key",
1040 vendor: true,
1041 updatable: false,
1042 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1043 }
1044
1045 apex_key {
1046 name: "myapex.key",
1047 public_key: "testkey.avbpubkey",
1048 private_key: "testkey.pem",
1049 }
1050
1051 cc_library {
1052 name: "libbar",
1053 srcs: ["mylib.cpp"],
1054 llndk: {
1055 symbol_file: "libbar.map.txt",
1056 }
1057 }
1058 `)
1059}
1060
Jiyong Park1bc84122021-06-22 20:23:05 +09001061func TestApexCanUsePrivateApis(t *testing.T) {
1062 ctx := testApex(t, `
1063 apex {
1064 name: "myapex",
1065 key: "myapex.key",
1066 native_shared_libs: ["mylib"],
1067 binaries: ["foo.rust"],
1068 updatable: false,
1069 platform_apis: true,
1070 }
1071
1072 apex_key {
1073 name: "myapex.key",
1074 public_key: "testkey.avbpubkey",
1075 private_key: "testkey.pem",
1076 }
1077
1078 cc_library {
1079 name: "mylib",
1080 srcs: ["mylib.cpp"],
1081 shared_libs: ["mylib2"],
1082 system_shared_libs: [],
1083 stl: "none",
1084 apex_available: [ "myapex" ],
1085 }
1086
1087 cc_library {
1088 name: "mylib2",
1089 srcs: ["mylib.cpp"],
1090 cflags: ["-include mylib.h"],
1091 system_shared_libs: [],
1092 stl: "none",
1093 stubs: {
1094 versions: ["1", "2", "3"],
1095 },
1096 }
1097
1098 rust_binary {
1099 name: "foo.rust",
1100 srcs: ["foo.rs"],
1101 shared_libs: ["libfoo.shared_from_rust"],
1102 prefer_rlib: true,
1103 apex_available: ["myapex"],
1104 }
1105
1106 cc_library_shared {
1107 name: "libfoo.shared_from_rust",
1108 srcs: ["mylib.cpp"],
1109 system_shared_libs: [],
1110 stl: "none",
1111 stubs: {
1112 versions: ["10", "11", "12"],
1113 },
1114 }
1115 `)
1116
Jooyung Hana0503a52023-08-23 13:12:50 +09001117 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001118 copyCmds := apexRule.Args["copy_commands"]
1119
1120 // Ensure that indirect stubs dep is not included
1121 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1122 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1123
1124 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1125 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001126 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001127 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1128 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001129 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001130 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1131 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1132}
1133
Colin Cross7812fd32020-09-25 12:35:10 -07001134func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1135 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001136 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001137 apex {
1138 name: "myapex",
1139 key: "myapex.key",
1140 native_shared_libs: ["mylib", "mylib3"],
1141 min_sdk_version: "29",
1142 }
1143
1144 apex_key {
1145 name: "myapex.key",
1146 public_key: "testkey.avbpubkey",
1147 private_key: "testkey.pem",
1148 }
1149
1150 cc_library {
1151 name: "mylib",
1152 srcs: ["mylib.cpp"],
1153 shared_libs: ["mylib2", "mylib3"],
1154 system_shared_libs: [],
1155 stl: "none",
1156 apex_available: [ "myapex" ],
1157 min_sdk_version: "28",
1158 }
1159
1160 cc_library {
1161 name: "mylib2",
1162 srcs: ["mylib.cpp"],
1163 cflags: ["-include mylib.h"],
1164 system_shared_libs: [],
1165 stl: "none",
1166 stubs: {
1167 versions: ["28", "29", "30", "current"],
1168 },
1169 min_sdk_version: "28",
1170 }
1171
1172 cc_library {
1173 name: "mylib3",
1174 srcs: ["mylib.cpp"],
1175 shared_libs: ["mylib4"],
1176 system_shared_libs: [],
1177 stl: "none",
1178 stubs: {
1179 versions: ["28", "29", "30", "current"],
1180 },
1181 apex_available: [ "myapex" ],
1182 min_sdk_version: "28",
1183 }
1184
1185 cc_library {
1186 name: "mylib4",
1187 srcs: ["mylib.cpp"],
1188 system_shared_libs: [],
1189 stl: "none",
1190 apex_available: [ "myapex" ],
1191 min_sdk_version: "28",
1192 }
1193 `)
1194
Jooyung Hana0503a52023-08-23 13:12:50 +09001195 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001196 copyCmds := apexRule.Args["copy_commands"]
1197
1198 // Ensure that direct non-stubs dep is always included
1199 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1200
1201 // Ensure that indirect stubs dep is not included
1202 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1203
1204 // Ensure that direct stubs dep is included
1205 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1206
1207 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1208
Jiyong Park55549df2021-02-26 23:57:23 +09001209 // Ensure that mylib is linking with the latest version of stub for mylib2
1210 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001211 // ... and not linking to the non-stub (impl) variant of mylib2
1212 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1213
1214 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1215 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1216 // .. and not linking to the stubs variant of mylib3
1217 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1218
1219 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001220 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001221 ensureNotContains(t, mylib2Cflags, "-include ")
1222
Jiyong Park85cc35a2022-07-17 11:30:47 +09001223 // Ensure that genstub is invoked with --systemapi
1224 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001225
Jooyung Hana0503a52023-08-23 13:12:50 +09001226 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001227 "lib64/mylib.so",
1228 "lib64/mylib3.so",
1229 "lib64/mylib4.so",
1230 })
1231}
1232
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001233func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1234 t.Parallel()
1235 // myapex (Z)
1236 // mylib -----------------.
1237 // |
1238 // otherapex (29) |
1239 // libstub's versions: 29 Z current
1240 // |
1241 // <platform> |
1242 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001243 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001244 apex {
1245 name: "myapex",
1246 key: "myapex.key",
1247 native_shared_libs: ["mylib"],
1248 min_sdk_version: "Z", // non-final
1249 }
1250
1251 cc_library {
1252 name: "mylib",
1253 srcs: ["mylib.cpp"],
1254 shared_libs: ["libstub"],
1255 apex_available: ["myapex"],
1256 min_sdk_version: "Z",
1257 }
1258
1259 apex_key {
1260 name: "myapex.key",
1261 public_key: "testkey.avbpubkey",
1262 private_key: "testkey.pem",
1263 }
1264
1265 apex {
1266 name: "otherapex",
1267 key: "myapex.key",
1268 native_shared_libs: ["libstub"],
1269 min_sdk_version: "29",
1270 }
1271
1272 cc_library {
1273 name: "libstub",
1274 srcs: ["mylib.cpp"],
1275 stubs: {
1276 versions: ["29", "Z", "current"],
1277 },
1278 apex_available: ["otherapex"],
1279 min_sdk_version: "29",
1280 }
1281
1282 // platform module depending on libstub from otherapex should use the latest stub("current")
1283 cc_library {
1284 name: "libplatform",
1285 srcs: ["mylib.cpp"],
1286 shared_libs: ["libstub"],
1287 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001288 `,
1289 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1290 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1291 variables.Platform_sdk_final = proptools.BoolPtr(false)
1292 variables.Platform_version_active_codenames = []string{"Z"}
1293 }),
1294 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001295
Jiyong Park55549df2021-02-26 23:57:23 +09001296 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001297 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001298 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001299 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001300 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001301
1302 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1303 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1304 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1305 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1306 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1307}
1308
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001310 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001312 name: "myapex2",
1313 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001314 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001315 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001316 }
1317
1318 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001319 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001320 public_key: "testkey.avbpubkey",
1321 private_key: "testkey.pem",
1322 }
1323
1324 cc_library {
1325 name: "mylib",
1326 srcs: ["mylib.cpp"],
1327 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001328 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001329 system_shared_libs: [],
1330 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001331 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001332 }
1333
1334 cc_library {
1335 name: "libfoo",
1336 srcs: ["mylib.cpp"],
1337 shared_libs: ["libbar"],
1338 system_shared_libs: [],
1339 stl: "none",
1340 stubs: {
1341 versions: ["10", "20", "30"],
1342 },
1343 }
1344
1345 cc_library {
1346 name: "libbar",
1347 srcs: ["mylib.cpp"],
1348 system_shared_libs: [],
1349 stl: "none",
1350 }
1351
Jiyong Park678c8812020-02-07 17:25:49 +09001352 cc_library_static {
1353 name: "libbaz",
1354 srcs: ["mylib.cpp"],
1355 system_shared_libs: [],
1356 stl: "none",
1357 apex_available: [ "myapex2" ],
1358 }
1359
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001360 `)
1361
Jooyung Hana0503a52023-08-23 13:12:50 +09001362 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001363 copyCmds := apexRule.Args["copy_commands"]
1364
1365 // Ensure that direct non-stubs dep is always included
1366 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1367
1368 // Ensure that indirect stubs dep is not included
1369 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1370
1371 // Ensure that dependency of stubs is not included
1372 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1373
Colin Crossaede88c2020-08-11 12:17:01 -07001374 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001375
1376 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001377 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001378 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001379 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001380
Jiyong Park3ff16992019-12-27 14:11:47 +09001381 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001382
1383 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1384 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001385
Colin Crossf61d03d2023-11-02 16:56:39 -07001386 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1387 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001388 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001389
Colin Crossf61d03d2023-11-02 16:56:39 -07001390 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1391 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001392 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001393}
1394
Jooyung Hand3639552019-08-09 12:57:43 +09001395func TestApexWithRuntimeLibsDependency(t *testing.T) {
1396 /*
1397 myapex
1398 |
1399 v (runtime_libs)
1400 mylib ------+------> libfoo [provides stub]
1401 |
1402 `------> libbar
1403 */
Colin Cross1c460562021-02-16 17:55:47 -08001404 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001405 apex {
1406 name: "myapex",
1407 key: "myapex.key",
1408 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001409 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001410 }
1411
1412 apex_key {
1413 name: "myapex.key",
1414 public_key: "testkey.avbpubkey",
1415 private_key: "testkey.pem",
1416 }
1417
1418 cc_library {
1419 name: "mylib",
1420 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001421 static_libs: ["libstatic"],
1422 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001423 runtime_libs: ["libfoo", "libbar"],
1424 system_shared_libs: [],
1425 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001426 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001427 }
1428
1429 cc_library {
1430 name: "libfoo",
1431 srcs: ["mylib.cpp"],
1432 system_shared_libs: [],
1433 stl: "none",
1434 stubs: {
1435 versions: ["10", "20", "30"],
1436 },
1437 }
1438
1439 cc_library {
1440 name: "libbar",
1441 srcs: ["mylib.cpp"],
1442 system_shared_libs: [],
1443 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001444 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001445 }
1446
Liz Kammer5f108fa2023-05-11 14:33:17 -04001447 cc_library {
1448 name: "libstatic",
1449 srcs: ["mylib.cpp"],
1450 system_shared_libs: [],
1451 stl: "none",
1452 apex_available: [ "myapex" ],
1453 runtime_libs: ["libstatic_to_runtime"],
1454 }
1455
1456 cc_library {
1457 name: "libshared",
1458 srcs: ["mylib.cpp"],
1459 system_shared_libs: [],
1460 stl: "none",
1461 apex_available: [ "myapex" ],
1462 runtime_libs: ["libshared_to_runtime"],
1463 }
1464
1465 cc_library {
1466 name: "libstatic_to_runtime",
1467 srcs: ["mylib.cpp"],
1468 system_shared_libs: [],
1469 stl: "none",
1470 apex_available: [ "myapex" ],
1471 }
1472
1473 cc_library {
1474 name: "libshared_to_runtime",
1475 srcs: ["mylib.cpp"],
1476 system_shared_libs: [],
1477 stl: "none",
1478 apex_available: [ "myapex" ],
1479 }
Jooyung Hand3639552019-08-09 12:57:43 +09001480 `)
1481
Jooyung Hana0503a52023-08-23 13:12:50 +09001482 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001483 copyCmds := apexRule.Args["copy_commands"]
1484
1485 // Ensure that direct non-stubs dep is always included
1486 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1487
1488 // Ensure that indirect stubs dep is not included
1489 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1490
1491 // Ensure that runtime_libs dep in included
1492 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001493 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1494 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1495
1496 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001497
Jooyung Hana0503a52023-08-23 13:12:50 +09001498 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001499 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1500 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001501}
1502
Paul Duffina02cae32021-03-09 01:44:06 +00001503var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1504 cc.PrepareForTestWithCcBuildComponents,
1505 PrepareForTestWithApexBuildComponents,
1506 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001507 apex {
1508 name: "com.android.runtime",
1509 key: "com.android.runtime.key",
1510 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001511 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001512 }
1513
1514 apex_key {
1515 name: "com.android.runtime.key",
1516 public_key: "testkey.avbpubkey",
1517 private_key: "testkey.pem",
1518 }
Paul Duffina02cae32021-03-09 01:44:06 +00001519 `),
1520 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1521)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522
Paul Duffina02cae32021-03-09 01:44:06 +00001523func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001524 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001525 cc_library {
1526 name: "libc",
1527 no_libcrt: true,
1528 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001529 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001530 stl: "none",
1531 system_shared_libs: [],
1532 stubs: { versions: ["1"] },
1533 apex_available: ["com.android.runtime"],
1534
1535 sanitize: {
1536 hwaddress: true,
1537 }
1538 }
1539
1540 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001541 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001542 no_libcrt: true,
1543 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001544 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001545 stl: "none",
1546 system_shared_libs: [],
1547 srcs: [""],
1548 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001549 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001550
1551 sanitize: {
1552 never: true,
1553 },
Spandan Das4de7b492023-05-05 21:13:01 +00001554 apex_available: [
1555 "//apex_available:anyapex",
1556 "//apex_available:platform",
1557 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001558 } `)
1559 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001560
Jooyung Hana0503a52023-08-23 13:12:50 +09001561 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562 "lib64/bionic/libc.so",
1563 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1564 })
1565
Colin Cross4c4c1be2022-02-10 11:41:18 -08001566 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001567
1568 installed := hwasan.Description("install libclang_rt.hwasan")
1569 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1570
1571 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1572 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1573 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1574}
1575
1576func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001577 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001578 prepareForTestOfRuntimeApexWithHwasan,
1579 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1580 variables.SanitizeDevice = []string{"hwaddress"}
1581 }),
1582 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 cc_library {
1584 name: "libc",
1585 no_libcrt: true,
1586 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001587 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588 stl: "none",
1589 system_shared_libs: [],
1590 stubs: { versions: ["1"] },
1591 apex_available: ["com.android.runtime"],
1592 }
1593
1594 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001595 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001596 no_libcrt: true,
1597 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001598 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001599 stl: "none",
1600 system_shared_libs: [],
1601 srcs: [""],
1602 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001603 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001604
1605 sanitize: {
1606 never: true,
1607 },
Spandan Das4de7b492023-05-05 21:13:01 +00001608 apex_available: [
1609 "//apex_available:anyapex",
1610 "//apex_available:platform",
1611 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001612 }
Paul Duffina02cae32021-03-09 01:44:06 +00001613 `)
1614 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001615
Jooyung Hana0503a52023-08-23 13:12:50 +09001616 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001617 "lib64/bionic/libc.so",
1618 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1619 })
1620
Colin Cross4c4c1be2022-02-10 11:41:18 -08001621 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001622
1623 installed := hwasan.Description("install libclang_rt.hwasan")
1624 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1625
1626 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1627 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1628 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1629}
1630
Jooyung Han61b66e92020-03-21 14:21:46 +00001631func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1632 testcases := []struct {
1633 name string
1634 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001635 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001636 shouldLink string
1637 shouldNotLink []string
1638 }{
1639 {
Jiyong Park55549df2021-02-26 23:57:23 +09001640 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001641 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001642 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001643 shouldLink: "current",
1644 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001645 },
1646 {
Jiyong Park55549df2021-02-26 23:57:23 +09001647 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001648 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001649 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001650 shouldLink: "current",
1651 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001652 },
1653 }
1654 for _, tc := range testcases {
1655 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001656 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001657 apex {
1658 name: "myapex",
1659 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001660 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001661 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001662 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001663 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001664
Jooyung Han61b66e92020-03-21 14:21:46 +00001665 apex_key {
1666 name: "myapex.key",
1667 public_key: "testkey.avbpubkey",
1668 private_key: "testkey.pem",
1669 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001670
Jooyung Han61b66e92020-03-21 14:21:46 +00001671 cc_library {
1672 name: "mylib",
1673 srcs: ["mylib.cpp"],
1674 vendor_available: true,
1675 shared_libs: ["libbar"],
1676 system_shared_libs: [],
1677 stl: "none",
1678 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001679 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001680 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001681
Jooyung Han61b66e92020-03-21 14:21:46 +00001682 cc_library {
1683 name: "libbar",
1684 srcs: ["mylib.cpp"],
1685 system_shared_libs: [],
1686 stl: "none",
1687 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001688 llndk: {
1689 symbol_file: "libbar.map.txt",
1690 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001691 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001692 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001693 withUnbundledBuild,
1694 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001695
Jooyung Han61b66e92020-03-21 14:21:46 +00001696 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001697 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 "lib64/mylib.so",
1699 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001700
Jooyung Han61b66e92020-03-21 14:21:46 +00001701 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001702 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001703 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1704 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001705
Steven Moreland2c4000c2021-04-27 02:08:49 +00001706 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1707 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001708 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001709 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001711
Steven Moreland2c4000c2021-04-27 02:08:49 +00001712 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001713 ver := tc.shouldLink
1714 if tc.shouldLink == "current" {
1715 ver = strconv.Itoa(android.FutureApiLevelInt)
1716 }
1717 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001718 })
1719 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001720}
1721
Jiyong Park25fc6a92018-11-18 18:02:45 +09001722func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001723 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001724 apex {
1725 name: "myapex",
1726 key: "myapex.key",
1727 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001728 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001729 }
1730
1731 apex_key {
1732 name: "myapex.key",
1733 public_key: "testkey.avbpubkey",
1734 private_key: "testkey.pem",
1735 }
1736
1737 cc_library {
1738 name: "mylib",
1739 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001740 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001741 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_shared {
1747 name: "mylib_shared",
1748 srcs: ["mylib.cpp"],
1749 shared_libs: ["libdl#27"],
1750 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001751 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001752 }
1753
1754 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001755 name: "libBootstrap",
1756 srcs: ["mylib.cpp"],
1757 stl: "none",
1758 bootstrap: true,
1759 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001760 `)
1761
Jooyung Hana0503a52023-08-23 13:12:50 +09001762 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001763 copyCmds := apexRule.Args["copy_commands"]
1764
1765 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001766 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001767 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1768 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001769
1770 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001771 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001772
Colin Crossaede88c2020-08-11 12:17:01 -07001773 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1774 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1775 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001776
1777 // For dependency to libc
1778 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001779 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001780 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001781 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001782 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001783 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1784 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001785
1786 // For dependency to libm
1787 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001788 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001789 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001790 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 // ... and is not compiling with the stub
1792 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1793 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1794
1795 // For dependency to libdl
1796 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001797 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001798 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001799 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1800 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001801 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001802 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001803 // ... Cflags from stub is correctly exported to mylib
1804 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1805 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001806
1807 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001808 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1809 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1810 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1811 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001812}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001813
Jooyung Han749dc692020-04-15 11:03:39 +09001814func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001815 // there are three links between liba --> libz.
1816 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001817 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001818 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001819 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001820 apex {
1821 name: "myapex",
1822 key: "myapex.key",
1823 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001824 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001825 }
1826
1827 apex {
1828 name: "otherapex",
1829 key: "myapex.key",
1830 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001831 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001832 }
1833
1834 apex_key {
1835 name: "myapex.key",
1836 public_key: "testkey.avbpubkey",
1837 private_key: "testkey.pem",
1838 }
1839
1840 cc_library {
1841 name: "libx",
1842 shared_libs: ["liba"],
1843 system_shared_libs: [],
1844 stl: "none",
1845 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001846 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001847 }
1848
1849 cc_library {
1850 name: "liby",
1851 shared_libs: ["liba"],
1852 system_shared_libs: [],
1853 stl: "none",
1854 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001855 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001856 }
1857
1858 cc_library {
1859 name: "liba",
1860 shared_libs: ["libz"],
1861 system_shared_libs: [],
1862 stl: "none",
1863 apex_available: [
1864 "//apex_available:anyapex",
1865 "//apex_available:platform",
1866 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001867 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001868 }
1869
1870 cc_library {
1871 name: "libz",
1872 system_shared_libs: [],
1873 stl: "none",
1874 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001875 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001876 },
1877 }
Jooyung Han749dc692020-04-15 11:03:39 +09001878 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001879
1880 expectLink := func(from, from_variant, to, to_variant string) {
1881 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1882 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1883 }
1884 expectNoLink := func(from, from_variant, to, to_variant string) {
1885 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1886 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1887 }
1888 // platform liba is linked to non-stub version
1889 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001890 // liba in myapex is linked to current
1891 expectLink("liba", "shared_apex29", "libz", "shared_current")
1892 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001893 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001894 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001895 // liba in otherapex is linked to current
1896 expectLink("liba", "shared_apex30", "libz", "shared_current")
1897 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001898 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1899 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001900}
1901
Jooyung Hanaed150d2020-04-02 01:41:41 +09001902func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001903 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001904 apex {
1905 name: "myapex",
1906 key: "myapex.key",
1907 native_shared_libs: ["libx"],
1908 min_sdk_version: "R",
1909 }
1910
1911 apex_key {
1912 name: "myapex.key",
1913 public_key: "testkey.avbpubkey",
1914 private_key: "testkey.pem",
1915 }
1916
1917 cc_library {
1918 name: "libx",
1919 shared_libs: ["libz"],
1920 system_shared_libs: [],
1921 stl: "none",
1922 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001923 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001924 }
1925
1926 cc_library {
1927 name: "libz",
1928 system_shared_libs: [],
1929 stl: "none",
1930 stubs: {
1931 versions: ["29", "R"],
1932 },
1933 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001934 `,
1935 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1936 variables.Platform_version_active_codenames = []string{"R"}
1937 }),
1938 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001939
1940 expectLink := func(from, from_variant, to, to_variant string) {
1941 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1942 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1943 }
1944 expectNoLink := func(from, from_variant, to, to_variant string) {
1945 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1946 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1947 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001948 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1949 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001950 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1951 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001952}
1953
Jooyung Han4c4da062021-06-23 10:23:16 +09001954func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1955 testApex(t, `
1956 apex {
1957 name: "myapex",
1958 key: "myapex.key",
1959 java_libs: ["libx"],
1960 min_sdk_version: "S",
1961 }
1962
1963 apex_key {
1964 name: "myapex.key",
1965 public_key: "testkey.avbpubkey",
1966 private_key: "testkey.pem",
1967 }
1968
1969 java_library {
1970 name: "libx",
1971 srcs: ["a.java"],
1972 apex_available: [ "myapex" ],
1973 sdk_version: "current",
1974 min_sdk_version: "S", // should be okay
1975 }
1976 `,
1977 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1978 variables.Platform_version_active_codenames = []string{"S"}
1979 variables.Platform_sdk_codename = proptools.StringPtr("S")
1980 }),
1981 )
1982}
1983
Jooyung Han749dc692020-04-15 11:03:39 +09001984func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001985 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001986 apex {
1987 name: "myapex",
1988 key: "myapex.key",
1989 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001990 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001991 }
1992
1993 apex_key {
1994 name: "myapex.key",
1995 public_key: "testkey.avbpubkey",
1996 private_key: "testkey.pem",
1997 }
1998
1999 cc_library {
2000 name: "libx",
2001 shared_libs: ["libz"],
2002 system_shared_libs: [],
2003 stl: "none",
2004 apex_available: [ "myapex" ],
2005 }
2006
2007 cc_library {
2008 name: "libz",
2009 system_shared_libs: [],
2010 stl: "none",
2011 stubs: {
2012 versions: ["1", "2"],
2013 },
2014 }
2015 `)
2016
2017 expectLink := func(from, from_variant, to, to_variant string) {
2018 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2019 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2020 }
2021 expectNoLink := func(from, from_variant, to, to_variant string) {
2022 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2023 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2024 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002025 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002026 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002027 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002028 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002029}
2030
Jooyung Handfc864c2023-03-20 18:19:07 +09002031func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002032 ctx := testApex(t, `
2033 apex {
2034 name: "myapex",
2035 key: "myapex.key",
2036 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002037 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002038 vendor: true,
2039 min_sdk_version: "29",
2040 }
2041
2042 apex_key {
2043 name: "myapex.key",
2044 public_key: "testkey.avbpubkey",
2045 private_key: "testkey.pem",
2046 }
2047
2048 cc_library {
2049 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002050 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002051 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002052 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002053 shared_libs: ["libbar"],
2054 }
2055
2056 cc_library {
2057 name: "libbar",
2058 stubs: { versions: ["29", "30"] },
2059 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002060 }
2061 `)
2062
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002063 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002064
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002065 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002066
2067 // Ensure that mylib links with "current" LLNDK
2068 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002069 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002070
2071 // Ensure that mylib is targeting 29
2072 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2073 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2074
2075 // Ensure that the correct variant of crtbegin_so is used.
2076 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2077 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002078
2079 // Ensure that the crtbegin_so used by the APEX is targeting 29
2080 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2081 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2082}
2083
Jooyung Han4495f842023-04-25 16:39:59 +09002084func TestTrackAllowedDeps(t *testing.T) {
2085 ctx := testApex(t, `
2086 apex {
2087 name: "myapex",
2088 key: "myapex.key",
2089 updatable: true,
2090 native_shared_libs: [
2091 "mylib",
2092 "yourlib",
2093 ],
2094 min_sdk_version: "29",
2095 }
2096
2097 apex {
2098 name: "myapex2",
2099 key: "myapex.key",
2100 updatable: false,
2101 native_shared_libs: ["yourlib"],
2102 }
2103
2104 apex_key {
2105 name: "myapex.key",
2106 public_key: "testkey.avbpubkey",
2107 private_key: "testkey.pem",
2108 }
2109
2110 cc_library {
2111 name: "mylib",
2112 srcs: ["mylib.cpp"],
2113 shared_libs: ["libbar"],
2114 min_sdk_version: "29",
2115 apex_available: ["myapex"],
2116 }
2117
2118 cc_library {
2119 name: "libbar",
2120 stubs: { versions: ["29", "30"] },
2121 }
2122
2123 cc_library {
2124 name: "yourlib",
2125 srcs: ["mylib.cpp"],
2126 min_sdk_version: "29",
2127 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2128 }
2129 `, withFiles(android.MockFS{
2130 "packages/modules/common/build/allowed_deps.txt": nil,
2131 }))
2132
2133 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2134 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2135 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002136 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002137 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002138 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002139
Jooyung Hana0503a52023-08-23 13:12:50 +09002140 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002141 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2142 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002143 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2144 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2145 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2146 flatlist, "mylib:(minSdkVersion:29)")
2147 android.AssertStringListContains(t, "track platform-available lib",
2148 flatlist, "yourlib(minSdkVersion:29)")
2149}
2150
2151func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2152 ctx := testApex(t, `
2153 apex {
2154 name: "myapex",
2155 key: "myapex.key",
2156 updatable: true,
2157 min_sdk_version: "29",
2158 }
2159
2160 apex_key {
2161 name: "myapex.key",
2162 public_key: "testkey.avbpubkey",
2163 private_key: "testkey.pem",
2164 }
2165 `)
2166 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2167 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2168 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2169 }
2170}
2171
Jooyung Han03b51852020-02-26 22:45:42 +09002172func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002173 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002174 apex {
2175 name: "myapex",
2176 key: "myapex.key",
2177 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002178 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002179 }
2180
2181 apex_key {
2182 name: "myapex.key",
2183 public_key: "testkey.avbpubkey",
2184 private_key: "testkey.pem",
2185 }
2186
2187 cc_library {
2188 name: "libx",
2189 system_shared_libs: [],
2190 stl: "none",
2191 apex_available: [ "myapex" ],
2192 stubs: {
2193 versions: ["1", "2"],
2194 },
2195 }
2196
2197 cc_library {
2198 name: "libz",
2199 shared_libs: ["libx"],
2200 system_shared_libs: [],
2201 stl: "none",
2202 }
2203 `)
2204
2205 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002206 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002207 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2208 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2209 }
2210 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002211 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002212 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2213 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2214 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002215 expectLink("libz", "shared", "libx", "shared_current")
2216 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002217 expectNoLink("libz", "shared", "libz", "shared_1")
2218 expectNoLink("libz", "shared", "libz", "shared")
2219}
2220
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002221var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2222 func(variables android.FixtureProductVariables) {
2223 variables.SanitizeDevice = []string{"hwaddress"}
2224 },
2225)
2226
Jooyung Han75568392020-03-20 04:29:24 +09002227func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002228 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002229 apex {
2230 name: "myapex",
2231 key: "myapex.key",
2232 native_shared_libs: ["libx"],
2233 min_sdk_version: "29",
2234 }
2235
2236 apex_key {
2237 name: "myapex.key",
2238 public_key: "testkey.avbpubkey",
2239 private_key: "testkey.pem",
2240 }
2241
2242 cc_library {
2243 name: "libx",
2244 shared_libs: ["libbar"],
2245 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002246 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002247 }
2248
2249 cc_library {
2250 name: "libbar",
2251 stubs: {
2252 versions: ["29", "30"],
2253 },
2254 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002255 `,
2256 prepareForTestWithSantitizeHwaddress,
2257 )
Jooyung Han03b51852020-02-26 22:45:42 +09002258 expectLink := func(from, from_variant, to, to_variant string) {
2259 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2260 libFlags := ld.Args["libFlags"]
2261 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2262 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002263 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002264}
2265
Jooyung Han75568392020-03-20 04:29:24 +09002266func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002267 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002268 apex {
2269 name: "myapex",
2270 key: "myapex.key",
2271 native_shared_libs: ["libx"],
2272 min_sdk_version: "29",
2273 }
2274
2275 apex_key {
2276 name: "myapex.key",
2277 public_key: "testkey.avbpubkey",
2278 private_key: "testkey.pem",
2279 }
2280
2281 cc_library {
2282 name: "libx",
2283 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002284 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002285 }
Jooyung Han75568392020-03-20 04:29:24 +09002286 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002287
2288 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002289 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002290 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002291 // note that platform variant is not.
2292 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002293 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002294}
2295
Jooyung Han749dc692020-04-15 11:03:39 +09002296func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2297 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002298 apex {
2299 name: "myapex",
2300 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002301 native_shared_libs: ["mylib"],
2302 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002303 }
2304
2305 apex_key {
2306 name: "myapex.key",
2307 public_key: "testkey.avbpubkey",
2308 private_key: "testkey.pem",
2309 }
Jooyung Han749dc692020-04-15 11:03:39 +09002310
2311 cc_library {
2312 name: "mylib",
2313 srcs: ["mylib.cpp"],
2314 system_shared_libs: [],
2315 stl: "none",
2316 apex_available: [
2317 "myapex",
2318 ],
2319 min_sdk_version: "30",
2320 }
2321 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002322
2323 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2324 apex {
2325 name: "myapex",
2326 key: "myapex.key",
2327 native_shared_libs: ["libfoo.ffi"],
2328 min_sdk_version: "29",
2329 }
2330
2331 apex_key {
2332 name: "myapex.key",
2333 public_key: "testkey.avbpubkey",
2334 private_key: "testkey.pem",
2335 }
2336
2337 rust_ffi_shared {
2338 name: "libfoo.ffi",
2339 srcs: ["foo.rs"],
2340 crate_name: "foo",
2341 apex_available: [
2342 "myapex",
2343 ],
2344 min_sdk_version: "30",
2345 }
2346 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002347
2348 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2349 apex {
2350 name: "myapex",
2351 key: "myapex.key",
2352 java_libs: ["libfoo"],
2353 min_sdk_version: "29",
2354 }
2355
2356 apex_key {
2357 name: "myapex.key",
2358 public_key: "testkey.avbpubkey",
2359 private_key: "testkey.pem",
2360 }
2361
2362 java_import {
2363 name: "libfoo",
2364 jars: ["libfoo.jar"],
2365 apex_available: [
2366 "myapex",
2367 ],
2368 min_sdk_version: "30",
2369 }
2370 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002371
2372 // Skip check for modules compiling against core API surface
2373 testApex(t, `
2374 apex {
2375 name: "myapex",
2376 key: "myapex.key",
2377 java_libs: ["libfoo"],
2378 min_sdk_version: "29",
2379 }
2380
2381 apex_key {
2382 name: "myapex.key",
2383 public_key: "testkey.avbpubkey",
2384 private_key: "testkey.pem",
2385 }
2386
2387 java_library {
2388 name: "libfoo",
2389 srcs: ["Foo.java"],
2390 apex_available: [
2391 "myapex",
2392 ],
2393 // Compile against core API surface
2394 sdk_version: "core_current",
2395 min_sdk_version: "30",
2396 }
2397 `)
2398
Jooyung Han749dc692020-04-15 11:03:39 +09002399}
2400
2401func TestApexMinSdkVersion_Okay(t *testing.T) {
2402 testApex(t, `
2403 apex {
2404 name: "myapex",
2405 key: "myapex.key",
2406 native_shared_libs: ["libfoo"],
2407 java_libs: ["libbar"],
2408 min_sdk_version: "29",
2409 }
2410
2411 apex_key {
2412 name: "myapex.key",
2413 public_key: "testkey.avbpubkey",
2414 private_key: "testkey.pem",
2415 }
2416
2417 cc_library {
2418 name: "libfoo",
2419 srcs: ["mylib.cpp"],
2420 shared_libs: ["libfoo_dep"],
2421 apex_available: ["myapex"],
2422 min_sdk_version: "29",
2423 }
2424
2425 cc_library {
2426 name: "libfoo_dep",
2427 srcs: ["mylib.cpp"],
2428 apex_available: ["myapex"],
2429 min_sdk_version: "29",
2430 }
2431
2432 java_library {
2433 name: "libbar",
2434 sdk_version: "current",
2435 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002436 static_libs: [
2437 "libbar_dep",
2438 "libbar_import_dep",
2439 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002440 apex_available: ["myapex"],
2441 min_sdk_version: "29",
2442 }
2443
2444 java_library {
2445 name: "libbar_dep",
2446 sdk_version: "current",
2447 srcs: ["a.java"],
2448 apex_available: ["myapex"],
2449 min_sdk_version: "29",
2450 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002451
2452 java_import {
2453 name: "libbar_import_dep",
2454 jars: ["libbar.jar"],
2455 apex_available: ["myapex"],
2456 min_sdk_version: "29",
2457 }
Jooyung Han03b51852020-02-26 22:45:42 +09002458 `)
2459}
2460
Colin Cross8ca61c12022-10-06 21:00:14 -07002461func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2462 // Tests that an apex dependency with min_sdk_version higher than the
2463 // min_sdk_version of the apex is allowed as long as the dependency's
2464 // min_sdk_version is less than or equal to the api level that the
2465 // architecture was introduced in. In this case, arm64 didn't exist
2466 // until api level 21, so the arm64 code will never need to run on
2467 // an api level 20 device, even if other architectures of the apex
2468 // will.
2469 testApex(t, `
2470 apex {
2471 name: "myapex",
2472 key: "myapex.key",
2473 native_shared_libs: ["libfoo"],
2474 min_sdk_version: "20",
2475 }
2476
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482
2483 cc_library {
2484 name: "libfoo",
2485 srcs: ["mylib.cpp"],
2486 apex_available: ["myapex"],
2487 min_sdk_version: "21",
2488 stl: "none",
2489 }
2490 `)
2491}
2492
Artur Satayev8cf899a2020-04-15 17:29:42 +01002493func TestJavaStableSdkVersion(t *testing.T) {
2494 testCases := []struct {
2495 name string
2496 expectedError string
2497 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002498 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002499 }{
2500 {
2501 name: "Non-updatable apex with non-stable dep",
2502 bp: `
2503 apex {
2504 name: "myapex",
2505 java_libs: ["myjar"],
2506 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002507 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002508 }
2509 apex_key {
2510 name: "myapex.key",
2511 public_key: "testkey.avbpubkey",
2512 private_key: "testkey.pem",
2513 }
2514 java_library {
2515 name: "myjar",
2516 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002517 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002518 apex_available: ["myapex"],
2519 }
2520 `,
2521 },
2522 {
2523 name: "Updatable apex with stable dep",
2524 bp: `
2525 apex {
2526 name: "myapex",
2527 java_libs: ["myjar"],
2528 key: "myapex.key",
2529 updatable: true,
2530 min_sdk_version: "29",
2531 }
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537 java_library {
2538 name: "myjar",
2539 srcs: ["foo/bar/MyClass.java"],
2540 sdk_version: "current",
2541 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002542 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002543 }
2544 `,
2545 },
2546 {
2547 name: "Updatable apex with non-stable dep",
2548 expectedError: "cannot depend on \"myjar\"",
2549 bp: `
2550 apex {
2551 name: "myapex",
2552 java_libs: ["myjar"],
2553 key: "myapex.key",
2554 updatable: true,
2555 }
2556 apex_key {
2557 name: "myapex.key",
2558 public_key: "testkey.avbpubkey",
2559 private_key: "testkey.pem",
2560 }
2561 java_library {
2562 name: "myjar",
2563 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002564 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002565 apex_available: ["myapex"],
2566 }
2567 `,
2568 },
2569 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002570 name: "Updatable apex with non-stable legacy core platform dep",
2571 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2572 bp: `
2573 apex {
2574 name: "myapex",
2575 java_libs: ["myjar-uses-legacy"],
2576 key: "myapex.key",
2577 updatable: true,
2578 }
2579 apex_key {
2580 name: "myapex.key",
2581 public_key: "testkey.avbpubkey",
2582 private_key: "testkey.pem",
2583 }
2584 java_library {
2585 name: "myjar-uses-legacy",
2586 srcs: ["foo/bar/MyClass.java"],
2587 sdk_version: "core_platform",
2588 apex_available: ["myapex"],
2589 }
2590 `,
2591 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2592 },
2593 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002594 name: "Updatable apex with non-stable transitive dep",
2595 // This is not actually detecting that the transitive dependency is unstable, rather it is
2596 // detecting that the transitive dependency is building against a wider API surface than the
2597 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002598 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002599 bp: `
2600 apex {
2601 name: "myapex",
2602 java_libs: ["myjar"],
2603 key: "myapex.key",
2604 updatable: true,
2605 }
2606 apex_key {
2607 name: "myapex.key",
2608 public_key: "testkey.avbpubkey",
2609 private_key: "testkey.pem",
2610 }
2611 java_library {
2612 name: "myjar",
2613 srcs: ["foo/bar/MyClass.java"],
2614 sdk_version: "current",
2615 apex_available: ["myapex"],
2616 static_libs: ["transitive-jar"],
2617 }
2618 java_library {
2619 name: "transitive-jar",
2620 srcs: ["foo/bar/MyClass.java"],
2621 sdk_version: "core_platform",
2622 apex_available: ["myapex"],
2623 }
2624 `,
2625 },
2626 }
2627
2628 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002629 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2630 continue
2631 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002632 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002633 errorHandler := android.FixtureExpectsNoErrors
2634 if test.expectedError != "" {
2635 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002636 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002637 android.GroupFixturePreparers(
2638 java.PrepareForTestWithJavaDefaultModules,
2639 PrepareForTestWithApexBuildComponents,
2640 prepareForTestWithMyapex,
2641 android.OptionalFixturePreparer(test.preparer),
2642 ).
2643 ExtendWithErrorHandler(errorHandler).
2644 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002645 })
2646 }
2647}
2648
Jooyung Han749dc692020-04-15 11:03:39 +09002649func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2650 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2651 apex {
2652 name: "myapex",
2653 key: "myapex.key",
2654 native_shared_libs: ["mylib"],
2655 min_sdk_version: "29",
2656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 srcs: ["mylib.cpp"],
2667 shared_libs: ["mylib2"],
2668 system_shared_libs: [],
2669 stl: "none",
2670 apex_available: [
2671 "myapex",
2672 ],
2673 min_sdk_version: "29",
2674 }
2675
2676 // indirect part of the apex
2677 cc_library {
2678 name: "mylib2",
2679 srcs: ["mylib.cpp"],
2680 system_shared_libs: [],
2681 stl: "none",
2682 apex_available: [
2683 "myapex",
2684 ],
2685 min_sdk_version: "30",
2686 }
2687 `)
2688}
2689
2690func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2691 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2692 apex {
2693 name: "myapex",
2694 key: "myapex.key",
2695 apps: ["AppFoo"],
2696 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002697 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002698 }
2699
2700 apex_key {
2701 name: "myapex.key",
2702 public_key: "testkey.avbpubkey",
2703 private_key: "testkey.pem",
2704 }
2705
2706 android_app {
2707 name: "AppFoo",
2708 srcs: ["foo/bar/MyClass.java"],
2709 sdk_version: "current",
2710 min_sdk_version: "29",
2711 system_modules: "none",
2712 stl: "none",
2713 static_libs: ["bar"],
2714 apex_available: [ "myapex" ],
2715 }
2716
2717 java_library {
2718 name: "bar",
2719 sdk_version: "current",
2720 srcs: ["a.java"],
2721 apex_available: [ "myapex" ],
2722 }
2723 `)
2724}
2725
2726func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002727 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002728 apex {
2729 name: "myapex",
2730 key: "myapex.key",
2731 native_shared_libs: ["mylib"],
2732 min_sdk_version: "29",
2733 }
2734
2735 apex_key {
2736 name: "myapex.key",
2737 public_key: "testkey.avbpubkey",
2738 private_key: "testkey.pem",
2739 }
2740
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002741 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002742 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2743 cc_library {
2744 name: "mylib",
2745 srcs: ["mylib.cpp"],
2746 shared_libs: ["mylib2"],
2747 system_shared_libs: [],
2748 stl: "none",
2749 apex_available: ["myapex", "otherapex"],
2750 min_sdk_version: "29",
2751 }
2752
2753 cc_library {
2754 name: "mylib2",
2755 srcs: ["mylib.cpp"],
2756 system_shared_libs: [],
2757 stl: "none",
2758 apex_available: ["otherapex"],
2759 stubs: { versions: ["29", "30"] },
2760 min_sdk_version: "30",
2761 }
2762
2763 apex {
2764 name: "otherapex",
2765 key: "myapex.key",
2766 native_shared_libs: ["mylib", "mylib2"],
2767 min_sdk_version: "30",
2768 }
2769 `)
2770 expectLink := func(from, from_variant, to, to_variant string) {
2771 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2772 libFlags := ld.Args["libFlags"]
2773 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2774 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002775 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002776 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002777}
2778
Jooyung Haned124c32021-01-26 11:43:46 +09002779func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002780 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2781 func(variables android.FixtureProductVariables) {
2782 variables.Platform_sdk_codename = proptools.StringPtr("S")
2783 variables.Platform_version_active_codenames = []string{"S"}
2784 },
2785 )
Jooyung Haned124c32021-01-26 11:43:46 +09002786 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2787 apex {
2788 name: "myapex",
2789 key: "myapex.key",
2790 native_shared_libs: ["libfoo"],
2791 min_sdk_version: "S",
2792 }
2793 apex_key {
2794 name: "myapex.key",
2795 public_key: "testkey.avbpubkey",
2796 private_key: "testkey.pem",
2797 }
2798 cc_library {
2799 name: "libfoo",
2800 shared_libs: ["libbar"],
2801 apex_available: ["myapex"],
2802 min_sdk_version: "29",
2803 }
2804 cc_library {
2805 name: "libbar",
2806 apex_available: ["myapex"],
2807 }
2808 `, withSAsActiveCodeNames)
2809}
2810
2811func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002812 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2813 variables.Platform_sdk_codename = proptools.StringPtr("S")
2814 variables.Platform_version_active_codenames = []string{"S", "T"}
2815 })
Colin Cross1c460562021-02-16 17:55:47 -08002816 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002817 apex {
2818 name: "myapex",
2819 key: "myapex.key",
2820 native_shared_libs: ["libfoo"],
2821 min_sdk_version: "S",
2822 }
2823 apex_key {
2824 name: "myapex.key",
2825 public_key: "testkey.avbpubkey",
2826 private_key: "testkey.pem",
2827 }
2828 cc_library {
2829 name: "libfoo",
2830 shared_libs: ["libbar"],
2831 apex_available: ["myapex"],
2832 min_sdk_version: "S",
2833 }
2834 cc_library {
2835 name: "libbar",
2836 stubs: {
2837 symbol_file: "libbar.map.txt",
2838 versions: ["30", "S", "T"],
2839 },
2840 }
2841 `, withSAsActiveCodeNames)
2842
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002843 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002844 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2845 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002846 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002847}
2848
Jiyong Park7c2ee712018-12-07 00:42:25 +09002849func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002850 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002851 apex {
2852 name: "myapex",
2853 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002854 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002855 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002856 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002857 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002858 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002859 }
2860
2861 apex_key {
2862 name: "myapex.key",
2863 public_key: "testkey.avbpubkey",
2864 private_key: "testkey.pem",
2865 }
2866
2867 prebuilt_etc {
2868 name: "myetc",
2869 src: "myprebuilt",
2870 sub_dir: "foo/bar",
2871 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002872
2873 cc_library {
2874 name: "mylib",
2875 srcs: ["mylib.cpp"],
2876 relative_install_path: "foo/bar",
2877 system_shared_libs: [],
2878 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002879 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002880 }
2881
2882 cc_binary {
2883 name: "mybin",
2884 srcs: ["mylib.cpp"],
2885 relative_install_path: "foo/bar",
2886 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002887 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002888 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002889 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002890
2891 rust_binary {
2892 name: "mybin.rust",
2893 srcs: ["foo.rs"],
2894 relative_install_path: "rust_subdir",
2895 apex_available: [ "myapex" ],
2896 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002897 `)
2898
Jooyung Hana0503a52023-08-23 13:12:50 +09002899 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002900 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002901
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002902 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002903 ensureContains(t, cmd, "/etc ")
2904 ensureContains(t, cmd, "/etc/foo ")
2905 ensureContains(t, cmd, "/etc/foo/bar ")
2906 ensureContains(t, cmd, "/lib64 ")
2907 ensureContains(t, cmd, "/lib64/foo ")
2908 ensureContains(t, cmd, "/lib64/foo/bar ")
2909 ensureContains(t, cmd, "/lib ")
2910 ensureContains(t, cmd, "/lib/foo ")
2911 ensureContains(t, cmd, "/lib/foo/bar ")
2912 ensureContains(t, cmd, "/bin ")
2913 ensureContains(t, cmd, "/bin/foo ")
2914 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002915 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002916}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002917
Jooyung Han35155c42020-02-06 17:33:20 +09002918func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002919 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002920 apex {
2921 name: "myapex",
2922 key: "myapex.key",
2923 multilib: {
2924 both: {
2925 native_shared_libs: ["mylib"],
2926 binaries: ["mybin"],
2927 },
2928 },
2929 compile_multilib: "both",
2930 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002931 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002932 }
2933
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }
2939
2940 cc_library {
2941 name: "mylib",
2942 relative_install_path: "foo/bar",
2943 system_shared_libs: [],
2944 stl: "none",
2945 apex_available: [ "myapex" ],
2946 native_bridge_supported: true,
2947 }
2948
2949 cc_binary {
2950 name: "mybin",
2951 relative_install_path: "foo/bar",
2952 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002953 stl: "none",
2954 apex_available: [ "myapex" ],
2955 native_bridge_supported: true,
2956 compile_multilib: "both", // default is "first" for binary
2957 multilib: {
2958 lib64: {
2959 suffix: "64",
2960 },
2961 },
2962 }
2963 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002964 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002965 "bin/foo/bar/mybin",
2966 "bin/foo/bar/mybin64",
2967 "bin/arm/foo/bar/mybin",
2968 "bin/arm64/foo/bar/mybin64",
2969 "lib/foo/bar/mylib.so",
2970 "lib/arm/foo/bar/mylib.so",
2971 "lib64/foo/bar/mylib.so",
2972 "lib64/arm64/foo/bar/mylib.so",
2973 })
2974}
2975
Jooyung Han85d61762020-06-24 23:50:26 +09002976func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002977 result := android.GroupFixturePreparers(
2978 prepareForApexTest,
2979 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2980 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002981 apex {
2982 name: "myapex",
2983 key: "myapex.key",
2984 binaries: ["mybin"],
2985 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002986 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002987 }
2988 apex_key {
2989 name: "myapex.key",
2990 public_key: "testkey.avbpubkey",
2991 private_key: "testkey.pem",
2992 }
2993 cc_binary {
2994 name: "mybin",
2995 vendor: true,
2996 shared_libs: ["libfoo"],
2997 }
2998 cc_library {
2999 name: "libfoo",
3000 proprietary: true,
3001 }
3002 `)
3003
Jooyung Hana0503a52023-08-23 13:12:50 +09003004 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003005 "bin/mybin",
3006 "lib64/libfoo.so",
3007 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3008 "lib64/libc++.so",
3009 })
3010
Jooyung Hana0503a52023-08-23 13:12:50 +09003011 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003012 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003013 name := apexBundle.BaseModuleName()
3014 prefix := "TARGET_"
3015 var builder strings.Builder
3016 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003017 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003018 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003019 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003020
Jooyung Hana0503a52023-08-23 13:12:50 +09003021 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003022 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3023 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003024}
3025
Justin Yun13decfb2021-03-08 19:25:55 +09003026func TestProductVariant(t *testing.T) {
3027 ctx := testApex(t, `
3028 apex {
3029 name: "myapex",
3030 key: "myapex.key",
3031 updatable: false,
3032 product_specific: true,
3033 binaries: ["foo"],
3034 }
3035
3036 apex_key {
3037 name: "myapex.key",
3038 public_key: "testkey.avbpubkey",
3039 private_key: "testkey.pem",
3040 }
3041
3042 cc_binary {
3043 name: "foo",
3044 product_available: true,
3045 apex_available: ["myapex"],
3046 srcs: ["foo.cpp"],
3047 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003048 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003049
3050 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003051 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003052 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3053 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3054 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3055 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3056}
3057
Jooyung Han8e5685d2020-09-21 11:02:57 +09003058func TestApex_withPrebuiltFirmware(t *testing.T) {
3059 testCases := []struct {
3060 name string
3061 additionalProp string
3062 }{
3063 {"system apex with prebuilt_firmware", ""},
3064 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3065 }
3066 for _, tc := range testCases {
3067 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003068 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003069 apex {
3070 name: "myapex",
3071 key: "myapex.key",
3072 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003073 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003074 `+tc.additionalProp+`
3075 }
3076 apex_key {
3077 name: "myapex.key",
3078 public_key: "testkey.avbpubkey",
3079 private_key: "testkey.pem",
3080 }
3081 prebuilt_firmware {
3082 name: "myfirmware",
3083 src: "myfirmware.bin",
3084 filename_from_src: true,
3085 `+tc.additionalProp+`
3086 }
3087 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003088 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003089 "etc/firmware/myfirmware.bin",
3090 })
3091 })
3092 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003093}
3094
Jooyung Hanefb184e2020-06-25 17:14:25 +09003095func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003096 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003097 apex {
3098 name: "myapex",
3099 key: "myapex.key",
3100 vendor: true,
3101 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003102 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003103 }
3104
3105 apex_key {
3106 name: "myapex.key",
3107 public_key: "testkey.avbpubkey",
3108 private_key: "testkey.pem",
3109 }
3110
3111 cc_library {
3112 name: "mylib",
3113 vendor_available: true,
3114 }
3115 `)
3116
Jooyung Hana0503a52023-08-23 13:12:50 +09003117 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003118 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003119 name := apexBundle.BaseModuleName()
3120 prefix := "TARGET_"
3121 var builder strings.Builder
3122 data.Custom(&builder, name, prefix, "", data)
3123 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003124 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 +09003125}
3126
Jooyung Han2ed99d02020-06-24 23:26:26 +09003127func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003128 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003129 apex {
3130 name: "myapex",
3131 key: "myapex.key",
3132 vintf_fragments: ["fragment.xml"],
3133 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003134 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003135 }
3136 apex_key {
3137 name: "myapex.key",
3138 public_key: "testkey.avbpubkey",
3139 private_key: "testkey.pem",
3140 }
3141 cc_binary {
3142 name: "mybin",
3143 }
3144 `)
3145
Jooyung Hana0503a52023-08-23 13:12:50 +09003146 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003147 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003148 name := apexBundle.BaseModuleName()
3149 prefix := "TARGET_"
3150 var builder strings.Builder
3151 data.Custom(&builder, name, prefix, "", data)
3152 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003153 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003154 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003155}
3156
Jiyong Park16e91a02018-12-20 18:18:08 +09003157func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003158 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003159 apex {
3160 name: "myapex",
3161 key: "myapex.key",
3162 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003163 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003164 }
3165
3166 apex_key {
3167 name: "myapex.key",
3168 public_key: "testkey.avbpubkey",
3169 private_key: "testkey.pem",
3170 }
3171
3172 cc_library {
3173 name: "mylib",
3174 srcs: ["mylib.cpp"],
3175 system_shared_libs: [],
3176 stl: "none",
3177 stubs: {
3178 versions: ["1", "2", "3"],
3179 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003180 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003181 }
3182
3183 cc_binary {
3184 name: "not_in_apex",
3185 srcs: ["mylib.cpp"],
3186 static_libs: ["mylib"],
3187 static_executable: true,
3188 system_shared_libs: [],
3189 stl: "none",
3190 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003191 `)
3192
Colin Cross7113d202019-11-20 16:39:12 -08003193 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003194
3195 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003196 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003197}
Jiyong Park9335a262018-12-24 11:31:58 +09003198
3199func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003201 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003202 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003203 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003204 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003205 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003206 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003207 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003208 }
3209
3210 cc_library {
3211 name: "mylib",
3212 srcs: ["mylib.cpp"],
3213 system_shared_libs: [],
3214 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003215 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003216 }
3217
3218 apex_key {
3219 name: "myapex.key",
3220 public_key: "testkey.avbpubkey",
3221 private_key: "testkey.pem",
3222 }
3223
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003224 android_app_certificate {
3225 name: "myapex.certificate",
3226 certificate: "testkey",
3227 }
3228
3229 android_app_certificate {
3230 name: "myapex.certificate.override",
3231 certificate: "testkey.override",
3232 }
3233
Jiyong Park9335a262018-12-24 11:31:58 +09003234 `)
3235
3236 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003237 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003238
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003239 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3240 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003241 "vendor/foo/devkeys/testkey.avbpubkey")
3242 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003243 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3244 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003245 "vendor/foo/devkeys/testkey.pem")
3246 }
3247
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003248 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003249 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003250 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003251 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003252 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003253 }
3254}
Jiyong Park58e364a2019-01-19 19:24:06 +09003255
Jooyung Hanf121a652019-12-17 14:30:11 +09003256func TestCertificate(t *testing.T) {
3257 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003258 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003259 apex {
3260 name: "myapex",
3261 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003262 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003263 }
3264 apex_key {
3265 name: "myapex.key",
3266 public_key: "testkey.avbpubkey",
3267 private_key: "testkey.pem",
3268 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003269 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003270 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3271 if actual := rule.Args["certificates"]; actual != expected {
3272 t.Errorf("certificates should be %q, not %q", expected, actual)
3273 }
3274 })
3275 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003276 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003277 apex {
3278 name: "myapex_keytest",
3279 key: "myapex.key",
3280 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003281 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003282 }
3283 apex_key {
3284 name: "myapex.key",
3285 public_key: "testkey.avbpubkey",
3286 private_key: "testkey.pem",
3287 }
3288 android_app_certificate {
3289 name: "myapex.certificate.override",
3290 certificate: "testkey.override",
3291 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003292 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003293 expected := "testkey.override.x509.pem testkey.override.pk8"
3294 if actual := rule.Args["certificates"]; actual != expected {
3295 t.Errorf("certificates should be %q, not %q", expected, actual)
3296 }
3297 })
3298 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003299 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003300 apex {
3301 name: "myapex",
3302 key: "myapex.key",
3303 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003304 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003305 }
3306 apex_key {
3307 name: "myapex.key",
3308 public_key: "testkey.avbpubkey",
3309 private_key: "testkey.pem",
3310 }
3311 android_app_certificate {
3312 name: "myapex.certificate",
3313 certificate: "testkey",
3314 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003315 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003316 expected := "testkey.x509.pem testkey.pk8"
3317 if actual := rule.Args["certificates"]; actual != expected {
3318 t.Errorf("certificates should be %q, not %q", expected, actual)
3319 }
3320 })
3321 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003322 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003323 apex {
3324 name: "myapex_keytest",
3325 key: "myapex.key",
3326 file_contexts: ":myapex-file_contexts",
3327 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003328 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003329 }
3330 apex_key {
3331 name: "myapex.key",
3332 public_key: "testkey.avbpubkey",
3333 private_key: "testkey.pem",
3334 }
3335 android_app_certificate {
3336 name: "myapex.certificate.override",
3337 certificate: "testkey.override",
3338 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003339 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003340 expected := "testkey.override.x509.pem testkey.override.pk8"
3341 if actual := rule.Args["certificates"]; actual != expected {
3342 t.Errorf("certificates should be %q, not %q", expected, actual)
3343 }
3344 })
3345 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003346 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 apex {
3348 name: "myapex",
3349 key: "myapex.key",
3350 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003351 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003352 }
3353 apex_key {
3354 name: "myapex.key",
3355 public_key: "testkey.avbpubkey",
3356 private_key: "testkey.pem",
3357 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003358 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003359 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3360 if actual := rule.Args["certificates"]; actual != expected {
3361 t.Errorf("certificates should be %q, not %q", expected, actual)
3362 }
3363 })
3364 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003365 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003366 apex {
3367 name: "myapex_keytest",
3368 key: "myapex.key",
3369 file_contexts: ":myapex-file_contexts",
3370 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003371 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003372 }
3373 apex_key {
3374 name: "myapex.key",
3375 public_key: "testkey.avbpubkey",
3376 private_key: "testkey.pem",
3377 }
3378 android_app_certificate {
3379 name: "myapex.certificate.override",
3380 certificate: "testkey.override",
3381 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003382 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003383 expected := "testkey.override.x509.pem testkey.override.pk8"
3384 if actual := rule.Args["certificates"]; actual != expected {
3385 t.Errorf("certificates should be %q, not %q", expected, actual)
3386 }
3387 })
3388}
3389
Jiyong Park58e364a2019-01-19 19:24:06 +09003390func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003391 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003392 apex {
3393 name: "myapex",
3394 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003395 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003396 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003397 }
3398
3399 apex {
3400 name: "otherapex",
3401 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003402 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003403 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003404 }
3405
3406 apex_key {
3407 name: "myapex.key",
3408 public_key: "testkey.avbpubkey",
3409 private_key: "testkey.pem",
3410 }
3411
3412 cc_library {
3413 name: "mylib",
3414 srcs: ["mylib.cpp"],
3415 system_shared_libs: [],
3416 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003417 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003418 "myapex",
3419 "otherapex",
3420 ],
Jooyung Han24282772020-03-21 23:20:55 +09003421 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003422 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003423 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003424 cc_library {
3425 name: "mylib2",
3426 srcs: ["mylib.cpp"],
3427 system_shared_libs: [],
3428 stl: "none",
3429 apex_available: [
3430 "myapex",
3431 "otherapex",
3432 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003433 static_libs: ["mylib3"],
3434 recovery_available: true,
3435 min_sdk_version: "29",
3436 }
3437 cc_library {
3438 name: "mylib3",
3439 srcs: ["mylib.cpp"],
3440 system_shared_libs: [],
3441 stl: "none",
3442 apex_available: [
3443 "myapex",
3444 "otherapex",
3445 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003446 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003447 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003448 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003449 `)
3450
Jooyung Hanc87a0592020-03-02 17:44:33 +09003451 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003452 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003453 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003454
Vinh Tranf9754732023-01-19 22:41:46 -05003455 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003456 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003457 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003458
Vinh Tranf9754732023-01-19 22:41:46 -05003459 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003460 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003461 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003462
Colin Crossaede88c2020-08-11 12:17:01 -07003463 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3464 // each variant defines additional macros to distinguish which apex variant it is built for
3465
3466 // non-APEX variant does not have __ANDROID_APEX__ defined
3467 mylibCFlags = ctx.ModuleForTests("mylib3", "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("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3472 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003473
Jooyung Hanc87a0592020-03-02 17:44:33 +09003474 // non-APEX variant does not have __ANDROID_APEX__ defined
3475 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3476 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3477
Vinh Tranf9754732023-01-19 22:41:46 -05003478 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003479 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003480 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003481}
Jiyong Park7e636d02019-01-28 16:16:54 +09003482
3483func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003484 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003485 apex {
3486 name: "myapex",
3487 key: "myapex.key",
3488 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003489 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003490 }
3491
3492 apex_key {
3493 name: "myapex.key",
3494 public_key: "testkey.avbpubkey",
3495 private_key: "testkey.pem",
3496 }
3497
3498 cc_library_headers {
3499 name: "mylib_headers",
3500 export_include_dirs: ["my_include"],
3501 system_shared_libs: [],
3502 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003503 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003504 }
3505
3506 cc_library {
3507 name: "mylib",
3508 srcs: ["mylib.cpp"],
3509 system_shared_libs: [],
3510 stl: "none",
3511 header_libs: ["mylib_headers"],
3512 export_header_lib_headers: ["mylib_headers"],
3513 stubs: {
3514 versions: ["1", "2", "3"],
3515 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003516 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003517 }
3518
3519 cc_library {
3520 name: "otherlib",
3521 srcs: ["mylib.cpp"],
3522 system_shared_libs: [],
3523 stl: "none",
3524 shared_libs: ["mylib"],
3525 }
3526 `)
3527
Colin Cross7113d202019-11-20 16:39:12 -08003528 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003529
3530 // Ensure that the include path of the header lib is exported to 'otherlib'
3531 ensureContains(t, cFlags, "-Imy_include")
3532}
Alex Light9670d332019-01-29 18:07:33 -08003533
Jiyong Park7cd10e32020-01-14 09:22:18 +09003534type fileInApex struct {
3535 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003536 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003537 isLink bool
3538}
3539
Jooyung Han1724d582022-12-21 10:17:44 +09003540func (f fileInApex) String() string {
3541 return f.src + ":" + f.path
3542}
3543
3544func (f fileInApex) match(expectation string) bool {
3545 parts := strings.Split(expectation, ":")
3546 if len(parts) == 1 {
3547 match, _ := path.Match(parts[0], f.path)
3548 return match
3549 }
3550 if len(parts) == 2 {
3551 matchSrc, _ := path.Match(parts[0], f.src)
3552 matchDst, _ := path.Match(parts[1], f.path)
3553 return matchSrc && matchDst
3554 }
3555 panic("invalid expected file specification: " + expectation)
3556}
3557
Jooyung Hana57af4a2020-01-23 05:36:59 +00003558func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003559 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003560 module := ctx.ModuleForTests(moduleName, variant)
3561 apexRule := module.MaybeRule("apexRule")
3562 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003563 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003564 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003565 for _, cmd := range strings.Split(copyCmds, "&&") {
3566 cmd = strings.TrimSpace(cmd)
3567 if cmd == "" {
3568 continue
3569 }
3570 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003571 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003572 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003573 switch terms[0] {
3574 case "mkdir":
3575 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003576 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003577 t.Fatal("copyCmds contains invalid cp command", cmd)
3578 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003579 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 = false
3582 case "ln":
3583 if len(terms) != 3 && len(terms) != 4 {
3584 // ln LINK TARGET or ln -s LINK TARGET
3585 t.Fatal("copyCmds contains invalid ln command", cmd)
3586 }
3587 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003588 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003589 isLink = true
3590 default:
3591 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3592 }
3593 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003594 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003595 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003596 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003597 }
Jooyung Han1724d582022-12-21 10:17:44 +09003598 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003599 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003600 }
3601 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003602 return ret
3603}
3604
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003605func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003606 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003607 var failed bool
3608 var surplus []string
3609 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003610 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003611 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003612 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003613 if file.match(expected) {
3614 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003615 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003616 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 }
3618 }
Jooyung Han1724d582022-12-21 10:17:44 +09003619 if !matchFound {
3620 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003621 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003623
Jooyung Han31c470b2019-10-18 16:26:59 +09003624 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003625 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003626 t.Log("surplus files", surplus)
3627 failed = true
3628 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003629
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003630 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003631 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003632 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003633 if !filesMatched[expected] {
3634 missing = append(missing, expected)
3635 }
3636 }
3637 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003638 t.Log("missing files", missing)
3639 failed = true
3640 }
3641 if failed {
3642 t.Fail()
3643 }
3644}
3645
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003646func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3647 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3648}
3649
3650func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003651 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003652 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3653 if deapexer.Output != nil {
3654 outputs = append(outputs, deapexer.Output.String())
3655 }
3656 for _, output := range deapexer.ImplicitOutputs {
3657 outputs = append(outputs, output.String())
3658 }
3659 actualFiles := make([]fileInApex, 0, len(outputs))
3660 for _, output := range outputs {
3661 dir := "/deapexer/"
3662 pos := strings.LastIndex(output, dir)
3663 if pos == -1 {
3664 t.Fatal("Unknown deapexer output ", output)
3665 }
3666 path := output[pos+len(dir):]
3667 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3668 }
3669 assertFileListEquals(t, files, actualFiles)
3670}
3671
Jooyung Han39edb6c2019-11-06 16:53:07 +09003672func vndkLibrariesTxtFiles(vers ...string) (result string) {
3673 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003674 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003675 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676 prebuilt_etc {
3677 name: "` + txt + `.libraries.` + v + `.txt",
3678 src: "dummy.txt",
3679 }
3680 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003681 }
3682 }
3683 return
3684}
3685
Jooyung Han344d5432019-08-23 11:17:39 +09003686func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003687 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003688 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003689 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003690 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003691 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003692 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003693 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003694 }
3695
3696 apex_key {
3697 name: "myapex.key",
3698 public_key: "testkey.avbpubkey",
3699 private_key: "testkey.pem",
3700 }
3701
Jooyung Han31c470b2019-10-18 16:26:59 +09003702 vndk_prebuilt_shared {
3703 name: "libvndk27",
3704 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003705 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003706 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003707 vndk: {
3708 enabled: true,
3709 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003710 target_arch: "arm64",
3711 arch: {
3712 arm: {
3713 srcs: ["libvndk27_arm.so"],
3714 },
3715 arm64: {
3716 srcs: ["libvndk27_arm64.so"],
3717 },
3718 },
Colin Cross2807f002021-03-02 10:15:29 -08003719 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003720 }
3721
3722 vndk_prebuilt_shared {
3723 name: "libvndk27",
3724 version: "27",
3725 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003726 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003727 vndk: {
3728 enabled: true,
3729 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 target_arch: "x86_64",
3731 arch: {
3732 x86: {
3733 srcs: ["libvndk27_x86.so"],
3734 },
3735 x86_64: {
3736 srcs: ["libvndk27_x86_64.so"],
3737 },
3738 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003739 }
3740 `+vndkLibrariesTxtFiles("27"),
3741 withFiles(map[string][]byte{
3742 "libvndk27_arm.so": nil,
3743 "libvndk27_arm64.so": nil,
3744 "libvndk27_x86.so": nil,
3745 "libvndk27_x86_64.so": nil,
3746 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003747
Jooyung Hana0503a52023-08-23 13:12:50 +09003748 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003749 "lib/libvndk27_arm.so",
3750 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003751 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003752 })
Jooyung Han344d5432019-08-23 11:17:39 +09003753}
3754
Jooyung Han90eee022019-10-01 20:02:42 +09003755func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003756 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003757 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003758 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003759 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003760 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003761 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003762 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003763 }
3764 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003765 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003766 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003767 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003768 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003769 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003770 }
3771 apex_key {
3772 name: "myapex.key",
3773 public_key: "testkey.avbpubkey",
3774 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003775 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003776
3777 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003778 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003779 apexManifestRule := module.Rule("apexManifestRule")
3780 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003781 }
3782
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003783 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003784 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003785}
3786
Jooyung Han344d5432019-08-23 11:17:39 +09003787func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003788 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003789 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003790 name: "com.android.vndk.v30",
3791 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003792 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003793 native_bridge_supported: true,
3794 }
3795
3796 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003797 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003798 public_key: "testkey.avbpubkey",
3799 private_key: "testkey.pem",
3800 }
3801
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003802 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003803 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003804 version: "30",
3805 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003806 srcs: ["mylib.cpp"],
3807 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003808 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003809 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003810 vndk: {
3811 enabled: true,
3812 },
Jooyung Han344d5432019-08-23 11:17:39 +09003813 }
3814 `)
3815}
3816
Jooyung Han31c470b2019-10-18 16:26:59 +09003817func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003818 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003819 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003820 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003821 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003822 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003823 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003824 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003825 }
3826
3827 apex_key {
3828 name: "myapex.key",
3829 public_key: "testkey.avbpubkey",
3830 private_key: "testkey.pem",
3831 }
3832
3833 vndk_prebuilt_shared {
3834 name: "libvndk27",
3835 version: "27",
3836 target_arch: "arm",
3837 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003838 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003839 vndk: {
3840 enabled: true,
3841 },
3842 arch: {
3843 arm: {
3844 srcs: ["libvndk27.so"],
3845 }
3846 },
3847 }
3848
3849 vndk_prebuilt_shared {
3850 name: "libvndk27",
3851 version: "27",
3852 target_arch: "arm",
3853 binder32bit: true,
3854 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003855 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003856 vndk: {
3857 enabled: true,
3858 },
3859 arch: {
3860 arm: {
3861 srcs: ["libvndk27binder32.so"],
3862 }
3863 },
Colin Cross2807f002021-03-02 10:15:29 -08003864 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003865 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003866 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003867 withFiles(map[string][]byte{
3868 "libvndk27.so": nil,
3869 "libvndk27binder32.so": nil,
3870 }),
3871 withBinder32bit,
3872 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003873 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003874 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3875 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 },
3877 }),
3878 )
3879
Jooyung Hana0503a52023-08-23 13:12:50 +09003880 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003882 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003883 })
3884}
3885
Jooyung Hane1633032019-08-01 17:41:43 +09003886func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003887 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003888 apex {
3889 name: "myapex_nodep",
3890 key: "myapex.key",
3891 native_shared_libs: ["lib_nodep"],
3892 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003893 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003894 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003895 }
3896
3897 apex {
3898 name: "myapex_dep",
3899 key: "myapex.key",
3900 native_shared_libs: ["lib_dep"],
3901 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003902 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003903 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003904 }
3905
3906 apex {
3907 name: "myapex_provider",
3908 key: "myapex.key",
3909 native_shared_libs: ["libfoo"],
3910 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003911 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003912 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003913 }
3914
3915 apex {
3916 name: "myapex_selfcontained",
3917 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00003918 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09003919 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003920 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003921 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003922 }
3923
3924 apex_key {
3925 name: "myapex.key",
3926 public_key: "testkey.avbpubkey",
3927 private_key: "testkey.pem",
3928 }
3929
3930 cc_library {
3931 name: "lib_nodep",
3932 srcs: ["mylib.cpp"],
3933 system_shared_libs: [],
3934 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003935 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003936 }
3937
3938 cc_library {
3939 name: "lib_dep",
3940 srcs: ["mylib.cpp"],
3941 shared_libs: ["libfoo"],
3942 system_shared_libs: [],
3943 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003944 apex_available: [
3945 "myapex_dep",
3946 "myapex_provider",
3947 "myapex_selfcontained",
3948 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003949 }
3950
3951 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00003952 name: "lib_dep_on_bar",
3953 srcs: ["mylib.cpp"],
3954 shared_libs: ["libbar"],
3955 system_shared_libs: [],
3956 stl: "none",
3957 apex_available: [
3958 "myapex_selfcontained",
3959 ],
3960 }
3961
3962
3963 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09003964 name: "libfoo",
3965 srcs: ["mytest.cpp"],
3966 stubs: {
3967 versions: ["1"],
3968 },
3969 system_shared_libs: [],
3970 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003971 apex_available: [
3972 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00003973 ],
3974 }
3975
3976 cc_library {
3977 name: "libbar",
3978 srcs: ["mytest.cpp"],
3979 stubs: {
3980 versions: ["1"],
3981 },
3982 system_shared_libs: [],
3983 stl: "none",
3984 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003985 "myapex_selfcontained",
3986 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003987 }
Spandan Das20fce2d2023-04-12 17:21:39 +00003988
Jooyung Hane1633032019-08-01 17:41:43 +09003989 `)
3990
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003991 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003992 var provideNativeLibs, requireNativeLibs []string
3993
Jooyung Hana0503a52023-08-23 13:12:50 +09003994 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003995 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3996 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003997 ensureListEmpty(t, provideNativeLibs)
3998 ensureListEmpty(t, requireNativeLibs)
3999
Jooyung Hana0503a52023-08-23 13:12:50 +09004000 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004001 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4002 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004003 ensureListEmpty(t, provideNativeLibs)
4004 ensureListContains(t, requireNativeLibs, "libfoo.so")
4005
Jooyung Hana0503a52023-08-23 13:12:50 +09004006 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004007 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4008 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004009 ensureListContains(t, provideNativeLibs, "libfoo.so")
4010 ensureListEmpty(t, requireNativeLibs)
4011
Jooyung Hana0503a52023-08-23 13:12:50 +09004012 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004013 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4014 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004015 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004016 ensureListEmpty(t, requireNativeLibs)
4017}
4018
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004019func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4020 ctx := testApex(t, `
4021 apex {
4022 name: "myapex",
4023 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004024 native_shared_libs: ["mylib"],
4025 updatable: false,
4026 }
4027
4028 apex_key {
4029 name: "myapex.key",
4030 public_key: "testkey.avbpubkey",
4031 private_key: "testkey.pem",
4032 }
4033
4034 cc_library {
4035 name: "mylib",
4036 srcs: ["mylib.cpp"],
4037 system_shared_libs: [],
4038 stl: "none",
4039 apex_available: [
4040 "//apex_available:platform",
4041 "myapex",
4042 ],
4043 }
4044 `, android.FixtureMergeEnv(map[string]string{
4045 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4046 }))
4047
Jooyung Hana0503a52023-08-23 13:12:50 +09004048 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004049 apexManifestRule := module.Rule("apexManifestRule")
4050 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4051}
4052
Vinh Tran8f5310f2022-10-07 18:16:47 -04004053func TestCompileMultilibProp(t *testing.T) {
4054 testCases := []struct {
4055 compileMultiLibProp string
4056 containedLibs []string
4057 notContainedLibs []string
4058 }{
4059 {
4060 containedLibs: []string{
4061 "image.apex/lib64/mylib.so",
4062 "image.apex/lib/mylib.so",
4063 },
4064 compileMultiLibProp: `compile_multilib: "both",`,
4065 },
4066 {
4067 containedLibs: []string{"image.apex/lib64/mylib.so"},
4068 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4069 compileMultiLibProp: `compile_multilib: "first",`,
4070 },
4071 {
4072 containedLibs: []string{"image.apex/lib64/mylib.so"},
4073 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4074 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4075 },
4076 {
4077 containedLibs: []string{"image.apex/lib64/mylib.so"},
4078 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4079 compileMultiLibProp: `compile_multilib: "64",`,
4080 },
4081 {
4082 containedLibs: []string{"image.apex/lib/mylib.so"},
4083 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4084 compileMultiLibProp: `compile_multilib: "32",`,
4085 },
4086 }
4087 for _, testCase := range testCases {
4088 ctx := testApex(t, fmt.Sprintf(`
4089 apex {
4090 name: "myapex",
4091 key: "myapex.key",
4092 %s
4093 native_shared_libs: ["mylib"],
4094 updatable: false,
4095 }
4096 apex_key {
4097 name: "myapex.key",
4098 public_key: "testkey.avbpubkey",
4099 private_key: "testkey.pem",
4100 }
4101 cc_library {
4102 name: "mylib",
4103 srcs: ["mylib.cpp"],
4104 apex_available: [
4105 "//apex_available:platform",
4106 "myapex",
4107 ],
4108 }
4109 `, testCase.compileMultiLibProp),
4110 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004111 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004112 apexRule := module.Rule("apexRule")
4113 copyCmds := apexRule.Args["copy_commands"]
4114 for _, containedLib := range testCase.containedLibs {
4115 ensureContains(t, copyCmds, containedLib)
4116 }
4117 for _, notContainedLib := range testCase.notContainedLibs {
4118 ensureNotContains(t, copyCmds, notContainedLib)
4119 }
4120 }
4121}
4122
Alex Light0851b882019-02-07 13:20:53 -08004123func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004124 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004125 apex {
4126 name: "myapex",
4127 key: "myapex.key",
4128 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004129 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004130 }
4131
4132 apex_key {
4133 name: "myapex.key",
4134 public_key: "testkey.avbpubkey",
4135 private_key: "testkey.pem",
4136 }
4137
4138 cc_library {
4139 name: "mylib_common",
4140 srcs: ["mylib.cpp"],
4141 system_shared_libs: [],
4142 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004143 apex_available: [
4144 "//apex_available:platform",
4145 "myapex",
4146 ],
Alex Light0851b882019-02-07 13:20:53 -08004147 }
4148 `)
4149
Jooyung Hana0503a52023-08-23 13:12:50 +09004150 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004151 apexRule := module.Rule("apexRule")
4152 copyCmds := apexRule.Args["copy_commands"]
4153
4154 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4155 t.Log("Apex was a test apex!")
4156 t.Fail()
4157 }
4158 // Ensure that main rule creates an output
4159 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4160
4161 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004162 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004163
4164 // Ensure that both direct and indirect deps are copied into apex
4165 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4166
Colin Cross7113d202019-11-20 16:39:12 -08004167 // Ensure that the platform variant ends with _shared
4168 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004169
Colin Cross56a83212020-09-15 18:30:11 -07004170 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004171 t.Log("Found mylib_common not in any apex!")
4172 t.Fail()
4173 }
4174}
4175
4176func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004177 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004178 apex_test {
4179 name: "myapex",
4180 key: "myapex.key",
4181 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004182 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004183 }
4184
4185 apex_key {
4186 name: "myapex.key",
4187 public_key: "testkey.avbpubkey",
4188 private_key: "testkey.pem",
4189 }
4190
4191 cc_library {
4192 name: "mylib_common_test",
4193 srcs: ["mylib.cpp"],
4194 system_shared_libs: [],
4195 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004196 // TODO: remove //apex_available:platform
4197 apex_available: [
4198 "//apex_available:platform",
4199 "myapex",
4200 ],
Alex Light0851b882019-02-07 13:20:53 -08004201 }
4202 `)
4203
Jooyung Hana0503a52023-08-23 13:12:50 +09004204 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004205 apexRule := module.Rule("apexRule")
4206 copyCmds := apexRule.Args["copy_commands"]
4207
4208 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4209 t.Log("Apex was not a test apex!")
4210 t.Fail()
4211 }
4212 // Ensure that main rule creates an output
4213 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4214
4215 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004216 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004217
4218 // Ensure that both direct and indirect deps are copied into apex
4219 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4220
Colin Cross7113d202019-11-20 16:39:12 -08004221 // Ensure that the platform variant ends with _shared
4222 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004223}
4224
Jooyung Han85707de2023-12-01 14:21:13 +09004225func TestLibzVendorIsntStable(t *testing.T) {
4226 ctx := testApex(t, `
4227 apex {
4228 name: "myapex",
4229 key: "myapex.key",
4230 updatable: false,
4231 binaries: ["mybin"],
4232 }
4233 apex {
4234 name: "myvendorapex",
4235 key: "myapex.key",
4236 file_contexts: "myvendorapex_file_contexts",
4237 vendor: true,
4238 updatable: false,
4239 binaries: ["mybin"],
4240 }
4241 apex_key {
4242 name: "myapex.key",
4243 public_key: "testkey.avbpubkey",
4244 private_key: "testkey.pem",
4245 }
4246 cc_binary {
4247 name: "mybin",
4248 vendor_available: true,
4249 system_shared_libs: [],
4250 stl: "none",
4251 shared_libs: ["libz"],
4252 apex_available: ["//apex_available:anyapex"],
4253 }
4254 cc_library {
4255 name: "libz",
4256 vendor_available: true,
4257 system_shared_libs: [],
4258 stl: "none",
4259 stubs: {
4260 versions: ["28", "30"],
4261 },
4262 target: {
4263 vendor: {
4264 no_stubs: true,
4265 },
4266 },
4267 }
4268 `, withFiles(map[string][]byte{
4269 "myvendorapex_file_contexts": nil,
4270 }))
4271
4272 // libz provides stubs for core variant.
4273 {
4274 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4275 "bin/mybin",
4276 })
4277 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4278 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4279 }
4280 // libz doesn't provide stubs for vendor variant.
4281 {
4282 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4283 "bin/mybin",
4284 "lib64/libz.so",
4285 })
4286 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4287 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4288 }
4289}
4290
Alex Light9670d332019-01-29 18:07:33 -08004291func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004292 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004293 apex {
4294 name: "myapex",
4295 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004296 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004297 multilib: {
4298 first: {
4299 native_shared_libs: ["mylib_common"],
4300 }
4301 },
4302 target: {
4303 android: {
4304 multilib: {
4305 first: {
4306 native_shared_libs: ["mylib"],
4307 }
4308 }
4309 },
4310 host: {
4311 multilib: {
4312 first: {
4313 native_shared_libs: ["mylib2"],
4314 }
4315 }
4316 }
4317 }
4318 }
4319
4320 apex_key {
4321 name: "myapex.key",
4322 public_key: "testkey.avbpubkey",
4323 private_key: "testkey.pem",
4324 }
4325
4326 cc_library {
4327 name: "mylib",
4328 srcs: ["mylib.cpp"],
4329 system_shared_libs: [],
4330 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004331 // TODO: remove //apex_available:platform
4332 apex_available: [
4333 "//apex_available:platform",
4334 "myapex",
4335 ],
Alex Light9670d332019-01-29 18:07:33 -08004336 }
4337
4338 cc_library {
4339 name: "mylib_common",
4340 srcs: ["mylib.cpp"],
4341 system_shared_libs: [],
4342 stl: "none",
4343 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004344 // TODO: remove //apex_available:platform
4345 apex_available: [
4346 "//apex_available:platform",
4347 "myapex",
4348 ],
Alex Light9670d332019-01-29 18:07:33 -08004349 }
4350
4351 cc_library {
4352 name: "mylib2",
4353 srcs: ["mylib.cpp"],
4354 system_shared_libs: [],
4355 stl: "none",
4356 compile_multilib: "first",
4357 }
4358 `)
4359
Jooyung Hana0503a52023-08-23 13:12:50 +09004360 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004361 copyCmds := apexRule.Args["copy_commands"]
4362
4363 // Ensure that main rule creates an output
4364 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4365
4366 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004367 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4368 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4369 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004370
4371 // Ensure that both direct and indirect deps are copied into apex
4372 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4373 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4374 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4375
Colin Cross7113d202019-11-20 16:39:12 -08004376 // Ensure that the platform variant ends with _shared
4377 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4378 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4379 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004380}
Jiyong Park04480cf2019-02-06 00:16:29 +09004381
Jiyong Park59140302020-12-14 18:44:04 +09004382func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004383 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004384 apex {
4385 name: "myapex",
4386 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004387 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004388 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004389 arch: {
4390 arm64: {
4391 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004392 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004393 },
4394 x86_64: {
4395 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004396 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004397 },
4398 }
4399 }
4400
4401 apex_key {
4402 name: "myapex.key",
4403 public_key: "testkey.avbpubkey",
4404 private_key: "testkey.pem",
4405 }
4406
4407 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004408 name: "mylib.generic",
4409 srcs: ["mylib.cpp"],
4410 system_shared_libs: [],
4411 stl: "none",
4412 // TODO: remove //apex_available:platform
4413 apex_available: [
4414 "//apex_available:platform",
4415 "myapex",
4416 ],
4417 }
4418
4419 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004420 name: "mylib.arm64",
4421 srcs: ["mylib.cpp"],
4422 system_shared_libs: [],
4423 stl: "none",
4424 // TODO: remove //apex_available:platform
4425 apex_available: [
4426 "//apex_available:platform",
4427 "myapex",
4428 ],
4429 }
4430
4431 cc_library {
4432 name: "mylib.x64",
4433 srcs: ["mylib.cpp"],
4434 system_shared_libs: [],
4435 stl: "none",
4436 // TODO: remove //apex_available:platform
4437 apex_available: [
4438 "//apex_available:platform",
4439 "myapex",
4440 ],
4441 }
4442 `)
4443
Jooyung Hana0503a52023-08-23 13:12:50 +09004444 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004445 copyCmds := apexRule.Args["copy_commands"]
4446
4447 // Ensure that apex variant is created for the direct dep
4448 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004449 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004450 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4451
4452 // Ensure that both direct and indirect deps are copied into apex
4453 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4454 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4455}
4456
Jiyong Park04480cf2019-02-06 00:16:29 +09004457func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004458 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004459 apex {
4460 name: "myapex",
4461 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004462 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004463 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004464 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004465 }
4466
4467 apex_key {
4468 name: "myapex.key",
4469 public_key: "testkey.avbpubkey",
4470 private_key: "testkey.pem",
4471 }
4472
4473 sh_binary {
4474 name: "myscript",
4475 src: "mylib.cpp",
4476 filename: "myscript.sh",
4477 sub_dir: "script",
4478 }
4479 `)
4480
Jooyung Hana0503a52023-08-23 13:12:50 +09004481 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004482 copyCmds := apexRule.Args["copy_commands"]
4483
4484 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4485}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004486
Jooyung Han91df2082019-11-20 01:49:42 +09004487func TestApexInVariousPartition(t *testing.T) {
4488 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004489 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004490 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004491 {"", "system"},
4492 {"product_specific: true", "product"},
4493 {"soc_specific: true", "vendor"},
4494 {"proprietary: true", "vendor"},
4495 {"vendor: true", "vendor"},
4496 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004497 }
4498 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004499 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004500 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004501 apex {
4502 name: "myapex",
4503 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004504 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004505 `+tc.propName+`
4506 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004507
Jooyung Han91df2082019-11-20 01:49:42 +09004508 apex_key {
4509 name: "myapex.key",
4510 public_key: "testkey.avbpubkey",
4511 private_key: "testkey.pem",
4512 }
4513 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004514
Jooyung Hana0503a52023-08-23 13:12:50 +09004515 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004516 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004517 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004518 if actual != expected {
4519 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4520 }
Jooyung Han91df2082019-11-20 01:49:42 +09004521 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004522 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004523}
Jiyong Park67882562019-03-21 01:11:21 +09004524
Jooyung Han580eb4f2020-06-24 19:33:06 +09004525func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004526 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004527 apex {
4528 name: "myapex",
4529 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004530 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004531 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004532
Jooyung Han580eb4f2020-06-24 19:33:06 +09004533 apex_key {
4534 name: "myapex.key",
4535 public_key: "testkey.avbpubkey",
4536 private_key: "testkey.pem",
4537 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004538 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004539 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004540 rule := module.Output("file_contexts")
4541 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4542}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004543
Jooyung Han580eb4f2020-06-24 19:33:06 +09004544func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004545 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004546 apex {
4547 name: "myapex",
4548 key: "myapex.key",
4549 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004550 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004551 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004552
Jooyung Han580eb4f2020-06-24 19:33:06 +09004553 apex_key {
4554 name: "myapex.key",
4555 public_key: "testkey.avbpubkey",
4556 private_key: "testkey.pem",
4557 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004558 `, withFiles(map[string][]byte{
4559 "my_own_file_contexts": nil,
4560 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004561}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004562
Jooyung Han580eb4f2020-06-24 19:33:06 +09004563func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004564 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004565 apex {
4566 name: "myapex",
4567 key: "myapex.key",
4568 product_specific: true,
4569 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004570 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004571 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004572
Jooyung Han580eb4f2020-06-24 19:33:06 +09004573 apex_key {
4574 name: "myapex.key",
4575 public_key: "testkey.avbpubkey",
4576 private_key: "testkey.pem",
4577 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004578 `)
4579
Colin Cross1c460562021-02-16 17:55:47 -08004580 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581 apex {
4582 name: "myapex",
4583 key: "myapex.key",
4584 product_specific: true,
4585 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004586 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004587 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004588
Jooyung Han580eb4f2020-06-24 19:33:06 +09004589 apex_key {
4590 name: "myapex.key",
4591 public_key: "testkey.avbpubkey",
4592 private_key: "testkey.pem",
4593 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004594 `, withFiles(map[string][]byte{
4595 "product_specific_file_contexts": nil,
4596 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004597 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004598 rule := module.Output("file_contexts")
4599 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4600}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004601
Jooyung Han580eb4f2020-06-24 19:33:06 +09004602func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004603 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004604 apex {
4605 name: "myapex",
4606 key: "myapex.key",
4607 product_specific: true,
4608 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004609 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004610 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004611
Jooyung Han580eb4f2020-06-24 19:33:06 +09004612 apex_key {
4613 name: "myapex.key",
4614 public_key: "testkey.avbpubkey",
4615 private_key: "testkey.pem",
4616 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004617
Jooyung Han580eb4f2020-06-24 19:33:06 +09004618 filegroup {
4619 name: "my-file-contexts",
4620 srcs: ["product_specific_file_contexts"],
4621 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004622 `, withFiles(map[string][]byte{
4623 "product_specific_file_contexts": nil,
4624 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004625 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 rule := module.Output("file_contexts")
4627 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004628}
4629
Jiyong Park67882562019-03-21 01:11:21 +09004630func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004631 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004632 apex_key {
4633 name: "myapex.key",
4634 public_key: ":my.avbpubkey",
4635 private_key: ":my.pem",
4636 product_specific: true,
4637 }
4638
4639 filegroup {
4640 name: "my.avbpubkey",
4641 srcs: ["testkey2.avbpubkey"],
4642 }
4643
4644 filegroup {
4645 name: "my.pem",
4646 srcs: ["testkey2.pem"],
4647 }
4648 `)
4649
4650 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4651 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004652 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004653 if actual_pubkey != expected_pubkey {
4654 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4655 }
4656 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004657 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004658 if actual_privkey != expected_privkey {
4659 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4660 }
4661}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004662
4663func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004664 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004665 prebuilt_apex {
4666 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004667 arch: {
4668 arm64: {
4669 src: "myapex-arm64.apex",
4670 },
4671 arm: {
4672 src: "myapex-arm.apex",
4673 },
4674 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004675 }
4676 `)
4677
Wei Li340ee8e2022-03-18 17:33:24 -07004678 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4679 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004680
Jiyong Parkc95714e2019-03-29 14:23:10 +09004681 expectedInput := "myapex-arm64.apex"
4682 if prebuilt.inputApex.String() != expectedInput {
4683 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4684 }
Wei Li340ee8e2022-03-18 17:33:24 -07004685 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4686 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4687 rule := testingModule.Rule("genProvenanceMetaData")
4688 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4689 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4690 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4691 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004692
4693 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4694 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004695}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004696
Paul Duffinc0609c62021-03-01 17:27:16 +00004697func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004698 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004699 prebuilt_apex {
4700 name: "myapex",
4701 }
4702 `)
4703}
4704
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004705func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004706 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004707 prebuilt_apex {
4708 name: "myapex",
4709 src: "myapex-arm.apex",
4710 filename: "notmyapex.apex",
4711 }
4712 `)
4713
Wei Li340ee8e2022-03-18 17:33:24 -07004714 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4715 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004716
4717 expected := "notmyapex.apex"
4718 if p.installFilename != expected {
4719 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4720 }
Wei Li340ee8e2022-03-18 17:33:24 -07004721 rule := testingModule.Rule("genProvenanceMetaData")
4722 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4723 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4724 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4725 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004726}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004727
Samiul Islam7c02e262021-09-08 17:48:28 +01004728func TestApexSetFilenameOverride(t *testing.T) {
4729 testApex(t, `
4730 apex_set {
4731 name: "com.company.android.myapex",
4732 apex_name: "com.android.myapex",
4733 set: "company-myapex.apks",
4734 filename: "com.company.android.myapex.apex"
4735 }
4736 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4737
4738 testApex(t, `
4739 apex_set {
4740 name: "com.company.android.myapex",
4741 apex_name: "com.android.myapex",
4742 set: "company-myapex.apks",
4743 filename: "com.company.android.myapex.capex"
4744 }
4745 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4746
4747 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4748 apex_set {
4749 name: "com.company.android.myapex",
4750 apex_name: "com.android.myapex",
4751 set: "company-myapex.apks",
4752 filename: "some-random-suffix"
4753 }
4754 `)
4755}
4756
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004757func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004758 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004759 prebuilt_apex {
4760 name: "myapex.prebuilt",
4761 src: "myapex-arm.apex",
4762 overrides: [
4763 "myapex",
4764 ],
4765 }
4766 `)
4767
Wei Li340ee8e2022-03-18 17:33:24 -07004768 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4769 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004770
4771 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004772 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004773 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004774 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004775 }
Wei Li340ee8e2022-03-18 17:33:24 -07004776 rule := testingModule.Rule("genProvenanceMetaData")
4777 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4778 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4779 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4780 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004781}
4782
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004783func TestPrebuiltApexName(t *testing.T) {
4784 testApex(t, `
4785 prebuilt_apex {
4786 name: "com.company.android.myapex",
4787 apex_name: "com.android.myapex",
4788 src: "company-myapex-arm.apex",
4789 }
4790 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4791
4792 testApex(t, `
4793 apex_set {
4794 name: "com.company.android.myapex",
4795 apex_name: "com.android.myapex",
4796 set: "company-myapex.apks",
4797 }
4798 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4799}
4800
4801func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4802 _ = android.GroupFixturePreparers(
4803 java.PrepareForTestWithJavaDefaultModules,
4804 PrepareForTestWithApexBuildComponents,
4805 android.FixtureWithRootAndroidBp(`
4806 platform_bootclasspath {
4807 name: "platform-bootclasspath",
4808 fragments: [
4809 {
4810 apex: "com.android.art",
4811 module: "art-bootclasspath-fragment",
4812 },
4813 ],
4814 }
4815
4816 prebuilt_apex {
4817 name: "com.company.android.art",
4818 apex_name: "com.android.art",
4819 src: "com.company.android.art-arm.apex",
4820 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4821 }
4822
4823 prebuilt_bootclasspath_fragment {
4824 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004825 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004826 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004827 hidden_api: {
4828 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4829 metadata: "my-bootclasspath-fragment/metadata.csv",
4830 index: "my-bootclasspath-fragment/index.csv",
4831 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4832 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4833 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004834 }
4835
4836 java_import {
4837 name: "core-oj",
4838 jars: ["prebuilt.jar"],
4839 }
4840 `),
4841 ).RunTest(t)
4842}
4843
Spandan Das59a4a2b2024-01-09 21:35:56 +00004844// A minimal context object for use with DexJarBuildPath
4845type moduleErrorfTestCtx struct {
4846}
4847
4848func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4849}
4850
Paul Duffin092153d2021-01-26 11:42:39 +00004851// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4852// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004853func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004854 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004855
Paul Duffin89886cb2021-02-05 16:44:03 +00004856 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004857 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004858 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004859 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00004860 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004861 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004862 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00004863 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09004864 android.NormalizePathForTesting(dexJarBuildPath))
4865 }
4866
4867 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004868 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004869 // Make sure the import has been given the correct path to the dex jar.
4870 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4871 dexJarBuildPath := p.DexJarInstallPath()
4872 stem := android.RemoveOptionalPrebuiltPrefix(name)
4873 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4874 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4875 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004876 }
4877
Paul Duffin39853512021-02-26 11:09:39 +00004878 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004879 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004880 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004881 android.AssertArrayString(t, "Check if there is no source variant",
4882 []string{"android_common"},
4883 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004884 }
4885
4886 t.Run("prebuilt only", func(t *testing.T) {
4887 bp := `
4888 prebuilt_apex {
4889 name: "myapex",
4890 arch: {
4891 arm64: {
4892 src: "myapex-arm64.apex",
4893 },
4894 arm: {
4895 src: "myapex-arm.apex",
4896 },
4897 },
Paul Duffin39853512021-02-26 11:09:39 +00004898 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004899 }
4900
4901 java_import {
4902 name: "libfoo",
4903 jars: ["libfoo.jar"],
4904 }
Paul Duffin39853512021-02-26 11:09:39 +00004905
4906 java_sdk_library_import {
4907 name: "libbar",
4908 public: {
4909 jars: ["libbar.jar"],
4910 },
4911 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004912 `
4913
4914 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4915 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4916
Spandan Das3576e762024-01-03 18:57:03 +00004917 deapexerName := deapexerModuleName("prebuilt_myapex")
4918 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01004919
Paul Duffinf6932af2021-02-26 18:21:56 +00004920 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004921 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004922 rule := deapexer.Rule("deapexer")
4923 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4924 t.Errorf("expected: %q, found: %q", expected, actual)
4925 }
4926
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004927 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004928 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004929 rule = prebuiltApex.Rule("android/soong/android.Cp")
4930 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4931 t.Errorf("expected: %q, found: %q", expected, actual)
4932 }
4933
Paul Duffin89886cb2021-02-05 16:44:03 +00004934 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004935 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004936
4937 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004938 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004939 })
4940
4941 t.Run("prebuilt with source preferred", func(t *testing.T) {
4942
4943 bp := `
4944 prebuilt_apex {
4945 name: "myapex",
4946 arch: {
4947 arm64: {
4948 src: "myapex-arm64.apex",
4949 },
4950 arm: {
4951 src: "myapex-arm.apex",
4952 },
4953 },
Paul Duffin39853512021-02-26 11:09:39 +00004954 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004955 }
4956
4957 java_import {
4958 name: "libfoo",
4959 jars: ["libfoo.jar"],
4960 }
4961
4962 java_library {
4963 name: "libfoo",
4964 }
Paul Duffin39853512021-02-26 11:09:39 +00004965
4966 java_sdk_library_import {
4967 name: "libbar",
4968 public: {
4969 jars: ["libbar.jar"],
4970 },
4971 }
4972
4973 java_sdk_library {
4974 name: "libbar",
4975 srcs: ["foo/bar/MyClass.java"],
4976 unsafe_ignore_missing_latest_api: true,
4977 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004978 `
4979
4980 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4981 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4982
Paul Duffin89886cb2021-02-05 16:44:03 +00004983 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004984 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004985 ensureNoSourceVariant(t, ctx, "libfoo")
4986
4987 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004988 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004989 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004990 })
4991
4992 t.Run("prebuilt preferred with source", func(t *testing.T) {
4993 bp := `
4994 prebuilt_apex {
4995 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004996 arch: {
4997 arm64: {
4998 src: "myapex-arm64.apex",
4999 },
5000 arm: {
5001 src: "myapex-arm.apex",
5002 },
5003 },
Paul Duffin39853512021-02-26 11:09:39 +00005004 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005005 }
5006
5007 java_import {
5008 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005009 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005010 jars: ["libfoo.jar"],
5011 }
5012
5013 java_library {
5014 name: "libfoo",
5015 }
Paul Duffin39853512021-02-26 11:09:39 +00005016
5017 java_sdk_library_import {
5018 name: "libbar",
5019 prefer: true,
5020 public: {
5021 jars: ["libbar.jar"],
5022 },
5023 }
5024
5025 java_sdk_library {
5026 name: "libbar",
5027 srcs: ["foo/bar/MyClass.java"],
5028 unsafe_ignore_missing_latest_api: true,
5029 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005030 `
5031
5032 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5033 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5034
Paul Duffin89886cb2021-02-05 16:44:03 +00005035 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005036 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005037 ensureNoSourceVariant(t, ctx, "libfoo")
5038
5039 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005040 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005041 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005042 })
5043}
5044
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005045func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005046 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005047 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005048 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5049 // is disabled.
5050 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005051
5052 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5053 // file creation.
5054 java.FixtureConfigureBootJars("platform:foo"),
5055 android.FixtureModifyMockFS(func(fs android.MockFS) {
5056 fs["platform/Android.bp"] = []byte(`
5057 java_library {
5058 name: "foo",
5059 srcs: ["Test.java"],
5060 compile_dex: true,
5061 }
5062 `)
5063 fs["platform/Test.java"] = nil
5064 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005065 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005066
Paul Duffin37856732021-02-26 14:24:15 +00005067 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5068 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005069 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005070 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005071 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005072 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005073 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005074 foundLibfooJar = true
5075 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005076 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005077 }
5078 }
5079 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005080 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 +00005081 }
5082 }
5083
Paul Duffin40a3f652021-07-19 13:11:24 +01005084 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005085 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005086 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005087 var rule android.TestingBuildParams
5088
5089 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5090 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005091 }
5092
Paul Duffin40a3f652021-07-19 13:11:24 +01005093 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5094 t.Helper()
5095 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5096 var rule android.TestingBuildParams
5097
5098 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5099 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5100 }
5101
Paul Duffin89f570a2021-06-16 01:42:33 +01005102 fragment := java.ApexVariantReference{
5103 Apex: proptools.StringPtr("myapex"),
5104 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5105 }
5106
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005107 t.Run("prebuilt only", func(t *testing.T) {
5108 bp := `
5109 prebuilt_apex {
5110 name: "myapex",
5111 arch: {
5112 arm64: {
5113 src: "myapex-arm64.apex",
5114 },
5115 arm: {
5116 src: "myapex-arm.apex",
5117 },
5118 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005119 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5120 }
5121
5122 prebuilt_bootclasspath_fragment {
5123 name: "my-bootclasspath-fragment",
5124 contents: ["libfoo", "libbar"],
5125 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005126 hidden_api: {
5127 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5128 metadata: "my-bootclasspath-fragment/metadata.csv",
5129 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005130 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5131 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5132 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005133 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005134 }
5135
5136 java_import {
5137 name: "libfoo",
5138 jars: ["libfoo.jar"],
5139 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005140 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005141 }
Paul Duffin37856732021-02-26 14:24:15 +00005142
5143 java_sdk_library_import {
5144 name: "libbar",
5145 public: {
5146 jars: ["libbar.jar"],
5147 },
5148 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005149 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005150 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005151 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005152 `
5153
Paul Duffin89f570a2021-06-16 01:42:33 +01005154 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005155 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5156 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005157
Paul Duffin537ea3d2021-05-14 10:38:00 +01005158 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005159 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005160 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005161 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005162 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005163 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 +01005164 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005165 })
5166
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005167 t.Run("apex_set only", func(t *testing.T) {
5168 bp := `
5169 apex_set {
5170 name: "myapex",
5171 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005172 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005173 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005174 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5175 }
5176
5177 java_import {
5178 name: "myjavalib",
5179 jars: ["myjavalib.jar"],
5180 apex_available: ["myapex"],
5181 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005182 }
5183
5184 prebuilt_bootclasspath_fragment {
5185 name: "my-bootclasspath-fragment",
5186 contents: ["libfoo", "libbar"],
5187 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005188 hidden_api: {
5189 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5190 metadata: "my-bootclasspath-fragment/metadata.csv",
5191 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005192 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5193 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5194 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005195 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005196 }
5197
Liz Kammer2dc72442023-04-20 10:10:48 -04005198 prebuilt_systemserverclasspath_fragment {
5199 name: "my-systemserverclasspath-fragment",
5200 contents: ["libbaz"],
5201 apex_available: ["myapex"],
5202 }
5203
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005204 java_import {
5205 name: "libfoo",
5206 jars: ["libfoo.jar"],
5207 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005208 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005209 }
5210
5211 java_sdk_library_import {
5212 name: "libbar",
5213 public: {
5214 jars: ["libbar.jar"],
5215 },
5216 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005217 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005218 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005219 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005220
5221 java_sdk_library_import {
5222 name: "libbaz",
5223 public: {
5224 jars: ["libbaz.jar"],
5225 },
5226 apex_available: ["myapex"],
5227 shared_library: false,
5228 permitted_packages: ["baz"],
5229 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005230 `
5231
Paul Duffin89f570a2021-06-16 01:42:33 +01005232 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005233 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5234 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005235
Paul Duffin537ea3d2021-05-14 10:38:00 +01005236 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005237 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005238 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005239 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005240 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005241 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 +01005242 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005243
5244 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5245
5246 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005247 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005248 "myjavalib.myapex",
5249 "libfoo.myapex",
5250 "libbar.myapex",
5251 "libbaz.myapex",
5252 }
5253 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5254 for i, e := range mkEntries {
5255 g := e.OverrideName
5256 if w := overrideNames[i]; w != g {
5257 t.Errorf("Expected override name %q, got %q", w, g)
5258 }
5259 }
5260
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005261 })
5262
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005263 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5264 bp := `
5265 prebuilt_apex {
5266 name: "myapex",
5267 arch: {
5268 arm64: {
5269 src: "myapex-arm64.apex",
5270 },
5271 arm: {
5272 src: "myapex-arm.apex",
5273 },
5274 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005275 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5276 }
5277
5278 prebuilt_bootclasspath_fragment {
5279 name: "my-bootclasspath-fragment",
5280 contents: ["libfoo", "libbar"],
5281 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005282 hidden_api: {
5283 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5284 metadata: "my-bootclasspath-fragment/metadata.csv",
5285 index: "my-bootclasspath-fragment/index.csv",
5286 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5287 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5288 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005289 }
5290
5291 java_import {
5292 name: "libfoo",
5293 jars: ["libfoo.jar"],
5294 apex_available: ["myapex"],
5295 }
5296
5297 java_library {
5298 name: "libfoo",
5299 srcs: ["foo/bar/MyClass.java"],
5300 apex_available: ["myapex"],
5301 }
Paul Duffin37856732021-02-26 14:24:15 +00005302
5303 java_sdk_library_import {
5304 name: "libbar",
5305 public: {
5306 jars: ["libbar.jar"],
5307 },
5308 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005309 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005310 }
5311
5312 java_sdk_library {
5313 name: "libbar",
5314 srcs: ["foo/bar/MyClass.java"],
5315 unsafe_ignore_missing_latest_api: true,
5316 apex_available: ["myapex"],
5317 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005318 `
5319
5320 // In this test the source (java_library) libfoo is active since the
5321 // prebuilt (java_import) defaults to prefer:false. However the
5322 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5323 // find the dex boot jar in it. We either need to disable the source libfoo
5324 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005325 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005326 // dexbootjar check is skipped if AllowMissingDependencies is true
5327 preparerAllowMissingDeps := android.GroupFixturePreparers(
5328 preparer,
5329 android.PrepareForTestWithAllowMissingDependencies,
5330 )
5331 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005332 })
5333
5334 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5335 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005336 apex {
5337 name: "myapex",
5338 key: "myapex.key",
5339 updatable: false,
5340 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5341 }
5342
5343 apex_key {
5344 name: "myapex.key",
5345 public_key: "testkey.avbpubkey",
5346 private_key: "testkey.pem",
5347 }
5348
5349 bootclasspath_fragment {
5350 name: "my-bootclasspath-fragment",
5351 contents: ["libfoo", "libbar"],
5352 apex_available: ["myapex"],
5353 hidden_api: {
5354 split_packages: ["*"],
5355 },
5356 }
5357
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005358 prebuilt_apex {
5359 name: "myapex",
5360 arch: {
5361 arm64: {
5362 src: "myapex-arm64.apex",
5363 },
5364 arm: {
5365 src: "myapex-arm.apex",
5366 },
5367 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005368 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5369 }
5370
5371 prebuilt_bootclasspath_fragment {
5372 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005373 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005374 contents: ["libfoo", "libbar"],
5375 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005376 hidden_api: {
5377 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5378 metadata: "my-bootclasspath-fragment/metadata.csv",
5379 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005380 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5381 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5382 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005383 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005384 }
5385
5386 java_import {
5387 name: "libfoo",
5388 prefer: true,
5389 jars: ["libfoo.jar"],
5390 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005391 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005392 }
5393
5394 java_library {
5395 name: "libfoo",
5396 srcs: ["foo/bar/MyClass.java"],
5397 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005398 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005399 }
Paul Duffin37856732021-02-26 14:24:15 +00005400
5401 java_sdk_library_import {
5402 name: "libbar",
5403 prefer: true,
5404 public: {
5405 jars: ["libbar.jar"],
5406 },
5407 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005408 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005409 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005410 }
5411
5412 java_sdk_library {
5413 name: "libbar",
5414 srcs: ["foo/bar/MyClass.java"],
5415 unsafe_ignore_missing_latest_api: true,
5416 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005417 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005418 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005419 `
5420
Paul Duffin89f570a2021-06-16 01:42:33 +01005421 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005422 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5423 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005424
Paul Duffin537ea3d2021-05-14 10:38:00 +01005425 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005426 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005427 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005428 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005429 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005430 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 +01005431 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005432 })
5433
5434 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5435 bp := `
5436 apex {
5437 name: "myapex",
5438 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005439 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005440 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005441 }
5442
5443 apex_key {
5444 name: "myapex.key",
5445 public_key: "testkey.avbpubkey",
5446 private_key: "testkey.pem",
5447 }
5448
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005449 bootclasspath_fragment {
5450 name: "my-bootclasspath-fragment",
5451 contents: ["libfoo", "libbar"],
5452 apex_available: ["myapex"],
5453 hidden_api: {
5454 split_packages: ["*"],
5455 },
5456 }
5457
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005458 prebuilt_apex {
5459 name: "myapex",
5460 arch: {
5461 arm64: {
5462 src: "myapex-arm64.apex",
5463 },
5464 arm: {
5465 src: "myapex-arm.apex",
5466 },
5467 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005468 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5469 }
5470
5471 prebuilt_bootclasspath_fragment {
5472 name: "my-bootclasspath-fragment",
5473 contents: ["libfoo", "libbar"],
5474 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005475 hidden_api: {
5476 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5477 metadata: "my-bootclasspath-fragment/metadata.csv",
5478 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005479 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5480 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5481 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005482 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005483 }
5484
5485 java_import {
5486 name: "libfoo",
5487 jars: ["libfoo.jar"],
5488 apex_available: ["myapex"],
5489 }
5490
5491 java_library {
5492 name: "libfoo",
5493 srcs: ["foo/bar/MyClass.java"],
5494 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005495 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005496 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005497 }
Paul Duffin37856732021-02-26 14:24:15 +00005498
5499 java_sdk_library_import {
5500 name: "libbar",
5501 public: {
5502 jars: ["libbar.jar"],
5503 },
5504 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005505 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005506 }
5507
5508 java_sdk_library {
5509 name: "libbar",
5510 srcs: ["foo/bar/MyClass.java"],
5511 unsafe_ignore_missing_latest_api: true,
5512 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005513 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005514 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005515 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005516 `
5517
Paul Duffin89f570a2021-06-16 01:42:33 +01005518 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005519 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5520 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 +00005521
Paul Duffin537ea3d2021-05-14 10:38:00 +01005522 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005523 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005524 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5525 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005526 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5527 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 +01005528 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005529 })
5530
5531 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5532 bp := `
5533 apex {
5534 name: "myapex",
5535 enabled: false,
5536 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005537 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005538 }
5539
5540 apex_key {
5541 name: "myapex.key",
5542 public_key: "testkey.avbpubkey",
5543 private_key: "testkey.pem",
5544 }
5545
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005546 bootclasspath_fragment {
5547 name: "my-bootclasspath-fragment",
5548 enabled: false,
5549 contents: ["libfoo", "libbar"],
5550 apex_available: ["myapex"],
5551 hidden_api: {
5552 split_packages: ["*"],
5553 },
5554 }
5555
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005556 prebuilt_apex {
5557 name: "myapex",
5558 arch: {
5559 arm64: {
5560 src: "myapex-arm64.apex",
5561 },
5562 arm: {
5563 src: "myapex-arm.apex",
5564 },
5565 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005566 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5567 }
5568
5569 prebuilt_bootclasspath_fragment {
5570 name: "my-bootclasspath-fragment",
5571 contents: ["libfoo", "libbar"],
5572 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005573 hidden_api: {
5574 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5575 metadata: "my-bootclasspath-fragment/metadata.csv",
5576 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005577 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5578 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5579 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005580 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 }
5582
5583 java_import {
5584 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005585 jars: ["libfoo.jar"],
5586 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005587 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005588 }
5589
5590 java_library {
5591 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005592 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005593 srcs: ["foo/bar/MyClass.java"],
5594 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005595 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005596 }
Paul Duffin37856732021-02-26 14:24:15 +00005597
5598 java_sdk_library_import {
5599 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005600 public: {
5601 jars: ["libbar.jar"],
5602 },
5603 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005604 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005605 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005606 }
5607
5608 java_sdk_library {
5609 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005610 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005611 srcs: ["foo/bar/MyClass.java"],
5612 unsafe_ignore_missing_latest_api: true,
5613 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005614 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005615 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005616 `
Cole Fausta963b942024-04-11 17:43:00 -07005617 // This test disables libbar, which causes the ComponentDepsMutator to add
5618 // deps on libbar.stubs and other sub-modules that don't exist. We can
5619 // enable AllowMissingDependencies to work around that, but enabling that
5620 // causes extra checks for missing source files to dex_bootjars, so add those
5621 // to the mock fs as well.
5622 preparer2 := android.GroupFixturePreparers(
5623 preparer,
5624 android.PrepareForTestWithAllowMissingDependencies,
5625 android.FixtureMergeMockFs(map[string][]byte{
5626 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5627 "frameworks/base/config/boot-profile.txt": nil,
5628 }),
5629 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005630
Cole Fausta963b942024-04-11 17:43:00 -07005631 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005632 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5633 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005634
Paul Duffin537ea3d2021-05-14 10:38:00 +01005635 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005636 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005637 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005638 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005639 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005640 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 +01005641 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005642 })
Spandan Das3a392012024-01-17 18:26:27 +00005643
Spandan Dasf2c10572024-02-27 04:49:52 +00005644 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005645 bp := `
5646 // Source
5647 apex {
5648 name: "myapex",
5649 enabled: false,
5650 key: "myapex.key",
5651 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5652 }
5653
5654 apex_key {
5655 name: "myapex.key",
5656 public_key: "testkey.avbpubkey",
5657 private_key: "testkey.pem",
5658 }
5659
5660 // Prebuilt
5661 prebuilt_apex {
5662 name: "myapex.v1",
5663 source_apex_name: "myapex",
5664 arch: {
5665 arm64: {
5666 src: "myapex-arm64.apex",
5667 },
5668 arm: {
5669 src: "myapex-arm.apex",
5670 },
5671 },
5672 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5673 prefer: true,
5674 }
5675 prebuilt_apex {
5676 name: "myapex.v2",
5677 source_apex_name: "myapex",
5678 arch: {
5679 arm64: {
5680 src: "myapex-arm64.apex",
5681 },
5682 arm: {
5683 src: "myapex-arm.apex",
5684 },
5685 },
5686 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5687 prefer: true,
5688 }
5689
5690 prebuilt_bootclasspath_fragment {
5691 name: "my-bootclasspath-fragment",
5692 contents: ["libfoo", "libbar"],
5693 apex_available: ["myapex"],
5694 hidden_api: {
5695 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5696 metadata: "my-bootclasspath-fragment/metadata.csv",
5697 index: "my-bootclasspath-fragment/index.csv",
5698 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5699 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5700 },
5701 prefer: true,
5702 }
5703
5704 java_import {
5705 name: "libfoo",
5706 jars: ["libfoo.jar"],
5707 apex_available: ["myapex"],
5708 prefer: true,
5709 }
5710 java_import {
5711 name: "libbar",
5712 jars: ["libbar.jar"],
5713 apex_available: ["myapex"],
5714 prefer: true,
5715 }
5716 `
5717
Spandan Dasf2c10572024-02-27 04:49:52 +00005718 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 +00005719 })
5720
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005721}
5722
Roland Levillain630846d2019-06-26 12:48:34 +01005723func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005724 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005725 apex_test {
5726 name: "myapex",
5727 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005728 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005729 tests: [
5730 "mytest",
5731 ],
5732 }
5733
5734 apex_key {
5735 name: "myapex.key",
5736 public_key: "testkey.avbpubkey",
5737 private_key: "testkey.pem",
5738 }
5739
Liz Kammer1c14a212020-05-12 15:26:55 -07005740 filegroup {
5741 name: "fg",
5742 srcs: [
5743 "baz",
5744 "bar/baz"
5745 ],
5746 }
5747
Roland Levillain630846d2019-06-26 12:48:34 +01005748 cc_test {
5749 name: "mytest",
5750 gtest: false,
5751 srcs: ["mytest.cpp"],
5752 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005753 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005754 system_shared_libs: [],
5755 static_executable: true,
5756 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005757 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005758 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005759
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005760 cc_library {
5761 name: "mylib",
5762 srcs: ["mylib.cpp"],
5763 system_shared_libs: [],
5764 stl: "none",
5765 }
5766
Liz Kammer5bd365f2020-05-27 15:15:11 -07005767 filegroup {
5768 name: "fg2",
5769 srcs: [
5770 "testdata/baz"
5771 ],
5772 }
Roland Levillain630846d2019-06-26 12:48:34 +01005773 `)
5774
Jooyung Hana0503a52023-08-23 13:12:50 +09005775 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005776 copyCmds := apexRule.Args["copy_commands"]
5777
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005778 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005779 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005780 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005781
Liz Kammer1c14a212020-05-12 15:26:55 -07005782 //Ensure that test data are copied into apex.
5783 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5784 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5785
Roland Levillainf89cd092019-07-29 16:22:59 +01005786 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005787 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005788 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005789 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005790 prefix := "TARGET_"
5791 var builder strings.Builder
5792 data.Custom(&builder, name, prefix, "", data)
5793 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005794 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005795 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005796}
5797
Jooyung Hand48f3c32019-08-23 11:18:57 +09005798func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5799 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5800 apex {
5801 name: "myapex",
5802 key: "myapex.key",
5803 native_shared_libs: ["libfoo"],
5804 }
5805
5806 apex_key {
5807 name: "myapex.key",
5808 public_key: "testkey.avbpubkey",
5809 private_key: "testkey.pem",
5810 }
5811
5812 cc_library {
5813 name: "libfoo",
5814 stl: "none",
5815 system_shared_libs: [],
5816 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005817 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005818 }
5819 `)
5820 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5821 apex {
5822 name: "myapex",
5823 key: "myapex.key",
5824 java_libs: ["myjar"],
5825 }
5826
5827 apex_key {
5828 name: "myapex.key",
5829 public_key: "testkey.avbpubkey",
5830 private_key: "testkey.pem",
5831 }
5832
5833 java_library {
5834 name: "myjar",
5835 srcs: ["foo/bar/MyClass.java"],
5836 sdk_version: "none",
5837 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005838 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005839 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005840 }
5841 `)
5842}
5843
Bill Peckhama41a6962021-01-11 10:58:54 -08005844func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005845 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005846 apex {
5847 name: "myapex",
5848 key: "myapex.key",
5849 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005850 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005851 }
5852
5853 apex_key {
5854 name: "myapex.key",
5855 public_key: "testkey.avbpubkey",
5856 private_key: "testkey.pem",
5857 }
5858
5859 java_import {
5860 name: "myjavaimport",
5861 apex_available: ["myapex"],
5862 jars: ["my.jar"],
5863 compile_dex: true,
5864 }
5865 `)
5866
Jooyung Hana0503a52023-08-23 13:12:50 +09005867 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005868 apexRule := module.Rule("apexRule")
5869 copyCmds := apexRule.Args["copy_commands"]
5870 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5871}
5872
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005873func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005874 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005875 apex {
5876 name: "myapex",
5877 key: "myapex.key",
5878 apps: [
5879 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005880 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005881 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005882 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005883 }
5884
5885 apex_key {
5886 name: "myapex.key",
5887 public_key: "testkey.avbpubkey",
5888 private_key: "testkey.pem",
5889 }
5890
5891 android_app {
5892 name: "AppFoo",
5893 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005894 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005895 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005896 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005897 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005898 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005899 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005900 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005901
5902 android_app {
5903 name: "AppFooPriv",
5904 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005905 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005906 system_modules: "none",
5907 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005908 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005909 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005910 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005911 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005912
5913 cc_library_shared {
5914 name: "libjni",
5915 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005916 shared_libs: ["libfoo"],
5917 stl: "none",
5918 system_shared_libs: [],
5919 apex_available: [ "myapex" ],
5920 sdk_version: "current",
5921 }
5922
5923 cc_library_shared {
5924 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005925 stl: "none",
5926 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005927 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005928 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005929 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005930 `)
5931
Jooyung Hana0503a52023-08-23 13:12:50 +09005932 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005933 apexRule := module.Rule("apexRule")
5934 copyCmds := apexRule.Args["copy_commands"]
5935
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005936 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5937 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005938 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005939
Colin Crossaede88c2020-08-11 12:17:01 -07005940 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005941 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005942 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005943 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005944 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005945 // JNI libraries including transitive deps are
5946 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005947 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005948 // ... embedded inside APK (jnilibs.zip)
5949 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5950 // ... and not directly inside the APEX
5951 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5952 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005953
5954 apexBundle := module.Module().(*apexBundle)
5955 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5956 var builder strings.Builder
5957 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5958 androidMk := builder.String()
5959 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5960 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5961 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5962 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5963 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5964 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 +01005965}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005966
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005967func TestApexWithAppImportBuildId(t *testing.T) {
5968 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5969 for _, id := range invalidBuildIds {
5970 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5971 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5972 variables.BuildId = proptools.StringPtr(id)
5973 })
5974 testApexError(t, message, `apex {
5975 name: "myapex",
5976 key: "myapex.key",
5977 apps: ["AppFooPrebuilt"],
5978 updatable: false,
5979 }
5980
5981 apex_key {
5982 name: "myapex.key",
5983 public_key: "testkey.avbpubkey",
5984 private_key: "testkey.pem",
5985 }
5986
5987 android_app_import {
5988 name: "AppFooPrebuilt",
5989 apk: "PrebuiltAppFoo.apk",
5990 presigned: true,
5991 apex_available: ["myapex"],
5992 }
5993 `, fixture)
5994 }
5995}
5996
Dario Frenicde2a032019-10-27 00:29:22 +01005997func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005998 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005999 apex {
6000 name: "myapex",
6001 key: "myapex.key",
6002 apps: [
6003 "AppFooPrebuilt",
6004 "AppFooPrivPrebuilt",
6005 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006006 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006007 }
6008
6009 apex_key {
6010 name: "myapex.key",
6011 public_key: "testkey.avbpubkey",
6012 private_key: "testkey.pem",
6013 }
6014
6015 android_app_import {
6016 name: "AppFooPrebuilt",
6017 apk: "PrebuiltAppFoo.apk",
6018 presigned: true,
6019 dex_preopt: {
6020 enabled: false,
6021 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006022 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006023 }
6024
6025 android_app_import {
6026 name: "AppFooPrivPrebuilt",
6027 apk: "PrebuiltAppFooPriv.apk",
6028 privileged: true,
6029 presigned: true,
6030 dex_preopt: {
6031 enabled: false,
6032 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006033 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006034 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006035 }
6036 `)
6037
Jooyung Hana0503a52023-08-23 13:12:50 +09006038 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006039 apexRule := module.Rule("apexRule")
6040 copyCmds := apexRule.Args["copy_commands"]
6041
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006042 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6043 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006044}
6045
6046func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006047 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006048 apex {
6049 name: "myapex",
6050 key: "myapex.key",
6051 apps: [
6052 "AppFoo",
6053 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006054 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006055 }
6056
6057 apex_key {
6058 name: "myapex.key",
6059 public_key: "testkey.avbpubkey",
6060 private_key: "testkey.pem",
6061 }
6062
6063 android_app {
6064 name: "AppFoo",
6065 srcs: ["foo/bar/MyClass.java"],
6066 sdk_version: "none",
6067 system_modules: "none",
6068 apex_available: [ "myapex" ],
6069 }
6070
6071 android_app_import {
6072 name: "AppFoo",
6073 apk: "AppFooPrebuilt.apk",
6074 filename: "AppFooPrebuilt.apk",
6075 presigned: true,
6076 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006077 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006078 }
6079 `, withFiles(map[string][]byte{
6080 "AppFooPrebuilt.apk": nil,
6081 }))
6082
Jooyung Hana0503a52023-08-23 13:12:50 +09006083 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006084 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006085 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006086}
6087
Dario Freni6f3937c2019-12-20 22:58:03 +00006088func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006089 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006090 apex {
6091 name: "myapex",
6092 key: "myapex.key",
6093 apps: [
6094 "TesterHelpAppFoo",
6095 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006096 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006097 }
6098
6099 apex_key {
6100 name: "myapex.key",
6101 public_key: "testkey.avbpubkey",
6102 private_key: "testkey.pem",
6103 }
6104
6105 android_test_helper_app {
6106 name: "TesterHelpAppFoo",
6107 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006108 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006109 }
6110
6111 `)
6112
Jooyung Hana0503a52023-08-23 13:12:50 +09006113 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006114 apexRule := module.Rule("apexRule")
6115 copyCmds := apexRule.Args["copy_commands"]
6116
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006117 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006118}
6119
Jooyung Han18020ea2019-11-13 10:50:48 +09006120func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6121 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006122 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006123 apex {
6124 name: "myapex",
6125 key: "myapex.key",
6126 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006127 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006128 }
6129
6130 apex_key {
6131 name: "myapex.key",
6132 public_key: "testkey.avbpubkey",
6133 private_key: "testkey.pem",
6134 }
6135
6136 apex {
6137 name: "otherapex",
6138 key: "myapex.key",
6139 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006140 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006141 }
6142
6143 cc_defaults {
6144 name: "libfoo-defaults",
6145 apex_available: ["otherapex"],
6146 }
6147
6148 cc_library {
6149 name: "libfoo",
6150 defaults: ["libfoo-defaults"],
6151 stl: "none",
6152 system_shared_libs: [],
6153 }`)
6154}
6155
Paul Duffine52e66f2020-03-30 17:54:29 +01006156func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006157 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006158 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006159 apex {
6160 name: "myapex",
6161 key: "myapex.key",
6162 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006163 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006164 }
6165
6166 apex_key {
6167 name: "myapex.key",
6168 public_key: "testkey.avbpubkey",
6169 private_key: "testkey.pem",
6170 }
6171
6172 apex {
6173 name: "otherapex",
6174 key: "otherapex.key",
6175 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006176 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006177 }
6178
6179 apex_key {
6180 name: "otherapex.key",
6181 public_key: "testkey.avbpubkey",
6182 private_key: "testkey.pem",
6183 }
6184
6185 cc_library {
6186 name: "libfoo",
6187 stl: "none",
6188 system_shared_libs: [],
6189 apex_available: ["otherapex"],
6190 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006191}
Jiyong Park127b40b2019-09-30 16:04:35 +09006192
Paul Duffine52e66f2020-03-30 17:54:29 +01006193func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006194 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006195 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006196.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006197.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006198.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006199.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006200.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006201.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006202 apex {
6203 name: "myapex",
6204 key: "myapex.key",
6205 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006206 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006207 }
6208
6209 apex_key {
6210 name: "myapex.key",
6211 public_key: "testkey.avbpubkey",
6212 private_key: "testkey.pem",
6213 }
6214
Jiyong Park127b40b2019-09-30 16:04:35 +09006215 cc_library {
6216 name: "libfoo",
6217 stl: "none",
6218 shared_libs: ["libbar"],
6219 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006220 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006221 }
6222
6223 cc_library {
6224 name: "libbar",
6225 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006226 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006227 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006228 apex_available: ["myapex"],
6229 }
6230
6231 cc_library {
6232 name: "libbaz",
6233 stl: "none",
6234 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006235 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006236}
Jiyong Park127b40b2019-09-30 16:04:35 +09006237
Liz Kammer5f108fa2023-05-11 14:33:17 -04006238func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6239 testApex(t, `
6240 apex {
6241 name: "myapex",
6242 key: "myapex.key",
6243 native_shared_libs: ["libfoo"],
6244 updatable: false,
6245 }
6246
6247 apex_key {
6248 name: "myapex.key",
6249 public_key: "testkey.avbpubkey",
6250 private_key: "testkey.pem",
6251 }
6252
6253 cc_library {
6254 name: "libfoo",
6255 stl: "none",
6256 static_libs: ["libbar"],
6257 system_shared_libs: [],
6258 apex_available: ["myapex"],
6259 }
6260
6261 cc_library {
6262 name: "libbar",
6263 stl: "none",
6264 shared_libs: ["libbaz"],
6265 system_shared_libs: [],
6266 apex_available: ["myapex"],
6267 }
6268
6269 cc_library {
6270 name: "libbaz",
6271 stl: "none",
6272 system_shared_libs: [],
6273 }`)
6274
6275 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6276 apex {
6277 name: "myapex",
6278 key: "myapex.key",
6279 native_shared_libs: ["libfoo"],
6280 updatable: false,
6281 }
6282
6283 apex_key {
6284 name: "myapex.key",
6285 public_key: "testkey.avbpubkey",
6286 private_key: "testkey.pem",
6287 }
6288
6289 cc_library {
6290 name: "libfoo",
6291 stl: "none",
6292 static_libs: ["libbar"],
6293 system_shared_libs: [],
6294 apex_available: ["myapex"],
6295 }
6296
6297 cc_library {
6298 name: "libbar",
6299 stl: "none",
6300 system_shared_libs: [],
6301 }`)
6302}
6303
Paul Duffine52e66f2020-03-30 17:54:29 +01006304func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006305 testApexError(t, "\"otherapex\" is not a valid module name", `
6306 apex {
6307 name: "myapex",
6308 key: "myapex.key",
6309 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006310 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006311 }
6312
6313 apex_key {
6314 name: "myapex.key",
6315 public_key: "testkey.avbpubkey",
6316 private_key: "testkey.pem",
6317 }
6318
6319 cc_library {
6320 name: "libfoo",
6321 stl: "none",
6322 system_shared_libs: [],
6323 apex_available: ["otherapex"],
6324 }`)
6325
Paul Duffine52e66f2020-03-30 17:54:29 +01006326 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006327 apex {
6328 name: "myapex",
6329 key: "myapex.key",
6330 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006331 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006332 }
6333
6334 apex_key {
6335 name: "myapex.key",
6336 public_key: "testkey.avbpubkey",
6337 private_key: "testkey.pem",
6338 }
6339
6340 cc_library {
6341 name: "libfoo",
6342 stl: "none",
6343 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006344 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006345 apex_available: ["myapex"],
6346 }
6347
6348 cc_library {
6349 name: "libbar",
6350 stl: "none",
6351 system_shared_libs: [],
6352 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006353 }
6354
6355 cc_library {
6356 name: "libbaz",
6357 stl: "none",
6358 system_shared_libs: [],
6359 stubs: {
6360 versions: ["10", "20", "30"],
6361 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006362 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006363}
Jiyong Park127b40b2019-09-30 16:04:35 +09006364
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006365func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6366 t.Run("negative variant_version produces error", func(t *testing.T) {
6367 testApexError(t, "expected an integer between 0-9; got -1", `
6368 apex {
6369 name: "myapex",
6370 key: "myapex.key",
6371 apex_available_name: "com.android.foo",
6372 variant_version: "-1",
6373 updatable: false,
6374 }
6375 apex_key {
6376 name: "myapex.key",
6377 public_key: "testkey.avbpubkey",
6378 private_key: "testkey.pem",
6379 }
6380 `)
6381 })
6382
6383 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6384 testApexError(t, "expected an integer between 0-9; got 10", `
6385 apex {
6386 name: "myapex",
6387 key: "myapex.key",
6388 apex_available_name: "com.android.foo",
6389 variant_version: "10",
6390 updatable: false,
6391 }
6392 apex_key {
6393 name: "myapex.key",
6394 public_key: "testkey.avbpubkey",
6395 private_key: "testkey.pem",
6396 }
6397 `)
6398 })
6399}
6400
6401func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6402 context := android.GroupFixturePreparers(
6403 android.PrepareForIntegrationTestWithAndroid,
6404 PrepareForTestWithApexBuildComponents,
6405 android.FixtureMergeMockFs(android.MockFS{
6406 "system/sepolicy/apex/foo-file_contexts": nil,
6407 "system/sepolicy/apex/bar-file_contexts": nil,
6408 }),
6409 )
6410 result := context.RunTestWithBp(t, `
6411 apex {
6412 name: "foo",
6413 key: "myapex.key",
6414 apex_available_name: "com.android.foo",
6415 variant_version: "0",
6416 updatable: false,
6417 }
6418 apex {
6419 name: "bar",
6420 key: "myapex.key",
6421 apex_available_name: "com.android.foo",
6422 variant_version: "3",
6423 updatable: false,
6424 }
6425 apex_key {
6426 name: "myapex.key",
6427 public_key: "testkey.avbpubkey",
6428 private_key: "testkey.pem",
6429 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006430 override_apex {
6431 name: "myoverrideapex",
6432 base: "bar",
6433 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006434 `)
6435
Jooyung Hana0503a52023-08-23 13:12:50 +09006436 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006437 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6438 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6439 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6440 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6441 }
6442
Jooyung Hana0503a52023-08-23 13:12:50 +09006443 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006444 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6445 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6446 barActualDefaultVersion := barManifestRule.Args["default_version"]
6447 if barActualDefaultVersion != barExpectedDefaultVersion {
6448 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6449 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006450
Spandan Das50801e22024-05-13 18:29:45 +00006451 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006452 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6453 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6454 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6455 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006456}
6457
Sam Delmericoca816532023-06-02 14:09:50 -04006458func TestApexAvailable_ApexAvailableName(t *testing.T) {
6459 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6460 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6461 apex {
6462 name: "myapex_sminus",
6463 key: "myapex.key",
6464 apps: ["AppFoo"],
6465 apex_available_name: "myapex",
6466 updatable: false,
6467 }
6468 apex {
6469 name: "myapex",
6470 key: "myapex.key",
6471 apps: ["AppFoo"],
6472 updatable: false,
6473 }
6474 apex_key {
6475 name: "myapex.key",
6476 public_key: "testkey.avbpubkey",
6477 private_key: "testkey.pem",
6478 }
6479 android_app {
6480 name: "AppFoo",
6481 srcs: ["foo/bar/MyClass.java"],
6482 sdk_version: "none",
6483 system_modules: "none",
6484 apex_available: [ "myapex_sminus" ],
6485 }`,
6486 android.FixtureMergeMockFs(android.MockFS{
6487 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6488 }),
6489 )
6490 })
6491
6492 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6493 testApex(t, `
6494 apex {
6495 name: "myapex_sminus",
6496 key: "myapex.key",
6497 apps: ["AppFoo"],
6498 apex_available_name: "myapex",
6499 updatable: false,
6500 }
6501 apex {
6502 name: "myapex",
6503 key: "myapex.key",
6504 apps: ["AppFoo"],
6505 updatable: false,
6506 }
6507 apex_key {
6508 name: "myapex.key",
6509 public_key: "testkey.avbpubkey",
6510 private_key: "testkey.pem",
6511 }
6512 android_app {
6513 name: "AppFoo",
6514 srcs: ["foo/bar/MyClass.java"],
6515 sdk_version: "none",
6516 system_modules: "none",
6517 apex_available: [ "myapex" ],
6518 }`,
6519 android.FixtureMergeMockFs(android.MockFS{
6520 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6521 }),
6522 )
6523 })
6524
6525 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6526 testApex(t, `
6527 override_apex {
6528 name: "myoverrideapex_sminus",
6529 base: "myapex_sminus",
6530 key: "myapex.key",
6531 apps: ["AppFooOverride"],
6532 }
6533 override_apex {
6534 name: "myoverrideapex",
6535 base: "myapex",
6536 key: "myapex.key",
6537 apps: ["AppFooOverride"],
6538 }
6539 apex {
6540 name: "myapex_sminus",
6541 key: "myapex.key",
6542 apps: ["AppFoo"],
6543 apex_available_name: "myapex",
6544 updatable: false,
6545 }
6546 apex {
6547 name: "myapex",
6548 key: "myapex.key",
6549 apps: ["AppFoo"],
6550 updatable: false,
6551 }
6552 apex_key {
6553 name: "myapex.key",
6554 public_key: "testkey.avbpubkey",
6555 private_key: "testkey.pem",
6556 }
6557 android_app {
6558 name: "AppFooOverride",
6559 srcs: ["foo/bar/MyClass.java"],
6560 sdk_version: "none",
6561 system_modules: "none",
6562 apex_available: [ "myapex" ],
6563 }
6564 android_app {
6565 name: "AppFoo",
6566 srcs: ["foo/bar/MyClass.java"],
6567 sdk_version: "none",
6568 system_modules: "none",
6569 apex_available: [ "myapex" ],
6570 }`,
6571 android.FixtureMergeMockFs(android.MockFS{
6572 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6573 }),
6574 )
6575 })
6576}
6577
6578func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6579 context := android.GroupFixturePreparers(
6580 android.PrepareForIntegrationTestWithAndroid,
6581 PrepareForTestWithApexBuildComponents,
6582 java.PrepareForTestWithDexpreopt,
6583 android.FixtureMergeMockFs(android.MockFS{
6584 "system/sepolicy/apex/myapex-file_contexts": nil,
6585 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6586 }),
6587 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6588 variables.BuildId = proptools.StringPtr("buildid")
6589 }),
6590 )
6591 context.RunTestWithBp(t, `
6592 override_apex {
6593 name: "myoverrideapex_sminus",
6594 base: "myapex_sminus",
6595 }
6596 override_apex {
6597 name: "myoverrideapex",
6598 base: "myapex",
6599 }
6600 apex {
6601 name: "myapex",
6602 key: "myapex.key",
6603 apps: ["AppFoo"],
6604 updatable: false,
6605 }
6606 apex {
6607 name: "myapex_sminus",
6608 apex_available_name: "myapex",
6609 key: "myapex.key",
6610 apps: ["AppFoo_sminus"],
6611 updatable: false,
6612 }
6613 apex_key {
6614 name: "myapex.key",
6615 public_key: "testkey.avbpubkey",
6616 private_key: "testkey.pem",
6617 }
6618 android_app {
6619 name: "AppFoo",
6620 srcs: ["foo/bar/MyClass.java"],
6621 sdk_version: "none",
6622 system_modules: "none",
6623 apex_available: [ "myapex" ],
6624 }
6625 android_app {
6626 name: "AppFoo_sminus",
6627 srcs: ["foo/bar/MyClass.java"],
6628 sdk_version: "none",
6629 min_sdk_version: "29",
6630 system_modules: "none",
6631 apex_available: [ "myapex" ],
6632 }`)
6633}
6634
Jiyong Park89e850a2020-04-07 16:37:39 +09006635func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006636 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006637 apex {
6638 name: "myapex",
6639 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006640 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006641 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006642 }
6643
6644 apex_key {
6645 name: "myapex.key",
6646 public_key: "testkey.avbpubkey",
6647 private_key: "testkey.pem",
6648 }
6649
6650 cc_library {
6651 name: "libfoo",
6652 stl: "none",
6653 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006654 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006655 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006656 }
6657
6658 cc_library {
6659 name: "libfoo2",
6660 stl: "none",
6661 system_shared_libs: [],
6662 shared_libs: ["libbaz"],
6663 apex_available: ["//apex_available:platform"],
6664 }
6665
6666 cc_library {
6667 name: "libbar",
6668 stl: "none",
6669 system_shared_libs: [],
6670 apex_available: ["myapex"],
6671 }
6672
6673 cc_library {
6674 name: "libbaz",
6675 stl: "none",
6676 system_shared_libs: [],
6677 apex_available: ["myapex"],
6678 stubs: {
6679 versions: ["1"],
6680 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006681 }`)
6682
Jiyong Park89e850a2020-04-07 16:37:39 +09006683 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6684 // because it depends on libbar which isn't available to platform
6685 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6686 if libfoo.NotAvailableForPlatform() != true {
6687 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6688 }
6689
6690 // libfoo2 however can be available to platform because it depends on libbaz which provides
6691 // stubs
6692 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6693 if libfoo2.NotAvailableForPlatform() == true {
6694 t.Errorf("%q should be available to platform", libfoo2.String())
6695 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006696}
Jiyong Parka90ca002019-10-07 15:47:24 +09006697
Paul Duffine52e66f2020-03-30 17:54:29 +01006698func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006699 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006700 apex {
6701 name: "myapex",
6702 key: "myapex.key",
6703 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006704 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006705 }
6706
6707 apex_key {
6708 name: "myapex.key",
6709 public_key: "testkey.avbpubkey",
6710 private_key: "testkey.pem",
6711 }
6712
6713 cc_library {
6714 name: "libfoo",
6715 stl: "none",
6716 system_shared_libs: [],
6717 apex_available: ["myapex"],
6718 static: {
6719 apex_available: ["//apex_available:platform"],
6720 },
6721 }`)
6722
Jiyong Park89e850a2020-04-07 16:37:39 +09006723 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6724 if libfooShared.NotAvailableForPlatform() != true {
6725 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6726 }
6727 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6728 if libfooStatic.NotAvailableForPlatform() != false {
6729 t.Errorf("%q should be available to platform", libfooStatic.String())
6730 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006731}
6732
Jiyong Park5d790c32019-11-15 18:40:32 +09006733func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006734 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006735 apex {
6736 name: "myapex",
6737 key: "myapex.key",
6738 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006739 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006740 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006741 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006742 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006743 }
6744
6745 override_apex {
6746 name: "override_myapex",
6747 base: "myapex",
6748 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006749 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006750 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006751 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006752 compile_multilib: "first",
6753 multilib: {
6754 lib32: {
6755 native_shared_libs: ["mylib32"],
6756 },
6757 lib64: {
6758 native_shared_libs: ["mylib64"],
6759 },
6760 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006761 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006762 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006763 key: "mynewapex.key",
6764 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006765 }
6766
6767 apex_key {
6768 name: "myapex.key",
6769 public_key: "testkey.avbpubkey",
6770 private_key: "testkey.pem",
6771 }
6772
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006773 apex_key {
6774 name: "mynewapex.key",
6775 public_key: "testkey2.avbpubkey",
6776 private_key: "testkey2.pem",
6777 }
6778
6779 android_app_certificate {
6780 name: "myapex.certificate",
6781 certificate: "testkey",
6782 }
6783
Jiyong Park5d790c32019-11-15 18:40:32 +09006784 android_app {
6785 name: "app",
6786 srcs: ["foo/bar/MyClass.java"],
6787 package_name: "foo",
6788 sdk_version: "none",
6789 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006790 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006791 }
6792
6793 override_android_app {
6794 name: "override_app",
6795 base: "app",
6796 package_name: "bar",
6797 }
markchien7c803b82021-08-26 22:10:06 +08006798
6799 bpf {
6800 name: "bpf",
6801 srcs: ["bpf.c"],
6802 }
6803
6804 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006805 name: "overrideBpf",
6806 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006807 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006808
6809 prebuilt_etc {
6810 name: "myetc",
6811 src: "myprebuilt",
6812 }
6813
6814 prebuilt_etc {
6815 name: "override_myetc",
6816 src: "override_myprebuilt",
6817 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006818
6819 cc_library {
6820 name: "mylib32",
6821 apex_available: [ "myapex" ],
6822 }
6823
6824 cc_library {
6825 name: "mylib64",
6826 apex_available: [ "myapex" ],
6827 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006828 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006829
Jooyung Hana0503a52023-08-23 13:12:50 +09006830 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00006831 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006832 if originalVariant.GetOverriddenBy() != "" {
6833 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6834 }
6835 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6836 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6837 }
6838
Spandan Das50801e22024-05-13 18:29:45 +00006839 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006840 apexRule := module.Rule("apexRule")
6841 copyCmds := apexRule.Args["copy_commands"]
6842
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006843 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6844 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006845
markchien7c803b82021-08-26 22:10:06 +08006846 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006847 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006848
Daniel Norman5a3ce132021-08-26 15:44:43 -07006849 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6850 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6851
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006852 apexBundle := module.Module().(*apexBundle)
6853 name := apexBundle.Name()
6854 if name != "override_myapex" {
6855 t.Errorf("name should be \"override_myapex\", but was %q", name)
6856 }
6857
Baligh Uddin004d7172020-02-19 21:29:28 -08006858 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6859 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6860 }
6861
Jiyong Park20bacab2020-03-03 11:45:41 +09006862 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006863 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006864 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6865
6866 signApkRule := module.Rule("signapk")
6867 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006868
Colin Crossaa255532020-07-03 13:18:24 -07006869 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006870 var builder strings.Builder
6871 data.Custom(&builder, name, "TARGET_", "", data)
6872 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006873 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6874 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006875 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006876 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006877 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006878 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006879 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006880 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006881}
6882
Albert Martineefabcf2022-03-21 20:11:16 +00006883func TestMinSdkVersionOverride(t *testing.T) {
6884 // Override from 29 to 31
6885 minSdkOverride31 := "31"
6886 ctx := testApex(t, `
6887 apex {
6888 name: "myapex",
6889 key: "myapex.key",
6890 native_shared_libs: ["mylib"],
6891 updatable: true,
6892 min_sdk_version: "29"
6893 }
6894
6895 override_apex {
6896 name: "override_myapex",
6897 base: "myapex",
6898 logging_parent: "com.foo.bar",
6899 package_name: "test.overridden.package"
6900 }
6901
6902 apex_key {
6903 name: "myapex.key",
6904 public_key: "testkey.avbpubkey",
6905 private_key: "testkey.pem",
6906 }
6907
6908 cc_library {
6909 name: "mylib",
6910 srcs: ["mylib.cpp"],
6911 runtime_libs: ["libbar"],
6912 system_shared_libs: [],
6913 stl: "none",
6914 apex_available: [ "myapex" ],
6915 min_sdk_version: "apex_inherit"
6916 }
6917
6918 cc_library {
6919 name: "libbar",
6920 srcs: ["mylib.cpp"],
6921 system_shared_libs: [],
6922 stl: "none",
6923 apex_available: [ "myapex" ],
6924 min_sdk_version: "apex_inherit"
6925 }
6926
6927 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6928
Jooyung Hana0503a52023-08-23 13:12:50 +09006929 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006930 copyCmds := apexRule.Args["copy_commands"]
6931
6932 // Ensure that direct non-stubs dep is always included
6933 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6934
6935 // Ensure that runtime_libs dep in included
6936 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6937
6938 // Ensure libraries target overridden min_sdk_version value
6939 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6940}
6941
6942func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6943 // Attempt to override from 31 to 29, should be a NOOP
6944 minSdkOverride29 := "29"
6945 ctx := testApex(t, `
6946 apex {
6947 name: "myapex",
6948 key: "myapex.key",
6949 native_shared_libs: ["mylib"],
6950 updatable: true,
6951 min_sdk_version: "31"
6952 }
6953
6954 override_apex {
6955 name: "override_myapex",
6956 base: "myapex",
6957 logging_parent: "com.foo.bar",
6958 package_name: "test.overridden.package"
6959 }
6960
6961 apex_key {
6962 name: "myapex.key",
6963 public_key: "testkey.avbpubkey",
6964 private_key: "testkey.pem",
6965 }
6966
6967 cc_library {
6968 name: "mylib",
6969 srcs: ["mylib.cpp"],
6970 runtime_libs: ["libbar"],
6971 system_shared_libs: [],
6972 stl: "none",
6973 apex_available: [ "myapex" ],
6974 min_sdk_version: "apex_inherit"
6975 }
6976
6977 cc_library {
6978 name: "libbar",
6979 srcs: ["mylib.cpp"],
6980 system_shared_libs: [],
6981 stl: "none",
6982 apex_available: [ "myapex" ],
6983 min_sdk_version: "apex_inherit"
6984 }
6985
6986 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6987
Jooyung Hana0503a52023-08-23 13:12:50 +09006988 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006989 copyCmds := apexRule.Args["copy_commands"]
6990
6991 // Ensure that direct non-stubs dep is always included
6992 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6993
6994 // Ensure that runtime_libs dep in included
6995 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6996
6997 // Ensure libraries target the original min_sdk_version value rather than the overridden
6998 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6999}
7000
Jooyung Han214bf372019-11-12 13:03:50 +09007001func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007002 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007003 apex {
7004 name: "myapex",
7005 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007006 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007007 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007008 }
7009
7010 apex_key {
7011 name: "myapex.key",
7012 public_key: "testkey.avbpubkey",
7013 private_key: "testkey.pem",
7014 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007015
7016 cc_library {
7017 name: "mylib",
7018 srcs: ["mylib.cpp"],
7019 stl: "libc++",
7020 system_shared_libs: [],
7021 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007022 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007023 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007024 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007025
Jooyung Hana0503a52023-08-23 13:12:50 +09007026 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007027 args := module.Rule("apexRule").Args
7028 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007029 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007030
7031 // The copies of the libraries in the apex should have one more dependency than
7032 // the ones outside the apex, namely the unwinder. Ideally we should check
7033 // the dependency names directly here but for some reason the names are blank in
7034 // this test.
7035 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007036 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007037 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7038 if len(apexImplicits) != len(nonApexImplicits)+1 {
7039 t.Errorf("%q missing unwinder dep", lib)
7040 }
7041 }
Jooyung Han214bf372019-11-12 13:03:50 +09007042}
7043
Paul Duffine05480a2021-03-08 15:07:14 +00007044var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007045 "api/current.txt": nil,
7046 "api/removed.txt": nil,
7047 "api/system-current.txt": nil,
7048 "api/system-removed.txt": nil,
7049 "api/test-current.txt": nil,
7050 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007051
Anton Hanssondff2c782020-12-21 17:10:01 +00007052 "100/public/api/foo.txt": nil,
7053 "100/public/api/foo-removed.txt": nil,
7054 "100/system/api/foo.txt": nil,
7055 "100/system/api/foo-removed.txt": nil,
7056
Paul Duffineedc5d52020-06-12 17:46:39 +01007057 // For java_sdk_library_import
7058 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007059}
7060
Jooyung Han58f26ab2019-12-18 15:34:32 +09007061func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007062 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007063 apex {
7064 name: "myapex",
7065 key: "myapex.key",
7066 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007067 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007068 }
7069
7070 apex_key {
7071 name: "myapex.key",
7072 public_key: "testkey.avbpubkey",
7073 private_key: "testkey.pem",
7074 }
7075
7076 java_sdk_library {
7077 name: "foo",
7078 srcs: ["a.java"],
7079 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007080 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007081 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007082
7083 prebuilt_apis {
7084 name: "sdk",
7085 api_dirs: ["100"],
7086 }
Paul Duffin9b879592020-05-26 13:21:35 +01007087 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007088
7089 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007090 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007091 "javalib/foo.jar",
7092 "etc/permissions/foo.xml",
7093 })
7094 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007095 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7096 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7097 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007098}
7099
Spandan Das3ee19692024-06-19 04:47:40 +00007100func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7101 ctx := testApex(t, `
7102 override_apex {
7103 name: "mycompanyapex",
7104 base: "myapex",
7105 }
7106 apex {
7107 name: "myapex",
7108 key: "myapex.key",
7109 java_libs: ["foo"],
7110 updatable: false,
7111 }
7112
7113 apex_key {
7114 name: "myapex.key",
7115 public_key: "testkey.avbpubkey",
7116 private_key: "testkey.pem",
7117 }
7118
7119 java_sdk_library {
7120 name: "foo",
7121 srcs: ["a.java"],
7122 api_packages: ["foo"],
7123 apex_available: [ "myapex" ],
7124 }
7125
7126 prebuilt_apis {
7127 name: "sdk",
7128 api_dirs: ["100"],
7129 }
7130 `, withFiles(filesForSdkLibrary))
7131
7132 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7133 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7134 // (com.android.foo), the filepath should not contain override apex name.
7135 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7136 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7137 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7138}
7139
Paul Duffin9b879592020-05-26 13:21:35 +01007140func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007141 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007142 apex {
7143 name: "myapex",
7144 key: "myapex.key",
7145 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007146 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007147 }
7148
7149 apex_key {
7150 name: "myapex.key",
7151 public_key: "testkey.avbpubkey",
7152 private_key: "testkey.pem",
7153 }
7154
7155 java_sdk_library {
7156 name: "foo",
7157 srcs: ["a.java"],
7158 api_packages: ["foo"],
7159 apex_available: ["myapex"],
7160 sdk_version: "none",
7161 system_modules: "none",
7162 }
7163
7164 java_library {
7165 name: "bar",
7166 srcs: ["a.java"],
7167 libs: ["foo"],
7168 apex_available: ["myapex"],
7169 sdk_version: "none",
7170 system_modules: "none",
7171 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007172
7173 prebuilt_apis {
7174 name: "sdk",
7175 api_dirs: ["100"],
7176 }
Paul Duffin9b879592020-05-26 13:21:35 +01007177 `, withFiles(filesForSdkLibrary))
7178
7179 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007180 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007181 "javalib/bar.jar",
7182 "javalib/foo.jar",
7183 "etc/permissions/foo.xml",
7184 })
7185
7186 // The bar library should depend on the implementation jar.
7187 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007188 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007189 t.Errorf("expected %q, found %#q", expected, actual)
7190 }
7191}
7192
7193func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007194 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007195 apex {
7196 name: "myapex",
7197 key: "myapex.key",
7198 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007199 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007200 }
7201
7202 apex_key {
7203 name: "myapex.key",
7204 public_key: "testkey.avbpubkey",
7205 private_key: "testkey.pem",
7206 }
7207
7208 java_sdk_library {
7209 name: "foo",
7210 srcs: ["a.java"],
7211 api_packages: ["foo"],
7212 apex_available: ["myapex"],
7213 sdk_version: "none",
7214 system_modules: "none",
7215 }
7216
7217 java_library {
7218 name: "bar",
7219 srcs: ["a.java"],
7220 libs: ["foo"],
7221 sdk_version: "none",
7222 system_modules: "none",
7223 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007224
7225 prebuilt_apis {
7226 name: "sdk",
7227 api_dirs: ["100"],
7228 }
Paul Duffin9b879592020-05-26 13:21:35 +01007229 `, withFiles(filesForSdkLibrary))
7230
7231 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007232 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007233 "javalib/foo.jar",
7234 "etc/permissions/foo.xml",
7235 })
7236
7237 // The bar library should depend on the stubs jar.
7238 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007239 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007240 t.Errorf("expected %q, found %#q", expected, actual)
7241 }
7242}
7243
Paul Duffineedc5d52020-06-12 17:46:39 +01007244func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007245 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007246 prebuilt_apis {
7247 name: "sdk",
7248 api_dirs: ["100"],
7249 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007250 withFiles(map[string][]byte{
7251 "apex/a.java": nil,
7252 "apex/apex_manifest.json": nil,
7253 "apex/Android.bp": []byte(`
7254 package {
7255 default_visibility: ["//visibility:private"],
7256 }
7257
7258 apex {
7259 name: "myapex",
7260 key: "myapex.key",
7261 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007262 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007263 }
7264
7265 apex_key {
7266 name: "myapex.key",
7267 public_key: "testkey.avbpubkey",
7268 private_key: "testkey.pem",
7269 }
7270
7271 java_library {
7272 name: "bar",
7273 srcs: ["a.java"],
7274 libs: ["foo"],
7275 apex_available: ["myapex"],
7276 sdk_version: "none",
7277 system_modules: "none",
7278 }
7279`),
7280 "source/a.java": nil,
7281 "source/api/current.txt": nil,
7282 "source/api/removed.txt": nil,
7283 "source/Android.bp": []byte(`
7284 package {
7285 default_visibility: ["//visibility:private"],
7286 }
7287
7288 java_sdk_library {
7289 name: "foo",
7290 visibility: ["//apex"],
7291 srcs: ["a.java"],
7292 api_packages: ["foo"],
7293 apex_available: ["myapex"],
7294 sdk_version: "none",
7295 system_modules: "none",
7296 public: {
7297 enabled: true,
7298 },
7299 }
7300`),
7301 "prebuilt/a.jar": nil,
7302 "prebuilt/Android.bp": []byte(`
7303 package {
7304 default_visibility: ["//visibility:private"],
7305 }
7306
7307 java_sdk_library_import {
7308 name: "foo",
7309 visibility: ["//apex", "//source"],
7310 apex_available: ["myapex"],
7311 prefer: true,
7312 public: {
7313 jars: ["a.jar"],
7314 },
7315 }
7316`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007317 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007318 )
7319
7320 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007321 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007322 "javalib/bar.jar",
7323 "javalib/foo.jar",
7324 "etc/permissions/foo.xml",
7325 })
7326
7327 // The bar library should depend on the implementation jar.
7328 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007329 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007330 t.Errorf("expected %q, found %#q", expected, actual)
7331 }
7332}
7333
7334func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7335 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7336 apex {
7337 name: "myapex",
7338 key: "myapex.key",
7339 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007340 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007341 }
7342
7343 apex_key {
7344 name: "myapex.key",
7345 public_key: "testkey.avbpubkey",
7346 private_key: "testkey.pem",
7347 }
7348
7349 java_sdk_library_import {
7350 name: "foo",
7351 apex_available: ["myapex"],
7352 prefer: true,
7353 public: {
7354 jars: ["a.jar"],
7355 },
7356 }
7357
7358 `, withFiles(filesForSdkLibrary))
7359}
7360
atrost6e126252020-01-27 17:01:16 +00007361func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007362 result := android.GroupFixturePreparers(
7363 prepareForApexTest,
7364 java.PrepareForTestWithPlatformCompatConfig,
7365 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007366 apex {
7367 name: "myapex",
7368 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007369 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007370 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007371 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007372 }
7373
7374 apex_key {
7375 name: "myapex.key",
7376 public_key: "testkey.avbpubkey",
7377 private_key: "testkey.pem",
7378 }
7379
7380 platform_compat_config {
7381 name: "myjar-platform-compat-config",
7382 src: ":myjar",
7383 }
7384
7385 java_library {
7386 name: "myjar",
7387 srcs: ["foo/bar/MyClass.java"],
7388 sdk_version: "none",
7389 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007390 apex_available: [ "myapex" ],
7391 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007392
7393 // Make sure that a preferred prebuilt does not affect the apex contents.
7394 prebuilt_platform_compat_config {
7395 name: "myjar-platform-compat-config",
7396 metadata: "compat-config/metadata.xml",
7397 prefer: true,
7398 }
atrost6e126252020-01-27 17:01:16 +00007399 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007400 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007401 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007402 "etc/compatconfig/myjar-platform-compat-config.xml",
7403 "javalib/myjar.jar",
7404 })
7405}
7406
Jooyung Han862c0d62022-12-21 10:15:37 +09007407func TestNoDupeApexFiles(t *testing.T) {
7408 android.GroupFixturePreparers(
7409 android.PrepareForTestWithAndroidBuildComponents,
7410 PrepareForTestWithApexBuildComponents,
7411 prepareForTestWithMyapex,
7412 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7413 ).
7414 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7415 RunTestWithBp(t, `
7416 apex {
7417 name: "myapex",
7418 key: "myapex.key",
7419 prebuilts: ["foo", "bar"],
7420 updatable: false,
7421 }
7422
7423 apex_key {
7424 name: "myapex.key",
7425 public_key: "testkey.avbpubkey",
7426 private_key: "testkey.pem",
7427 }
7428
7429 prebuilt_etc {
7430 name: "foo",
7431 src: "myprebuilt",
7432 filename_from_src: true,
7433 }
7434
7435 prebuilt_etc {
7436 name: "bar",
7437 src: "myprebuilt",
7438 filename_from_src: true,
7439 }
7440 `)
7441}
7442
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007443func TestApexUnwantedTransitiveDeps(t *testing.T) {
7444 bp := `
7445 apex {
7446 name: "myapex",
7447 key: "myapex.key",
7448 native_shared_libs: ["libfoo"],
7449 updatable: false,
7450 unwanted_transitive_deps: ["libbar"],
7451 }
7452
7453 apex_key {
7454 name: "myapex.key",
7455 public_key: "testkey.avbpubkey",
7456 private_key: "testkey.pem",
7457 }
7458
7459 cc_library {
7460 name: "libfoo",
7461 srcs: ["foo.cpp"],
7462 shared_libs: ["libbar"],
7463 apex_available: ["myapex"],
7464 }
7465
7466 cc_library {
7467 name: "libbar",
7468 srcs: ["bar.cpp"],
7469 apex_available: ["myapex"],
7470 }`
7471 ctx := testApex(t, bp)
7472 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7473 "*/libc++.so",
7474 "*/libfoo.so",
7475 // not libbar.so
7476 })
7477}
7478
Jiyong Park479321d2019-12-16 11:47:12 +09007479func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7480 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7481 apex {
7482 name: "myapex",
7483 key: "myapex.key",
7484 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007485 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007486 }
7487
7488 apex_key {
7489 name: "myapex.key",
7490 public_key: "testkey.avbpubkey",
7491 private_key: "testkey.pem",
7492 }
7493
7494 java_library {
7495 name: "myjar",
7496 srcs: ["foo/bar/MyClass.java"],
7497 sdk_version: "none",
7498 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007499 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007500 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007501 }
7502 `)
7503}
7504
Jiyong Park7afd1072019-12-30 16:56:33 +09007505func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007506 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007507 apex {
7508 name: "myapex",
7509 key: "myapex.key",
7510 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007511 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007512 }
7513
7514 apex_key {
7515 name: "myapex.key",
7516 public_key: "testkey.avbpubkey",
7517 private_key: "testkey.pem",
7518 }
7519
7520 cc_library {
7521 name: "mylib",
7522 srcs: ["mylib.cpp"],
7523 system_shared_libs: [],
7524 stl: "none",
7525 required: ["a", "b"],
7526 host_required: ["c", "d"],
7527 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007528 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007529 }
7530 `)
7531
Jooyung Hana0503a52023-08-23 13:12:50 +09007532 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007533 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007534 name := apexBundle.BaseModuleName()
7535 prefix := "TARGET_"
7536 var builder strings.Builder
7537 data.Custom(&builder, name, prefix, "", data)
7538 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007539 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007540 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7541 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007542}
7543
Jiyong Park7cd10e32020-01-14 09:22:18 +09007544func TestSymlinksFromApexToSystem(t *testing.T) {
7545 bp := `
7546 apex {
7547 name: "myapex",
7548 key: "myapex.key",
7549 native_shared_libs: ["mylib"],
7550 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007551 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007552 }
7553
Jiyong Park9d677202020-02-19 16:29:35 +09007554 apex {
7555 name: "myapex.updatable",
7556 key: "myapex.key",
7557 native_shared_libs: ["mylib"],
7558 java_libs: ["myjar"],
7559 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007560 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007561 }
7562
Jiyong Park7cd10e32020-01-14 09:22:18 +09007563 apex_key {
7564 name: "myapex.key",
7565 public_key: "testkey.avbpubkey",
7566 private_key: "testkey.pem",
7567 }
7568
7569 cc_library {
7570 name: "mylib",
7571 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007572 shared_libs: [
7573 "myotherlib",
7574 "myotherlib_ext",
7575 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007576 system_shared_libs: [],
7577 stl: "none",
7578 apex_available: [
7579 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007580 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007581 "//apex_available:platform",
7582 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007583 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007584 }
7585
7586 cc_library {
7587 name: "myotherlib",
7588 srcs: ["mylib.cpp"],
7589 system_shared_libs: [],
7590 stl: "none",
7591 apex_available: [
7592 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007593 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007594 "//apex_available:platform",
7595 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007596 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007597 }
7598
Jiyong Parkce243632023-02-17 18:22:25 +09007599 cc_library {
7600 name: "myotherlib_ext",
7601 srcs: ["mylib.cpp"],
7602 system_shared_libs: [],
7603 system_ext_specific: true,
7604 stl: "none",
7605 apex_available: [
7606 "myapex",
7607 "myapex.updatable",
7608 "//apex_available:platform",
7609 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007610 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007611 }
7612
Jiyong Park7cd10e32020-01-14 09:22:18 +09007613 java_library {
7614 name: "myjar",
7615 srcs: ["foo/bar/MyClass.java"],
7616 sdk_version: "none",
7617 system_modules: "none",
7618 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007619 apex_available: [
7620 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007621 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007622 "//apex_available:platform",
7623 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007624 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007625 }
7626
7627 java_library {
7628 name: "myotherjar",
7629 srcs: ["foo/bar/MyClass.java"],
7630 sdk_version: "none",
7631 system_modules: "none",
7632 apex_available: [
7633 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007634 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007635 "//apex_available:platform",
7636 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007637 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007638 }
7639 `
7640
7641 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7642 for _, f := range files {
7643 if f.path == file {
7644 if f.isLink {
7645 t.Errorf("%q is not a real file", file)
7646 }
7647 return
7648 }
7649 }
7650 t.Errorf("%q is not found", file)
7651 }
7652
Jiyong Parkce243632023-02-17 18:22:25 +09007653 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007654 for _, f := range files {
7655 if f.path == file {
7656 if !f.isLink {
7657 t.Errorf("%q is not a symlink", file)
7658 }
Jiyong Parkce243632023-02-17 18:22:25 +09007659 if f.src != target {
7660 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7661 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007662 return
7663 }
7664 }
7665 t.Errorf("%q is not found", file)
7666 }
7667
Jiyong Park9d677202020-02-19 16:29:35 +09007668 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7669 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007670 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007671 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007672 ensureRealfileExists(t, files, "javalib/myjar.jar")
7673 ensureRealfileExists(t, files, "lib64/mylib.so")
7674 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007675 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007676
Jooyung Hana0503a52023-08-23 13:12:50 +09007677 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007678 ensureRealfileExists(t, files, "javalib/myjar.jar")
7679 ensureRealfileExists(t, files, "lib64/mylib.so")
7680 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007681 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007682
7683 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007684 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007685 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007686 ensureRealfileExists(t, files, "javalib/myjar.jar")
7687 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007688 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7689 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007690
Jooyung Hana0503a52023-08-23 13:12:50 +09007691 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007692 ensureRealfileExists(t, files, "javalib/myjar.jar")
7693 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007694 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7695 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007696}
7697
Yo Chiange8128052020-07-23 20:09:18 +08007698func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007699 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007700 apex {
7701 name: "myapex",
7702 key: "myapex.key",
7703 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007704 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007705 }
7706
7707 apex_key {
7708 name: "myapex.key",
7709 public_key: "testkey.avbpubkey",
7710 private_key: "testkey.pem",
7711 }
7712
7713 cc_library_shared {
7714 name: "mylib",
7715 srcs: ["mylib.cpp"],
7716 shared_libs: ["myotherlib"],
7717 system_shared_libs: [],
7718 stl: "none",
7719 apex_available: [
7720 "myapex",
7721 "//apex_available:platform",
7722 ],
7723 }
7724
7725 cc_prebuilt_library_shared {
7726 name: "myotherlib",
7727 srcs: ["prebuilt.so"],
7728 system_shared_libs: [],
7729 stl: "none",
7730 apex_available: [
7731 "myapex",
7732 "//apex_available:platform",
7733 ],
7734 }
7735 `)
7736
Jooyung Hana0503a52023-08-23 13:12:50 +09007737 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007738 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007739 var builder strings.Builder
7740 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7741 androidMk := builder.String()
7742 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007743 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007744 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7745 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7746 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007747 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007748}
7749
Jooyung Han643adc42020-02-27 13:50:06 +09007750func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007751 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007752 apex {
7753 name: "myapex",
7754 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007755 binaries: ["mybin"],
7756 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007757 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007758 }
7759
7760 apex_key {
7761 name: "myapex.key",
7762 public_key: "testkey.avbpubkey",
7763 private_key: "testkey.pem",
7764 }
7765
7766 cc_library {
7767 name: "mylib",
7768 srcs: ["mylib.cpp"],
7769 shared_libs: ["mylib2"],
7770 system_shared_libs: [],
7771 stl: "none",
7772 apex_available: [ "myapex" ],
7773 }
7774
7775 cc_library {
7776 name: "mylib2",
7777 srcs: ["mylib.cpp"],
7778 system_shared_libs: [],
7779 stl: "none",
7780 apex_available: [ "myapex" ],
7781 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007782
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007783 // Used as both a JNI library and a regular shared library.
7784 cc_library {
7785 name: "mylib3",
7786 srcs: ["mylib.cpp"],
7787 system_shared_libs: [],
7788 stl: "none",
7789 apex_available: [ "myapex" ],
7790 }
7791
7792 cc_binary {
7793 name: "mybin",
7794 srcs: ["mybin.cpp"],
7795 shared_libs: ["mylib3"],
7796 system_shared_libs: [],
7797 stl: "none",
7798 apex_available: [ "myapex" ],
7799 }
7800
Jiyong Park34d5c332022-02-24 18:02:44 +09007801 rust_ffi_shared {
7802 name: "libfoo.rust",
7803 crate_name: "foo",
7804 srcs: ["foo.rs"],
7805 shared_libs: ["libfoo.shared_from_rust"],
7806 prefer_rlib: true,
7807 apex_available: ["myapex"],
7808 }
7809
7810 cc_library_shared {
7811 name: "libfoo.shared_from_rust",
7812 srcs: ["mylib.cpp"],
7813 system_shared_libs: [],
7814 stl: "none",
7815 stubs: {
7816 versions: ["10", "11", "12"],
7817 },
7818 }
7819
Jooyung Han643adc42020-02-27 13:50:06 +09007820 `)
7821
Jooyung Hana0503a52023-08-23 13:12:50 +09007822 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007823 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007824 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007825 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007826 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007827 "lib64/mylib.so",
7828 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007829 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007830 "lib64/libfoo.rust.so",
7831 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7832 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007833 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007834
7835 // b/220397949
7836 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007837}
7838
Jooyung Han49f67012020-04-17 13:43:10 +09007839func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007840 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007841 apex {
7842 name: "myapex",
7843 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007844 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007845 }
7846 apex_key {
7847 name: "myapex.key",
7848 public_key: "testkey.avbpubkey",
7849 private_key: "testkey.pem",
7850 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007851 `,
7852 android.FixtureModifyConfig(func(config android.Config) {
7853 delete(config.Targets, android.Android)
7854 config.AndroidCommonTarget = android.Target{}
7855 }),
7856 )
Jooyung Han49f67012020-04-17 13:43:10 +09007857
7858 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7859 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7860 }
7861}
7862
Jiyong Parkbd159612020-02-28 15:22:21 +09007863func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007864 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007865 apex {
7866 name: "myapex",
7867 key: "myapex.key",
7868 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007869 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007870 }
7871
7872 apex_key {
7873 name: "myapex.key",
7874 public_key: "testkey.avbpubkey",
7875 private_key: "testkey.pem",
7876 }
7877
7878 android_app {
7879 name: "AppFoo",
7880 srcs: ["foo/bar/MyClass.java"],
7881 sdk_version: "none",
7882 system_modules: "none",
7883 apex_available: [ "myapex" ],
7884 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007885 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007886
Jooyung Hana0503a52023-08-23 13:12:50 +09007887 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007888 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09007889
7890 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007891 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 +09007892}
7893
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007894func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007895 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007896 apex {
7897 name: "myapex",
7898 key: "myapex.key",
7899 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007900 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007901 }
7902
7903 apex_key {
7904 name: "myapex.key",
7905 public_key: "testkey.avbpubkey",
7906 private_key: "testkey.pem",
7907 }
7908
7909 android_app_set {
7910 name: "AppSet",
7911 set: "AppSet.apks",
7912 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09007913 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08007914 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007915 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007916 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7917 s := mod.Rule("apexRule").Args["copy_commands"]
7918 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007919 if len(copyCmds) != 4 {
7920 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007921 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007922 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7923 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007924 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7925 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007926
7927 // Ensure that canned_fs_config has an entry for the app set zip file
7928 generateFsRule := mod.Rule("generateFsConfig")
7929 cmd := generateFsRule.RuleParams.Command
7930 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007931}
7932
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007933func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007934 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007935 apex_set {
7936 name: "myapex",
7937 filename: "foo_v2.apex",
7938 sanitized: {
7939 none: { set: "myapex.apks", },
7940 hwaddress: { set: "myapex.hwasan.apks", },
7941 },
Paul Duffin24704672021-04-06 16:09:30 +01007942 }
7943 `
7944 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007945
Paul Duffin24704672021-04-06 16:09:30 +01007946 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00007947 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007948
Spandan Das3576e762024-01-03 18:57:03 +00007949 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01007950 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007951
Paul Duffin24704672021-04-06 16:09:30 +01007952 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7953
7954 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007955 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7956 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007957
7958 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007959}
7960
Pranav Guptaeba03b02022-09-27 00:27:08 +00007961func TestApexSetApksModuleAssignment(t *testing.T) {
7962 ctx := testApex(t, `
7963 apex_set {
7964 name: "myapex",
7965 set: ":myapex_apks_file",
7966 }
7967
7968 filegroup {
7969 name: "myapex_apks_file",
7970 srcs: ["myapex.apks"],
7971 }
7972 `)
7973
Spandan Das3576e762024-01-03 18:57:03 +00007974 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00007975
7976 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00007977 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00007978 extractedApex := m.Output(extractorOutput)
7979
7980 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7981}
7982
Paul Duffin89f570a2021-06-16 01:42:33 +01007983func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007984 t.Helper()
7985
Paul Duffin55607122021-03-30 23:32:51 +01007986 fs := android.MockFS{
7987 "a.java": nil,
7988 "a.jar": nil,
7989 "apex_manifest.json": nil,
7990 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007991 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007992 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7993 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7994 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007995 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007996 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007997
Paul Duffin55607122021-03-30 23:32:51 +01007998 errorHandler := android.FixtureExpectsNoErrors
7999 if errmsg != "" {
8000 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008001 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008002
Paul Duffin55607122021-03-30 23:32:51 +01008003 result := android.GroupFixturePreparers(
8004 cc.PrepareForTestWithCcDefaultModules,
8005 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008006 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008007 java.PrepareForTestWithJavaSdkLibraryFiles,
8008 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008009 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008010 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008011 android.FixtureModifyMockFS(func(fs android.MockFS) {
8012 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8013 insert := ""
8014 for _, fragment := range fragments {
8015 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8016 }
8017 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8018 platform_bootclasspath {
8019 name: "platform-bootclasspath",
8020 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008021 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008022 %s
8023 ],
8024 }
8025 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008026 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008027 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008028 // Dexpreopt for boot jars requires the ART boot image profile.
8029 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8030 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008031 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008032 ).
8033 ExtendWithErrorHandler(errorHandler).
8034 RunTestWithBp(t, bp)
8035
8036 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008037}
8038
Paul Duffin5556c5f2022-06-09 17:32:21 +00008039func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008040 preparers := android.GroupFixturePreparers(
8041 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008042 prepareForTestWithBootclasspathFragment,
8043 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008044 PrepareForTestWithApexBuildComponents,
8045 ).
8046 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008047 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008048
8049 bpBase := `
8050 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008051 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008052 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008053 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008054 set: "myapex.apks",
8055 }
8056
8057 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008058 name: "com.mycompany.android.art",
8059 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008060 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008061 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008062 set: "company-myapex.apks",
8063 }
8064
8065 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008066 name: "art-bootclasspath-fragment",
8067 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008068 hidden_api: {
8069 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8070 metadata: "my-bootclasspath-fragment/metadata.csv",
8071 index: "my-bootclasspath-fragment/index.csv",
8072 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8073 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8074 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008075 %s
8076 }
8077 `
8078
8079 t.Run("java_import", func(t *testing.T) {
8080 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8081 java_import {
8082 name: "libfoo",
8083 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008084 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008085 }
8086 `)
8087 })
8088
8089 t.Run("java_sdk_library_import", func(t *testing.T) {
8090 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8091 java_sdk_library_import {
8092 name: "libfoo",
8093 public: {
8094 jars: ["libbar.jar"],
8095 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008096 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008097 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008098 }
8099 `)
8100 })
8101
8102 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8103 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8104 image_name: "art",
8105 contents: ["libfoo"],
8106 `)+`
8107 java_sdk_library_import {
8108 name: "libfoo",
8109 public: {
8110 jars: ["libbar.jar"],
8111 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008112 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008113 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008114 }
8115 `)
8116 })
8117}
8118
Paul Duffin5556c5f2022-06-09 17:32:21 +00008119func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8120 preparers := android.GroupFixturePreparers(
8121 java.PrepareForTestWithJavaDefaultModules,
8122 PrepareForTestWithApexBuildComponents,
8123 )
8124
Spandan Das59a4a2b2024-01-09 21:35:56 +00008125 errCtx := moduleErrorfTestCtx{}
8126
Paul Duffin5556c5f2022-06-09 17:32:21 +00008127 bpBase := `
8128 apex_set {
8129 name: "com.android.myapex",
8130 installable: true,
8131 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8132 set: "myapex.apks",
8133 }
8134
8135 apex_set {
8136 name: "com.android.myapex_compressed",
8137 apex_name: "com.android.myapex",
8138 installable: true,
8139 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8140 set: "myapex_compressed.apks",
8141 }
8142
8143 prebuilt_bootclasspath_fragment {
8144 name: "my-bootclasspath-fragment",
8145 apex_available: [
8146 "com.android.myapex",
8147 "com.android.myapex_compressed",
8148 ],
8149 hidden_api: {
8150 annotation_flags: "annotation-flags.csv",
8151 metadata: "metadata.csv",
8152 index: "index.csv",
8153 signature_patterns: "signature_patterns.csv",
8154 },
8155 %s
8156 }
8157 `
8158
8159 t.Run("java_import", func(t *testing.T) {
8160 result := preparers.RunTestWithBp(t,
8161 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8162 java_import {
8163 name: "libfoo",
8164 jars: ["libfoo.jar"],
8165 apex_available: [
8166 "com.android.myapex",
8167 "com.android.myapex_compressed",
8168 ],
8169 }
8170 `)
8171
8172 module := result.Module("libfoo", "android_common_com.android.myapex")
8173 usesLibraryDep := module.(java.UsesLibraryDependency)
8174 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008175 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008176 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008177 })
8178
8179 t.Run("java_sdk_library_import", func(t *testing.T) {
8180 result := preparers.RunTestWithBp(t,
8181 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8182 java_sdk_library_import {
8183 name: "libfoo",
8184 public: {
8185 jars: ["libbar.jar"],
8186 },
8187 apex_available: [
8188 "com.android.myapex",
8189 "com.android.myapex_compressed",
8190 ],
8191 compile_dex: true,
8192 }
8193 `)
8194
8195 module := result.Module("libfoo", "android_common_com.android.myapex")
8196 usesLibraryDep := module.(java.UsesLibraryDependency)
8197 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008198 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008199 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008200 })
8201
8202 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8203 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8204 image_name: "art",
8205 contents: ["libfoo"],
8206 `)+`
8207 java_sdk_library_import {
8208 name: "libfoo",
8209 public: {
8210 jars: ["libbar.jar"],
8211 },
8212 apex_available: [
8213 "com.android.myapex",
8214 "com.android.myapex_compressed",
8215 ],
8216 compile_dex: true,
8217 }
8218 `)
8219 })
8220}
8221
Jooyung Han548640b2020-04-27 12:10:30 +09008222func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8223 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8224 apex {
8225 name: "myapex",
8226 key: "myapex.key",
8227 updatable: true,
8228 }
8229
8230 apex_key {
8231 name: "myapex.key",
8232 public_key: "testkey.avbpubkey",
8233 private_key: "testkey.pem",
8234 }
8235 `)
8236}
8237
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008238func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8239 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8240 apex {
8241 name: "myapex",
8242 key: "myapex.key",
8243 }
8244
8245 apex_key {
8246 name: "myapex.key",
8247 public_key: "testkey.avbpubkey",
8248 private_key: "testkey.pem",
8249 }
8250 `)
8251}
8252
satayevb98371c2021-06-15 16:49:50 +01008253func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8254 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8255 apex {
8256 name: "myapex",
8257 key: "myapex.key",
8258 systemserverclasspath_fragments: [
8259 "mysystemserverclasspathfragment",
8260 ],
8261 min_sdk_version: "29",
8262 updatable: true,
8263 }
8264
8265 apex_key {
8266 name: "myapex.key",
8267 public_key: "testkey.avbpubkey",
8268 private_key: "testkey.pem",
8269 }
8270
8271 java_library {
8272 name: "foo",
8273 srcs: ["b.java"],
8274 min_sdk_version: "29",
8275 installable: true,
8276 apex_available: [
8277 "myapex",
8278 ],
8279 }
8280
8281 systemserverclasspath_fragment {
8282 name: "mysystemserverclasspathfragment",
8283 generate_classpaths_proto: false,
8284 contents: [
8285 "foo",
8286 ],
8287 apex_available: [
8288 "myapex",
8289 ],
8290 }
satayevabcd5972021-08-06 17:49:46 +01008291 `,
8292 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8293 )
satayevb98371c2021-06-15 16:49:50 +01008294}
8295
Paul Duffin064b70c2020-11-02 17:32:38 +00008296func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008297 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008298 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008299 fragment := java.ApexVariantReference{
8300 Apex: proptools.StringPtr("myapex"),
8301 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8302 }
8303
Paul Duffin064b70c2020-11-02 17:32:38 +00008304 testDexpreoptWithApexes(t, `
8305 prebuilt_apex {
8306 name: "myapex" ,
8307 arch: {
8308 arm64: {
8309 src: "myapex-arm64.apex",
8310 },
8311 arm: {
8312 src: "myapex-arm.apex",
8313 },
8314 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008315 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8316 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008317
Paul Duffin89f570a2021-06-16 01:42:33 +01008318 prebuilt_bootclasspath_fragment {
8319 name: "my-bootclasspath-fragment",
8320 contents: ["libfoo"],
8321 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008322 hidden_api: {
8323 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8324 metadata: "my-bootclasspath-fragment/metadata.csv",
8325 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008326 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8327 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8328 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008329 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008330 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008331
Paul Duffin89f570a2021-06-16 01:42:33 +01008332 java_import {
8333 name: "libfoo",
8334 jars: ["libfoo.jar"],
8335 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008336 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008337 }
8338 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008339 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008340}
8341
Spandan Dasf14e2542021-11-12 00:01:37 +00008342func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008343 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008344 bp += `
8345 apex_key {
8346 name: "myapex.key",
8347 public_key: "testkey.avbpubkey",
8348 private_key: "testkey.pem",
8349 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008350 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008351 "lib1/src/A.java": nil,
8352 "lib2/src/B.java": nil,
8353 "system/sepolicy/apex/myapex-file_contexts": nil,
8354 }
8355
Paul Duffin45338f02021-03-30 23:07:52 +01008356 errorHandler := android.FixtureExpectsNoErrors
8357 if errmsg != "" {
8358 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008359 }
Colin Crossae8600b2020-10-29 17:09:13 -07008360
Paul Duffin45338f02021-03-30 23:07:52 +01008361 android.GroupFixturePreparers(
8362 android.PrepareForTestWithAndroidBuildComponents,
8363 java.PrepareForTestWithJavaBuildComponents,
8364 PrepareForTestWithApexBuildComponents,
8365 android.PrepareForTestWithNeverallowRules(rules),
8366 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008367 apexBootJars := make([]string, 0, len(bootJars))
8368 for _, apexBootJar := range bootJars {
8369 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008370 }
satayevd604b212021-07-21 14:23:52 +01008371 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008372 }),
8373 fs.AddToFixture(),
8374 ).
8375 ExtendWithErrorHandler(errorHandler).
8376 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008377}
8378
8379func TestApexPermittedPackagesRules(t *testing.T) {
8380 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008381 name string
8382 expectedError string
8383 bp string
8384 bootJars []string
8385 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008386 }{
8387
8388 {
8389 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8390 expectedError: "",
8391 bp: `
8392 java_library {
8393 name: "bcp_lib1",
8394 srcs: ["lib1/src/*.java"],
8395 permitted_packages: ["foo.bar"],
8396 apex_available: ["myapex"],
8397 sdk_version: "none",
8398 system_modules: "none",
8399 }
8400 java_library {
8401 name: "nonbcp_lib2",
8402 srcs: ["lib2/src/*.java"],
8403 apex_available: ["myapex"],
8404 permitted_packages: ["a.b"],
8405 sdk_version: "none",
8406 system_modules: "none",
8407 }
8408 apex {
8409 name: "myapex",
8410 key: "myapex.key",
8411 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008412 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008413 }`,
8414 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008415 bcpPermittedPackages: map[string][]string{
8416 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008417 "foo.bar",
8418 },
8419 },
8420 },
8421 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008422 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008423 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 +01008424 bp: `
8425 java_library {
8426 name: "bcp_lib1",
8427 srcs: ["lib1/src/*.java"],
8428 apex_available: ["myapex"],
8429 permitted_packages: ["foo.bar"],
8430 sdk_version: "none",
8431 system_modules: "none",
8432 }
8433 java_library {
8434 name: "bcp_lib2",
8435 srcs: ["lib2/src/*.java"],
8436 apex_available: ["myapex"],
8437 permitted_packages: ["foo.bar", "bar.baz"],
8438 sdk_version: "none",
8439 system_modules: "none",
8440 }
8441 apex {
8442 name: "myapex",
8443 key: "myapex.key",
8444 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008445 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008446 }
8447 `,
8448 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008449 bcpPermittedPackages: map[string][]string{
8450 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008451 "foo.bar",
8452 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008453 "bcp_lib2": []string{
8454 "foo.bar",
8455 },
8456 },
8457 },
8458 {
8459 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8460 expectedError: "",
8461 bp: `
8462 java_library {
8463 name: "bcp_lib_restricted",
8464 srcs: ["lib1/src/*.java"],
8465 apex_available: ["myapex"],
8466 permitted_packages: ["foo.bar"],
8467 sdk_version: "none",
8468 min_sdk_version: "29",
8469 system_modules: "none",
8470 }
8471 java_library {
8472 name: "bcp_lib_unrestricted",
8473 srcs: ["lib2/src/*.java"],
8474 apex_available: ["myapex"],
8475 permitted_packages: ["foo.bar", "bar.baz"],
8476 sdk_version: "none",
8477 min_sdk_version: "29",
8478 system_modules: "none",
8479 }
8480 apex {
8481 name: "myapex",
8482 key: "myapex.key",
8483 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8484 updatable: true,
8485 min_sdk_version: "29",
8486 }
8487 `,
8488 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8489 bcpPermittedPackages: map[string][]string{
8490 "bcp_lib1_non_updateable": []string{
8491 "foo.bar",
8492 },
8493 // 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 +01008494 },
8495 },
8496 }
8497 for _, tc := range testcases {
8498 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008499 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8500 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008501 })
8502 }
8503}
8504
Jiyong Park62304bb2020-04-13 16:19:48 +09008505func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008506 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008507 apex {
8508 name: "myapex",
8509 key: "myapex.key",
8510 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008511 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008512 }
8513
8514 apex_key {
8515 name: "myapex.key",
8516 public_key: "testkey.avbpubkey",
8517 private_key: "testkey.pem",
8518 }
8519
8520 cc_library {
8521 name: "mylib",
8522 srcs: ["mylib.cpp"],
8523 system_shared_libs: [],
8524 stl: "none",
8525 stubs: {
8526 versions: ["1"],
8527 },
8528 apex_available: ["myapex"],
8529 }
8530
8531 cc_library {
8532 name: "myprivlib",
8533 srcs: ["mylib.cpp"],
8534 system_shared_libs: [],
8535 stl: "none",
8536 apex_available: ["myapex"],
8537 }
8538
8539
8540 cc_test {
8541 name: "mytest",
8542 gtest: false,
8543 srcs: ["mylib.cpp"],
8544 system_shared_libs: [],
8545 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008546 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008547 test_for: ["myapex"]
8548 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008549
8550 cc_library {
8551 name: "mytestlib",
8552 srcs: ["mylib.cpp"],
8553 system_shared_libs: [],
8554 shared_libs: ["mylib", "myprivlib"],
8555 stl: "none",
8556 test_for: ["myapex"],
8557 }
8558
8559 cc_benchmark {
8560 name: "mybench",
8561 srcs: ["mylib.cpp"],
8562 system_shared_libs: [],
8563 shared_libs: ["mylib", "myprivlib"],
8564 stl: "none",
8565 test_for: ["myapex"],
8566 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008567 `)
8568
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008569 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008570 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008571 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8572 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8573 }
8574
8575 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008576 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008577 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8578 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8579 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8580}
Jiyong Park46a512f2020-12-04 18:02:13 +09008581
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008582func TestIndirectTestFor(t *testing.T) {
8583 ctx := testApex(t, `
8584 apex {
8585 name: "myapex",
8586 key: "myapex.key",
8587 native_shared_libs: ["mylib", "myprivlib"],
8588 updatable: false,
8589 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008590
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008591 apex_key {
8592 name: "myapex.key",
8593 public_key: "testkey.avbpubkey",
8594 private_key: "testkey.pem",
8595 }
8596
8597 cc_library {
8598 name: "mylib",
8599 srcs: ["mylib.cpp"],
8600 system_shared_libs: [],
8601 stl: "none",
8602 stubs: {
8603 versions: ["1"],
8604 },
8605 apex_available: ["myapex"],
8606 }
8607
8608 cc_library {
8609 name: "myprivlib",
8610 srcs: ["mylib.cpp"],
8611 system_shared_libs: [],
8612 stl: "none",
8613 shared_libs: ["mylib"],
8614 apex_available: ["myapex"],
8615 }
8616
8617 cc_library {
8618 name: "mytestlib",
8619 srcs: ["mylib.cpp"],
8620 system_shared_libs: [],
8621 shared_libs: ["myprivlib"],
8622 stl: "none",
8623 test_for: ["myapex"],
8624 }
8625 `)
8626
8627 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008628 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008629 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8630 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8631 }
8632
8633 // The platform variant of mytestlib links to the platform variant of the
8634 // internal myprivlib.
8635 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8636
8637 // The platform variant of myprivlib links to the platform variant of mylib
8638 // and bypasses its stubs.
8639 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 +09008640}
8641
Martin Stjernholmec009002021-03-27 15:18:31 +00008642func TestTestForForLibInOtherApex(t *testing.T) {
8643 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8644 _ = testApex(t, `
8645 apex {
8646 name: "com.android.art",
8647 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008648 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008649 updatable: false,
8650 }
8651
8652 apex {
8653 name: "com.android.art.debug",
8654 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008655 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008656 updatable: false,
8657 }
8658
8659 apex_key {
8660 name: "myapex.key",
8661 public_key: "testkey.avbpubkey",
8662 private_key: "testkey.pem",
8663 }
8664
8665 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008666 name: "libnativebridge",
8667 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008668 system_shared_libs: [],
8669 stl: "none",
8670 stubs: {
8671 versions: ["1"],
8672 },
8673 apex_available: ["com.android.art", "com.android.art.debug"],
8674 }
8675
8676 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008677 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008678 srcs: ["mylib.cpp"],
8679 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008680 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008681 stl: "none",
8682 apex_available: ["com.android.art.debug"],
8683 test_for: ["com.android.art"],
8684 }
8685 `,
8686 android.MockFS{
8687 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8688 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8689 }.AddToFixture())
8690}
8691
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008692// TODO(jungjw): Move this to proptools
8693func intPtr(i int) *int {
8694 return &i
8695}
8696
8697func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008698 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008699 apex_set {
8700 name: "myapex",
8701 set: "myapex.apks",
8702 filename: "foo_v2.apex",
8703 overrides: ["foo"],
8704 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008705 `,
8706 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8707 variables.Platform_sdk_version = intPtr(30)
8708 }),
8709 android.FixtureModifyConfig(func(config android.Config) {
8710 config.Targets[android.Android] = []android.Target{
8711 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8712 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8713 }
8714 }),
8715 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008716
Spandan Das3576e762024-01-03 18:57:03 +00008717 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008718
8719 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008720 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008721 actual := extractedApex.Args["abis"]
8722 expected := "ARMEABI_V7A,ARM64_V8A"
8723 if actual != expected {
8724 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8725 }
8726 actual = extractedApex.Args["sdk-version"]
8727 expected = "30"
8728 if actual != expected {
8729 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8730 }
8731
Paul Duffin6717d882021-06-15 19:09:41 +01008732 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008733 a := m.Module().(*ApexSet)
8734 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008735 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008736 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8737 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8738 }
8739}
8740
Anton Hansson805e0a52022-11-25 14:06:46 +00008741func TestApexSet_NativeBridge(t *testing.T) {
8742 ctx := testApex(t, `
8743 apex_set {
8744 name: "myapex",
8745 set: "myapex.apks",
8746 filename: "foo_v2.apex",
8747 overrides: ["foo"],
8748 }
8749 `,
8750 android.FixtureModifyConfig(func(config android.Config) {
8751 config.Targets[android.Android] = []android.Target{
8752 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8753 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8754 }
8755 }),
8756 )
8757
Spandan Das3576e762024-01-03 18:57:03 +00008758 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008759
8760 // Check extract_apks tool parameters. No native bridge arch expected
8761 extractedApex := m.Output("extracted/myapex.apks")
8762 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8763}
8764
Jiyong Park7d95a512020-05-10 15:16:24 +09008765func TestNoStaticLinkingToStubsLib(t *testing.T) {
8766 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8767 apex {
8768 name: "myapex",
8769 key: "myapex.key",
8770 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008771 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008772 }
8773
8774 apex_key {
8775 name: "myapex.key",
8776 public_key: "testkey.avbpubkey",
8777 private_key: "testkey.pem",
8778 }
8779
8780 cc_library {
8781 name: "mylib",
8782 srcs: ["mylib.cpp"],
8783 static_libs: ["otherlib"],
8784 system_shared_libs: [],
8785 stl: "none",
8786 apex_available: [ "myapex" ],
8787 }
8788
8789 cc_library {
8790 name: "otherlib",
8791 srcs: ["mylib.cpp"],
8792 system_shared_libs: [],
8793 stl: "none",
8794 stubs: {
8795 versions: ["1", "2", "3"],
8796 },
8797 apex_available: [ "myapex" ],
8798 }
8799 `)
8800}
8801
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008802func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008803 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008804 apex {
8805 name: "myapex",
8806 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008807 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008808 custom_sign_tool: "sign_myapex",
8809 }
8810
8811 apex_key {
8812 name: "myapex.key",
8813 public_key: "testkey.avbpubkey",
8814 private_key: "testkey.pem",
8815 }
8816 `)
8817
Jooyung Han286957d2023-10-30 16:17:56 +09008818 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008819 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008820 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 +09008821}
8822
8823func TestApexKeysTxtOverrides(t *testing.T) {
8824 ctx := testApex(t, `
8825 apex {
8826 name: "myapex",
8827 key: "myapex.key",
8828 updatable: false,
8829 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008830 }
8831
8832 apex_key {
8833 name: "myapex.key",
8834 public_key: "testkey.avbpubkey",
8835 private_key: "testkey.pem",
8836 }
8837
8838 prebuilt_apex {
8839 name: "myapex",
8840 prefer: true,
8841 arch: {
8842 arm64: {
8843 src: "myapex-arm64.apex",
8844 },
8845 arm: {
8846 src: "myapex-arm.apex",
8847 },
8848 },
8849 }
8850
8851 apex_set {
8852 name: "myapex_set",
8853 set: "myapex.apks",
8854 filename: "myapex_set.apex",
8855 overrides: ["myapex"],
8856 }
8857 `)
8858
Colin Crossf61d03d2023-11-02 16:56:39 -07008859 content := android.ContentFromFileRuleForTests(t, ctx,
8860 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008861 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 -07008862 content = android.ContentFromFileRuleForTests(t, ctx,
8863 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008864 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 +09008865}
8866
Jooyung Han938b5932020-06-20 12:47:47 +09008867func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008868 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008869 apex {
8870 name: "myapex",
8871 key: "myapex.key",
8872 apps: ["app"],
8873 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008874 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008875 }
8876
8877 apex_key {
8878 name: "myapex.key",
8879 public_key: "testkey.avbpubkey",
8880 private_key: "testkey.pem",
8881 }
8882
8883 android_app {
8884 name: "app",
8885 srcs: ["foo/bar/MyClass.java"],
8886 package_name: "foo",
8887 sdk_version: "none",
8888 system_modules: "none",
8889 apex_available: [ "myapex" ],
8890 }
8891 `, withFiles(map[string][]byte{
8892 "sub/Android.bp": []byte(`
8893 override_apex {
8894 name: "override_myapex",
8895 base: "myapex",
8896 apps: ["override_app"],
8897 allowed_files: ":allowed",
8898 }
8899 // Overridable "path" property should be referenced indirectly
8900 filegroup {
8901 name: "allowed",
8902 srcs: ["allowed.txt"],
8903 }
8904 override_android_app {
8905 name: "override_app",
8906 base: "app",
8907 package_name: "bar",
8908 }
8909 `),
8910 }))
8911
Jooyung Hana0503a52023-08-23 13:12:50 +09008912 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008913 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8914 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8915 }
8916
Spandan Das50801e22024-05-13 18:29:45 +00008917 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008918 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8919 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8920 }
8921}
8922
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008923func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008924 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008925 apex {
8926 name: "myapex",
8927 key: "myapex.key",
8928 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008929 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008930 }
8931
8932 apex_key {
8933 name: "myapex.key",
8934 public_key: "testkey.avbpubkey",
8935 private_key: "testkey.pem",
8936 }
8937
8938 cc_library {
8939 name: "mylib",
8940 srcs: ["mylib.cpp"],
8941 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008942 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008943 },
8944 apex_available: ["myapex"],
8945 }
8946
8947 cc_prebuilt_library_shared {
8948 name: "mylib",
8949 prefer: false,
8950 srcs: ["prebuilt.so"],
8951 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008952 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008953 },
8954 apex_available: ["myapex"],
8955 }
8956 `)
8957}
8958
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008959func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008960 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008961 apex {
8962 name: "myapex",
8963 key: "myapex.key",
8964 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008965 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008966 }
8967 apex_key {
8968 name: "myapex.key",
8969 public_key: "testkey.avbpubkey",
8970 private_key: "testkey.pem",
8971 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008972 `,
8973 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8974 variables.CompressedApex = proptools.BoolPtr(true)
8975 }),
8976 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008977
Jooyung Hana0503a52023-08-23 13:12:50 +09008978 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008979 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8980
Jooyung Hana0503a52023-08-23 13:12:50 +09008981 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008982 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8983
8984 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09008985 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008986 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8987
8988 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008989 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008990 var builder strings.Builder
8991 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8992 androidMk := builder.String()
8993 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8994}
8995
Jooyung Han26ec8482024-07-31 15:04:05 +09008996func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
8997 for _, compressionEnabled := range []bool{true, false} {
8998 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
8999 ctx := testApex(t, `
9000 apex_set {
9001 name: "com.company.android.myapex",
9002 apex_name: "com.android.myapex",
9003 set: "company-myapex.apks",
9004 }
9005 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9006 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9007 }),
9008 )
9009
9010 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9011 if compressionEnabled {
9012 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9013 } else {
9014 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9015 }
9016 })
9017 }
9018}
9019
Martin Stjernholm2856c662020-12-02 15:03:42 +00009020func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009021 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009022 apex {
9023 name: "myapex",
9024 key: "myapex.key",
9025 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009026 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009027 }
9028
9029 apex_key {
9030 name: "myapex.key",
9031 public_key: "testkey.avbpubkey",
9032 private_key: "testkey.pem",
9033 }
9034
9035 cc_library {
9036 name: "mylib",
9037 srcs: ["mylib.cpp"],
9038 apex_available: ["myapex"],
9039 shared_libs: ["otherlib"],
9040 system_shared_libs: [],
9041 }
9042
9043 cc_library {
9044 name: "otherlib",
9045 srcs: ["mylib.cpp"],
9046 stubs: {
9047 versions: ["current"],
9048 },
9049 }
9050
9051 cc_prebuilt_library_shared {
9052 name: "otherlib",
9053 prefer: true,
9054 srcs: ["prebuilt.so"],
9055 stubs: {
9056 versions: ["current"],
9057 },
9058 }
9059 `)
9060
Jooyung Hana0503a52023-08-23 13:12:50 +09009061 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009062 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009063 var builder strings.Builder
9064 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9065 androidMk := builder.String()
9066
9067 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9068 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009069 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009070}
9071
Jiyong Parke3867542020-12-03 17:28:25 +09009072func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009073 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009074 apex {
9075 name: "myapex",
9076 key: "myapex.key",
9077 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009078 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009079 }
9080
9081 apex_key {
9082 name: "myapex.key",
9083 public_key: "testkey.avbpubkey",
9084 private_key: "testkey.pem",
9085 }
9086
9087 cc_library {
9088 name: "mylib",
9089 srcs: ["mylib.cpp"],
9090 system_shared_libs: [],
9091 stl: "none",
9092 apex_available: ["myapex"],
9093 shared_libs: ["mylib2"],
9094 target: {
9095 apex: {
9096 exclude_shared_libs: ["mylib2"],
9097 },
9098 },
9099 }
9100
9101 cc_library {
9102 name: "mylib2",
9103 srcs: ["mylib.cpp"],
9104 system_shared_libs: [],
9105 stl: "none",
9106 }
9107 `)
9108
9109 // Check if mylib is linked to mylib2 for the non-apex target
9110 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9111 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9112
9113 // Make sure that the link doesn't occur for the apex target
9114 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9115 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9116
9117 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009118 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009119 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9120}
9121
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009122func TestPrebuiltStubLibDep(t *testing.T) {
9123 bpBase := `
9124 apex {
9125 name: "myapex",
9126 key: "myapex.key",
9127 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009128 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009129 }
9130 apex_key {
9131 name: "myapex.key",
9132 public_key: "testkey.avbpubkey",
9133 private_key: "testkey.pem",
9134 }
9135 cc_library {
9136 name: "mylib",
9137 srcs: ["mylib.cpp"],
9138 apex_available: ["myapex"],
9139 shared_libs: ["stublib"],
9140 system_shared_libs: [],
9141 }
9142 apex {
9143 name: "otherapex",
9144 enabled: %s,
9145 key: "myapex.key",
9146 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009147 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009148 }
9149 `
9150
9151 stublibSourceBp := `
9152 cc_library {
9153 name: "stublib",
9154 srcs: ["mylib.cpp"],
9155 apex_available: ["otherapex"],
9156 system_shared_libs: [],
9157 stl: "none",
9158 stubs: {
9159 versions: ["1"],
9160 },
9161 }
9162 `
9163
9164 stublibPrebuiltBp := `
9165 cc_prebuilt_library_shared {
9166 name: "stublib",
9167 srcs: ["prebuilt.so"],
9168 apex_available: ["otherapex"],
9169 stubs: {
9170 versions: ["1"],
9171 },
9172 %s
9173 }
9174 `
9175
9176 tests := []struct {
9177 name string
9178 stublibBp string
9179 usePrebuilt bool
9180 modNames []string // Modules to collect AndroidMkEntries for
9181 otherApexEnabled []string
9182 }{
9183 {
9184 name: "only_source",
9185 stublibBp: stublibSourceBp,
9186 usePrebuilt: false,
9187 modNames: []string{"stublib"},
9188 otherApexEnabled: []string{"true", "false"},
9189 },
9190 {
9191 name: "source_preferred",
9192 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9193 usePrebuilt: false,
9194 modNames: []string{"stublib", "prebuilt_stublib"},
9195 otherApexEnabled: []string{"true", "false"},
9196 },
9197 {
9198 name: "prebuilt_preferred",
9199 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9200 usePrebuilt: true,
9201 modNames: []string{"stublib", "prebuilt_stublib"},
9202 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9203 },
9204 {
9205 name: "only_prebuilt",
9206 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9207 usePrebuilt: true,
9208 modNames: []string{"stublib"},
9209 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9210 },
9211 }
9212
9213 for _, test := range tests {
9214 t.Run(test.name, func(t *testing.T) {
9215 for _, otherApexEnabled := range test.otherApexEnabled {
9216 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009217 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009218
9219 type modAndMkEntries struct {
9220 mod *cc.Module
9221 mkEntries android.AndroidMkEntries
9222 }
9223 entries := []*modAndMkEntries{}
9224
9225 // Gather shared lib modules that are installable
9226 for _, modName := range test.modNames {
9227 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9228 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9229 continue
9230 }
9231 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009232 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009233 continue
9234 }
Colin Crossaa255532020-07-03 13:18:24 -07009235 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009236 if ent.Disabled {
9237 continue
9238 }
9239 entries = append(entries, &modAndMkEntries{
9240 mod: mod,
9241 mkEntries: ent,
9242 })
9243 }
9244 }
9245 }
9246
9247 var entry *modAndMkEntries = nil
9248 for _, ent := range entries {
9249 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9250 if entry != nil {
9251 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9252 } else {
9253 entry = ent
9254 }
9255 }
9256 }
9257
9258 if entry == nil {
9259 t.Errorf("AndroidMk entry for \"stublib\" missing")
9260 } else {
9261 isPrebuilt := entry.mod.Prebuilt() != nil
9262 if isPrebuilt != test.usePrebuilt {
9263 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9264 }
9265 if !entry.mod.IsStubs() {
9266 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9267 }
9268 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9269 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9270 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009271 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009272 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009273 if !android.InList(expected, cflags) {
9274 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9275 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009276 }
9277 })
9278 }
9279 })
9280 }
9281}
9282
Colin Crossc33e5212021-05-25 18:16:02 -07009283func TestApexJavaCoverage(t *testing.T) {
9284 bp := `
9285 apex {
9286 name: "myapex",
9287 key: "myapex.key",
9288 java_libs: ["mylib"],
9289 bootclasspath_fragments: ["mybootclasspathfragment"],
9290 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9291 updatable: false,
9292 }
9293
9294 apex_key {
9295 name: "myapex.key",
9296 public_key: "testkey.avbpubkey",
9297 private_key: "testkey.pem",
9298 }
9299
9300 java_library {
9301 name: "mylib",
9302 srcs: ["mylib.java"],
9303 apex_available: ["myapex"],
9304 compile_dex: true,
9305 }
9306
9307 bootclasspath_fragment {
9308 name: "mybootclasspathfragment",
9309 contents: ["mybootclasspathlib"],
9310 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009311 hidden_api: {
9312 split_packages: ["*"],
9313 },
Colin Crossc33e5212021-05-25 18:16:02 -07009314 }
9315
9316 java_library {
9317 name: "mybootclasspathlib",
9318 srcs: ["mybootclasspathlib.java"],
9319 apex_available: ["myapex"],
9320 compile_dex: true,
9321 }
9322
9323 systemserverclasspath_fragment {
9324 name: "mysystemserverclasspathfragment",
9325 contents: ["mysystemserverclasspathlib"],
9326 apex_available: ["myapex"],
9327 }
9328
9329 java_library {
9330 name: "mysystemserverclasspathlib",
9331 srcs: ["mysystemserverclasspathlib.java"],
9332 apex_available: ["myapex"],
9333 compile_dex: true,
9334 }
9335 `
9336
9337 result := android.GroupFixturePreparers(
9338 PrepareForTestWithApexBuildComponents,
9339 prepareForTestWithMyapex,
9340 java.PrepareForTestWithJavaDefaultModules,
9341 android.PrepareForTestWithAndroidBuildComponents,
9342 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009343 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9344 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009345 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009346 ).RunTest(t)
9347
9348 // Make sure jacoco ran on both mylib and mybootclasspathlib
9349 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9350 t.Errorf("Failed to find jacoco rule for mylib")
9351 }
9352 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9353 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9354 }
9355 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9356 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9357 }
9358}
9359
Jiyong Park192600a2021-08-03 07:52:17 +00009360func TestProhibitStaticExecutable(t *testing.T) {
9361 testApexError(t, `executable mybin is static`, `
9362 apex {
9363 name: "myapex",
9364 key: "myapex.key",
9365 binaries: ["mybin"],
9366 min_sdk_version: "29",
9367 }
9368
9369 apex_key {
9370 name: "myapex.key",
9371 public_key: "testkey.avbpubkey",
9372 private_key: "testkey.pem",
9373 }
9374
9375 cc_binary {
9376 name: "mybin",
9377 srcs: ["mylib.cpp"],
9378 relative_install_path: "foo/bar",
9379 static_executable: true,
9380 system_shared_libs: [],
9381 stl: "none",
9382 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009383 min_sdk_version: "29",
9384 }
9385 `)
9386
9387 testApexError(t, `executable mybin.rust is static`, `
9388 apex {
9389 name: "myapex",
9390 key: "myapex.key",
9391 binaries: ["mybin.rust"],
9392 min_sdk_version: "29",
9393 }
9394
9395 apex_key {
9396 name: "myapex.key",
9397 public_key: "testkey.avbpubkey",
9398 private_key: "testkey.pem",
9399 }
9400
9401 rust_binary {
9402 name: "mybin.rust",
9403 srcs: ["foo.rs"],
9404 static_executable: true,
9405 apex_available: ["myapex"],
9406 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009407 }
9408 `)
9409}
9410
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009411func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9412 ctx := testApex(t, `
9413 apex {
9414 name: "myapex",
9415 key: "myapex.key",
9416 updatable: false,
9417 java_libs: ["foo"],
9418 }
9419
9420 apex_key {
9421 name: "myapex.key",
9422 public_key: "testkey.avbpubkey",
9423 private_key: "testkey.pem",
9424 }
9425
9426 java_library {
9427 name: "foo",
9428 srcs: ["foo.java"],
9429 apex_available: ["myapex"],
9430 installable: true,
9431 }
9432 `,
9433 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9434 )
9435
Jooyung Hana0503a52023-08-23 13:12:50 +09009436 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009437 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9438 var builder strings.Builder
9439 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9440 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009441 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 +00009442}
9443
9444func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9445 ctx := testApex(t, `
9446 prebuilt_apex {
9447 name: "myapex",
9448 arch: {
9449 arm64: {
9450 src: "myapex-arm64.apex",
9451 },
9452 arm: {
9453 src: "myapex-arm.apex",
9454 },
9455 },
9456 exported_java_libs: ["foo"],
9457 }
9458
9459 java_import {
9460 name: "foo",
9461 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009462 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009463 }
9464 `,
9465 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9466 )
9467
9468 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9469 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9470 mainModuleEntries := entriesList[0]
9471 android.AssertArrayString(t,
9472 "LOCAL_REQUIRED_MODULES",
9473 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9474 []string{
9475 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9476 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9477 })
9478}
9479
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009480func TestAndroidMk_RequiredModules(t *testing.T) {
9481 ctx := testApex(t, `
9482 apex {
9483 name: "myapex",
9484 key: "myapex.key",
9485 updatable: false,
9486 java_libs: ["foo"],
9487 required: ["otherapex"],
9488 }
9489
9490 apex {
9491 name: "otherapex",
9492 key: "myapex.key",
9493 updatable: false,
9494 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009495 }
9496
9497 apex_key {
9498 name: "myapex.key",
9499 public_key: "testkey.avbpubkey",
9500 private_key: "testkey.pem",
9501 }
9502
9503 java_library {
9504 name: "foo",
9505 srcs: ["foo.java"],
9506 apex_available: ["myapex", "otherapex"],
9507 installable: true,
9508 }
9509 `)
9510
Jooyung Hana0503a52023-08-23 13:12:50 +09009511 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009512 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9513 var builder strings.Builder
9514 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9515 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009516 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009517}
9518
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009519func TestAndroidMk_RequiredDeps(t *testing.T) {
9520 ctx := testApex(t, `
9521 apex {
9522 name: "myapex",
9523 key: "myapex.key",
9524 updatable: false,
9525 }
9526
9527 apex_key {
9528 name: "myapex.key",
9529 public_key: "testkey.avbpubkey",
9530 private_key: "testkey.pem",
9531 }
9532 `)
9533
Jooyung Hana0503a52023-08-23 13:12:50 +09009534 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009535 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009536 data := android.AndroidMkDataForTest(t, ctx, bundle)
9537 var builder strings.Builder
9538 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9539 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009540 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009541}
9542
Jooyung Hana6d36672022-02-24 13:58:07 +09009543func TestApexOutputFileProducer(t *testing.T) {
9544 for _, tc := range []struct {
9545 name string
9546 ref string
9547 expected_data []string
9548 }{
9549 {
9550 name: "test_using_output",
9551 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009552 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009553 },
9554 {
9555 name: "test_using_apex",
9556 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009557 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009558 },
9559 } {
9560 t.Run(tc.name, func(t *testing.T) {
9561 ctx := testApex(t, `
9562 apex {
9563 name: "myapex",
9564 key: "myapex.key",
9565 compressible: true,
9566 updatable: false,
9567 }
9568
9569 apex_key {
9570 name: "myapex.key",
9571 public_key: "testkey.avbpubkey",
9572 private_key: "testkey.pem",
9573 }
9574
9575 java_test {
9576 name: "`+tc.name+`",
9577 srcs: ["a.java"],
9578 data: ["`+tc.ref+`"],
9579 }
9580 `,
9581 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9582 variables.CompressedApex = proptools.BoolPtr(true)
9583 }))
9584 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9585 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9586 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9587 })
9588 }
9589}
9590
satayev758968a2021-12-06 11:42:40 +00009591func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9592 preparer := android.GroupFixturePreparers(
9593 PrepareForTestWithApexBuildComponents,
9594 prepareForTestWithMyapex,
9595 java.PrepareForTestWithJavaSdkLibraryFiles,
9596 java.PrepareForTestWithJavaDefaultModules,
9597 android.PrepareForTestWithAndroidBuildComponents,
9598 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9599 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9600 )
9601
9602 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9603 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9604 preparer.RunTestWithBp(t, `
9605 apex {
9606 name: "myapex",
9607 key: "myapex.key",
9608 bootclasspath_fragments: ["mybootclasspathfragment"],
9609 min_sdk_version: "30",
9610 updatable: false,
9611 }
9612
9613 apex_key {
9614 name: "myapex.key",
9615 public_key: "testkey.avbpubkey",
9616 private_key: "testkey.pem",
9617 }
9618
9619 bootclasspath_fragment {
9620 name: "mybootclasspathfragment",
9621 contents: ["mybootclasspathlib"],
9622 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009623 hidden_api: {
9624 split_packages: ["*"],
9625 },
satayev758968a2021-12-06 11:42:40 +00009626 }
9627
9628 java_sdk_library {
9629 name: "mybootclasspathlib",
9630 srcs: ["mybootclasspathlib.java"],
9631 apex_available: ["myapex"],
9632 compile_dex: true,
9633 unsafe_ignore_missing_latest_api: true,
9634 min_sdk_version: "31",
9635 static_libs: ["util"],
9636 }
9637
9638 java_library {
9639 name: "util",
9640 srcs: ["a.java"],
9641 apex_available: ["myapex"],
9642 min_sdk_version: "31",
9643 static_libs: ["another_util"],
9644 }
9645
9646 java_library {
9647 name: "another_util",
9648 srcs: ["a.java"],
9649 min_sdk_version: "31",
9650 apex_available: ["myapex"],
9651 }
9652 `)
9653 })
9654
9655 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9656 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9657 preparer.RunTestWithBp(t, `
9658 apex {
9659 name: "myapex",
9660 key: "myapex.key",
9661 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9662 min_sdk_version: "30",
9663 updatable: false,
9664 }
9665
9666 apex_key {
9667 name: "myapex.key",
9668 public_key: "testkey.avbpubkey",
9669 private_key: "testkey.pem",
9670 }
9671
9672 systemserverclasspath_fragment {
9673 name: "mysystemserverclasspathfragment",
9674 contents: ["mysystemserverclasspathlib"],
9675 apex_available: ["myapex"],
9676 }
9677
9678 java_sdk_library {
9679 name: "mysystemserverclasspathlib",
9680 srcs: ["mysystemserverclasspathlib.java"],
9681 apex_available: ["myapex"],
9682 compile_dex: true,
9683 min_sdk_version: "32",
9684 unsafe_ignore_missing_latest_api: true,
9685 static_libs: ["util"],
9686 }
9687
9688 java_library {
9689 name: "util",
9690 srcs: ["a.java"],
9691 apex_available: ["myapex"],
9692 min_sdk_version: "31",
9693 static_libs: ["another_util"],
9694 }
9695
9696 java_library {
9697 name: "another_util",
9698 srcs: ["a.java"],
9699 min_sdk_version: "31",
9700 apex_available: ["myapex"],
9701 }
9702 `)
9703 })
9704
9705 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9706 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9707 RunTestWithBp(t, `
9708 apex {
9709 name: "myapex",
9710 key: "myapex.key",
9711 bootclasspath_fragments: ["mybootclasspathfragment"],
9712 min_sdk_version: "30",
9713 updatable: false,
9714 }
9715
9716 apex_key {
9717 name: "myapex.key",
9718 public_key: "testkey.avbpubkey",
9719 private_key: "testkey.pem",
9720 }
9721
9722 bootclasspath_fragment {
9723 name: "mybootclasspathfragment",
9724 contents: ["mybootclasspathlib"],
9725 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009726 hidden_api: {
9727 split_packages: ["*"],
9728 },
satayev758968a2021-12-06 11:42:40 +00009729 }
9730
9731 java_sdk_library {
9732 name: "mybootclasspathlib",
9733 srcs: ["mybootclasspathlib.java"],
9734 apex_available: ["myapex"],
9735 compile_dex: true,
9736 unsafe_ignore_missing_latest_api: true,
9737 }
9738 `)
9739 })
9740
9741 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9742 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9743 RunTestWithBp(t, `
9744 apex {
9745 name: "myapex",
9746 key: "myapex.key",
9747 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9748 min_sdk_version: "30",
9749 updatable: false,
9750 }
9751
9752 apex_key {
9753 name: "myapex.key",
9754 public_key: "testkey.avbpubkey",
9755 private_key: "testkey.pem",
9756 }
9757
9758 systemserverclasspath_fragment {
9759 name: "mysystemserverclasspathfragment",
9760 contents: ["mysystemserverclasspathlib"],
9761 apex_available: ["myapex"],
9762 }
9763
9764 java_sdk_library {
9765 name: "mysystemserverclasspathlib",
9766 srcs: ["mysystemserverclasspathlib.java"],
9767 apex_available: ["myapex"],
9768 compile_dex: true,
9769 unsafe_ignore_missing_latest_api: true,
9770 }
9771 `)
9772 })
9773}
9774
Jiakai Zhang6decef92022-01-12 17:56:19 +00009775// Verifies that the APEX depends on all the Make modules in the list.
9776func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9777 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9778 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009779 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009780 }
9781}
9782
9783// Verifies that the APEX does not depend on any of the Make modules in the list.
9784func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9785 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9786 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009787 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009788 }
9789}
9790
Cole Faust24e25c02024-01-19 14:12:17 -08009791func TestApexStrictUpdtabilityLint(t *testing.T) {
9792 bpTemplate := `
9793 apex {
9794 name: "myapex",
9795 key: "myapex.key",
9796 java_libs: ["myjavalib"],
9797 updatable: %v,
9798 min_sdk_version: "29",
9799 }
9800 apex_key {
9801 name: "myapex.key",
9802 }
9803 java_library {
9804 name: "myjavalib",
9805 srcs: ["MyClass.java"],
9806 apex_available: [ "myapex" ],
9807 lint: {
9808 strict_updatability_linting: %v,
9809 %s
9810 },
9811 sdk_version: "current",
9812 min_sdk_version: "29",
9813 }
9814 `
9815 fs := android.MockFS{
9816 "lint-baseline.xml": nil,
9817 }
9818
9819 testCases := []struct {
9820 testCaseName string
9821 apexUpdatable bool
9822 javaStrictUpdtabilityLint bool
9823 lintFileExists bool
9824 disallowedFlagExpected bool
9825 }{
9826 {
9827 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9828 apexUpdatable: true,
9829 javaStrictUpdtabilityLint: true,
9830 lintFileExists: false,
9831 disallowedFlagExpected: false,
9832 },
9833 {
9834 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9835 apexUpdatable: false,
9836 javaStrictUpdtabilityLint: false,
9837 lintFileExists: true,
9838 disallowedFlagExpected: false,
9839 },
9840 {
9841 testCaseName: "non-updatable apex respects strict updatability of javalib",
9842 apexUpdatable: false,
9843 javaStrictUpdtabilityLint: true,
9844 lintFileExists: true,
9845 disallowedFlagExpected: true,
9846 },
9847 {
9848 testCaseName: "updatable apex sets strict updatability of javalib to true",
9849 apexUpdatable: true,
9850 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9851 lintFileExists: true,
9852 disallowedFlagExpected: true,
9853 },
9854 }
9855
9856 for _, testCase := range testCases {
9857 fixtures := []android.FixturePreparer{}
9858 baselineProperty := ""
9859 if testCase.lintFileExists {
9860 fixtures = append(fixtures, fs.AddToFixture())
9861 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9862 }
9863 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
9864
9865 result := testApex(t, bp, fixtures...)
9866 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9867 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9868 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9869
9870 if disallowedFlagActual != testCase.disallowedFlagExpected {
9871 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9872 }
9873 }
9874}
9875
9876func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9877 bp := `
9878 apex {
9879 name: "myapex",
9880 key: "myapex.key",
9881 java_libs: ["myjavalib"],
9882 updatable: true,
9883 min_sdk_version: "29",
9884 }
9885 apex_key {
9886 name: "myapex.key",
9887 }
9888 java_library {
9889 name: "myjavalib",
9890 srcs: ["MyClass.java"],
9891 apex_available: [ "myapex" ],
9892 sdk_version: "current",
9893 min_sdk_version: "29",
9894 lint: {
9895 baseline_filename: "lint-baseline.xml",
9896 }
9897 }
9898 `
9899
9900 testCases := []struct {
9901 testCaseName string
9902 moduleDirectory string
9903 disallowedFlagExpected bool
9904 }{
9905 {
9906 testCaseName: "lintable module defined outside libcore",
9907 moduleDirectory: "",
9908 disallowedFlagExpected: true,
9909 },
9910 {
9911 testCaseName: "lintable module defined in libcore root directory",
9912 moduleDirectory: "libcore/",
9913 disallowedFlagExpected: false,
9914 },
9915 {
9916 testCaseName: "lintable module defined in libcore child directory",
9917 moduleDirectory: "libcore/childdir/",
9918 disallowedFlagExpected: true,
9919 },
9920 }
9921
9922 for _, testCase := range testCases {
9923 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9924 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9925 result := testApex(t, "", lintFileCreator, bpFileCreator)
9926 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9927 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9928 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9929 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9930
9931 if disallowedFlagActual != testCase.disallowedFlagExpected {
9932 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9933 }
9934 }
9935}
9936
9937// checks transtive deps of an apex coming from bootclasspath_fragment
9938func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9939 bp := `
9940 apex {
9941 name: "myapex",
9942 key: "myapex.key",
9943 bootclasspath_fragments: ["mybootclasspathfragment"],
9944 updatable: true,
9945 min_sdk_version: "29",
9946 }
9947 apex_key {
9948 name: "myapex.key",
9949 }
9950 bootclasspath_fragment {
9951 name: "mybootclasspathfragment",
9952 contents: ["myjavalib"],
9953 apex_available: ["myapex"],
9954 hidden_api: {
9955 split_packages: ["*"],
9956 },
9957 }
9958 java_library {
9959 name: "myjavalib",
9960 srcs: ["MyClass.java"],
9961 apex_available: [ "myapex" ],
9962 sdk_version: "current",
9963 min_sdk_version: "29",
9964 compile_dex: true,
9965 lint: {
9966 baseline_filename: "lint-baseline.xml",
9967 }
9968 }
9969 `
9970 fs := android.MockFS{
9971 "lint-baseline.xml": nil,
9972 }
9973
9974 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9975 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9976 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9977 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9978 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9979 }
9980}
Spandan Das66773252022-01-15 00:23:18 +00009981
Jihoon Kang784c0052024-06-25 22:15:39 +00009982func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
9983 bp := `
9984 apex {
9985 name: "myapex",
9986 key: "myapex.key",
9987 bootclasspath_fragments: ["mybootclasspathfragment"],
9988 min_sdk_version: "29",
9989 }
9990 apex_key {
9991 name: "myapex.key",
9992 }
9993 bootclasspath_fragment {
9994 name: "mybootclasspathfragment",
9995 contents: ["foo"],
9996 apex_available: ["myapex"],
9997 hidden_api: {
9998 split_packages: ["*"],
9999 },
10000 }
10001 java_sdk_library {
10002 name: "foo",
10003 srcs: ["MyClass.java"],
10004 apex_available: [ "myapex" ],
10005 sdk_version: "current",
10006 min_sdk_version: "29",
10007 compile_dex: true,
10008 }
10009 `
10010 fs := android.MockFS{
10011 "lint-baseline.xml": nil,
10012 }
10013
10014 result := android.GroupFixturePreparers(
10015 prepareForApexTest,
10016 java.PrepareForTestWithJavaSdkLibraryFiles,
10017 java.PrepareForTestWithJacocoInstrumentation,
10018 java.FixtureWithLastReleaseApis("foo"),
10019 android.FixtureModifyConfig(func(config android.Config) {
10020 config.SetApiLibraries([]string{"foo"})
10021 }),
10022 android.FixtureMergeMockFs(fs),
10023 ).RunTestWithBp(t, bp)
10024
10025 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10026 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10027 android.AssertStringDoesContain(t,
10028 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10029 lintReportInputs, "foo.impl")
10030}
10031
Spandan Das42e89502022-05-06 22:12:55 +000010032// updatable apexes should propagate updatable=true to its apps
10033func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10034 bp := `
10035 apex {
10036 name: "myapex",
10037 key: "myapex.key",
10038 updatable: %v,
10039 apps: [
10040 "myapp",
10041 ],
10042 min_sdk_version: "30",
10043 }
10044 apex_key {
10045 name: "myapex.key",
10046 }
10047 android_app {
10048 name: "myapp",
10049 updatable: %v,
10050 apex_available: [
10051 "myapex",
10052 ],
10053 sdk_version: "current",
10054 min_sdk_version: "30",
10055 }
10056 `
10057 testCases := []struct {
10058 name string
10059 apex_is_updatable_bp bool
10060 app_is_updatable_bp bool
10061 app_is_updatable_expected bool
10062 }{
10063 {
10064 name: "Non-updatable apex respects updatable property of non-updatable app",
10065 apex_is_updatable_bp: false,
10066 app_is_updatable_bp: false,
10067 app_is_updatable_expected: false,
10068 },
10069 {
10070 name: "Non-updatable apex respects updatable property of updatable app",
10071 apex_is_updatable_bp: false,
10072 app_is_updatable_bp: true,
10073 app_is_updatable_expected: true,
10074 },
10075 {
10076 name: "Updatable apex respects updatable property of updatable app",
10077 apex_is_updatable_bp: true,
10078 app_is_updatable_bp: true,
10079 app_is_updatable_expected: true,
10080 },
10081 {
10082 name: "Updatable apex sets updatable=true on non-updatable app",
10083 apex_is_updatable_bp: true,
10084 app_is_updatable_bp: false,
10085 app_is_updatable_expected: true,
10086 },
10087 }
10088 for _, testCase := range testCases {
10089 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10090 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10091 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10092 }
10093}
10094
Kiyoung Kim487689e2022-07-26 09:48:22 +090010095func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10096 bp := `
10097 apex {
10098 name: "myapex",
10099 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010100 native_shared_libs: ["libbaz"],
10101 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010102 min_sdk_version: "29",
10103 }
10104 apex_key {
10105 name: "myapex.key",
10106 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010107 cc_binary {
10108 name: "binfoo",
10109 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010110 apex_available: ["myapex"],
10111 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010112 recovery_available: false,
10113 }
10114 cc_library {
10115 name: "libbar",
10116 srcs: ["libbar.cc"],
10117 stubs: {
10118 symbol_file: "libbar.map.txt",
10119 versions: [
10120 "29",
10121 ],
10122 },
10123 }
10124 cc_library {
10125 name: "libbaz",
10126 srcs: ["libbaz.cc"],
10127 apex_available: ["myapex"],
10128 min_sdk_version: "29",
10129 stubs: {
10130 symbol_file: "libbaz.map.txt",
10131 versions: [
10132 "29",
10133 ],
10134 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010135 }
10136 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010137 name: "libbar",
10138 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010139 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010140 variants: ["apex.29"],
10141 }
10142 cc_api_variant {
10143 name: "libbar",
10144 variant: "apex",
10145 version: "29",
10146 src: "libbar_apex_29.so",
10147 }
10148 cc_api_library {
10149 name: "libbaz",
10150 src: "libbaz_stub.so",
10151 min_sdk_version: "29",
10152 variants: ["apex.29"],
10153 }
10154 cc_api_variant {
10155 name: "libbaz",
10156 variant: "apex",
10157 version: "29",
10158 src: "libbaz_apex_29.so",
10159 }
10160 cc_api_library {
10161 name: "libqux",
10162 src: "libqux_stub.so",
10163 min_sdk_version: "29",
10164 variants: ["apex.29"],
10165 }
10166 cc_api_variant {
10167 name: "libqux",
10168 variant: "apex",
10169 version: "29",
10170 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010171 }
10172 api_imports {
10173 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010174 apex_shared_libs: [
10175 "libbar",
10176 "libbaz",
10177 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010178 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010179 }
10180 `
10181 result := testApex(t, bp)
10182
10183 hasDep := func(m android.Module, wantDep android.Module) bool {
10184 t.Helper()
10185 var found bool
10186 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10187 if dep == wantDep {
10188 found = true
10189 }
10190 })
10191 return found
10192 }
10193
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010194 // Library defines stubs and cc_api_library should be used with cc_api_library
10195 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10196 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10197 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010198
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010199 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10200 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010201
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010202 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10203 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10204 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10205 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10206
10207 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10208 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10209 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10210 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10211 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10212
10213 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10214 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10215 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10216
10217 // cc_api_library defined without original library should be linked with cc_api_library
10218 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10219 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10220 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10221}
10222
10223func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10224 bp := `
10225 apex {
10226 name: "myapex",
10227 key: "myapex.key",
10228 native_shared_libs: ["libbar"],
10229 min_sdk_version: "29",
10230 }
10231 apex_key {
10232 name: "myapex.key",
10233 }
10234 cc_binary {
10235 name: "binfoo",
10236 shared_libs: ["libbar"],
10237 recovery_available: false,
10238 }
10239 cc_library {
10240 name: "libbar",
10241 srcs: ["libbar.cc"],
10242 apex_available: ["myapex"],
10243 min_sdk_version: "29",
10244 stubs: {
10245 symbol_file: "libbar.map.txt",
10246 versions: [
10247 "29",
10248 ],
10249 },
10250 }
10251 cc_api_library {
10252 name: "libbar",
10253 src: "libbar_stub.so",
10254 variants: ["apex.29"],
10255 }
10256 cc_api_variant {
10257 name: "libbar",
10258 variant: "apex",
10259 version: "29",
10260 src: "libbar_apex_29.so",
10261 }
10262 api_imports {
10263 name: "api_imports",
10264 apex_shared_libs: [
10265 "libbar",
10266 ],
10267 }
10268 `
10269
10270 result := testApex(t, bp)
10271
10272 hasDep := func(m android.Module, wantDep android.Module) bool {
10273 t.Helper()
10274 var found bool
10275 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10276 if dep == wantDep {
10277 found = true
10278 }
10279 })
10280 return found
10281 }
10282
10283 // Library defines stubs and cc_api_library should be used with cc_api_library
10284 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10285 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10286 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10287
10288 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10289 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10290
10291 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10292 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10293 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10294 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010295}
Dennis Shend4f5d932023-01-31 20:27:21 +000010296
10297func TestTrimmedApex(t *testing.T) {
10298 bp := `
10299 apex {
10300 name: "myapex",
10301 key: "myapex.key",
10302 native_shared_libs: ["libfoo","libbaz"],
10303 min_sdk_version: "29",
10304 trim_against: "mydcla",
10305 }
10306 apex {
10307 name: "mydcla",
10308 key: "myapex.key",
10309 native_shared_libs: ["libfoo","libbar"],
10310 min_sdk_version: "29",
10311 file_contexts: ":myapex-file_contexts",
10312 dynamic_common_lib_apex: true,
10313 }
10314 apex_key {
10315 name: "myapex.key",
10316 }
10317 cc_library {
10318 name: "libfoo",
10319 shared_libs: ["libc"],
10320 apex_available: ["myapex","mydcla"],
10321 min_sdk_version: "29",
10322 }
10323 cc_library {
10324 name: "libbar",
10325 shared_libs: ["libc"],
10326 apex_available: ["myapex","mydcla"],
10327 min_sdk_version: "29",
10328 }
10329 cc_library {
10330 name: "libbaz",
10331 shared_libs: ["libc"],
10332 apex_available: ["myapex","mydcla"],
10333 min_sdk_version: "29",
10334 }
10335 cc_api_library {
10336 name: "libc",
10337 src: "libc.so",
10338 min_sdk_version: "29",
10339 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010340 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010341 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010342 }
10343 api_imports {
10344 name: "api_imports",
10345 shared_libs: [
10346 "libc",
10347 ],
10348 header_libs: [],
10349 }
10350 `
10351 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010352 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010353 apexRule := module.MaybeRule("apexRule")
10354 if apexRule.Rule == nil {
10355 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10356 }
10357
10358 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010359 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010360 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10361 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10362 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10363 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10364}
Jingwen Chendea7a642023-03-28 11:30:50 +000010365
10366func TestCannedFsConfig(t *testing.T) {
10367 ctx := testApex(t, `
10368 apex {
10369 name: "myapex",
10370 key: "myapex.key",
10371 updatable: false,
10372 }
10373
10374 apex_key {
10375 name: "myapex.key",
10376 public_key: "testkey.avbpubkey",
10377 private_key: "testkey.pem",
10378 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010379 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010380 generateFsRule := mod.Rule("generateFsConfig")
10381 cmd := generateFsRule.RuleParams.Command
10382
10383 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10384}
10385
10386func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10387 ctx := testApex(t, `
10388 apex {
10389 name: "myapex",
10390 key: "myapex.key",
10391 canned_fs_config: "my_config",
10392 updatable: false,
10393 }
10394
10395 apex_key {
10396 name: "myapex.key",
10397 public_key: "testkey.avbpubkey",
10398 private_key: "testkey.pem",
10399 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010400 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010401 generateFsRule := mod.Rule("generateFsConfig")
10402 cmd := generateFsRule.RuleParams.Command
10403
10404 // Ensure that canned_fs_config has "cat my_config" at the end
10405 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10406}
Spandan Das20fce2d2023-04-12 17:21:39 +000010407
10408func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10409 testCases := []struct {
10410 desc string
10411 hasStubs bool
10412 apexAvailable string
10413 expectedError string
10414 }{
10415 {
10416 desc: "non-stub library can have multiple apex_available",
10417 hasStubs: false,
10418 apexAvailable: `["myapex", "otherapex"]`,
10419 },
10420 {
10421 desc: "stub library should not be available to anyapex",
10422 hasStubs: true,
10423 apexAvailable: `["//apex_available:anyapex"]`,
10424 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10425 },
10426 {
10427 desc: "stub library should not be available to multiple apexes",
10428 hasStubs: true,
10429 apexAvailable: `["myapex", "otherapex"]`,
10430 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10431 },
10432 {
10433 desc: "stub library can be available to a core apex and a test apex",
10434 hasStubs: true,
10435 apexAvailable: `["myapex", "test_myapex"]`,
10436 },
10437 }
10438 bpTemplate := `
10439 cc_library {
10440 name: "libfoo",
10441 %v
10442 apex_available: %v,
10443 }
10444 apex {
10445 name: "myapex",
10446 key: "apex.key",
10447 updatable: false,
10448 native_shared_libs: ["libfoo"],
10449 }
10450 apex {
10451 name: "otherapex",
10452 key: "apex.key",
10453 updatable: false,
10454 }
10455 apex_test {
10456 name: "test_myapex",
10457 key: "apex.key",
10458 updatable: false,
10459 native_shared_libs: ["libfoo"],
10460 }
10461 apex_key {
10462 name: "apex.key",
10463 }
10464 `
10465 for _, tc := range testCases {
10466 stubs := ""
10467 if tc.hasStubs {
10468 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10469 }
10470 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10471 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10472 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10473 })
10474 if tc.expectedError == "" {
10475 testApex(t, bp, mockFsFixturePreparer)
10476 } else {
10477 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10478 }
10479 }
10480}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010481
10482func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10483 context := android.GroupFixturePreparers(
10484 android.PrepareForIntegrationTestWithAndroid,
10485 cc.PrepareForIntegrationTestWithCc,
10486 PrepareForTestWithApexBuildComponents,
10487 prepareForTestWithMyapex,
10488 filesystem.PrepareForTestWithFilesystemBuildComponents,
10489 )
10490 result := context.RunTestWithBp(t, `
10491 android_system_image {
10492 name: "myfilesystem",
10493 deps: [
10494 "libfoo",
10495 ],
10496 linker_config_src: "linker.config.json",
10497 }
10498
10499 cc_library {
10500 name: "libfoo",
10501 shared_libs: [
10502 "libbar",
10503 ],
10504 stl: "none",
10505 }
10506
10507 cc_library {
10508 name: "libbar",
10509 stl: "none",
10510 apex_available: ["myapex"],
10511 }
10512
10513 apex {
10514 name: "myapex",
10515 native_shared_libs: ["libbar"],
10516 key: "myapex.key",
10517 updatable: false,
10518 }
10519
10520 apex_key {
10521 name: "myapex.key",
10522 public_key: "testkey.avbpubkey",
10523 private_key: "testkey.pem",
10524 }
10525 `)
10526
Cole Faust3b806d32024-03-11 15:15:03 -070010527 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010528 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10529 inputs.Strings(),
10530 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10531}
Yu Liueae7b362023-11-16 17:05:47 -080010532
10533var apex_default_bp = `
10534 apex_key {
10535 name: "myapex.key",
10536 public_key: "testkey.avbpubkey",
10537 private_key: "testkey.pem",
10538 }
10539
10540 filegroup {
10541 name: "myapex.manifest",
10542 srcs: ["apex_manifest.json"],
10543 }
10544
10545 filegroup {
10546 name: "myapex.androidmanifest",
10547 srcs: ["AndroidManifest.xml"],
10548 }
10549`
10550
10551func TestAconfigFilesJavaDeps(t *testing.T) {
10552 ctx := testApex(t, apex_default_bp+`
10553 apex {
10554 name: "myapex",
10555 manifest: ":myapex.manifest",
10556 androidManifest: ":myapex.androidmanifest",
10557 key: "myapex.key",
10558 java_libs: [
10559 "my_java_library_foo",
10560 "my_java_library_bar",
10561 ],
10562 updatable: false,
10563 }
10564
10565 java_library {
10566 name: "my_java_library_foo",
10567 srcs: ["foo/bar/MyClass.java"],
10568 sdk_version: "none",
10569 system_modules: "none",
10570 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010571 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010572 "myapex",
10573 ],
10574 }
10575
10576 java_library {
10577 name: "my_java_library_bar",
10578 srcs: ["foo/bar/MyClass.java"],
10579 sdk_version: "none",
10580 system_modules: "none",
10581 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010582 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010583 "myapex",
10584 ],
10585 }
10586
10587 aconfig_declarations {
10588 name: "my_aconfig_declarations_foo",
10589 package: "com.example.package",
10590 container: "myapex",
10591 srcs: ["foo.aconfig"],
10592 }
10593
10594 java_aconfig_library {
10595 name: "my_java_aconfig_library_foo",
10596 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010597 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010598 "myapex",
10599 ],
10600 }
10601
10602 aconfig_declarations {
10603 name: "my_aconfig_declarations_bar",
10604 package: "com.example.package",
10605 container: "myapex",
10606 srcs: ["bar.aconfig"],
10607 }
10608
10609 java_aconfig_library {
10610 name: "my_java_aconfig_library_bar",
10611 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010612 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010613 "myapex",
10614 ],
10615 }
10616 `)
10617
10618 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10619 s := mod.Rule("apexRule").Args["copy_commands"]
10620 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010621 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080010622 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10623 }
10624
Yu Liuab31c822024-02-28 22:21:31 +000010625 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10626 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
10627 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
10628 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010629
Yu Liubba555e2024-02-17 00:36:42 +000010630 inputs := []string{
10631 "my_aconfig_declarations_foo/intermediate.pb",
10632 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010633 }
Yu Liubba555e2024-02-17 00:36:42 +000010634 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10635 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10636 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10637 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010638}
10639
10640func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10641 ctx := testApex(t, apex_default_bp+`
10642 apex {
10643 name: "myapex",
10644 manifest: ":myapex.manifest",
10645 androidManifest: ":myapex.androidmanifest",
10646 key: "myapex.key",
10647 java_libs: [
10648 "my_java_library_foo",
10649 ],
10650 native_shared_libs: [
10651 "my_cc_library_bar",
10652 ],
10653 binaries: [
10654 "my_cc_binary_baz",
10655 ],
10656 updatable: false,
10657 }
10658
10659 java_library {
10660 name: "my_java_library_foo",
10661 srcs: ["foo/bar/MyClass.java"],
10662 sdk_version: "none",
10663 system_modules: "none",
10664 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010665 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010666 "myapex",
10667 ],
10668 }
10669
10670 cc_library {
10671 name: "my_cc_library_bar",
10672 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010673 static_libs: [
10674 "my_cc_aconfig_library_bar",
10675 "my_cc_aconfig_library_baz",
10676 ],
Yu Liueae7b362023-11-16 17:05:47 -080010677 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010678 "myapex",
10679 ],
10680 }
10681
10682 cc_binary {
10683 name: "my_cc_binary_baz",
10684 srcs: ["foo/bar/MyClass.cc"],
10685 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010686 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010687 "myapex",
10688 ],
10689 }
10690
10691 aconfig_declarations {
10692 name: "my_aconfig_declarations_foo",
10693 package: "com.example.package",
10694 container: "myapex",
10695 srcs: ["foo.aconfig"],
10696 }
10697
10698 java_aconfig_library {
10699 name: "my_java_aconfig_library_foo",
10700 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010701 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010702 "myapex",
10703 ],
10704 }
10705
10706 aconfig_declarations {
10707 name: "my_aconfig_declarations_bar",
10708 package: "com.example.package",
10709 container: "myapex",
10710 srcs: ["bar.aconfig"],
10711 }
10712
10713 cc_aconfig_library {
10714 name: "my_cc_aconfig_library_bar",
10715 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010716 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010717 "myapex",
10718 ],
10719 }
10720
10721 aconfig_declarations {
10722 name: "my_aconfig_declarations_baz",
10723 package: "com.example.package",
10724 container: "myapex",
10725 srcs: ["baz.aconfig"],
10726 }
10727
10728 cc_aconfig_library {
10729 name: "my_cc_aconfig_library_baz",
10730 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010731 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010732 "myapex",
10733 ],
10734 }
10735
10736 cc_library {
10737 name: "server_configurable_flags",
10738 srcs: ["server_configurable_flags.cc"],
10739 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010740 cc_library {
10741 name: "libbase",
10742 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010743 apex_available: [
10744 "myapex",
10745 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010746 }
10747 cc_library {
10748 name: "libaconfig_storage_read_api_cc",
10749 srcs: ["libaconfig_storage_read_api_cc.cc"],
10750 }
Yu Liueae7b362023-11-16 17:05:47 -080010751 `)
10752
10753 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10754 s := mod.Rule("apexRule").Args["copy_commands"]
10755 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010756 if len(copyCmds) != 12 {
10757 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010758 }
10759
Yu Liuab31c822024-02-28 22:21:31 +000010760 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10761 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
10762 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
10763 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010764
Yu Liubba555e2024-02-17 00:36:42 +000010765 inputs := []string{
10766 "my_aconfig_declarations_foo/intermediate.pb",
10767 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10768 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010769 }
Yu Liubba555e2024-02-17 00:36:42 +000010770 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10771 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10772 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10773 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010774}
10775
Yu Liucec0e412023-11-30 16:45:50 -080010776func TestAconfigFilesRustDeps(t *testing.T) {
10777 ctx := testApex(t, apex_default_bp+`
10778 apex {
10779 name: "myapex",
10780 manifest: ":myapex.manifest",
10781 androidManifest: ":myapex.androidmanifest",
10782 key: "myapex.key",
10783 native_shared_libs: [
10784 "libmy_rust_library",
10785 ],
10786 binaries: [
10787 "my_rust_binary",
10788 ],
10789 rust_dyn_libs: [
10790 "libmy_rust_dylib",
10791 ],
10792 updatable: false,
10793 }
10794
10795 rust_library {
10796 name: "libflags_rust", // test mock
10797 crate_name: "flags_rust",
10798 srcs: ["lib.rs"],
10799 apex_available: [
10800 "myapex",
10801 ],
10802 }
10803
10804 rust_library {
10805 name: "liblazy_static", // test mock
10806 crate_name: "lazy_static",
10807 srcs: ["src/lib.rs"],
10808 apex_available: [
10809 "myapex",
10810 ],
10811 }
10812
Ted Bauer02d475c2024-03-27 20:56:26 +000010813 rust_library {
10814 name: "libaconfig_storage_read_api", // test mock
10815 crate_name: "aconfig_storage_read_api",
10816 srcs: ["src/lib.rs"],
10817 apex_available: [
10818 "myapex",
10819 ],
10820 }
10821
Ted Bauer6ef40db2024-03-29 14:04:10 +000010822 rust_library {
10823 name: "liblogger", // test mock
10824 crate_name: "logger",
10825 srcs: ["src/lib.rs"],
10826 apex_available: [
10827 "myapex",
10828 ],
10829 }
10830
10831 rust_library {
10832 name: "liblog_rust", // test mock
10833 crate_name: "log_rust",
10834 srcs: ["src/lib.rs"],
10835 apex_available: [
10836 "myapex",
10837 ],
10838 }
10839
Yu Liucec0e412023-11-30 16:45:50 -080010840 rust_ffi_shared {
10841 name: "libmy_rust_library",
10842 srcs: ["src/lib.rs"],
10843 rustlibs: ["libmy_rust_aconfig_library_foo"],
10844 crate_name: "my_rust_library",
10845 apex_available: [
10846 "myapex",
10847 ],
10848 }
10849
10850 rust_library_dylib {
10851 name: "libmy_rust_dylib",
10852 srcs: ["foo/bar/MyClass.rs"],
10853 rustlibs: ["libmy_rust_aconfig_library_bar"],
10854 crate_name: "my_rust_dylib",
10855 apex_available: [
10856 "myapex",
10857 ],
10858 }
10859
10860 rust_binary {
10861 name: "my_rust_binary",
10862 srcs: ["foo/bar/MyClass.rs"],
10863 rustlibs: [
10864 "libmy_rust_aconfig_library_baz",
10865 "libmy_rust_dylib",
10866 ],
10867 apex_available: [
10868 "myapex",
10869 ],
10870 }
10871
10872 aconfig_declarations {
10873 name: "my_aconfig_declarations_foo",
10874 package: "com.example.package",
10875 container: "myapex",
10876 srcs: ["foo.aconfig"],
10877 }
10878
10879 aconfig_declarations {
10880 name: "my_aconfig_declarations_bar",
10881 package: "com.example.package",
10882 container: "myapex",
10883 srcs: ["bar.aconfig"],
10884 }
10885
10886 aconfig_declarations {
10887 name: "my_aconfig_declarations_baz",
10888 package: "com.example.package",
10889 container: "myapex",
10890 srcs: ["baz.aconfig"],
10891 }
10892
10893 rust_aconfig_library {
10894 name: "libmy_rust_aconfig_library_foo",
10895 aconfig_declarations: "my_aconfig_declarations_foo",
10896 crate_name: "my_rust_aconfig_library_foo",
10897 apex_available: [
10898 "myapex",
10899 ],
10900 }
10901
10902 rust_aconfig_library {
10903 name: "libmy_rust_aconfig_library_bar",
10904 aconfig_declarations: "my_aconfig_declarations_bar",
10905 crate_name: "my_rust_aconfig_library_bar",
10906 apex_available: [
10907 "myapex",
10908 ],
10909 }
10910
10911 rust_aconfig_library {
10912 name: "libmy_rust_aconfig_library_baz",
10913 aconfig_declarations: "my_aconfig_declarations_baz",
10914 crate_name: "my_rust_aconfig_library_baz",
10915 apex_available: [
10916 "myapex",
10917 ],
10918 }
10919 `)
10920
10921 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10922 s := mod.Rule("apexRule").Args["copy_commands"]
10923 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ted Bauer6ef40db2024-03-29 14:04:10 +000010924 if len(copyCmds) != 32 {
Ted Bauer02d475c2024-03-27 20:56:26 +000010925 t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010926 }
10927
Ted Bauer6ef40db2024-03-29 14:04:10 +000010928 ensureMatches(t, copyCmds[28], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10929 ensureMatches(t, copyCmds[29], "^cp -f .*/package.map .*/image.apex/etc$")
10930 ensureMatches(t, copyCmds[30], "^cp -f .*/flag.map .*/image.apex/etc$")
10931 ensureMatches(t, copyCmds[31], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080010932
Yu Liubba555e2024-02-17 00:36:42 +000010933 inputs := []string{
10934 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010935 "my_aconfig_declarations_bar/intermediate.pb",
10936 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010937 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10938 }
10939 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10940 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10941 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10942 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10943}
10944
10945func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10946 aconfigRule := mod.Description(desc)
10947 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010948 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010949 if len(aconfigArgs) != len(inputs) {
10950 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010951 }
Yu Liucec0e412023-11-30 16:45:50 -080010952
Yu Liubba555e2024-02-17 00:36:42 +000010953 ensureEquals(t, container, aconfigRule.Args["container"])
10954 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10955
10956 buildParams := aconfigRule.BuildParams
10957 for _, input := range inputs {
10958 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10959 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010960 }
Yu Liubba555e2024-02-17 00:36:42 +000010961
10962 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010963}
10964
Yu Liueae7b362023-11-16 17:05:47 -080010965func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
10966 ctx := testApex(t, apex_default_bp+`
10967 apex {
10968 name: "myapex",
10969 manifest: ":myapex.manifest",
10970 androidManifest: ":myapex.androidmanifest",
10971 key: "myapex.key",
10972 java_libs: [
10973 "my_java_library_foo",
10974 "other_java_library_bar",
10975 ],
10976 updatable: false,
10977 }
10978
10979 java_library {
10980 name: "my_java_library_foo",
10981 srcs: ["foo/bar/MyClass.java"],
10982 sdk_version: "none",
10983 system_modules: "none",
10984 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010985 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010986 "myapex",
10987 ],
10988 }
10989
10990 java_library {
10991 name: "other_java_library_bar",
10992 srcs: ["foo/bar/MyClass.java"],
10993 sdk_version: "none",
10994 system_modules: "none",
10995 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010996 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010997 "myapex",
10998 ],
10999 }
11000
11001 aconfig_declarations {
11002 name: "my_aconfig_declarations_foo",
11003 package: "com.example.package",
11004 container: "myapex",
11005 srcs: ["foo.aconfig"],
11006 }
11007
11008 java_aconfig_library {
11009 name: "my_java_aconfig_library_foo",
11010 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011011 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011012 "myapex",
11013 ],
11014 }
11015
11016 aconfig_declarations {
11017 name: "other_aconfig_declarations_bar",
11018 package: "com.example.package",
11019 container: "otherapex",
11020 srcs: ["bar.aconfig"],
11021 }
11022
11023 java_aconfig_library {
11024 name: "other_java_aconfig_library_bar",
11025 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011026 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011027 "myapex",
11028 ],
11029 }
11030 `)
11031
11032 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11033 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11034 s := " " + combineAconfigRule.Args["cache_files"]
11035 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11036 if len(aconfigArgs) != 1 {
11037 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11038 }
11039 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11040
11041 buildParams := combineAconfigRule.BuildParams
11042 if len(buildParams.Inputs) != 1 {
11043 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11044 }
11045 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11046 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11047}
11048
11049func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11050 ctx := testApex(t, apex_default_bp+`
11051 apex {
11052 name: "myapex",
11053 manifest: ":myapex.manifest",
11054 androidManifest: ":myapex.androidmanifest",
11055 key: "myapex.key",
11056 java_libs: [
11057 "my_java_library_foo",
11058 "my_java_library_bar",
11059 ],
11060 updatable: false,
11061 }
11062
11063 java_library {
11064 name: "my_java_library_foo",
11065 srcs: ["foo/bar/MyClass.java"],
11066 sdk_version: "none",
11067 system_modules: "none",
11068 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011069 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011070 "myapex",
11071 ],
11072 }
11073
11074 java_library {
11075 name: "my_java_library_bar",
11076 srcs: ["foo/bar/MyClass.java"],
11077 sdk_version: "none",
11078 system_modules: "none",
11079 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011080 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011081 "myapex",
11082 ],
11083 }
11084
11085 aconfig_declarations {
11086 name: "my_aconfig_declarations_foo",
11087 package: "com.example.package",
11088 container: "myapex",
11089 srcs: ["foo.aconfig"],
11090 }
11091
11092 java_aconfig_library {
11093 name: "my_java_aconfig_library_foo",
11094 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011095 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011096 "myapex",
11097 ],
11098 }
11099
11100 java_aconfig_library {
11101 name: "my_java_aconfig_library_bar",
11102 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011103 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011104 "myapex",
11105 ],
11106 }
11107 `)
11108
11109 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11110 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11111 s := " " + combineAconfigRule.Args["cache_files"]
11112 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11113 if len(aconfigArgs) != 1 {
11114 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11115 }
11116 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11117
11118 buildParams := combineAconfigRule.BuildParams
11119 if len(buildParams.Inputs) != 1 {
11120 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11121 }
11122 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11123 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11124}
Spandan Das5be63332023-12-13 00:06:32 +000011125
11126// Test that the boot jars come from the _selected_ apex prebuilt
11127// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11128func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11129 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11130 t.Helper()
11131 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11132 foundLibfooJar := false
11133 base := stem + ".jar"
11134 for _, output := range s.AllOutputs() {
11135 if filepath.Base(output) == base {
11136 foundLibfooJar = true
11137 buildRule := s.Output(output)
11138 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11139 }
11140 }
11141 if !foundLibfooJar {
11142 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11143 }
11144 }
11145
Spandan Das64c9e0c2023-12-20 20:13:34 +000011146 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11147 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11148 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11149 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11150 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11151 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)
11152 }
11153
11154 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11155 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11156 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11157 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11158 }
11159
Spandan Das5be63332023-12-13 00:06:32 +000011160 bp := `
11161 // Source APEX.
11162
11163 java_library {
11164 name: "framework-foo",
11165 srcs: ["foo.java"],
11166 installable: true,
11167 apex_available: [
11168 "com.android.foo",
11169 ],
11170 }
11171
11172 bootclasspath_fragment {
11173 name: "foo-bootclasspath-fragment",
11174 contents: ["framework-foo"],
11175 apex_available: [
11176 "com.android.foo",
11177 ],
11178 hidden_api: {
11179 split_packages: ["*"],
11180 },
11181 }
11182
11183 apex_key {
11184 name: "com.android.foo.key",
11185 public_key: "com.android.foo.avbpubkey",
11186 private_key: "com.android.foo.pem",
11187 }
11188
11189 apex {
11190 name: "com.android.foo",
11191 key: "com.android.foo.key",
11192 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11193 updatable: false,
11194 }
11195
11196 // Prebuilt APEX.
11197
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011198 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011199 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011200 public: {
11201 jars: ["foo.jar"],
11202 },
Spandan Das5be63332023-12-13 00:06:32 +000011203 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011204 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011205 }
11206
11207 prebuilt_bootclasspath_fragment {
11208 name: "foo-bootclasspath-fragment",
11209 contents: ["framework-foo"],
11210 hidden_api: {
11211 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11212 metadata: "my-bootclasspath-fragment/metadata.csv",
11213 index: "my-bootclasspath-fragment/index.csv",
11214 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11215 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11216 },
11217 apex_available: [
11218 "com.android.foo",
11219 ],
11220 }
11221
11222 prebuilt_apex {
11223 name: "com.android.foo",
11224 apex_name: "com.android.foo",
11225 src: "com.android.foo-arm.apex",
11226 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11227 }
11228
11229 // Another Prebuilt ART APEX
11230 prebuilt_apex {
11231 name: "com.android.foo.v2",
11232 apex_name: "com.android.foo", // Used to determine the API domain
11233 src: "com.android.foo-arm.apex",
11234 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11235 }
11236
11237 // APEX contribution modules
11238
11239 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011240 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011241 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011242 contents: ["com.android.foo"],
11243 }
11244
11245 apex_contributions {
11246 name: "foo.prebuilt.contributions",
11247 api_domain: "com.android.foo",
11248 contents: ["prebuilt_com.android.foo"],
11249 }
11250
11251 apex_contributions {
11252 name: "foo.prebuilt.v2.contributions",
11253 api_domain: "com.android.foo",
11254 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011255 }
11256 `
11257
11258 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011259 desc string
11260 selectedApexContributions string
11261 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011262 }{
11263 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011264 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11265 selectedApexContributions: "foo.source.contributions",
11266 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011267 },
11268 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011269 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11270 selectedApexContributions: "foo.prebuilt.contributions",
11271 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011272 },
11273 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011274 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11275 selectedApexContributions: "foo.prebuilt.v2.contributions",
11276 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011277 },
11278 }
11279
11280 fragment := java.ApexVariantReference{
11281 Apex: proptools.StringPtr("com.android.foo"),
11282 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11283 }
11284
11285 for _, tc := range testCases {
11286 preparer := android.GroupFixturePreparers(
11287 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11288 android.FixtureMergeMockFs(map[string][]byte{
11289 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11290 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011291 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11292 // file creation.
11293 java.FixtureConfigureBootJars("platform:foo"),
11294 android.FixtureModifyMockFS(func(fs android.MockFS) {
11295 fs["platform/Android.bp"] = []byte(`
11296 java_library {
11297 name: "foo",
11298 srcs: ["Test.java"],
11299 compile_dex: true,
11300 }
11301 `)
11302 fs["platform/Test.java"] = nil
11303 }),
11304
Spandan Das5be63332023-12-13 00:06:32 +000011305 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11306 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011307 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011308 }
11309 }),
11310 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011311 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011312 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011313 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11314 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011315 }
11316}
Spandan Das3576e762024-01-03 18:57:03 +000011317
11318// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11319// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11320func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000011321 // for a mainline module family, check that only the flagged soong module is visible to make
11322 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11323 variation := func(moduleName string) string {
11324 ret := "android_common_com.android.foo"
11325 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011326 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011327 }
11328 return ret
11329 }
11330
11331 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11332 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11333
11334 for _, hiddenModuleName := range hiddenModuleNames {
11335 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11336 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11337
11338 }
11339 }
11340
11341 bp := `
11342 apex_key {
11343 name: "com.android.foo.key",
11344 public_key: "com.android.foo.avbpubkey",
11345 private_key: "com.android.foo.pem",
11346 }
11347
11348 // AOSP source apex
11349 apex {
11350 name: "com.android.foo",
11351 key: "com.android.foo.key",
11352 updatable: false,
11353 }
11354
11355 // Google source apex
11356 override_apex {
11357 name: "com.google.android.foo",
11358 base: "com.android.foo",
11359 key: "com.android.foo.key",
11360 }
11361
11362 // Prebuilt Google APEX.
11363
11364 prebuilt_apex {
11365 name: "com.google.android.foo",
11366 apex_name: "com.android.foo",
11367 src: "com.android.foo-arm.apex",
11368 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11369 }
11370
11371 // Another Prebuilt Google APEX
11372 prebuilt_apex {
11373 name: "com.google.android.foo.v2",
11374 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011375 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011376 src: "com.android.foo-arm.apex",
11377 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11378 }
11379
11380 // APEX contribution modules
11381
11382 apex_contributions {
11383 name: "foo.source.contributions",
11384 api_domain: "com.android.foo",
11385 contents: ["com.google.android.foo"],
11386 }
11387
11388 apex_contributions {
11389 name: "foo.prebuilt.contributions",
11390 api_domain: "com.android.foo",
11391 contents: ["prebuilt_com.google.android.foo"],
11392 }
11393
11394 apex_contributions {
11395 name: "foo.prebuilt.v2.contributions",
11396 api_domain: "com.android.foo",
11397 contents: ["prebuilt_com.google.android.foo.v2"],
11398 }
11399
11400 // This is an incompatible module because it selects multiple versions of the same mainline module
11401 apex_contributions {
11402 name: "foo.prebuilt.duplicate.contributions",
11403 api_domain: "com.android.foo",
11404 contents: [
11405 "prebuilt_com.google.android.foo",
11406 "prebuilt_com.google.android.foo.v2",
11407 ],
11408 }
11409 `
11410
11411 testCases := []struct {
11412 desc string
11413 selectedApexContributions string
11414 expectedVisibleModuleName string
11415 expectedHiddenModuleNames []string
11416 expectedError string
11417 }{
11418 {
11419 desc: "Source apex is selected, prebuilts should be hidden from make",
11420 selectedApexContributions: "foo.source.contributions",
11421 expectedVisibleModuleName: "com.google.android.foo",
11422 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11423 },
11424 {
11425 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11426 selectedApexContributions: "foo.prebuilt.contributions",
11427 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11428 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11429 },
11430 {
11431 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11432 selectedApexContributions: "foo.prebuilt.v2.contributions",
11433 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11434 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11435 },
11436 {
11437 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11438 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11439 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11440 },
11441 }
11442
11443 for _, tc := range testCases {
11444 preparer := android.GroupFixturePreparers(
11445 android.FixtureMergeMockFs(map[string][]byte{
11446 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11447 }),
11448 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11449 variables.BuildFlags = map[string]string{
11450 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11451 }
11452 }),
11453 )
11454 if tc.expectedError != "" {
11455 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11456 testApex(t, bp, preparer)
11457 return
11458 }
11459 ctx := testApex(t, bp, preparer)
11460
Spandan Das3576e762024-01-03 18:57:03 +000011461 // Check that
11462 // 1. The contents of the selected apex_contributions are visible to make
11463 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11464 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11465 }
11466}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011467
11468func TestAconfifDeclarationsValidation(t *testing.T) {
11469 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11470 for _, moduleName := range moduleNames {
11471 ret += fmt.Sprintf(`
11472 aconfig_declarations {
11473 name: "%[1]s",
11474 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011475 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011476 srcs: [
11477 "%[1]s.aconfig",
11478 ],
11479 }
11480 java_aconfig_library {
11481 name: "%[1]s-lib",
11482 aconfig_declarations: "%[1]s",
11483 }
11484 `, moduleName)
11485 }
11486 return ret
11487 }
11488
11489 result := android.GroupFixturePreparers(
11490 prepareForApexTest,
11491 java.PrepareForTestWithJavaSdkLibraryFiles,
11492 java.FixtureWithLastReleaseApis("foo"),
11493 android.FixtureModifyConfig(func(config android.Config) {
11494 config.SetApiLibraries([]string{"foo"})
11495 }),
11496 ).RunTestWithBp(t, `
11497 java_library {
11498 name: "baz-java-lib",
11499 static_libs: [
11500 "baz-lib",
11501 ],
11502 }
11503 filegroup {
11504 name: "qux-filegroup",
11505 srcs: [
11506 ":qux-lib{.generated_srcjars}",
11507 ],
11508 }
11509 filegroup {
11510 name: "qux-another-filegroup",
11511 srcs: [
11512 ":qux-filegroup",
11513 ],
11514 }
11515 java_library {
11516 name: "quux-java-lib",
11517 srcs: [
11518 "a.java",
11519 ],
11520 libs: [
11521 "quux-lib",
11522 ],
11523 }
11524 java_sdk_library {
11525 name: "foo",
11526 srcs: [
11527 ":qux-another-filegroup",
11528 ],
11529 api_packages: ["foo"],
11530 system: {
11531 enabled: true,
11532 },
11533 module_lib: {
11534 enabled: true,
11535 },
11536 test: {
11537 enabled: true,
11538 },
11539 static_libs: [
11540 "bar-lib",
11541 ],
11542 libs: [
11543 "baz-java-lib",
11544 "quux-java-lib",
11545 ],
11546 aconfig_declarations: [
11547 "bar",
11548 ],
11549 }
11550 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11551
11552 m := result.ModuleForTests("foo.stubs.source", "android_common")
11553 outDir := "out/soong/.intermediates"
11554
11555 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11556 // textproto files
11557 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11558
11559 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11560 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11561 // to aconfig.
11562 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11563 "passed as an input",
11564 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11565
11566 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11567 // to metalava as classpath. Thus the cache file provided by the associated
11568 // aconfig_declarations module "baz" should be passed to aconfig.
11569 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11570 "java_aconfig_library passed as an input",
11571 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11572
11573 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11574 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11575 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11576 "input",
11577 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11578
11579 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11580 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11581 // aconfig_declarations module "quux" should not be passed to aconfig.
11582 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11583 "depend on java_aconfig_library not passed as an input",
11584 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11585}
Cole Faust7c991b42024-05-15 11:17:55 -070011586
11587func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11588 ctx := testApex(t, `
11589 apex {
11590 name: "myapex",
11591 key: "myapex.key",
11592 prebuilts: ["myetc", "myetc2"],
11593 min_sdk_version: "29",
11594 }
11595 apex_key {
11596 name: "myapex.key",
11597 public_key: "testkey.avbpubkey",
11598 private_key: "testkey.pem",
11599 }
11600
11601 prebuilt_etc {
11602 name: "myetc",
11603 src: "myprebuilt",
11604 filename: "myfilename",
11605 }
11606 prebuilt_etc {
11607 name: "myetc2",
11608 sub_dir: "mysubdir",
11609 src: "myprebuilt",
11610 filename: "myfilename",
11611 }
11612 `, withFiles(android.MockFS{
11613 "packages/modules/common/build/allowed_deps.txt": nil,
11614 }))
11615
11616 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11617 data := android.AndroidMkDataForTest(t, ctx, ab)
11618 var builder strings.Builder
11619 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11620 androidMk := builder.String()
11621
11622 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11623 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11624}
Spandan Das50801e22024-05-13 18:29:45 +000011625
11626func TestApexMinSdkVersionOverride(t *testing.T) {
11627 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11628 args := module.Rule("apexRule").Args
11629 optFlags := args["opt_flags"]
11630 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11631 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11632 }
11633 }
11634
11635 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11636 t.Helper()
11637 found := false
11638 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11639 if dep == wantDep {
11640 found = true
11641 }
11642 })
11643 if !found {
11644 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11645 }
11646 }
11647
11648 ctx := testApex(t, `
11649 apex {
11650 name: "com.android.apex30",
11651 min_sdk_version: "30",
11652 key: "apex30.key",
11653 java_libs: ["javalib"],
11654 }
11655
11656 java_library {
11657 name: "javalib",
11658 srcs: ["A.java"],
11659 apex_available: ["com.android.apex30"],
11660 min_sdk_version: "30",
11661 sdk_version: "current",
11662 }
11663
11664 override_apex {
11665 name: "com.mycompany.android.apex30",
11666 base: "com.android.apex30",
11667 }
11668
11669 override_apex {
11670 name: "com.mycompany.android.apex31",
11671 base: "com.android.apex30",
11672 min_sdk_version: "31",
11673 }
11674
11675 apex_key {
11676 name: "apex30.key",
11677 public_key: "testkey.avbpubkey",
11678 private_key: "testkey.pem",
11679 }
11680
11681 `, android.FixtureMergeMockFs(android.MockFS{
11682 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11683 }),
11684 )
11685
11686 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11687 checkMinSdkVersion(t, baseModule, "30")
11688
11689 // Override module, but uses same min_sdk_version
11690 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11691 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11692 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11693 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11694
11695 // Override module, uses different min_sdk_version
11696 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11697 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11698 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11699 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11700}
Spandan Das0b28fa02024-05-28 23:40:17 +000011701
11702func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11703 context := android.GroupFixturePreparers(
11704 android.PrepareForIntegrationTestWithAndroid,
11705 PrepareForTestWithApexBuildComponents,
11706 android.FixtureMergeMockFs(android.MockFS{
11707 "system/sepolicy/apex/foo-file_contexts": nil,
11708 }),
11709 )
11710 res := context.RunTestWithBp(t, `
11711 apex {
11712 name: "foo",
11713 key: "myapex.key",
11714 apex_available_name: "com.android.foo",
11715 variant_version: "0",
11716 updatable: false,
11717 }
11718 apex_key {
11719 name: "myapex.key",
11720 public_key: "testkey.avbpubkey",
11721 private_key: "testkey.pem",
11722 }
11723 prebuilt_apex {
11724 name: "foo",
11725 src: "foo.apex",
11726 prefer: true,
11727 }
11728 override_apex {
11729 name: "myoverrideapex",
11730 base: "foo",
11731 }
11732 `)
11733
11734 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11735}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011736
11737func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11738 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`, `
11739 apex {
11740 name: "myapex",
11741 key: "myapex.key",
11742 updatable: true,
11743 min_sdk_version: "current",
11744 }
11745
11746 apex_key {
11747 name: "myapex.key",
11748 public_key: "testkey.avbpubkey",
11749 private_key: "testkey.pem",
11750 }
11751 `)
11752}
Spandan Das2f68f192024-07-22 19:25:50 +000011753
11754func TestPrebuiltStubNoinstall(t *testing.T) {
11755 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11756 result := android.GroupFixturePreparers(
11757 prepareForApexTest,
11758 android.PrepareForTestWithAndroidMk,
11759 android.PrepareForTestWithMakevars,
11760 android.FixtureMergeMockFs(fs),
11761 ).RunTest(t)
11762
11763 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
11764 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared/libfoo.so")
11765
11766 installRules := result.InstallMakeRulesForTesting(t)
11767
11768 var installedlibRule *android.InstallMakeRule
11769 for i, rule := range installRules {
11770 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11771 if installedlibRule != nil {
11772 t.Errorf("Duplicate install rules for %s", rule.Target)
11773 }
11774 installedlibRule = &installRules[i]
11775 }
11776 }
11777 if installedlibRule == nil {
11778 t.Errorf("No install rule found for installedlib")
11779 return
11780 }
11781
11782 if expectLibfooOnSystemLib {
11783 android.AssertStringListContains(t,
11784 "installedlib doesn't have install dependency on libfoo impl",
11785 installedlibRule.OrderOnlyDeps,
11786 "out/target/product/test_device/system/lib/libfoo.so")
11787 } else {
11788 android.AssertStringListDoesNotContain(t,
11789 "installedlib has install dependency on libfoo stub",
11790 installedlibRule.Deps,
11791 "out/target/product/test_device/system/lib/libfoo.so")
11792 android.AssertStringListDoesNotContain(t,
11793 "installedlib has order-only install dependency on libfoo stub",
11794 installedlibRule.OrderOnlyDeps,
11795 "out/target/product/test_device/system/lib/libfoo.so")
11796 }
11797 }
11798
11799 prebuiltLibfooBp := []byte(`
11800 cc_prebuilt_library {
11801 name: "libfoo",
11802 prefer: true,
11803 srcs: ["libfoo.so"],
11804 stubs: {
11805 versions: ["1"],
11806 },
11807 apex_available: ["apexfoo"],
11808 }
11809 `)
11810
11811 apexfooBp := []byte(`
11812 apex {
11813 name: "apexfoo",
11814 key: "apexfoo.key",
11815 native_shared_libs: ["libfoo"],
11816 updatable: false,
11817 compile_multilib: "both",
11818 }
11819 apex_key {
11820 name: "apexfoo.key",
11821 public_key: "testkey.avbpubkey",
11822 private_key: "testkey.pem",
11823 }
11824 `)
11825
11826 installedlibBp := []byte(`
11827 cc_library {
11828 name: "installedlib",
11829 shared_libs: ["libfoo"],
11830 }
11831 `)
11832
11833 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
11834 testFunc(
11835 t,
11836 /*expectLibfooOnSystemLib=*/ false,
11837 android.MockFS{
11838 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11839 "apexfoo/Android.bp": apexfooBp,
11840 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11841 "Android.bp": installedlibBp,
11842 },
11843 )
11844 })
11845
11846 disabledSourceLibfooBp := []byte(`
11847 cc_library {
11848 name: "libfoo",
11849 enabled: false,
11850 stubs: {
11851 versions: ["1"],
11852 },
11853 apex_available: ["apexfoo"],
11854 }
11855 `)
11856
11857 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
11858 testFunc(
11859 t,
11860 /*expectLibfooOnSystemLib=*/ false,
11861 android.MockFS{
11862 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11863 "impl/Android.bp": disabledSourceLibfooBp,
11864 "apexfoo/Android.bp": apexfooBp,
11865 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11866 "Android.bp": installedlibBp,
11867 },
11868 )
11869 })
11870}