blob: f2c0ab6ea062aba0bfe243b14adbf7ec515d3889 [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) {
Colin Cross2807f002021-03-02 10:15:29 -08003788 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003789 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003790 name: "com.android.vndk.current",
3791 key: "com.android.vndk.current.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 {
Colin Cross2807f002021-03-02 10:15:29 -08003797 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003798 public_key: "testkey.avbpubkey",
3799 private_key: "testkey.pem",
3800 }
3801
3802 cc_library {
3803 name: "libvndk",
3804 srcs: ["mylib.cpp"],
3805 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003806 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003807 native_bridge_supported: true,
3808 host_supported: true,
3809 vndk: {
3810 enabled: true,
3811 },
3812 system_shared_libs: [],
3813 stl: "none",
3814 }
3815 `)
3816}
3817
Jooyung Han31c470b2019-10-18 16:26:59 +09003818func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003819 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003820 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003821 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003822 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003823 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003824 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003825 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003826 }
3827
3828 apex_key {
3829 name: "myapex.key",
3830 public_key: "testkey.avbpubkey",
3831 private_key: "testkey.pem",
3832 }
3833
3834 vndk_prebuilt_shared {
3835 name: "libvndk27",
3836 version: "27",
3837 target_arch: "arm",
3838 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003839 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 vndk: {
3841 enabled: true,
3842 },
3843 arch: {
3844 arm: {
3845 srcs: ["libvndk27.so"],
3846 }
3847 },
3848 }
3849
3850 vndk_prebuilt_shared {
3851 name: "libvndk27",
3852 version: "27",
3853 target_arch: "arm",
3854 binder32bit: true,
3855 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003856 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003857 vndk: {
3858 enabled: true,
3859 },
3860 arch: {
3861 arm: {
3862 srcs: ["libvndk27binder32.so"],
3863 }
3864 },
Colin Cross2807f002021-03-02 10:15:29 -08003865 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003866 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 withFiles(map[string][]byte{
3869 "libvndk27.so": nil,
3870 "libvndk27binder32.so": nil,
3871 }),
3872 withBinder32bit,
3873 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003874 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003875 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3876 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003877 },
3878 }),
3879 )
3880
Jooyung Hana0503a52023-08-23 13:12:50 +09003881 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003883 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003884 })
3885}
3886
Jooyung Hane1633032019-08-01 17:41:43 +09003887func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003888 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003889 apex {
3890 name: "myapex_nodep",
3891 key: "myapex.key",
3892 native_shared_libs: ["lib_nodep"],
3893 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003894 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003895 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003896 }
3897
3898 apex {
3899 name: "myapex_dep",
3900 key: "myapex.key",
3901 native_shared_libs: ["lib_dep"],
3902 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003903 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003904 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003905 }
3906
3907 apex {
3908 name: "myapex_provider",
3909 key: "myapex.key",
3910 native_shared_libs: ["libfoo"],
3911 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003912 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003913 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003914 }
3915
3916 apex {
3917 name: "myapex_selfcontained",
3918 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00003919 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09003920 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003921 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003922 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003923 }
3924
3925 apex_key {
3926 name: "myapex.key",
3927 public_key: "testkey.avbpubkey",
3928 private_key: "testkey.pem",
3929 }
3930
3931 cc_library {
3932 name: "lib_nodep",
3933 srcs: ["mylib.cpp"],
3934 system_shared_libs: [],
3935 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003936 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003937 }
3938
3939 cc_library {
3940 name: "lib_dep",
3941 srcs: ["mylib.cpp"],
3942 shared_libs: ["libfoo"],
3943 system_shared_libs: [],
3944 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003945 apex_available: [
3946 "myapex_dep",
3947 "myapex_provider",
3948 "myapex_selfcontained",
3949 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003950 }
3951
3952 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00003953 name: "lib_dep_on_bar",
3954 srcs: ["mylib.cpp"],
3955 shared_libs: ["libbar"],
3956 system_shared_libs: [],
3957 stl: "none",
3958 apex_available: [
3959 "myapex_selfcontained",
3960 ],
3961 }
3962
3963
3964 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09003965 name: "libfoo",
3966 srcs: ["mytest.cpp"],
3967 stubs: {
3968 versions: ["1"],
3969 },
3970 system_shared_libs: [],
3971 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003972 apex_available: [
3973 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00003974 ],
3975 }
3976
3977 cc_library {
3978 name: "libbar",
3979 srcs: ["mytest.cpp"],
3980 stubs: {
3981 versions: ["1"],
3982 },
3983 system_shared_libs: [],
3984 stl: "none",
3985 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003986 "myapex_selfcontained",
3987 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003988 }
Spandan Das20fce2d2023-04-12 17:21:39 +00003989
Jooyung Hane1633032019-08-01 17:41:43 +09003990 `)
3991
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003992 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003993 var provideNativeLibs, requireNativeLibs []string
3994
Jooyung Hana0503a52023-08-23 13:12:50 +09003995 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003996 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3997 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003998 ensureListEmpty(t, provideNativeLibs)
3999 ensureListEmpty(t, requireNativeLibs)
4000
Jooyung Hana0503a52023-08-23 13:12:50 +09004001 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004002 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4003 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004004 ensureListEmpty(t, provideNativeLibs)
4005 ensureListContains(t, requireNativeLibs, "libfoo.so")
4006
Jooyung Hana0503a52023-08-23 13:12:50 +09004007 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004008 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4009 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004010 ensureListContains(t, provideNativeLibs, "libfoo.so")
4011 ensureListEmpty(t, requireNativeLibs)
4012
Jooyung Hana0503a52023-08-23 13:12:50 +09004013 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004014 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4015 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004016 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004017 ensureListEmpty(t, requireNativeLibs)
4018}
4019
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004020func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4021 ctx := testApex(t, `
4022 apex {
4023 name: "myapex",
4024 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004025 native_shared_libs: ["mylib"],
4026 updatable: false,
4027 }
4028
4029 apex_key {
4030 name: "myapex.key",
4031 public_key: "testkey.avbpubkey",
4032 private_key: "testkey.pem",
4033 }
4034
4035 cc_library {
4036 name: "mylib",
4037 srcs: ["mylib.cpp"],
4038 system_shared_libs: [],
4039 stl: "none",
4040 apex_available: [
4041 "//apex_available:platform",
4042 "myapex",
4043 ],
4044 }
4045 `, android.FixtureMergeEnv(map[string]string{
4046 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4047 }))
4048
Jooyung Hana0503a52023-08-23 13:12:50 +09004049 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004050 apexManifestRule := module.Rule("apexManifestRule")
4051 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4052}
4053
Vinh Tran8f5310f2022-10-07 18:16:47 -04004054func TestCompileMultilibProp(t *testing.T) {
4055 testCases := []struct {
4056 compileMultiLibProp string
4057 containedLibs []string
4058 notContainedLibs []string
4059 }{
4060 {
4061 containedLibs: []string{
4062 "image.apex/lib64/mylib.so",
4063 "image.apex/lib/mylib.so",
4064 },
4065 compileMultiLibProp: `compile_multilib: "both",`,
4066 },
4067 {
4068 containedLibs: []string{"image.apex/lib64/mylib.so"},
4069 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4070 compileMultiLibProp: `compile_multilib: "first",`,
4071 },
4072 {
4073 containedLibs: []string{"image.apex/lib64/mylib.so"},
4074 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4075 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4076 },
4077 {
4078 containedLibs: []string{"image.apex/lib64/mylib.so"},
4079 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4080 compileMultiLibProp: `compile_multilib: "64",`,
4081 },
4082 {
4083 containedLibs: []string{"image.apex/lib/mylib.so"},
4084 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4085 compileMultiLibProp: `compile_multilib: "32",`,
4086 },
4087 }
4088 for _, testCase := range testCases {
4089 ctx := testApex(t, fmt.Sprintf(`
4090 apex {
4091 name: "myapex",
4092 key: "myapex.key",
4093 %s
4094 native_shared_libs: ["mylib"],
4095 updatable: false,
4096 }
4097 apex_key {
4098 name: "myapex.key",
4099 public_key: "testkey.avbpubkey",
4100 private_key: "testkey.pem",
4101 }
4102 cc_library {
4103 name: "mylib",
4104 srcs: ["mylib.cpp"],
4105 apex_available: [
4106 "//apex_available:platform",
4107 "myapex",
4108 ],
4109 }
4110 `, testCase.compileMultiLibProp),
4111 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004112 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004113 apexRule := module.Rule("apexRule")
4114 copyCmds := apexRule.Args["copy_commands"]
4115 for _, containedLib := range testCase.containedLibs {
4116 ensureContains(t, copyCmds, containedLib)
4117 }
4118 for _, notContainedLib := range testCase.notContainedLibs {
4119 ensureNotContains(t, copyCmds, notContainedLib)
4120 }
4121 }
4122}
4123
Alex Light0851b882019-02-07 13:20:53 -08004124func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004125 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004126 apex {
4127 name: "myapex",
4128 key: "myapex.key",
4129 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004130 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004131 }
4132
4133 apex_key {
4134 name: "myapex.key",
4135 public_key: "testkey.avbpubkey",
4136 private_key: "testkey.pem",
4137 }
4138
4139 cc_library {
4140 name: "mylib_common",
4141 srcs: ["mylib.cpp"],
4142 system_shared_libs: [],
4143 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004144 apex_available: [
4145 "//apex_available:platform",
4146 "myapex",
4147 ],
Alex Light0851b882019-02-07 13:20:53 -08004148 }
4149 `)
4150
Jooyung Hana0503a52023-08-23 13:12:50 +09004151 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004152 apexRule := module.Rule("apexRule")
4153 copyCmds := apexRule.Args["copy_commands"]
4154
4155 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4156 t.Log("Apex was a test apex!")
4157 t.Fail()
4158 }
4159 // Ensure that main rule creates an output
4160 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4161
4162 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004163 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004164
4165 // Ensure that both direct and indirect deps are copied into apex
4166 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4167
Colin Cross7113d202019-11-20 16:39:12 -08004168 // Ensure that the platform variant ends with _shared
4169 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004170
Colin Cross56a83212020-09-15 18:30:11 -07004171 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004172 t.Log("Found mylib_common not in any apex!")
4173 t.Fail()
4174 }
4175}
4176
4177func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004178 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004179 apex_test {
4180 name: "myapex",
4181 key: "myapex.key",
4182 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004183 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004184 }
4185
4186 apex_key {
4187 name: "myapex.key",
4188 public_key: "testkey.avbpubkey",
4189 private_key: "testkey.pem",
4190 }
4191
4192 cc_library {
4193 name: "mylib_common_test",
4194 srcs: ["mylib.cpp"],
4195 system_shared_libs: [],
4196 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004197 // TODO: remove //apex_available:platform
4198 apex_available: [
4199 "//apex_available:platform",
4200 "myapex",
4201 ],
Alex Light0851b882019-02-07 13:20:53 -08004202 }
4203 `)
4204
Jooyung Hana0503a52023-08-23 13:12:50 +09004205 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004206 apexRule := module.Rule("apexRule")
4207 copyCmds := apexRule.Args["copy_commands"]
4208
4209 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4210 t.Log("Apex was not a test apex!")
4211 t.Fail()
4212 }
4213 // Ensure that main rule creates an output
4214 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4215
4216 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004217 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004218
4219 // Ensure that both direct and indirect deps are copied into apex
4220 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4221
Colin Cross7113d202019-11-20 16:39:12 -08004222 // Ensure that the platform variant ends with _shared
4223 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004224}
4225
Jooyung Han85707de2023-12-01 14:21:13 +09004226func TestLibzVendorIsntStable(t *testing.T) {
4227 ctx := testApex(t, `
4228 apex {
4229 name: "myapex",
4230 key: "myapex.key",
4231 updatable: false,
4232 binaries: ["mybin"],
4233 }
4234 apex {
4235 name: "myvendorapex",
4236 key: "myapex.key",
4237 file_contexts: "myvendorapex_file_contexts",
4238 vendor: true,
4239 updatable: false,
4240 binaries: ["mybin"],
4241 }
4242 apex_key {
4243 name: "myapex.key",
4244 public_key: "testkey.avbpubkey",
4245 private_key: "testkey.pem",
4246 }
4247 cc_binary {
4248 name: "mybin",
4249 vendor_available: true,
4250 system_shared_libs: [],
4251 stl: "none",
4252 shared_libs: ["libz"],
4253 apex_available: ["//apex_available:anyapex"],
4254 }
4255 cc_library {
4256 name: "libz",
4257 vendor_available: true,
4258 system_shared_libs: [],
4259 stl: "none",
4260 stubs: {
4261 versions: ["28", "30"],
4262 },
4263 target: {
4264 vendor: {
4265 no_stubs: true,
4266 },
4267 },
4268 }
4269 `, withFiles(map[string][]byte{
4270 "myvendorapex_file_contexts": nil,
4271 }))
4272
4273 // libz provides stubs for core variant.
4274 {
4275 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4276 "bin/mybin",
4277 })
4278 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4279 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4280 }
4281 // libz doesn't provide stubs for vendor variant.
4282 {
4283 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4284 "bin/mybin",
4285 "lib64/libz.so",
4286 })
4287 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4288 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4289 }
4290}
4291
Alex Light9670d332019-01-29 18:07:33 -08004292func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004293 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004294 apex {
4295 name: "myapex",
4296 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004297 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004298 multilib: {
4299 first: {
4300 native_shared_libs: ["mylib_common"],
4301 }
4302 },
4303 target: {
4304 android: {
4305 multilib: {
4306 first: {
4307 native_shared_libs: ["mylib"],
4308 }
4309 }
4310 },
4311 host: {
4312 multilib: {
4313 first: {
4314 native_shared_libs: ["mylib2"],
4315 }
4316 }
4317 }
4318 }
4319 }
4320
4321 apex_key {
4322 name: "myapex.key",
4323 public_key: "testkey.avbpubkey",
4324 private_key: "testkey.pem",
4325 }
4326
4327 cc_library {
4328 name: "mylib",
4329 srcs: ["mylib.cpp"],
4330 system_shared_libs: [],
4331 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004332 // TODO: remove //apex_available:platform
4333 apex_available: [
4334 "//apex_available:platform",
4335 "myapex",
4336 ],
Alex Light9670d332019-01-29 18:07:33 -08004337 }
4338
4339 cc_library {
4340 name: "mylib_common",
4341 srcs: ["mylib.cpp"],
4342 system_shared_libs: [],
4343 stl: "none",
4344 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004345 // TODO: remove //apex_available:platform
4346 apex_available: [
4347 "//apex_available:platform",
4348 "myapex",
4349 ],
Alex Light9670d332019-01-29 18:07:33 -08004350 }
4351
4352 cc_library {
4353 name: "mylib2",
4354 srcs: ["mylib.cpp"],
4355 system_shared_libs: [],
4356 stl: "none",
4357 compile_multilib: "first",
4358 }
4359 `)
4360
Jooyung Hana0503a52023-08-23 13:12:50 +09004361 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004362 copyCmds := apexRule.Args["copy_commands"]
4363
4364 // Ensure that main rule creates an output
4365 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4366
4367 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004368 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4369 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4370 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004371
4372 // Ensure that both direct and indirect deps are copied into apex
4373 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4374 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4375 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4376
Colin Cross7113d202019-11-20 16:39:12 -08004377 // Ensure that the platform variant ends with _shared
4378 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4379 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4380 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004381}
Jiyong Park04480cf2019-02-06 00:16:29 +09004382
Jiyong Park59140302020-12-14 18:44:04 +09004383func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004384 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004385 apex {
4386 name: "myapex",
4387 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004388 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004389 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004390 arch: {
4391 arm64: {
4392 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004393 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004394 },
4395 x86_64: {
4396 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004397 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004398 },
4399 }
4400 }
4401
4402 apex_key {
4403 name: "myapex.key",
4404 public_key: "testkey.avbpubkey",
4405 private_key: "testkey.pem",
4406 }
4407
4408 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004409 name: "mylib.generic",
4410 srcs: ["mylib.cpp"],
4411 system_shared_libs: [],
4412 stl: "none",
4413 // TODO: remove //apex_available:platform
4414 apex_available: [
4415 "//apex_available:platform",
4416 "myapex",
4417 ],
4418 }
4419
4420 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004421 name: "mylib.arm64",
4422 srcs: ["mylib.cpp"],
4423 system_shared_libs: [],
4424 stl: "none",
4425 // TODO: remove //apex_available:platform
4426 apex_available: [
4427 "//apex_available:platform",
4428 "myapex",
4429 ],
4430 }
4431
4432 cc_library {
4433 name: "mylib.x64",
4434 srcs: ["mylib.cpp"],
4435 system_shared_libs: [],
4436 stl: "none",
4437 // TODO: remove //apex_available:platform
4438 apex_available: [
4439 "//apex_available:platform",
4440 "myapex",
4441 ],
4442 }
4443 `)
4444
Jooyung Hana0503a52023-08-23 13:12:50 +09004445 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004446 copyCmds := apexRule.Args["copy_commands"]
4447
4448 // Ensure that apex variant is created for the direct dep
4449 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004450 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004451 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4452
4453 // Ensure that both direct and indirect deps are copied into apex
4454 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4455 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4456}
4457
Jiyong Park04480cf2019-02-06 00:16:29 +09004458func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004459 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004460 apex {
4461 name: "myapex",
4462 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004463 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004464 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004465 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004466 }
4467
4468 apex_key {
4469 name: "myapex.key",
4470 public_key: "testkey.avbpubkey",
4471 private_key: "testkey.pem",
4472 }
4473
4474 sh_binary {
4475 name: "myscript",
4476 src: "mylib.cpp",
4477 filename: "myscript.sh",
4478 sub_dir: "script",
4479 }
4480 `)
4481
Jooyung Hana0503a52023-08-23 13:12:50 +09004482 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004483 copyCmds := apexRule.Args["copy_commands"]
4484
4485 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4486}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004487
Jooyung Han91df2082019-11-20 01:49:42 +09004488func TestApexInVariousPartition(t *testing.T) {
4489 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004490 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004491 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004492 {"", "system"},
4493 {"product_specific: true", "product"},
4494 {"soc_specific: true", "vendor"},
4495 {"proprietary: true", "vendor"},
4496 {"vendor: true", "vendor"},
4497 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004498 }
4499 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004500 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004501 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004502 apex {
4503 name: "myapex",
4504 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004505 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004506 `+tc.propName+`
4507 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004508
Jooyung Han91df2082019-11-20 01:49:42 +09004509 apex_key {
4510 name: "myapex.key",
4511 public_key: "testkey.avbpubkey",
4512 private_key: "testkey.pem",
4513 }
4514 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004515
Jooyung Hana0503a52023-08-23 13:12:50 +09004516 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004517 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004518 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004519 if actual != expected {
4520 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4521 }
Jooyung Han91df2082019-11-20 01:49:42 +09004522 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004523 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004524}
Jiyong Park67882562019-03-21 01:11:21 +09004525
Jooyung Han580eb4f2020-06-24 19:33:06 +09004526func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004527 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004528 apex {
4529 name: "myapex",
4530 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004531 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004532 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004533
Jooyung Han580eb4f2020-06-24 19:33:06 +09004534 apex_key {
4535 name: "myapex.key",
4536 public_key: "testkey.avbpubkey",
4537 private_key: "testkey.pem",
4538 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004539 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004540 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004541 rule := module.Output("file_contexts")
4542 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4543}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004544
Jooyung Han580eb4f2020-06-24 19:33:06 +09004545func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004546 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004547 apex {
4548 name: "myapex",
4549 key: "myapex.key",
4550 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004551 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004552 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004553
Jooyung Han580eb4f2020-06-24 19:33:06 +09004554 apex_key {
4555 name: "myapex.key",
4556 public_key: "testkey.avbpubkey",
4557 private_key: "testkey.pem",
4558 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004559 `, withFiles(map[string][]byte{
4560 "my_own_file_contexts": nil,
4561 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004562}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004563
Jooyung Han580eb4f2020-06-24 19:33:06 +09004564func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004565 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004566 apex {
4567 name: "myapex",
4568 key: "myapex.key",
4569 product_specific: true,
4570 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004571 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004572 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004573
Jooyung Han580eb4f2020-06-24 19:33:06 +09004574 apex_key {
4575 name: "myapex.key",
4576 public_key: "testkey.avbpubkey",
4577 private_key: "testkey.pem",
4578 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004579 `)
4580
Colin Cross1c460562021-02-16 17:55:47 -08004581 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004582 apex {
4583 name: "myapex",
4584 key: "myapex.key",
4585 product_specific: true,
4586 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004587 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004588 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004589
Jooyung Han580eb4f2020-06-24 19:33:06 +09004590 apex_key {
4591 name: "myapex.key",
4592 public_key: "testkey.avbpubkey",
4593 private_key: "testkey.pem",
4594 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004595 `, withFiles(map[string][]byte{
4596 "product_specific_file_contexts": nil,
4597 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004598 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004599 rule := module.Output("file_contexts")
4600 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4601}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004602
Jooyung Han580eb4f2020-06-24 19:33:06 +09004603func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004604 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004605 apex {
4606 name: "myapex",
4607 key: "myapex.key",
4608 product_specific: true,
4609 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004610 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004611 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004612
Jooyung Han580eb4f2020-06-24 19:33:06 +09004613 apex_key {
4614 name: "myapex.key",
4615 public_key: "testkey.avbpubkey",
4616 private_key: "testkey.pem",
4617 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004618
Jooyung Han580eb4f2020-06-24 19:33:06 +09004619 filegroup {
4620 name: "my-file-contexts",
4621 srcs: ["product_specific_file_contexts"],
4622 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004623 `, withFiles(map[string][]byte{
4624 "product_specific_file_contexts": nil,
4625 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004626 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004627 rule := module.Output("file_contexts")
4628 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004629}
4630
Jiyong Park67882562019-03-21 01:11:21 +09004631func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004632 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004633 apex_key {
4634 name: "myapex.key",
4635 public_key: ":my.avbpubkey",
4636 private_key: ":my.pem",
4637 product_specific: true,
4638 }
4639
4640 filegroup {
4641 name: "my.avbpubkey",
4642 srcs: ["testkey2.avbpubkey"],
4643 }
4644
4645 filegroup {
4646 name: "my.pem",
4647 srcs: ["testkey2.pem"],
4648 }
4649 `)
4650
4651 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4652 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004653 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004654 if actual_pubkey != expected_pubkey {
4655 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4656 }
4657 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004658 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004659 if actual_privkey != expected_privkey {
4660 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4661 }
4662}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004663
4664func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004665 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004666 prebuilt_apex {
4667 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004668 arch: {
4669 arm64: {
4670 src: "myapex-arm64.apex",
4671 },
4672 arm: {
4673 src: "myapex-arm.apex",
4674 },
4675 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004676 }
4677 `)
4678
Wei Li340ee8e2022-03-18 17:33:24 -07004679 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4680 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004681
Jiyong Parkc95714e2019-03-29 14:23:10 +09004682 expectedInput := "myapex-arm64.apex"
4683 if prebuilt.inputApex.String() != expectedInput {
4684 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4685 }
Wei Li340ee8e2022-03-18 17:33:24 -07004686 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4687 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4688 rule := testingModule.Rule("genProvenanceMetaData")
4689 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4690 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4691 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4692 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004693
4694 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4695 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004696}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004697
Paul Duffinc0609c62021-03-01 17:27:16 +00004698func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004699 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004700 prebuilt_apex {
4701 name: "myapex",
4702 }
4703 `)
4704}
4705
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004706func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004707 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004708 prebuilt_apex {
4709 name: "myapex",
4710 src: "myapex-arm.apex",
4711 filename: "notmyapex.apex",
4712 }
4713 `)
4714
Wei Li340ee8e2022-03-18 17:33:24 -07004715 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4716 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004717
4718 expected := "notmyapex.apex"
4719 if p.installFilename != expected {
4720 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4721 }
Wei Li340ee8e2022-03-18 17:33:24 -07004722 rule := testingModule.Rule("genProvenanceMetaData")
4723 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4724 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4725 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4726 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004727}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004728
Samiul Islam7c02e262021-09-08 17:48:28 +01004729func TestApexSetFilenameOverride(t *testing.T) {
4730 testApex(t, `
4731 apex_set {
4732 name: "com.company.android.myapex",
4733 apex_name: "com.android.myapex",
4734 set: "company-myapex.apks",
4735 filename: "com.company.android.myapex.apex"
4736 }
4737 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4738
4739 testApex(t, `
4740 apex_set {
4741 name: "com.company.android.myapex",
4742 apex_name: "com.android.myapex",
4743 set: "company-myapex.apks",
4744 filename: "com.company.android.myapex.capex"
4745 }
4746 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4747
4748 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4749 apex_set {
4750 name: "com.company.android.myapex",
4751 apex_name: "com.android.myapex",
4752 set: "company-myapex.apks",
4753 filename: "some-random-suffix"
4754 }
4755 `)
4756}
4757
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004758func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004759 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004760 prebuilt_apex {
4761 name: "myapex.prebuilt",
4762 src: "myapex-arm.apex",
4763 overrides: [
4764 "myapex",
4765 ],
4766 }
4767 `)
4768
Wei Li340ee8e2022-03-18 17:33:24 -07004769 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4770 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004771
4772 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004773 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004774 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004775 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004776 }
Wei Li340ee8e2022-03-18 17:33:24 -07004777 rule := testingModule.Rule("genProvenanceMetaData")
4778 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4779 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4780 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4781 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004782}
4783
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004784func TestPrebuiltApexName(t *testing.T) {
4785 testApex(t, `
4786 prebuilt_apex {
4787 name: "com.company.android.myapex",
4788 apex_name: "com.android.myapex",
4789 src: "company-myapex-arm.apex",
4790 }
4791 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4792
4793 testApex(t, `
4794 apex_set {
4795 name: "com.company.android.myapex",
4796 apex_name: "com.android.myapex",
4797 set: "company-myapex.apks",
4798 }
4799 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4800}
4801
4802func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4803 _ = android.GroupFixturePreparers(
4804 java.PrepareForTestWithJavaDefaultModules,
4805 PrepareForTestWithApexBuildComponents,
4806 android.FixtureWithRootAndroidBp(`
4807 platform_bootclasspath {
4808 name: "platform-bootclasspath",
4809 fragments: [
4810 {
4811 apex: "com.android.art",
4812 module: "art-bootclasspath-fragment",
4813 },
4814 ],
4815 }
4816
4817 prebuilt_apex {
4818 name: "com.company.android.art",
4819 apex_name: "com.android.art",
4820 src: "com.company.android.art-arm.apex",
4821 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4822 }
4823
4824 prebuilt_bootclasspath_fragment {
4825 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004826 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004827 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004828 hidden_api: {
4829 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4830 metadata: "my-bootclasspath-fragment/metadata.csv",
4831 index: "my-bootclasspath-fragment/index.csv",
4832 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4833 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4834 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004835 }
4836
4837 java_import {
4838 name: "core-oj",
4839 jars: ["prebuilt.jar"],
4840 }
4841 `),
4842 ).RunTest(t)
4843}
4844
Spandan Das59a4a2b2024-01-09 21:35:56 +00004845// A minimal context object for use with DexJarBuildPath
4846type moduleErrorfTestCtx struct {
4847}
4848
4849func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4850}
4851
Paul Duffin092153d2021-01-26 11:42:39 +00004852// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4853// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004854func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004855 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004856
Paul Duffin89886cb2021-02-05 16:44:03 +00004857 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004858 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004859 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004860 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00004861 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004862 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004863 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00004864 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09004865 android.NormalizePathForTesting(dexJarBuildPath))
4866 }
4867
4868 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004869 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004870 // Make sure the import has been given the correct path to the dex jar.
4871 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4872 dexJarBuildPath := p.DexJarInstallPath()
4873 stem := android.RemoveOptionalPrebuiltPrefix(name)
4874 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4875 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4876 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004877 }
4878
Paul Duffin39853512021-02-26 11:09:39 +00004879 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004880 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004881 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004882 android.AssertArrayString(t, "Check if there is no source variant",
4883 []string{"android_common"},
4884 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004885 }
4886
4887 t.Run("prebuilt only", func(t *testing.T) {
4888 bp := `
4889 prebuilt_apex {
4890 name: "myapex",
4891 arch: {
4892 arm64: {
4893 src: "myapex-arm64.apex",
4894 },
4895 arm: {
4896 src: "myapex-arm.apex",
4897 },
4898 },
Paul Duffin39853512021-02-26 11:09:39 +00004899 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004900 }
4901
4902 java_import {
4903 name: "libfoo",
4904 jars: ["libfoo.jar"],
4905 }
Paul Duffin39853512021-02-26 11:09:39 +00004906
4907 java_sdk_library_import {
4908 name: "libbar",
4909 public: {
4910 jars: ["libbar.jar"],
4911 },
4912 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004913 `
4914
4915 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4916 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4917
Spandan Das3576e762024-01-03 18:57:03 +00004918 deapexerName := deapexerModuleName("prebuilt_myapex")
4919 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01004920
Paul Duffinf6932af2021-02-26 18:21:56 +00004921 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004922 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004923 rule := deapexer.Rule("deapexer")
4924 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4925 t.Errorf("expected: %q, found: %q", expected, actual)
4926 }
4927
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004928 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004929 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004930 rule = prebuiltApex.Rule("android/soong/android.Cp")
4931 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4932 t.Errorf("expected: %q, found: %q", expected, actual)
4933 }
4934
Paul Duffin89886cb2021-02-05 16:44:03 +00004935 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004936 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004937
4938 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004939 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004940 })
4941
4942 t.Run("prebuilt with source preferred", func(t *testing.T) {
4943
4944 bp := `
4945 prebuilt_apex {
4946 name: "myapex",
4947 arch: {
4948 arm64: {
4949 src: "myapex-arm64.apex",
4950 },
4951 arm: {
4952 src: "myapex-arm.apex",
4953 },
4954 },
Paul Duffin39853512021-02-26 11:09:39 +00004955 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004956 }
4957
4958 java_import {
4959 name: "libfoo",
4960 jars: ["libfoo.jar"],
4961 }
4962
4963 java_library {
4964 name: "libfoo",
4965 }
Paul Duffin39853512021-02-26 11:09:39 +00004966
4967 java_sdk_library_import {
4968 name: "libbar",
4969 public: {
4970 jars: ["libbar.jar"],
4971 },
4972 }
4973
4974 java_sdk_library {
4975 name: "libbar",
4976 srcs: ["foo/bar/MyClass.java"],
4977 unsafe_ignore_missing_latest_api: true,
4978 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004979 `
4980
4981 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4982 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4983
Paul Duffin89886cb2021-02-05 16:44:03 +00004984 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004985 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004986 ensureNoSourceVariant(t, ctx, "libfoo")
4987
4988 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004989 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004990 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004991 })
4992
4993 t.Run("prebuilt preferred with source", func(t *testing.T) {
4994 bp := `
4995 prebuilt_apex {
4996 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004997 arch: {
4998 arm64: {
4999 src: "myapex-arm64.apex",
5000 },
5001 arm: {
5002 src: "myapex-arm.apex",
5003 },
5004 },
Paul Duffin39853512021-02-26 11:09:39 +00005005 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005006 }
5007
5008 java_import {
5009 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005010 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005011 jars: ["libfoo.jar"],
5012 }
5013
5014 java_library {
5015 name: "libfoo",
5016 }
Paul Duffin39853512021-02-26 11:09:39 +00005017
5018 java_sdk_library_import {
5019 name: "libbar",
5020 prefer: true,
5021 public: {
5022 jars: ["libbar.jar"],
5023 },
5024 }
5025
5026 java_sdk_library {
5027 name: "libbar",
5028 srcs: ["foo/bar/MyClass.java"],
5029 unsafe_ignore_missing_latest_api: true,
5030 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005031 `
5032
5033 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5034 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5035
Paul Duffin89886cb2021-02-05 16:44:03 +00005036 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005037 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005038 ensureNoSourceVariant(t, ctx, "libfoo")
5039
5040 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005041 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005042 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005043 })
5044}
5045
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005046func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005047 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005048 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005049 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5050 // is disabled.
5051 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005052
5053 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5054 // file creation.
5055 java.FixtureConfigureBootJars("platform:foo"),
5056 android.FixtureModifyMockFS(func(fs android.MockFS) {
5057 fs["platform/Android.bp"] = []byte(`
5058 java_library {
5059 name: "foo",
5060 srcs: ["Test.java"],
5061 compile_dex: true,
5062 }
5063 `)
5064 fs["platform/Test.java"] = nil
5065 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005066 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005067
Paul Duffin37856732021-02-26 14:24:15 +00005068 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5069 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005070 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005071 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005072 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005073 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005074 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005075 foundLibfooJar = true
5076 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005077 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005078 }
5079 }
5080 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005081 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 +00005082 }
5083 }
5084
Paul Duffin40a3f652021-07-19 13:11:24 +01005085 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005086 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005087 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005088 var rule android.TestingBuildParams
5089
5090 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5091 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005092 }
5093
Paul Duffin40a3f652021-07-19 13:11:24 +01005094 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5095 t.Helper()
5096 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5097 var rule android.TestingBuildParams
5098
5099 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5100 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5101 }
5102
Paul Duffin89f570a2021-06-16 01:42:33 +01005103 fragment := java.ApexVariantReference{
5104 Apex: proptools.StringPtr("myapex"),
5105 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5106 }
5107
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005108 t.Run("prebuilt only", func(t *testing.T) {
5109 bp := `
5110 prebuilt_apex {
5111 name: "myapex",
5112 arch: {
5113 arm64: {
5114 src: "myapex-arm64.apex",
5115 },
5116 arm: {
5117 src: "myapex-arm.apex",
5118 },
5119 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005120 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5121 }
5122
5123 prebuilt_bootclasspath_fragment {
5124 name: "my-bootclasspath-fragment",
5125 contents: ["libfoo", "libbar"],
5126 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005127 hidden_api: {
5128 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5129 metadata: "my-bootclasspath-fragment/metadata.csv",
5130 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005131 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5132 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5133 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005134 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005135 }
5136
5137 java_import {
5138 name: "libfoo",
5139 jars: ["libfoo.jar"],
5140 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005141 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005142 }
Paul Duffin37856732021-02-26 14:24:15 +00005143
5144 java_sdk_library_import {
5145 name: "libbar",
5146 public: {
5147 jars: ["libbar.jar"],
5148 },
5149 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005150 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005151 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005152 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005153 `
5154
Paul Duffin89f570a2021-06-16 01:42:33 +01005155 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005156 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5157 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005158
Paul Duffin537ea3d2021-05-14 10:38:00 +01005159 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005160 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005161 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005162 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005163 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005164 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 +01005165 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005166 })
5167
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005168 t.Run("apex_set only", func(t *testing.T) {
5169 bp := `
5170 apex_set {
5171 name: "myapex",
5172 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005173 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005174 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005175 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5176 }
5177
5178 java_import {
5179 name: "myjavalib",
5180 jars: ["myjavalib.jar"],
5181 apex_available: ["myapex"],
5182 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005183 }
5184
5185 prebuilt_bootclasspath_fragment {
5186 name: "my-bootclasspath-fragment",
5187 contents: ["libfoo", "libbar"],
5188 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005189 hidden_api: {
5190 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5191 metadata: "my-bootclasspath-fragment/metadata.csv",
5192 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005193 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5194 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5195 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005196 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005197 }
5198
Liz Kammer2dc72442023-04-20 10:10:48 -04005199 prebuilt_systemserverclasspath_fragment {
5200 name: "my-systemserverclasspath-fragment",
5201 contents: ["libbaz"],
5202 apex_available: ["myapex"],
5203 }
5204
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005205 java_import {
5206 name: "libfoo",
5207 jars: ["libfoo.jar"],
5208 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005209 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005210 }
5211
5212 java_sdk_library_import {
5213 name: "libbar",
5214 public: {
5215 jars: ["libbar.jar"],
5216 },
5217 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005218 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005219 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005220 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005221
5222 java_sdk_library_import {
5223 name: "libbaz",
5224 public: {
5225 jars: ["libbaz.jar"],
5226 },
5227 apex_available: ["myapex"],
5228 shared_library: false,
5229 permitted_packages: ["baz"],
5230 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005231 `
5232
Paul Duffin89f570a2021-06-16 01:42:33 +01005233 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005234 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5235 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005236
Paul Duffin537ea3d2021-05-14 10:38:00 +01005237 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005238 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005239 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005240 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005241 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005242 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 +01005243 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005244
5245 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5246
5247 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005248 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005249 "myjavalib.myapex",
5250 "libfoo.myapex",
5251 "libbar.myapex",
5252 "libbaz.myapex",
5253 }
5254 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5255 for i, e := range mkEntries {
5256 g := e.OverrideName
5257 if w := overrideNames[i]; w != g {
5258 t.Errorf("Expected override name %q, got %q", w, g)
5259 }
5260 }
5261
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005262 })
5263
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005264 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5265 bp := `
5266 prebuilt_apex {
5267 name: "myapex",
5268 arch: {
5269 arm64: {
5270 src: "myapex-arm64.apex",
5271 },
5272 arm: {
5273 src: "myapex-arm.apex",
5274 },
5275 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005276 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5277 }
5278
5279 prebuilt_bootclasspath_fragment {
5280 name: "my-bootclasspath-fragment",
5281 contents: ["libfoo", "libbar"],
5282 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005283 hidden_api: {
5284 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5285 metadata: "my-bootclasspath-fragment/metadata.csv",
5286 index: "my-bootclasspath-fragment/index.csv",
5287 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5288 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5289 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005290 }
5291
5292 java_import {
5293 name: "libfoo",
5294 jars: ["libfoo.jar"],
5295 apex_available: ["myapex"],
5296 }
5297
5298 java_library {
5299 name: "libfoo",
5300 srcs: ["foo/bar/MyClass.java"],
5301 apex_available: ["myapex"],
5302 }
Paul Duffin37856732021-02-26 14:24:15 +00005303
5304 java_sdk_library_import {
5305 name: "libbar",
5306 public: {
5307 jars: ["libbar.jar"],
5308 },
5309 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005310 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005311 }
5312
5313 java_sdk_library {
5314 name: "libbar",
5315 srcs: ["foo/bar/MyClass.java"],
5316 unsafe_ignore_missing_latest_api: true,
5317 apex_available: ["myapex"],
5318 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005319 `
5320
5321 // In this test the source (java_library) libfoo is active since the
5322 // prebuilt (java_import) defaults to prefer:false. However the
5323 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5324 // find the dex boot jar in it. We either need to disable the source libfoo
5325 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005326 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005327 // dexbootjar check is skipped if AllowMissingDependencies is true
5328 preparerAllowMissingDeps := android.GroupFixturePreparers(
5329 preparer,
5330 android.PrepareForTestWithAllowMissingDependencies,
5331 )
5332 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005333 })
5334
5335 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5336 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005337 apex {
5338 name: "myapex",
5339 key: "myapex.key",
5340 updatable: false,
5341 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5342 }
5343
5344 apex_key {
5345 name: "myapex.key",
5346 public_key: "testkey.avbpubkey",
5347 private_key: "testkey.pem",
5348 }
5349
5350 bootclasspath_fragment {
5351 name: "my-bootclasspath-fragment",
5352 contents: ["libfoo", "libbar"],
5353 apex_available: ["myapex"],
5354 hidden_api: {
5355 split_packages: ["*"],
5356 },
5357 }
5358
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005359 prebuilt_apex {
5360 name: "myapex",
5361 arch: {
5362 arm64: {
5363 src: "myapex-arm64.apex",
5364 },
5365 arm: {
5366 src: "myapex-arm.apex",
5367 },
5368 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005369 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5370 }
5371
5372 prebuilt_bootclasspath_fragment {
5373 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005374 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005375 contents: ["libfoo", "libbar"],
5376 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005377 hidden_api: {
5378 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5379 metadata: "my-bootclasspath-fragment/metadata.csv",
5380 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005381 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5382 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5383 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005384 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005385 }
5386
5387 java_import {
5388 name: "libfoo",
5389 prefer: true,
5390 jars: ["libfoo.jar"],
5391 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005392 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005393 }
5394
5395 java_library {
5396 name: "libfoo",
5397 srcs: ["foo/bar/MyClass.java"],
5398 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005399 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005400 }
Paul Duffin37856732021-02-26 14:24:15 +00005401
5402 java_sdk_library_import {
5403 name: "libbar",
5404 prefer: true,
5405 public: {
5406 jars: ["libbar.jar"],
5407 },
5408 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005409 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005410 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005411 }
5412
5413 java_sdk_library {
5414 name: "libbar",
5415 srcs: ["foo/bar/MyClass.java"],
5416 unsafe_ignore_missing_latest_api: true,
5417 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005418 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005419 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005420 `
5421
Paul Duffin89f570a2021-06-16 01:42:33 +01005422 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005423 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5424 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005425
Paul Duffin537ea3d2021-05-14 10:38:00 +01005426 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005427 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005428 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005429 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005430 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005431 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 +01005432 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005433 })
5434
5435 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5436 bp := `
5437 apex {
5438 name: "myapex",
5439 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005440 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005441 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005442 }
5443
5444 apex_key {
5445 name: "myapex.key",
5446 public_key: "testkey.avbpubkey",
5447 private_key: "testkey.pem",
5448 }
5449
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005450 bootclasspath_fragment {
5451 name: "my-bootclasspath-fragment",
5452 contents: ["libfoo", "libbar"],
5453 apex_available: ["myapex"],
5454 hidden_api: {
5455 split_packages: ["*"],
5456 },
5457 }
5458
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459 prebuilt_apex {
5460 name: "myapex",
5461 arch: {
5462 arm64: {
5463 src: "myapex-arm64.apex",
5464 },
5465 arm: {
5466 src: "myapex-arm.apex",
5467 },
5468 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005469 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5470 }
5471
5472 prebuilt_bootclasspath_fragment {
5473 name: "my-bootclasspath-fragment",
5474 contents: ["libfoo", "libbar"],
5475 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005476 hidden_api: {
5477 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5478 metadata: "my-bootclasspath-fragment/metadata.csv",
5479 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005480 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5481 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5482 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005483 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 }
5485
5486 java_import {
5487 name: "libfoo",
5488 jars: ["libfoo.jar"],
5489 apex_available: ["myapex"],
5490 }
5491
5492 java_library {
5493 name: "libfoo",
5494 srcs: ["foo/bar/MyClass.java"],
5495 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005496 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005497 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005498 }
Paul Duffin37856732021-02-26 14:24:15 +00005499
5500 java_sdk_library_import {
5501 name: "libbar",
5502 public: {
5503 jars: ["libbar.jar"],
5504 },
5505 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005506 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005507 }
5508
5509 java_sdk_library {
5510 name: "libbar",
5511 srcs: ["foo/bar/MyClass.java"],
5512 unsafe_ignore_missing_latest_api: true,
5513 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005514 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005515 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005516 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005517 `
5518
Paul Duffin89f570a2021-06-16 01:42:33 +01005519 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005520 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5521 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 +00005522
Paul Duffin537ea3d2021-05-14 10:38:00 +01005523 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005524 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005525 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5526 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005527 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5528 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 +01005529 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005530 })
5531
5532 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5533 bp := `
5534 apex {
5535 name: "myapex",
5536 enabled: false,
5537 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005538 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005539 }
5540
5541 apex_key {
5542 name: "myapex.key",
5543 public_key: "testkey.avbpubkey",
5544 private_key: "testkey.pem",
5545 }
5546
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005547 bootclasspath_fragment {
5548 name: "my-bootclasspath-fragment",
5549 enabled: false,
5550 contents: ["libfoo", "libbar"],
5551 apex_available: ["myapex"],
5552 hidden_api: {
5553 split_packages: ["*"],
5554 },
5555 }
5556
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005557 prebuilt_apex {
5558 name: "myapex",
5559 arch: {
5560 arm64: {
5561 src: "myapex-arm64.apex",
5562 },
5563 arm: {
5564 src: "myapex-arm.apex",
5565 },
5566 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005567 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5568 }
5569
5570 prebuilt_bootclasspath_fragment {
5571 name: "my-bootclasspath-fragment",
5572 contents: ["libfoo", "libbar"],
5573 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005574 hidden_api: {
5575 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5576 metadata: "my-bootclasspath-fragment/metadata.csv",
5577 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005578 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5579 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5580 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005581 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005582 }
5583
5584 java_import {
5585 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005586 jars: ["libfoo.jar"],
5587 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005588 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005589 }
5590
5591 java_library {
5592 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005593 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005594 srcs: ["foo/bar/MyClass.java"],
5595 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005596 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005597 }
Paul Duffin37856732021-02-26 14:24:15 +00005598
5599 java_sdk_library_import {
5600 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005601 public: {
5602 jars: ["libbar.jar"],
5603 },
5604 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005605 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005606 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005607 }
5608
5609 java_sdk_library {
5610 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005611 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005612 srcs: ["foo/bar/MyClass.java"],
5613 unsafe_ignore_missing_latest_api: true,
5614 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005615 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005616 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005617 `
Cole Fausta963b942024-04-11 17:43:00 -07005618 // This test disables libbar, which causes the ComponentDepsMutator to add
5619 // deps on libbar.stubs and other sub-modules that don't exist. We can
5620 // enable AllowMissingDependencies to work around that, but enabling that
5621 // causes extra checks for missing source files to dex_bootjars, so add those
5622 // to the mock fs as well.
5623 preparer2 := android.GroupFixturePreparers(
5624 preparer,
5625 android.PrepareForTestWithAllowMissingDependencies,
5626 android.FixtureMergeMockFs(map[string][]byte{
5627 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5628 "frameworks/base/config/boot-profile.txt": nil,
5629 }),
5630 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005631
Cole Fausta963b942024-04-11 17:43:00 -07005632 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005633 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5634 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005635
Paul Duffin537ea3d2021-05-14 10:38:00 +01005636 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005637 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005638 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005639 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005640 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005641 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 +01005642 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005643 })
Spandan Das3a392012024-01-17 18:26:27 +00005644
Spandan Dasf2c10572024-02-27 04:49:52 +00005645 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005646 bp := `
5647 // Source
5648 apex {
5649 name: "myapex",
5650 enabled: false,
5651 key: "myapex.key",
5652 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5653 }
5654
5655 apex_key {
5656 name: "myapex.key",
5657 public_key: "testkey.avbpubkey",
5658 private_key: "testkey.pem",
5659 }
5660
5661 // Prebuilt
5662 prebuilt_apex {
5663 name: "myapex.v1",
5664 source_apex_name: "myapex",
5665 arch: {
5666 arm64: {
5667 src: "myapex-arm64.apex",
5668 },
5669 arm: {
5670 src: "myapex-arm.apex",
5671 },
5672 },
5673 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5674 prefer: true,
5675 }
5676 prebuilt_apex {
5677 name: "myapex.v2",
5678 source_apex_name: "myapex",
5679 arch: {
5680 arm64: {
5681 src: "myapex-arm64.apex",
5682 },
5683 arm: {
5684 src: "myapex-arm.apex",
5685 },
5686 },
5687 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5688 prefer: true,
5689 }
5690
5691 prebuilt_bootclasspath_fragment {
5692 name: "my-bootclasspath-fragment",
5693 contents: ["libfoo", "libbar"],
5694 apex_available: ["myapex"],
5695 hidden_api: {
5696 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5697 metadata: "my-bootclasspath-fragment/metadata.csv",
5698 index: "my-bootclasspath-fragment/index.csv",
5699 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5700 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5701 },
5702 prefer: true,
5703 }
5704
5705 java_import {
5706 name: "libfoo",
5707 jars: ["libfoo.jar"],
5708 apex_available: ["myapex"],
5709 prefer: true,
5710 }
5711 java_import {
5712 name: "libbar",
5713 jars: ["libbar.jar"],
5714 apex_available: ["myapex"],
5715 prefer: true,
5716 }
5717 `
5718
Spandan Dasf2c10572024-02-27 04:49:52 +00005719 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 +00005720 })
5721
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005722}
5723
Roland Levillain630846d2019-06-26 12:48:34 +01005724func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005725 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005726 apex_test {
5727 name: "myapex",
5728 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005729 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005730 tests: [
5731 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005732 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005733 ],
5734 }
5735
5736 apex_key {
5737 name: "myapex.key",
5738 public_key: "testkey.avbpubkey",
5739 private_key: "testkey.pem",
5740 }
5741
Liz Kammer1c14a212020-05-12 15:26:55 -07005742 filegroup {
5743 name: "fg",
5744 srcs: [
5745 "baz",
5746 "bar/baz"
5747 ],
5748 }
5749
Roland Levillain630846d2019-06-26 12:48:34 +01005750 cc_test {
5751 name: "mytest",
5752 gtest: false,
5753 srcs: ["mytest.cpp"],
5754 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005755 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005756 system_shared_libs: [],
5757 static_executable: true,
5758 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005759 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005760 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005761
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005762 cc_library {
5763 name: "mylib",
5764 srcs: ["mylib.cpp"],
5765 system_shared_libs: [],
5766 stl: "none",
5767 }
5768
Liz Kammer5bd365f2020-05-27 15:15:11 -07005769 filegroup {
5770 name: "fg2",
5771 srcs: [
5772 "testdata/baz"
5773 ],
5774 }
5775
Roland Levillain9b5fde92019-06-28 15:41:19 +01005776 cc_test {
5777 name: "mytests",
5778 gtest: false,
5779 srcs: [
5780 "mytest1.cpp",
5781 "mytest2.cpp",
5782 "mytest3.cpp",
5783 ],
5784 test_per_src: true,
5785 relative_install_path: "test",
5786 system_shared_libs: [],
5787 static_executable: true,
5788 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005789 data: [
5790 ":fg",
5791 ":fg2",
5792 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005793 }
Roland Levillain630846d2019-06-26 12:48:34 +01005794 `)
5795
Jooyung Hana0503a52023-08-23 13:12:50 +09005796 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005797 copyCmds := apexRule.Args["copy_commands"]
5798
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005799 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005800 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005801 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005802
Liz Kammer1c14a212020-05-12 15:26:55 -07005803 //Ensure that test data are copied into apex.
5804 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5805 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5806
Roland Levillain9b5fde92019-06-28 15:41:19 +01005807 // Ensure that test deps built with `test_per_src` are copied into apex.
5808 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5809 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5810 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005811
5812 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005813 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005814 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005815 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005816 prefix := "TARGET_"
5817 var builder strings.Builder
5818 data.Custom(&builder, name, prefix, "", data)
5819 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005820 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5821 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5822 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5823 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005824 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005825}
5826
Jooyung Hand48f3c32019-08-23 11:18:57 +09005827func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5828 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5829 apex {
5830 name: "myapex",
5831 key: "myapex.key",
5832 native_shared_libs: ["libfoo"],
5833 }
5834
5835 apex_key {
5836 name: "myapex.key",
5837 public_key: "testkey.avbpubkey",
5838 private_key: "testkey.pem",
5839 }
5840
5841 cc_library {
5842 name: "libfoo",
5843 stl: "none",
5844 system_shared_libs: [],
5845 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005846 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005847 }
5848 `)
5849 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5850 apex {
5851 name: "myapex",
5852 key: "myapex.key",
5853 java_libs: ["myjar"],
5854 }
5855
5856 apex_key {
5857 name: "myapex.key",
5858 public_key: "testkey.avbpubkey",
5859 private_key: "testkey.pem",
5860 }
5861
5862 java_library {
5863 name: "myjar",
5864 srcs: ["foo/bar/MyClass.java"],
5865 sdk_version: "none",
5866 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005867 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005868 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005869 }
5870 `)
5871}
5872
Bill Peckhama41a6962021-01-11 10:58:54 -08005873func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005874 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005875 apex {
5876 name: "myapex",
5877 key: "myapex.key",
5878 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005879 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005880 }
5881
5882 apex_key {
5883 name: "myapex.key",
5884 public_key: "testkey.avbpubkey",
5885 private_key: "testkey.pem",
5886 }
5887
5888 java_import {
5889 name: "myjavaimport",
5890 apex_available: ["myapex"],
5891 jars: ["my.jar"],
5892 compile_dex: true,
5893 }
5894 `)
5895
Jooyung Hana0503a52023-08-23 13:12:50 +09005896 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005897 apexRule := module.Rule("apexRule")
5898 copyCmds := apexRule.Args["copy_commands"]
5899 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5900}
5901
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005902func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005903 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005904 apex {
5905 name: "myapex",
5906 key: "myapex.key",
5907 apps: [
5908 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005909 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005910 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005911 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005912 }
5913
5914 apex_key {
5915 name: "myapex.key",
5916 public_key: "testkey.avbpubkey",
5917 private_key: "testkey.pem",
5918 }
5919
5920 android_app {
5921 name: "AppFoo",
5922 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005923 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005924 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005925 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005926 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005927 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005928 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005929 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005930
5931 android_app {
5932 name: "AppFooPriv",
5933 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005934 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005935 system_modules: "none",
5936 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005937 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005938 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005939 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005940 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005941
5942 cc_library_shared {
5943 name: "libjni",
5944 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005945 shared_libs: ["libfoo"],
5946 stl: "none",
5947 system_shared_libs: [],
5948 apex_available: [ "myapex" ],
5949 sdk_version: "current",
5950 }
5951
5952 cc_library_shared {
5953 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005954 stl: "none",
5955 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005956 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005957 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005958 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005959 `)
5960
Jooyung Hana0503a52023-08-23 13:12:50 +09005961 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005962 apexRule := module.Rule("apexRule")
5963 copyCmds := apexRule.Args["copy_commands"]
5964
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005965 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5966 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005967 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005968
Colin Crossaede88c2020-08-11 12:17:01 -07005969 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005970 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005971 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005972 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005973 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005974 // JNI libraries including transitive deps are
5975 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005976 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005977 // ... embedded inside APK (jnilibs.zip)
5978 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5979 // ... and not directly inside the APEX
5980 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5981 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005982
5983 apexBundle := module.Module().(*apexBundle)
5984 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5985 var builder strings.Builder
5986 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5987 androidMk := builder.String()
5988 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5989 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5990 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5991 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5992 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5993 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 +01005994}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005995
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005996func TestApexWithAppImportBuildId(t *testing.T) {
5997 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5998 for _, id := range invalidBuildIds {
5999 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6000 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6001 variables.BuildId = proptools.StringPtr(id)
6002 })
6003 testApexError(t, message, `apex {
6004 name: "myapex",
6005 key: "myapex.key",
6006 apps: ["AppFooPrebuilt"],
6007 updatable: false,
6008 }
6009
6010 apex_key {
6011 name: "myapex.key",
6012 public_key: "testkey.avbpubkey",
6013 private_key: "testkey.pem",
6014 }
6015
6016 android_app_import {
6017 name: "AppFooPrebuilt",
6018 apk: "PrebuiltAppFoo.apk",
6019 presigned: true,
6020 apex_available: ["myapex"],
6021 }
6022 `, fixture)
6023 }
6024}
6025
Dario Frenicde2a032019-10-27 00:29:22 +01006026func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006027 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006028 apex {
6029 name: "myapex",
6030 key: "myapex.key",
6031 apps: [
6032 "AppFooPrebuilt",
6033 "AppFooPrivPrebuilt",
6034 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006035 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006036 }
6037
6038 apex_key {
6039 name: "myapex.key",
6040 public_key: "testkey.avbpubkey",
6041 private_key: "testkey.pem",
6042 }
6043
6044 android_app_import {
6045 name: "AppFooPrebuilt",
6046 apk: "PrebuiltAppFoo.apk",
6047 presigned: true,
6048 dex_preopt: {
6049 enabled: false,
6050 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006051 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006052 }
6053
6054 android_app_import {
6055 name: "AppFooPrivPrebuilt",
6056 apk: "PrebuiltAppFooPriv.apk",
6057 privileged: true,
6058 presigned: true,
6059 dex_preopt: {
6060 enabled: false,
6061 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006062 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006063 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006064 }
6065 `)
6066
Jooyung Hana0503a52023-08-23 13:12:50 +09006067 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006068 apexRule := module.Rule("apexRule")
6069 copyCmds := apexRule.Args["copy_commands"]
6070
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006071 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6072 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006073}
6074
6075func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006076 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006077 apex {
6078 name: "myapex",
6079 key: "myapex.key",
6080 apps: [
6081 "AppFoo",
6082 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006083 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006084 }
6085
6086 apex_key {
6087 name: "myapex.key",
6088 public_key: "testkey.avbpubkey",
6089 private_key: "testkey.pem",
6090 }
6091
6092 android_app {
6093 name: "AppFoo",
6094 srcs: ["foo/bar/MyClass.java"],
6095 sdk_version: "none",
6096 system_modules: "none",
6097 apex_available: [ "myapex" ],
6098 }
6099
6100 android_app_import {
6101 name: "AppFoo",
6102 apk: "AppFooPrebuilt.apk",
6103 filename: "AppFooPrebuilt.apk",
6104 presigned: true,
6105 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006106 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006107 }
6108 `, withFiles(map[string][]byte{
6109 "AppFooPrebuilt.apk": nil,
6110 }))
6111
Jooyung Hana0503a52023-08-23 13:12:50 +09006112 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006113 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006114 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006115}
6116
Dario Freni6f3937c2019-12-20 22:58:03 +00006117func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006118 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 apps: [
6123 "TesterHelpAppFoo",
6124 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006125 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006126 }
6127
6128 apex_key {
6129 name: "myapex.key",
6130 public_key: "testkey.avbpubkey",
6131 private_key: "testkey.pem",
6132 }
6133
6134 android_test_helper_app {
6135 name: "TesterHelpAppFoo",
6136 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006137 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006138 }
6139
6140 `)
6141
Jooyung Hana0503a52023-08-23 13:12:50 +09006142 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006143 apexRule := module.Rule("apexRule")
6144 copyCmds := apexRule.Args["copy_commands"]
6145
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006146 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006147}
6148
Jooyung Han18020ea2019-11-13 10:50:48 +09006149func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6150 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006151 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006152 apex {
6153 name: "myapex",
6154 key: "myapex.key",
6155 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006156 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006157 }
6158
6159 apex_key {
6160 name: "myapex.key",
6161 public_key: "testkey.avbpubkey",
6162 private_key: "testkey.pem",
6163 }
6164
6165 apex {
6166 name: "otherapex",
6167 key: "myapex.key",
6168 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006169 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006170 }
6171
6172 cc_defaults {
6173 name: "libfoo-defaults",
6174 apex_available: ["otherapex"],
6175 }
6176
6177 cc_library {
6178 name: "libfoo",
6179 defaults: ["libfoo-defaults"],
6180 stl: "none",
6181 system_shared_libs: [],
6182 }`)
6183}
6184
Paul Duffine52e66f2020-03-30 17:54:29 +01006185func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006186 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006187 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006188 apex {
6189 name: "myapex",
6190 key: "myapex.key",
6191 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006192 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006193 }
6194
6195 apex_key {
6196 name: "myapex.key",
6197 public_key: "testkey.avbpubkey",
6198 private_key: "testkey.pem",
6199 }
6200
6201 apex {
6202 name: "otherapex",
6203 key: "otherapex.key",
6204 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006205 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006206 }
6207
6208 apex_key {
6209 name: "otherapex.key",
6210 public_key: "testkey.avbpubkey",
6211 private_key: "testkey.pem",
6212 }
6213
6214 cc_library {
6215 name: "libfoo",
6216 stl: "none",
6217 system_shared_libs: [],
6218 apex_available: ["otherapex"],
6219 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006220}
Jiyong Park127b40b2019-09-30 16:04:35 +09006221
Paul Duffine52e66f2020-03-30 17:54:29 +01006222func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006223 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006224 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006225.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006226.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006227.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006228.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006229.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006230.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006231 apex {
6232 name: "myapex",
6233 key: "myapex.key",
6234 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006235 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006236 }
6237
6238 apex_key {
6239 name: "myapex.key",
6240 public_key: "testkey.avbpubkey",
6241 private_key: "testkey.pem",
6242 }
6243
Jiyong Park127b40b2019-09-30 16:04:35 +09006244 cc_library {
6245 name: "libfoo",
6246 stl: "none",
6247 shared_libs: ["libbar"],
6248 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006249 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006250 }
6251
6252 cc_library {
6253 name: "libbar",
6254 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006255 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006256 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006257 apex_available: ["myapex"],
6258 }
6259
6260 cc_library {
6261 name: "libbaz",
6262 stl: "none",
6263 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006264 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006265}
Jiyong Park127b40b2019-09-30 16:04:35 +09006266
Liz Kammer5f108fa2023-05-11 14:33:17 -04006267func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6268 testApex(t, `
6269 apex {
6270 name: "myapex",
6271 key: "myapex.key",
6272 native_shared_libs: ["libfoo"],
6273 updatable: false,
6274 }
6275
6276 apex_key {
6277 name: "myapex.key",
6278 public_key: "testkey.avbpubkey",
6279 private_key: "testkey.pem",
6280 }
6281
6282 cc_library {
6283 name: "libfoo",
6284 stl: "none",
6285 static_libs: ["libbar"],
6286 system_shared_libs: [],
6287 apex_available: ["myapex"],
6288 }
6289
6290 cc_library {
6291 name: "libbar",
6292 stl: "none",
6293 shared_libs: ["libbaz"],
6294 system_shared_libs: [],
6295 apex_available: ["myapex"],
6296 }
6297
6298 cc_library {
6299 name: "libbaz",
6300 stl: "none",
6301 system_shared_libs: [],
6302 }`)
6303
6304 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6305 apex {
6306 name: "myapex",
6307 key: "myapex.key",
6308 native_shared_libs: ["libfoo"],
6309 updatable: false,
6310 }
6311
6312 apex_key {
6313 name: "myapex.key",
6314 public_key: "testkey.avbpubkey",
6315 private_key: "testkey.pem",
6316 }
6317
6318 cc_library {
6319 name: "libfoo",
6320 stl: "none",
6321 static_libs: ["libbar"],
6322 system_shared_libs: [],
6323 apex_available: ["myapex"],
6324 }
6325
6326 cc_library {
6327 name: "libbar",
6328 stl: "none",
6329 system_shared_libs: [],
6330 }`)
6331}
6332
Paul Duffine52e66f2020-03-30 17:54:29 +01006333func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006334 testApexError(t, "\"otherapex\" is not a valid module name", `
6335 apex {
6336 name: "myapex",
6337 key: "myapex.key",
6338 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006339 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006340 }
6341
6342 apex_key {
6343 name: "myapex.key",
6344 public_key: "testkey.avbpubkey",
6345 private_key: "testkey.pem",
6346 }
6347
6348 cc_library {
6349 name: "libfoo",
6350 stl: "none",
6351 system_shared_libs: [],
6352 apex_available: ["otherapex"],
6353 }`)
6354
Paul Duffine52e66f2020-03-30 17:54:29 +01006355 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006356 apex {
6357 name: "myapex",
6358 key: "myapex.key",
6359 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006360 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006361 }
6362
6363 apex_key {
6364 name: "myapex.key",
6365 public_key: "testkey.avbpubkey",
6366 private_key: "testkey.pem",
6367 }
6368
6369 cc_library {
6370 name: "libfoo",
6371 stl: "none",
6372 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006373 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006374 apex_available: ["myapex"],
6375 }
6376
6377 cc_library {
6378 name: "libbar",
6379 stl: "none",
6380 system_shared_libs: [],
6381 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006382 }
6383
6384 cc_library {
6385 name: "libbaz",
6386 stl: "none",
6387 system_shared_libs: [],
6388 stubs: {
6389 versions: ["10", "20", "30"],
6390 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006391 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006392}
Jiyong Park127b40b2019-09-30 16:04:35 +09006393
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006394func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6395 t.Run("negative variant_version produces error", func(t *testing.T) {
6396 testApexError(t, "expected an integer between 0-9; got -1", `
6397 apex {
6398 name: "myapex",
6399 key: "myapex.key",
6400 apex_available_name: "com.android.foo",
6401 variant_version: "-1",
6402 updatable: false,
6403 }
6404 apex_key {
6405 name: "myapex.key",
6406 public_key: "testkey.avbpubkey",
6407 private_key: "testkey.pem",
6408 }
6409 `)
6410 })
6411
6412 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6413 testApexError(t, "expected an integer between 0-9; got 10", `
6414 apex {
6415 name: "myapex",
6416 key: "myapex.key",
6417 apex_available_name: "com.android.foo",
6418 variant_version: "10",
6419 updatable: false,
6420 }
6421 apex_key {
6422 name: "myapex.key",
6423 public_key: "testkey.avbpubkey",
6424 private_key: "testkey.pem",
6425 }
6426 `)
6427 })
6428}
6429
6430func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6431 context := android.GroupFixturePreparers(
6432 android.PrepareForIntegrationTestWithAndroid,
6433 PrepareForTestWithApexBuildComponents,
6434 android.FixtureMergeMockFs(android.MockFS{
6435 "system/sepolicy/apex/foo-file_contexts": nil,
6436 "system/sepolicy/apex/bar-file_contexts": nil,
6437 }),
6438 )
6439 result := context.RunTestWithBp(t, `
6440 apex {
6441 name: "foo",
6442 key: "myapex.key",
6443 apex_available_name: "com.android.foo",
6444 variant_version: "0",
6445 updatable: false,
6446 }
6447 apex {
6448 name: "bar",
6449 key: "myapex.key",
6450 apex_available_name: "com.android.foo",
6451 variant_version: "3",
6452 updatable: false,
6453 }
6454 apex_key {
6455 name: "myapex.key",
6456 public_key: "testkey.avbpubkey",
6457 private_key: "testkey.pem",
6458 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006459 override_apex {
6460 name: "myoverrideapex",
6461 base: "bar",
6462 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006463 `)
6464
Jooyung Hana0503a52023-08-23 13:12:50 +09006465 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006466 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6467 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6468 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6469 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6470 }
6471
Jooyung Hana0503a52023-08-23 13:12:50 +09006472 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006473 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6474 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6475 barActualDefaultVersion := barManifestRule.Args["default_version"]
6476 if barActualDefaultVersion != barExpectedDefaultVersion {
6477 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6478 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006479
Jooyung Hana0503a52023-08-23 13:12:50 +09006480 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006481 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6482 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6483 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6484 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006485}
6486
Sam Delmericoca816532023-06-02 14:09:50 -04006487func TestApexAvailable_ApexAvailableName(t *testing.T) {
6488 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6489 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6490 apex {
6491 name: "myapex_sminus",
6492 key: "myapex.key",
6493 apps: ["AppFoo"],
6494 apex_available_name: "myapex",
6495 updatable: false,
6496 }
6497 apex {
6498 name: "myapex",
6499 key: "myapex.key",
6500 apps: ["AppFoo"],
6501 updatable: false,
6502 }
6503 apex_key {
6504 name: "myapex.key",
6505 public_key: "testkey.avbpubkey",
6506 private_key: "testkey.pem",
6507 }
6508 android_app {
6509 name: "AppFoo",
6510 srcs: ["foo/bar/MyClass.java"],
6511 sdk_version: "none",
6512 system_modules: "none",
6513 apex_available: [ "myapex_sminus" ],
6514 }`,
6515 android.FixtureMergeMockFs(android.MockFS{
6516 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6517 }),
6518 )
6519 })
6520
6521 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6522 testApex(t, `
6523 apex {
6524 name: "myapex_sminus",
6525 key: "myapex.key",
6526 apps: ["AppFoo"],
6527 apex_available_name: "myapex",
6528 updatable: false,
6529 }
6530 apex {
6531 name: "myapex",
6532 key: "myapex.key",
6533 apps: ["AppFoo"],
6534 updatable: false,
6535 }
6536 apex_key {
6537 name: "myapex.key",
6538 public_key: "testkey.avbpubkey",
6539 private_key: "testkey.pem",
6540 }
6541 android_app {
6542 name: "AppFoo",
6543 srcs: ["foo/bar/MyClass.java"],
6544 sdk_version: "none",
6545 system_modules: "none",
6546 apex_available: [ "myapex" ],
6547 }`,
6548 android.FixtureMergeMockFs(android.MockFS{
6549 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6550 }),
6551 )
6552 })
6553
6554 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6555 testApex(t, `
6556 override_apex {
6557 name: "myoverrideapex_sminus",
6558 base: "myapex_sminus",
6559 key: "myapex.key",
6560 apps: ["AppFooOverride"],
6561 }
6562 override_apex {
6563 name: "myoverrideapex",
6564 base: "myapex",
6565 key: "myapex.key",
6566 apps: ["AppFooOverride"],
6567 }
6568 apex {
6569 name: "myapex_sminus",
6570 key: "myapex.key",
6571 apps: ["AppFoo"],
6572 apex_available_name: "myapex",
6573 updatable: false,
6574 }
6575 apex {
6576 name: "myapex",
6577 key: "myapex.key",
6578 apps: ["AppFoo"],
6579 updatable: false,
6580 }
6581 apex_key {
6582 name: "myapex.key",
6583 public_key: "testkey.avbpubkey",
6584 private_key: "testkey.pem",
6585 }
6586 android_app {
6587 name: "AppFooOverride",
6588 srcs: ["foo/bar/MyClass.java"],
6589 sdk_version: "none",
6590 system_modules: "none",
6591 apex_available: [ "myapex" ],
6592 }
6593 android_app {
6594 name: "AppFoo",
6595 srcs: ["foo/bar/MyClass.java"],
6596 sdk_version: "none",
6597 system_modules: "none",
6598 apex_available: [ "myapex" ],
6599 }`,
6600 android.FixtureMergeMockFs(android.MockFS{
6601 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6602 }),
6603 )
6604 })
6605}
6606
6607func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6608 context := android.GroupFixturePreparers(
6609 android.PrepareForIntegrationTestWithAndroid,
6610 PrepareForTestWithApexBuildComponents,
6611 java.PrepareForTestWithDexpreopt,
6612 android.FixtureMergeMockFs(android.MockFS{
6613 "system/sepolicy/apex/myapex-file_contexts": nil,
6614 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6615 }),
6616 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6617 variables.BuildId = proptools.StringPtr("buildid")
6618 }),
6619 )
6620 context.RunTestWithBp(t, `
6621 override_apex {
6622 name: "myoverrideapex_sminus",
6623 base: "myapex_sminus",
6624 }
6625 override_apex {
6626 name: "myoverrideapex",
6627 base: "myapex",
6628 }
6629 apex {
6630 name: "myapex",
6631 key: "myapex.key",
6632 apps: ["AppFoo"],
6633 updatable: false,
6634 }
6635 apex {
6636 name: "myapex_sminus",
6637 apex_available_name: "myapex",
6638 key: "myapex.key",
6639 apps: ["AppFoo_sminus"],
6640 updatable: false,
6641 }
6642 apex_key {
6643 name: "myapex.key",
6644 public_key: "testkey.avbpubkey",
6645 private_key: "testkey.pem",
6646 }
6647 android_app {
6648 name: "AppFoo",
6649 srcs: ["foo/bar/MyClass.java"],
6650 sdk_version: "none",
6651 system_modules: "none",
6652 apex_available: [ "myapex" ],
6653 }
6654 android_app {
6655 name: "AppFoo_sminus",
6656 srcs: ["foo/bar/MyClass.java"],
6657 sdk_version: "none",
6658 min_sdk_version: "29",
6659 system_modules: "none",
6660 apex_available: [ "myapex" ],
6661 }`)
6662}
6663
Jiyong Park89e850a2020-04-07 16:37:39 +09006664func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006665 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006666 apex {
6667 name: "myapex",
6668 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006669 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006670 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006671 }
6672
6673 apex_key {
6674 name: "myapex.key",
6675 public_key: "testkey.avbpubkey",
6676 private_key: "testkey.pem",
6677 }
6678
6679 cc_library {
6680 name: "libfoo",
6681 stl: "none",
6682 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006683 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006684 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006685 }
6686
6687 cc_library {
6688 name: "libfoo2",
6689 stl: "none",
6690 system_shared_libs: [],
6691 shared_libs: ["libbaz"],
6692 apex_available: ["//apex_available:platform"],
6693 }
6694
6695 cc_library {
6696 name: "libbar",
6697 stl: "none",
6698 system_shared_libs: [],
6699 apex_available: ["myapex"],
6700 }
6701
6702 cc_library {
6703 name: "libbaz",
6704 stl: "none",
6705 system_shared_libs: [],
6706 apex_available: ["myapex"],
6707 stubs: {
6708 versions: ["1"],
6709 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006710 }`)
6711
Jiyong Park89e850a2020-04-07 16:37:39 +09006712 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6713 // because it depends on libbar which isn't available to platform
6714 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6715 if libfoo.NotAvailableForPlatform() != true {
6716 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6717 }
6718
6719 // libfoo2 however can be available to platform because it depends on libbaz which provides
6720 // stubs
6721 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6722 if libfoo2.NotAvailableForPlatform() == true {
6723 t.Errorf("%q should be available to platform", libfoo2.String())
6724 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006725}
Jiyong Parka90ca002019-10-07 15:47:24 +09006726
Paul Duffine52e66f2020-03-30 17:54:29 +01006727func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006728 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006729 apex {
6730 name: "myapex",
6731 key: "myapex.key",
6732 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006733 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006734 }
6735
6736 apex_key {
6737 name: "myapex.key",
6738 public_key: "testkey.avbpubkey",
6739 private_key: "testkey.pem",
6740 }
6741
6742 cc_library {
6743 name: "libfoo",
6744 stl: "none",
6745 system_shared_libs: [],
6746 apex_available: ["myapex"],
6747 static: {
6748 apex_available: ["//apex_available:platform"],
6749 },
6750 }`)
6751
Jiyong Park89e850a2020-04-07 16:37:39 +09006752 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6753 if libfooShared.NotAvailableForPlatform() != true {
6754 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6755 }
6756 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6757 if libfooStatic.NotAvailableForPlatform() != false {
6758 t.Errorf("%q should be available to platform", libfooStatic.String())
6759 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006760}
6761
Jiyong Park5d790c32019-11-15 18:40:32 +09006762func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006763 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006764 apex {
6765 name: "myapex",
6766 key: "myapex.key",
6767 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006768 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006769 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006770 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006771 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006772 }
6773
6774 override_apex {
6775 name: "override_myapex",
6776 base: "myapex",
6777 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006778 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006779 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006780 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006781 compile_multilib: "first",
6782 multilib: {
6783 lib32: {
6784 native_shared_libs: ["mylib32"],
6785 },
6786 lib64: {
6787 native_shared_libs: ["mylib64"],
6788 },
6789 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006790 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006791 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006792 key: "mynewapex.key",
6793 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006794 }
6795
6796 apex_key {
6797 name: "myapex.key",
6798 public_key: "testkey.avbpubkey",
6799 private_key: "testkey.pem",
6800 }
6801
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006802 apex_key {
6803 name: "mynewapex.key",
6804 public_key: "testkey2.avbpubkey",
6805 private_key: "testkey2.pem",
6806 }
6807
6808 android_app_certificate {
6809 name: "myapex.certificate",
6810 certificate: "testkey",
6811 }
6812
Jiyong Park5d790c32019-11-15 18:40:32 +09006813 android_app {
6814 name: "app",
6815 srcs: ["foo/bar/MyClass.java"],
6816 package_name: "foo",
6817 sdk_version: "none",
6818 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006819 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006820 }
6821
6822 override_android_app {
6823 name: "override_app",
6824 base: "app",
6825 package_name: "bar",
6826 }
markchien7c803b82021-08-26 22:10:06 +08006827
6828 bpf {
6829 name: "bpf",
6830 srcs: ["bpf.c"],
6831 }
6832
6833 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006834 name: "overrideBpf",
6835 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006836 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006837
6838 prebuilt_etc {
6839 name: "myetc",
6840 src: "myprebuilt",
6841 }
6842
6843 prebuilt_etc {
6844 name: "override_myetc",
6845 src: "override_myprebuilt",
6846 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006847
6848 cc_library {
6849 name: "mylib32",
6850 apex_available: [ "myapex" ],
6851 }
6852
6853 cc_library {
6854 name: "mylib64",
6855 apex_available: [ "myapex" ],
6856 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006857 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006858
Jooyung Hana0503a52023-08-23 13:12:50 +09006859 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
6860 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006861 if originalVariant.GetOverriddenBy() != "" {
6862 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6863 }
6864 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6865 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6866 }
6867
Jooyung Hana0503a52023-08-23 13:12:50 +09006868 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006869 apexRule := module.Rule("apexRule")
6870 copyCmds := apexRule.Args["copy_commands"]
6871
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006872 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6873 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006874
markchien7c803b82021-08-26 22:10:06 +08006875 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006876 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006877
Daniel Norman5a3ce132021-08-26 15:44:43 -07006878 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6879 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6880
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006881 apexBundle := module.Module().(*apexBundle)
6882 name := apexBundle.Name()
6883 if name != "override_myapex" {
6884 t.Errorf("name should be \"override_myapex\", but was %q", name)
6885 }
6886
Baligh Uddin004d7172020-02-19 21:29:28 -08006887 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6888 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6889 }
6890
Jiyong Park20bacab2020-03-03 11:45:41 +09006891 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006892 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006893 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6894
6895 signApkRule := module.Rule("signapk")
6896 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006897
Colin Crossaa255532020-07-03 13:18:24 -07006898 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006899 var builder strings.Builder
6900 data.Custom(&builder, name, "TARGET_", "", data)
6901 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006902 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6903 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006904 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006905 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006906 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006907 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006908 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006909 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006910}
6911
Albert Martineefabcf2022-03-21 20:11:16 +00006912func TestMinSdkVersionOverride(t *testing.T) {
6913 // Override from 29 to 31
6914 minSdkOverride31 := "31"
6915 ctx := testApex(t, `
6916 apex {
6917 name: "myapex",
6918 key: "myapex.key",
6919 native_shared_libs: ["mylib"],
6920 updatable: true,
6921 min_sdk_version: "29"
6922 }
6923
6924 override_apex {
6925 name: "override_myapex",
6926 base: "myapex",
6927 logging_parent: "com.foo.bar",
6928 package_name: "test.overridden.package"
6929 }
6930
6931 apex_key {
6932 name: "myapex.key",
6933 public_key: "testkey.avbpubkey",
6934 private_key: "testkey.pem",
6935 }
6936
6937 cc_library {
6938 name: "mylib",
6939 srcs: ["mylib.cpp"],
6940 runtime_libs: ["libbar"],
6941 system_shared_libs: [],
6942 stl: "none",
6943 apex_available: [ "myapex" ],
6944 min_sdk_version: "apex_inherit"
6945 }
6946
6947 cc_library {
6948 name: "libbar",
6949 srcs: ["mylib.cpp"],
6950 system_shared_libs: [],
6951 stl: "none",
6952 apex_available: [ "myapex" ],
6953 min_sdk_version: "apex_inherit"
6954 }
6955
6956 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6957
Jooyung Hana0503a52023-08-23 13:12:50 +09006958 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00006959 copyCmds := apexRule.Args["copy_commands"]
6960
6961 // Ensure that direct non-stubs dep is always included
6962 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6963
6964 // Ensure that runtime_libs dep in included
6965 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6966
6967 // Ensure libraries target overridden min_sdk_version value
6968 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6969}
6970
6971func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6972 // Attempt to override from 31 to 29, should be a NOOP
6973 minSdkOverride29 := "29"
6974 ctx := testApex(t, `
6975 apex {
6976 name: "myapex",
6977 key: "myapex.key",
6978 native_shared_libs: ["mylib"],
6979 updatable: true,
6980 min_sdk_version: "31"
6981 }
6982
6983 override_apex {
6984 name: "override_myapex",
6985 base: "myapex",
6986 logging_parent: "com.foo.bar",
6987 package_name: "test.overridden.package"
6988 }
6989
6990 apex_key {
6991 name: "myapex.key",
6992 public_key: "testkey.avbpubkey",
6993 private_key: "testkey.pem",
6994 }
6995
6996 cc_library {
6997 name: "mylib",
6998 srcs: ["mylib.cpp"],
6999 runtime_libs: ["libbar"],
7000 system_shared_libs: [],
7001 stl: "none",
7002 apex_available: [ "myapex" ],
7003 min_sdk_version: "apex_inherit"
7004 }
7005
7006 cc_library {
7007 name: "libbar",
7008 srcs: ["mylib.cpp"],
7009 system_shared_libs: [],
7010 stl: "none",
7011 apex_available: [ "myapex" ],
7012 min_sdk_version: "apex_inherit"
7013 }
7014
7015 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7016
Jooyung Hana0503a52023-08-23 13:12:50 +09007017 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007018 copyCmds := apexRule.Args["copy_commands"]
7019
7020 // Ensure that direct non-stubs dep is always included
7021 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7022
7023 // Ensure that runtime_libs dep in included
7024 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7025
7026 // Ensure libraries target the original min_sdk_version value rather than the overridden
7027 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7028}
7029
Jooyung Han214bf372019-11-12 13:03:50 +09007030func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007031 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007032 apex {
7033 name: "myapex",
7034 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007035 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007036 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007037 }
7038
7039 apex_key {
7040 name: "myapex.key",
7041 public_key: "testkey.avbpubkey",
7042 private_key: "testkey.pem",
7043 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007044
7045 cc_library {
7046 name: "mylib",
7047 srcs: ["mylib.cpp"],
7048 stl: "libc++",
7049 system_shared_libs: [],
7050 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007051 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007052 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007053 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007054
Jooyung Hana0503a52023-08-23 13:12:50 +09007055 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007056 args := module.Rule("apexRule").Args
7057 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007058 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007059
7060 // The copies of the libraries in the apex should have one more dependency than
7061 // the ones outside the apex, namely the unwinder. Ideally we should check
7062 // the dependency names directly here but for some reason the names are blank in
7063 // this test.
7064 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007065 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007066 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7067 if len(apexImplicits) != len(nonApexImplicits)+1 {
7068 t.Errorf("%q missing unwinder dep", lib)
7069 }
7070 }
Jooyung Han214bf372019-11-12 13:03:50 +09007071}
7072
Paul Duffine05480a2021-03-08 15:07:14 +00007073var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007074 "api/current.txt": nil,
7075 "api/removed.txt": nil,
7076 "api/system-current.txt": nil,
7077 "api/system-removed.txt": nil,
7078 "api/test-current.txt": nil,
7079 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007080
Anton Hanssondff2c782020-12-21 17:10:01 +00007081 "100/public/api/foo.txt": nil,
7082 "100/public/api/foo-removed.txt": nil,
7083 "100/system/api/foo.txt": nil,
7084 "100/system/api/foo-removed.txt": nil,
7085
Paul Duffineedc5d52020-06-12 17:46:39 +01007086 // For java_sdk_library_import
7087 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007088}
7089
Jooyung Han58f26ab2019-12-18 15:34:32 +09007090func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007091 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007092 apex {
7093 name: "myapex",
7094 key: "myapex.key",
7095 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007096 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007097 }
7098
7099 apex_key {
7100 name: "myapex.key",
7101 public_key: "testkey.avbpubkey",
7102 private_key: "testkey.pem",
7103 }
7104
7105 java_sdk_library {
7106 name: "foo",
7107 srcs: ["a.java"],
7108 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007109 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007110 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007111
7112 prebuilt_apis {
7113 name: "sdk",
7114 api_dirs: ["100"],
7115 }
Paul Duffin9b879592020-05-26 13:21:35 +01007116 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007117
7118 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007119 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007120 "javalib/foo.jar",
7121 "etc/permissions/foo.xml",
7122 })
7123 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007124 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7125 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7126 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007127}
7128
Paul Duffin9b879592020-05-26 13:21:35 +01007129func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007130 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007131 apex {
7132 name: "myapex",
7133 key: "myapex.key",
7134 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007135 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007136 }
7137
7138 apex_key {
7139 name: "myapex.key",
7140 public_key: "testkey.avbpubkey",
7141 private_key: "testkey.pem",
7142 }
7143
7144 java_sdk_library {
7145 name: "foo",
7146 srcs: ["a.java"],
7147 api_packages: ["foo"],
7148 apex_available: ["myapex"],
7149 sdk_version: "none",
7150 system_modules: "none",
7151 }
7152
7153 java_library {
7154 name: "bar",
7155 srcs: ["a.java"],
7156 libs: ["foo"],
7157 apex_available: ["myapex"],
7158 sdk_version: "none",
7159 system_modules: "none",
7160 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007161
7162 prebuilt_apis {
7163 name: "sdk",
7164 api_dirs: ["100"],
7165 }
Paul Duffin9b879592020-05-26 13:21:35 +01007166 `, withFiles(filesForSdkLibrary))
7167
7168 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007169 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007170 "javalib/bar.jar",
7171 "javalib/foo.jar",
7172 "etc/permissions/foo.xml",
7173 })
7174
7175 // The bar library should depend on the implementation jar.
7176 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007177 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007178 t.Errorf("expected %q, found %#q", expected, actual)
7179 }
7180}
7181
7182func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007183 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007184 apex {
7185 name: "myapex",
7186 key: "myapex.key",
7187 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007188 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007189 }
7190
7191 apex_key {
7192 name: "myapex.key",
7193 public_key: "testkey.avbpubkey",
7194 private_key: "testkey.pem",
7195 }
7196
7197 java_sdk_library {
7198 name: "foo",
7199 srcs: ["a.java"],
7200 api_packages: ["foo"],
7201 apex_available: ["myapex"],
7202 sdk_version: "none",
7203 system_modules: "none",
7204 }
7205
7206 java_library {
7207 name: "bar",
7208 srcs: ["a.java"],
7209 libs: ["foo"],
7210 sdk_version: "none",
7211 system_modules: "none",
7212 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007213
7214 prebuilt_apis {
7215 name: "sdk",
7216 api_dirs: ["100"],
7217 }
Paul Duffin9b879592020-05-26 13:21:35 +01007218 `, withFiles(filesForSdkLibrary))
7219
7220 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007221 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007222 "javalib/foo.jar",
7223 "etc/permissions/foo.xml",
7224 })
7225
7226 // The bar library should depend on the stubs jar.
7227 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007228 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007229 t.Errorf("expected %q, found %#q", expected, actual)
7230 }
7231}
7232
Paul Duffineedc5d52020-06-12 17:46:39 +01007233func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007234 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007235 prebuilt_apis {
7236 name: "sdk",
7237 api_dirs: ["100"],
7238 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007239 withFiles(map[string][]byte{
7240 "apex/a.java": nil,
7241 "apex/apex_manifest.json": nil,
7242 "apex/Android.bp": []byte(`
7243 package {
7244 default_visibility: ["//visibility:private"],
7245 }
7246
7247 apex {
7248 name: "myapex",
7249 key: "myapex.key",
7250 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007251 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007252 }
7253
7254 apex_key {
7255 name: "myapex.key",
7256 public_key: "testkey.avbpubkey",
7257 private_key: "testkey.pem",
7258 }
7259
7260 java_library {
7261 name: "bar",
7262 srcs: ["a.java"],
7263 libs: ["foo"],
7264 apex_available: ["myapex"],
7265 sdk_version: "none",
7266 system_modules: "none",
7267 }
7268`),
7269 "source/a.java": nil,
7270 "source/api/current.txt": nil,
7271 "source/api/removed.txt": nil,
7272 "source/Android.bp": []byte(`
7273 package {
7274 default_visibility: ["//visibility:private"],
7275 }
7276
7277 java_sdk_library {
7278 name: "foo",
7279 visibility: ["//apex"],
7280 srcs: ["a.java"],
7281 api_packages: ["foo"],
7282 apex_available: ["myapex"],
7283 sdk_version: "none",
7284 system_modules: "none",
7285 public: {
7286 enabled: true,
7287 },
7288 }
7289`),
7290 "prebuilt/a.jar": nil,
7291 "prebuilt/Android.bp": []byte(`
7292 package {
7293 default_visibility: ["//visibility:private"],
7294 }
7295
7296 java_sdk_library_import {
7297 name: "foo",
7298 visibility: ["//apex", "//source"],
7299 apex_available: ["myapex"],
7300 prefer: true,
7301 public: {
7302 jars: ["a.jar"],
7303 },
7304 }
7305`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007306 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007307 )
7308
7309 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007310 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007311 "javalib/bar.jar",
7312 "javalib/foo.jar",
7313 "etc/permissions/foo.xml",
7314 })
7315
7316 // The bar library should depend on the implementation jar.
7317 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007318 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007319 t.Errorf("expected %q, found %#q", expected, actual)
7320 }
7321}
7322
7323func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7324 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7325 apex {
7326 name: "myapex",
7327 key: "myapex.key",
7328 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007329 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007330 }
7331
7332 apex_key {
7333 name: "myapex.key",
7334 public_key: "testkey.avbpubkey",
7335 private_key: "testkey.pem",
7336 }
7337
7338 java_sdk_library_import {
7339 name: "foo",
7340 apex_available: ["myapex"],
7341 prefer: true,
7342 public: {
7343 jars: ["a.jar"],
7344 },
7345 }
7346
7347 `, withFiles(filesForSdkLibrary))
7348}
7349
atrost6e126252020-01-27 17:01:16 +00007350func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007351 result := android.GroupFixturePreparers(
7352 prepareForApexTest,
7353 java.PrepareForTestWithPlatformCompatConfig,
7354 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007355 apex {
7356 name: "myapex",
7357 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007358 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007359 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007360 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007361 }
7362
7363 apex_key {
7364 name: "myapex.key",
7365 public_key: "testkey.avbpubkey",
7366 private_key: "testkey.pem",
7367 }
7368
7369 platform_compat_config {
7370 name: "myjar-platform-compat-config",
7371 src: ":myjar",
7372 }
7373
7374 java_library {
7375 name: "myjar",
7376 srcs: ["foo/bar/MyClass.java"],
7377 sdk_version: "none",
7378 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007379 apex_available: [ "myapex" ],
7380 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007381
7382 // Make sure that a preferred prebuilt does not affect the apex contents.
7383 prebuilt_platform_compat_config {
7384 name: "myjar-platform-compat-config",
7385 metadata: "compat-config/metadata.xml",
7386 prefer: true,
7387 }
atrost6e126252020-01-27 17:01:16 +00007388 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007389 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007390 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007391 "etc/compatconfig/myjar-platform-compat-config.xml",
7392 "javalib/myjar.jar",
7393 })
7394}
7395
Jooyung Han862c0d62022-12-21 10:15:37 +09007396func TestNoDupeApexFiles(t *testing.T) {
7397 android.GroupFixturePreparers(
7398 android.PrepareForTestWithAndroidBuildComponents,
7399 PrepareForTestWithApexBuildComponents,
7400 prepareForTestWithMyapex,
7401 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7402 ).
7403 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7404 RunTestWithBp(t, `
7405 apex {
7406 name: "myapex",
7407 key: "myapex.key",
7408 prebuilts: ["foo", "bar"],
7409 updatable: false,
7410 }
7411
7412 apex_key {
7413 name: "myapex.key",
7414 public_key: "testkey.avbpubkey",
7415 private_key: "testkey.pem",
7416 }
7417
7418 prebuilt_etc {
7419 name: "foo",
7420 src: "myprebuilt",
7421 filename_from_src: true,
7422 }
7423
7424 prebuilt_etc {
7425 name: "bar",
7426 src: "myprebuilt",
7427 filename_from_src: true,
7428 }
7429 `)
7430}
7431
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007432func TestApexUnwantedTransitiveDeps(t *testing.T) {
7433 bp := `
7434 apex {
7435 name: "myapex",
7436 key: "myapex.key",
7437 native_shared_libs: ["libfoo"],
7438 updatable: false,
7439 unwanted_transitive_deps: ["libbar"],
7440 }
7441
7442 apex_key {
7443 name: "myapex.key",
7444 public_key: "testkey.avbpubkey",
7445 private_key: "testkey.pem",
7446 }
7447
7448 cc_library {
7449 name: "libfoo",
7450 srcs: ["foo.cpp"],
7451 shared_libs: ["libbar"],
7452 apex_available: ["myapex"],
7453 }
7454
7455 cc_library {
7456 name: "libbar",
7457 srcs: ["bar.cpp"],
7458 apex_available: ["myapex"],
7459 }`
7460 ctx := testApex(t, bp)
7461 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7462 "*/libc++.so",
7463 "*/libfoo.so",
7464 // not libbar.so
7465 })
7466}
7467
Jiyong Park479321d2019-12-16 11:47:12 +09007468func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7469 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7470 apex {
7471 name: "myapex",
7472 key: "myapex.key",
7473 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007474 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007475 }
7476
7477 apex_key {
7478 name: "myapex.key",
7479 public_key: "testkey.avbpubkey",
7480 private_key: "testkey.pem",
7481 }
7482
7483 java_library {
7484 name: "myjar",
7485 srcs: ["foo/bar/MyClass.java"],
7486 sdk_version: "none",
7487 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007488 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007489 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007490 }
7491 `)
7492}
7493
Jiyong Park7afd1072019-12-30 16:56:33 +09007494func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007495 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007496 apex {
7497 name: "myapex",
7498 key: "myapex.key",
7499 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007500 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007501 }
7502
7503 apex_key {
7504 name: "myapex.key",
7505 public_key: "testkey.avbpubkey",
7506 private_key: "testkey.pem",
7507 }
7508
7509 cc_library {
7510 name: "mylib",
7511 srcs: ["mylib.cpp"],
7512 system_shared_libs: [],
7513 stl: "none",
7514 required: ["a", "b"],
7515 host_required: ["c", "d"],
7516 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007517 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007518 }
7519 `)
7520
Jooyung Hana0503a52023-08-23 13:12:50 +09007521 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007522 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007523 name := apexBundle.BaseModuleName()
7524 prefix := "TARGET_"
7525 var builder strings.Builder
7526 data.Custom(&builder, name, prefix, "", data)
7527 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007528 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007529 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7530 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007531}
7532
Jiyong Park7cd10e32020-01-14 09:22:18 +09007533func TestSymlinksFromApexToSystem(t *testing.T) {
7534 bp := `
7535 apex {
7536 name: "myapex",
7537 key: "myapex.key",
7538 native_shared_libs: ["mylib"],
7539 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007540 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007541 }
7542
Jiyong Park9d677202020-02-19 16:29:35 +09007543 apex {
7544 name: "myapex.updatable",
7545 key: "myapex.key",
7546 native_shared_libs: ["mylib"],
7547 java_libs: ["myjar"],
7548 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007549 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007550 }
7551
Jiyong Park7cd10e32020-01-14 09:22:18 +09007552 apex_key {
7553 name: "myapex.key",
7554 public_key: "testkey.avbpubkey",
7555 private_key: "testkey.pem",
7556 }
7557
7558 cc_library {
7559 name: "mylib",
7560 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007561 shared_libs: [
7562 "myotherlib",
7563 "myotherlib_ext",
7564 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007565 system_shared_libs: [],
7566 stl: "none",
7567 apex_available: [
7568 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007569 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007570 "//apex_available:platform",
7571 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007572 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007573 }
7574
7575 cc_library {
7576 name: "myotherlib",
7577 srcs: ["mylib.cpp"],
7578 system_shared_libs: [],
7579 stl: "none",
7580 apex_available: [
7581 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007582 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007583 "//apex_available:platform",
7584 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007585 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007586 }
7587
Jiyong Parkce243632023-02-17 18:22:25 +09007588 cc_library {
7589 name: "myotherlib_ext",
7590 srcs: ["mylib.cpp"],
7591 system_shared_libs: [],
7592 system_ext_specific: true,
7593 stl: "none",
7594 apex_available: [
7595 "myapex",
7596 "myapex.updatable",
7597 "//apex_available:platform",
7598 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007599 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007600 }
7601
Jiyong Park7cd10e32020-01-14 09:22:18 +09007602 java_library {
7603 name: "myjar",
7604 srcs: ["foo/bar/MyClass.java"],
7605 sdk_version: "none",
7606 system_modules: "none",
7607 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007608 apex_available: [
7609 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007610 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007611 "//apex_available:platform",
7612 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007613 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007614 }
7615
7616 java_library {
7617 name: "myotherjar",
7618 srcs: ["foo/bar/MyClass.java"],
7619 sdk_version: "none",
7620 system_modules: "none",
7621 apex_available: [
7622 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007623 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007624 "//apex_available:platform",
7625 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007626 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007627 }
7628 `
7629
7630 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7631 for _, f := range files {
7632 if f.path == file {
7633 if f.isLink {
7634 t.Errorf("%q is not a real file", file)
7635 }
7636 return
7637 }
7638 }
7639 t.Errorf("%q is not found", file)
7640 }
7641
Jiyong Parkce243632023-02-17 18:22:25 +09007642 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007643 for _, f := range files {
7644 if f.path == file {
7645 if !f.isLink {
7646 t.Errorf("%q is not a symlink", file)
7647 }
Jiyong Parkce243632023-02-17 18:22:25 +09007648 if f.src != target {
7649 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7650 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007651 return
7652 }
7653 }
7654 t.Errorf("%q is not found", file)
7655 }
7656
Jiyong Park9d677202020-02-19 16:29:35 +09007657 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7658 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007659 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007660 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007661 ensureRealfileExists(t, files, "javalib/myjar.jar")
7662 ensureRealfileExists(t, files, "lib64/mylib.so")
7663 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007664 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007665
Jooyung Hana0503a52023-08-23 13:12:50 +09007666 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007667 ensureRealfileExists(t, files, "javalib/myjar.jar")
7668 ensureRealfileExists(t, files, "lib64/mylib.so")
7669 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007670 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007671
7672 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007673 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007674 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007675 ensureRealfileExists(t, files, "javalib/myjar.jar")
7676 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007677 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7678 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007679
Jooyung Hana0503a52023-08-23 13:12:50 +09007680 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007681 ensureRealfileExists(t, files, "javalib/myjar.jar")
7682 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007683 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7684 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007685}
7686
Yo Chiange8128052020-07-23 20:09:18 +08007687func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007688 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007689 apex {
7690 name: "myapex",
7691 key: "myapex.key",
7692 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007693 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007694 }
7695
7696 apex_key {
7697 name: "myapex.key",
7698 public_key: "testkey.avbpubkey",
7699 private_key: "testkey.pem",
7700 }
7701
7702 cc_library_shared {
7703 name: "mylib",
7704 srcs: ["mylib.cpp"],
7705 shared_libs: ["myotherlib"],
7706 system_shared_libs: [],
7707 stl: "none",
7708 apex_available: [
7709 "myapex",
7710 "//apex_available:platform",
7711 ],
7712 }
7713
7714 cc_prebuilt_library_shared {
7715 name: "myotherlib",
7716 srcs: ["prebuilt.so"],
7717 system_shared_libs: [],
7718 stl: "none",
7719 apex_available: [
7720 "myapex",
7721 "//apex_available:platform",
7722 ],
7723 }
7724 `)
7725
Jooyung Hana0503a52023-08-23 13:12:50 +09007726 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007727 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007728 var builder strings.Builder
7729 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7730 androidMk := builder.String()
7731 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007732 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007733 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7734 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7735 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007736 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007737}
7738
Jooyung Han643adc42020-02-27 13:50:06 +09007739func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007740 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007741 apex {
7742 name: "myapex",
7743 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007744 binaries: ["mybin"],
7745 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007746 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007747 }
7748
7749 apex_key {
7750 name: "myapex.key",
7751 public_key: "testkey.avbpubkey",
7752 private_key: "testkey.pem",
7753 }
7754
7755 cc_library {
7756 name: "mylib",
7757 srcs: ["mylib.cpp"],
7758 shared_libs: ["mylib2"],
7759 system_shared_libs: [],
7760 stl: "none",
7761 apex_available: [ "myapex" ],
7762 }
7763
7764 cc_library {
7765 name: "mylib2",
7766 srcs: ["mylib.cpp"],
7767 system_shared_libs: [],
7768 stl: "none",
7769 apex_available: [ "myapex" ],
7770 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007771
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007772 // Used as both a JNI library and a regular shared library.
7773 cc_library {
7774 name: "mylib3",
7775 srcs: ["mylib.cpp"],
7776 system_shared_libs: [],
7777 stl: "none",
7778 apex_available: [ "myapex" ],
7779 }
7780
7781 cc_binary {
7782 name: "mybin",
7783 srcs: ["mybin.cpp"],
7784 shared_libs: ["mylib3"],
7785 system_shared_libs: [],
7786 stl: "none",
7787 apex_available: [ "myapex" ],
7788 }
7789
Jiyong Park34d5c332022-02-24 18:02:44 +09007790 rust_ffi_shared {
7791 name: "libfoo.rust",
7792 crate_name: "foo",
7793 srcs: ["foo.rs"],
7794 shared_libs: ["libfoo.shared_from_rust"],
7795 prefer_rlib: true,
7796 apex_available: ["myapex"],
7797 }
7798
7799 cc_library_shared {
7800 name: "libfoo.shared_from_rust",
7801 srcs: ["mylib.cpp"],
7802 system_shared_libs: [],
7803 stl: "none",
7804 stubs: {
7805 versions: ["10", "11", "12"],
7806 },
7807 }
7808
Jooyung Han643adc42020-02-27 13:50:06 +09007809 `)
7810
Jooyung Hana0503a52023-08-23 13:12:50 +09007811 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007812 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007813 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007814 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007815 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007816 "lib64/mylib.so",
7817 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007818 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007819 "lib64/libfoo.rust.so",
7820 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7821 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007822 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007823
7824 // b/220397949
7825 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007826}
7827
Jooyung Han49f67012020-04-17 13:43:10 +09007828func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007829 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007830 apex {
7831 name: "myapex",
7832 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007833 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007834 }
7835 apex_key {
7836 name: "myapex.key",
7837 public_key: "testkey.avbpubkey",
7838 private_key: "testkey.pem",
7839 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007840 `,
7841 android.FixtureModifyConfig(func(config android.Config) {
7842 delete(config.Targets, android.Android)
7843 config.AndroidCommonTarget = android.Target{}
7844 }),
7845 )
Jooyung Han49f67012020-04-17 13:43:10 +09007846
7847 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7848 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7849 }
7850}
7851
Jiyong Parkbd159612020-02-28 15:22:21 +09007852func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007853 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007854 apex {
7855 name: "myapex",
7856 key: "myapex.key",
7857 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007858 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007859 }
7860
7861 apex_key {
7862 name: "myapex.key",
7863 public_key: "testkey.avbpubkey",
7864 private_key: "testkey.pem",
7865 }
7866
7867 android_app {
7868 name: "AppFoo",
7869 srcs: ["foo/bar/MyClass.java"],
7870 sdk_version: "none",
7871 system_modules: "none",
7872 apex_available: [ "myapex" ],
7873 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007874 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007875
Jooyung Hana0503a52023-08-23 13:12:50 +09007876 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007877 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09007878
7879 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007880 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 +09007881}
7882
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007883func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007884 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007885 apex {
7886 name: "myapex",
7887 key: "myapex.key",
7888 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007889 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007890 }
7891
7892 apex_key {
7893 name: "myapex.key",
7894 public_key: "testkey.avbpubkey",
7895 private_key: "testkey.pem",
7896 }
7897
7898 android_app_set {
7899 name: "AppSet",
7900 set: "AppSet.apks",
7901 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09007902 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08007903 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007904 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007905 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7906 s := mod.Rule("apexRule").Args["copy_commands"]
7907 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007908 if len(copyCmds) != 4 {
7909 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007910 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007911 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7912 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007913 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7914 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007915
7916 // Ensure that canned_fs_config has an entry for the app set zip file
7917 generateFsRule := mod.Rule("generateFsConfig")
7918 cmd := generateFsRule.RuleParams.Command
7919 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007920}
7921
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007922func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007923 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007924 apex_set {
7925 name: "myapex",
7926 filename: "foo_v2.apex",
7927 sanitized: {
7928 none: { set: "myapex.apks", },
7929 hwaddress: { set: "myapex.hwasan.apks", },
7930 },
Paul Duffin24704672021-04-06 16:09:30 +01007931 }
7932 `
7933 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007934
Paul Duffin24704672021-04-06 16:09:30 +01007935 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00007936 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007937
Spandan Das3576e762024-01-03 18:57:03 +00007938 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01007939 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007940
Paul Duffin24704672021-04-06 16:09:30 +01007941 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7942
7943 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007944 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7945 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007946
7947 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007948}
7949
Pranav Guptaeba03b02022-09-27 00:27:08 +00007950func TestApexSetApksModuleAssignment(t *testing.T) {
7951 ctx := testApex(t, `
7952 apex_set {
7953 name: "myapex",
7954 set: ":myapex_apks_file",
7955 }
7956
7957 filegroup {
7958 name: "myapex_apks_file",
7959 srcs: ["myapex.apks"],
7960 }
7961 `)
7962
Spandan Das3576e762024-01-03 18:57:03 +00007963 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00007964
7965 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00007966 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00007967 extractedApex := m.Output(extractorOutput)
7968
7969 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7970}
7971
Paul Duffin89f570a2021-06-16 01:42:33 +01007972func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007973 t.Helper()
7974
Paul Duffin55607122021-03-30 23:32:51 +01007975 fs := android.MockFS{
7976 "a.java": nil,
7977 "a.jar": nil,
7978 "apex_manifest.json": nil,
7979 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007980 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007981 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7982 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7983 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007984 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007985 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007986
Paul Duffin55607122021-03-30 23:32:51 +01007987 errorHandler := android.FixtureExpectsNoErrors
7988 if errmsg != "" {
7989 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007990 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007991
Paul Duffin55607122021-03-30 23:32:51 +01007992 result := android.GroupFixturePreparers(
7993 cc.PrepareForTestWithCcDefaultModules,
7994 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01007995 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01007996 java.PrepareForTestWithJavaSdkLibraryFiles,
7997 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007998 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007999 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008000 android.FixtureModifyMockFS(func(fs android.MockFS) {
8001 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8002 insert := ""
8003 for _, fragment := range fragments {
8004 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8005 }
8006 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8007 platform_bootclasspath {
8008 name: "platform-bootclasspath",
8009 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008010 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008011 %s
8012 ],
8013 }
8014 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008015 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008016 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008017 // Dexpreopt for boot jars requires the ART boot image profile.
8018 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8019 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008020 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008021 ).
8022 ExtendWithErrorHandler(errorHandler).
8023 RunTestWithBp(t, bp)
8024
8025 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008026}
8027
Paul Duffin5556c5f2022-06-09 17:32:21 +00008028func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008029 preparers := android.GroupFixturePreparers(
8030 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008031 prepareForTestWithBootclasspathFragment,
8032 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008033 PrepareForTestWithApexBuildComponents,
8034 ).
8035 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008036 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008037
8038 bpBase := `
8039 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008040 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008041 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008042 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008043 set: "myapex.apks",
8044 }
8045
8046 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008047 name: "com.mycompany.android.art",
8048 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008049 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008050 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008051 set: "company-myapex.apks",
8052 }
8053
8054 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008055 name: "art-bootclasspath-fragment",
8056 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008057 hidden_api: {
8058 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8059 metadata: "my-bootclasspath-fragment/metadata.csv",
8060 index: "my-bootclasspath-fragment/index.csv",
8061 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8062 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8063 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008064 %s
8065 }
8066 `
8067
8068 t.Run("java_import", func(t *testing.T) {
8069 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8070 java_import {
8071 name: "libfoo",
8072 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008073 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008074 }
8075 `)
8076 })
8077
8078 t.Run("java_sdk_library_import", func(t *testing.T) {
8079 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8080 java_sdk_library_import {
8081 name: "libfoo",
8082 public: {
8083 jars: ["libbar.jar"],
8084 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008085 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008086 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008087 }
8088 `)
8089 })
8090
8091 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8092 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8093 image_name: "art",
8094 contents: ["libfoo"],
8095 `)+`
8096 java_sdk_library_import {
8097 name: "libfoo",
8098 public: {
8099 jars: ["libbar.jar"],
8100 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008101 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008102 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008103 }
8104 `)
8105 })
8106}
8107
Paul Duffin5556c5f2022-06-09 17:32:21 +00008108func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8109 preparers := android.GroupFixturePreparers(
8110 java.PrepareForTestWithJavaDefaultModules,
8111 PrepareForTestWithApexBuildComponents,
8112 )
8113
Spandan Das59a4a2b2024-01-09 21:35:56 +00008114 errCtx := moduleErrorfTestCtx{}
8115
Paul Duffin5556c5f2022-06-09 17:32:21 +00008116 bpBase := `
8117 apex_set {
8118 name: "com.android.myapex",
8119 installable: true,
8120 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8121 set: "myapex.apks",
8122 }
8123
8124 apex_set {
8125 name: "com.android.myapex_compressed",
8126 apex_name: "com.android.myapex",
8127 installable: true,
8128 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8129 set: "myapex_compressed.apks",
8130 }
8131
8132 prebuilt_bootclasspath_fragment {
8133 name: "my-bootclasspath-fragment",
8134 apex_available: [
8135 "com.android.myapex",
8136 "com.android.myapex_compressed",
8137 ],
8138 hidden_api: {
8139 annotation_flags: "annotation-flags.csv",
8140 metadata: "metadata.csv",
8141 index: "index.csv",
8142 signature_patterns: "signature_patterns.csv",
8143 },
8144 %s
8145 }
8146 `
8147
8148 t.Run("java_import", func(t *testing.T) {
8149 result := preparers.RunTestWithBp(t,
8150 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8151 java_import {
8152 name: "libfoo",
8153 jars: ["libfoo.jar"],
8154 apex_available: [
8155 "com.android.myapex",
8156 "com.android.myapex_compressed",
8157 ],
8158 }
8159 `)
8160
8161 module := result.Module("libfoo", "android_common_com.android.myapex")
8162 usesLibraryDep := module.(java.UsesLibraryDependency)
8163 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008164 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008165 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008166 })
8167
8168 t.Run("java_sdk_library_import", func(t *testing.T) {
8169 result := preparers.RunTestWithBp(t,
8170 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8171 java_sdk_library_import {
8172 name: "libfoo",
8173 public: {
8174 jars: ["libbar.jar"],
8175 },
8176 apex_available: [
8177 "com.android.myapex",
8178 "com.android.myapex_compressed",
8179 ],
8180 compile_dex: true,
8181 }
8182 `)
8183
8184 module := result.Module("libfoo", "android_common_com.android.myapex")
8185 usesLibraryDep := module.(java.UsesLibraryDependency)
8186 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008187 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008188 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008189 })
8190
8191 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8192 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8193 image_name: "art",
8194 contents: ["libfoo"],
8195 `)+`
8196 java_sdk_library_import {
8197 name: "libfoo",
8198 public: {
8199 jars: ["libbar.jar"],
8200 },
8201 apex_available: [
8202 "com.android.myapex",
8203 "com.android.myapex_compressed",
8204 ],
8205 compile_dex: true,
8206 }
8207 `)
8208 })
8209}
8210
Jooyung Han548640b2020-04-27 12:10:30 +09008211func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8212 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8213 apex {
8214 name: "myapex",
8215 key: "myapex.key",
8216 updatable: true,
8217 }
8218
8219 apex_key {
8220 name: "myapex.key",
8221 public_key: "testkey.avbpubkey",
8222 private_key: "testkey.pem",
8223 }
8224 `)
8225}
8226
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008227func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8228 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8229 apex {
8230 name: "myapex",
8231 key: "myapex.key",
8232 }
8233
8234 apex_key {
8235 name: "myapex.key",
8236 public_key: "testkey.avbpubkey",
8237 private_key: "testkey.pem",
8238 }
8239 `)
8240}
8241
Jooyung Handfc864c2023-03-20 18:19:07 +09008242func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8243 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008244 apex {
8245 name: "myapex",
8246 key: "myapex.key",
8247 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008248 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008249 soc_specific: true,
8250 }
8251
8252 apex_key {
8253 name: "myapex.key",
8254 public_key: "testkey.avbpubkey",
8255 private_key: "testkey.pem",
8256 }
8257 `)
8258}
8259
Jooyung Han02873da2023-03-22 17:41:03 +09008260func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8261 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8262 apex {
8263 name: "myapex",
8264 key: "myapex.key",
8265 updatable: false,
8266 min_sdk_version: "29",
8267 use_vndk_as_stable: true,
8268 vendor: true,
8269 }
8270
8271 apex_key {
8272 name: "myapex.key",
8273 public_key: "testkey.avbpubkey",
8274 private_key: "testkey.pem",
8275 }
8276 `)
8277}
8278
Jooyung Handfc864c2023-03-20 18:19:07 +09008279func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8280 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8281 apex {
8282 name: "myapex",
8283 key: "myapex.key",
8284 updatable: false,
8285 use_vndk_as_stable: true,
8286 }
8287
8288 apex_key {
8289 name: "myapex.key",
8290 public_key: "testkey.avbpubkey",
8291 private_key: "testkey.pem",
8292 }
8293 `)
8294}
8295
satayevb98371c2021-06-15 16:49:50 +01008296func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8297 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8298 apex {
8299 name: "myapex",
8300 key: "myapex.key",
8301 systemserverclasspath_fragments: [
8302 "mysystemserverclasspathfragment",
8303 ],
8304 min_sdk_version: "29",
8305 updatable: true,
8306 }
8307
8308 apex_key {
8309 name: "myapex.key",
8310 public_key: "testkey.avbpubkey",
8311 private_key: "testkey.pem",
8312 }
8313
8314 java_library {
8315 name: "foo",
8316 srcs: ["b.java"],
8317 min_sdk_version: "29",
8318 installable: true,
8319 apex_available: [
8320 "myapex",
8321 ],
8322 }
8323
8324 systemserverclasspath_fragment {
8325 name: "mysystemserverclasspathfragment",
8326 generate_classpaths_proto: false,
8327 contents: [
8328 "foo",
8329 ],
8330 apex_available: [
8331 "myapex",
8332 ],
8333 }
satayevabcd5972021-08-06 17:49:46 +01008334 `,
8335 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8336 )
satayevb98371c2021-06-15 16:49:50 +01008337}
8338
Paul Duffin064b70c2020-11-02 17:32:38 +00008339func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008340 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008341 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008342 fragment := java.ApexVariantReference{
8343 Apex: proptools.StringPtr("myapex"),
8344 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8345 }
8346
Paul Duffin064b70c2020-11-02 17:32:38 +00008347 testDexpreoptWithApexes(t, `
8348 prebuilt_apex {
8349 name: "myapex" ,
8350 arch: {
8351 arm64: {
8352 src: "myapex-arm64.apex",
8353 },
8354 arm: {
8355 src: "myapex-arm.apex",
8356 },
8357 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008358 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8359 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008360
Paul Duffin89f570a2021-06-16 01:42:33 +01008361 prebuilt_bootclasspath_fragment {
8362 name: "my-bootclasspath-fragment",
8363 contents: ["libfoo"],
8364 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008365 hidden_api: {
8366 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8367 metadata: "my-bootclasspath-fragment/metadata.csv",
8368 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008369 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8370 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8371 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008372 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008373 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008374
Paul Duffin89f570a2021-06-16 01:42:33 +01008375 java_import {
8376 name: "libfoo",
8377 jars: ["libfoo.jar"],
8378 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008379 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008380 }
8381 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008382 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008383}
8384
Spandan Dasf14e2542021-11-12 00:01:37 +00008385func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008386 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008387 bp += `
8388 apex_key {
8389 name: "myapex.key",
8390 public_key: "testkey.avbpubkey",
8391 private_key: "testkey.pem",
8392 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008393 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008394 "lib1/src/A.java": nil,
8395 "lib2/src/B.java": nil,
8396 "system/sepolicy/apex/myapex-file_contexts": nil,
8397 }
8398
Paul Duffin45338f02021-03-30 23:07:52 +01008399 errorHandler := android.FixtureExpectsNoErrors
8400 if errmsg != "" {
8401 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008402 }
Colin Crossae8600b2020-10-29 17:09:13 -07008403
Paul Duffin45338f02021-03-30 23:07:52 +01008404 android.GroupFixturePreparers(
8405 android.PrepareForTestWithAndroidBuildComponents,
8406 java.PrepareForTestWithJavaBuildComponents,
8407 PrepareForTestWithApexBuildComponents,
8408 android.PrepareForTestWithNeverallowRules(rules),
8409 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008410 apexBootJars := make([]string, 0, len(bootJars))
8411 for _, apexBootJar := range bootJars {
8412 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008413 }
satayevd604b212021-07-21 14:23:52 +01008414 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008415 }),
8416 fs.AddToFixture(),
8417 ).
8418 ExtendWithErrorHandler(errorHandler).
8419 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008420}
8421
8422func TestApexPermittedPackagesRules(t *testing.T) {
8423 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008424 name string
8425 expectedError string
8426 bp string
8427 bootJars []string
8428 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008429 }{
8430
8431 {
8432 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8433 expectedError: "",
8434 bp: `
8435 java_library {
8436 name: "bcp_lib1",
8437 srcs: ["lib1/src/*.java"],
8438 permitted_packages: ["foo.bar"],
8439 apex_available: ["myapex"],
8440 sdk_version: "none",
8441 system_modules: "none",
8442 }
8443 java_library {
8444 name: "nonbcp_lib2",
8445 srcs: ["lib2/src/*.java"],
8446 apex_available: ["myapex"],
8447 permitted_packages: ["a.b"],
8448 sdk_version: "none",
8449 system_modules: "none",
8450 }
8451 apex {
8452 name: "myapex",
8453 key: "myapex.key",
8454 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008455 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008456 }`,
8457 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008458 bcpPermittedPackages: map[string][]string{
8459 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008460 "foo.bar",
8461 },
8462 },
8463 },
8464 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008465 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008466 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 +01008467 bp: `
8468 java_library {
8469 name: "bcp_lib1",
8470 srcs: ["lib1/src/*.java"],
8471 apex_available: ["myapex"],
8472 permitted_packages: ["foo.bar"],
8473 sdk_version: "none",
8474 system_modules: "none",
8475 }
8476 java_library {
8477 name: "bcp_lib2",
8478 srcs: ["lib2/src/*.java"],
8479 apex_available: ["myapex"],
8480 permitted_packages: ["foo.bar", "bar.baz"],
8481 sdk_version: "none",
8482 system_modules: "none",
8483 }
8484 apex {
8485 name: "myapex",
8486 key: "myapex.key",
8487 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008488 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008489 }
8490 `,
8491 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008492 bcpPermittedPackages: map[string][]string{
8493 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008494 "foo.bar",
8495 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008496 "bcp_lib2": []string{
8497 "foo.bar",
8498 },
8499 },
8500 },
8501 {
8502 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8503 expectedError: "",
8504 bp: `
8505 java_library {
8506 name: "bcp_lib_restricted",
8507 srcs: ["lib1/src/*.java"],
8508 apex_available: ["myapex"],
8509 permitted_packages: ["foo.bar"],
8510 sdk_version: "none",
8511 min_sdk_version: "29",
8512 system_modules: "none",
8513 }
8514 java_library {
8515 name: "bcp_lib_unrestricted",
8516 srcs: ["lib2/src/*.java"],
8517 apex_available: ["myapex"],
8518 permitted_packages: ["foo.bar", "bar.baz"],
8519 sdk_version: "none",
8520 min_sdk_version: "29",
8521 system_modules: "none",
8522 }
8523 apex {
8524 name: "myapex",
8525 key: "myapex.key",
8526 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8527 updatable: true,
8528 min_sdk_version: "29",
8529 }
8530 `,
8531 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8532 bcpPermittedPackages: map[string][]string{
8533 "bcp_lib1_non_updateable": []string{
8534 "foo.bar",
8535 },
8536 // 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 +01008537 },
8538 },
8539 }
8540 for _, tc := range testcases {
8541 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008542 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8543 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008544 })
8545 }
8546}
8547
Jiyong Park62304bb2020-04-13 16:19:48 +09008548func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008549 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008550 apex {
8551 name: "myapex",
8552 key: "myapex.key",
8553 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008554 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008555 }
8556
8557 apex_key {
8558 name: "myapex.key",
8559 public_key: "testkey.avbpubkey",
8560 private_key: "testkey.pem",
8561 }
8562
8563 cc_library {
8564 name: "mylib",
8565 srcs: ["mylib.cpp"],
8566 system_shared_libs: [],
8567 stl: "none",
8568 stubs: {
8569 versions: ["1"],
8570 },
8571 apex_available: ["myapex"],
8572 }
8573
8574 cc_library {
8575 name: "myprivlib",
8576 srcs: ["mylib.cpp"],
8577 system_shared_libs: [],
8578 stl: "none",
8579 apex_available: ["myapex"],
8580 }
8581
8582
8583 cc_test {
8584 name: "mytest",
8585 gtest: false,
8586 srcs: ["mylib.cpp"],
8587 system_shared_libs: [],
8588 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008589 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008590 test_for: ["myapex"]
8591 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008592
8593 cc_library {
8594 name: "mytestlib",
8595 srcs: ["mylib.cpp"],
8596 system_shared_libs: [],
8597 shared_libs: ["mylib", "myprivlib"],
8598 stl: "none",
8599 test_for: ["myapex"],
8600 }
8601
8602 cc_benchmark {
8603 name: "mybench",
8604 srcs: ["mylib.cpp"],
8605 system_shared_libs: [],
8606 shared_libs: ["mylib", "myprivlib"],
8607 stl: "none",
8608 test_for: ["myapex"],
8609 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008610 `)
8611
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008612 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008613 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008614 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8615 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8616 }
8617
8618 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008619 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008620 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8621 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8622 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8623}
Jiyong Park46a512f2020-12-04 18:02:13 +09008624
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008625func TestIndirectTestFor(t *testing.T) {
8626 ctx := testApex(t, `
8627 apex {
8628 name: "myapex",
8629 key: "myapex.key",
8630 native_shared_libs: ["mylib", "myprivlib"],
8631 updatable: false,
8632 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008633
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008634 apex_key {
8635 name: "myapex.key",
8636 public_key: "testkey.avbpubkey",
8637 private_key: "testkey.pem",
8638 }
8639
8640 cc_library {
8641 name: "mylib",
8642 srcs: ["mylib.cpp"],
8643 system_shared_libs: [],
8644 stl: "none",
8645 stubs: {
8646 versions: ["1"],
8647 },
8648 apex_available: ["myapex"],
8649 }
8650
8651 cc_library {
8652 name: "myprivlib",
8653 srcs: ["mylib.cpp"],
8654 system_shared_libs: [],
8655 stl: "none",
8656 shared_libs: ["mylib"],
8657 apex_available: ["myapex"],
8658 }
8659
8660 cc_library {
8661 name: "mytestlib",
8662 srcs: ["mylib.cpp"],
8663 system_shared_libs: [],
8664 shared_libs: ["myprivlib"],
8665 stl: "none",
8666 test_for: ["myapex"],
8667 }
8668 `)
8669
8670 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008671 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008672 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8673 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8674 }
8675
8676 // The platform variant of mytestlib links to the platform variant of the
8677 // internal myprivlib.
8678 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8679
8680 // The platform variant of myprivlib links to the platform variant of mylib
8681 // and bypasses its stubs.
8682 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 +09008683}
8684
Martin Stjernholmec009002021-03-27 15:18:31 +00008685func TestTestForForLibInOtherApex(t *testing.T) {
8686 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8687 _ = testApex(t, `
8688 apex {
8689 name: "com.android.art",
8690 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008691 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008692 updatable: false,
8693 }
8694
8695 apex {
8696 name: "com.android.art.debug",
8697 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008698 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008699 updatable: false,
8700 }
8701
8702 apex_key {
8703 name: "myapex.key",
8704 public_key: "testkey.avbpubkey",
8705 private_key: "testkey.pem",
8706 }
8707
8708 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008709 name: "libnativebridge",
8710 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008711 system_shared_libs: [],
8712 stl: "none",
8713 stubs: {
8714 versions: ["1"],
8715 },
8716 apex_available: ["com.android.art", "com.android.art.debug"],
8717 }
8718
8719 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008720 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008721 srcs: ["mylib.cpp"],
8722 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008723 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008724 stl: "none",
8725 apex_available: ["com.android.art.debug"],
8726 test_for: ["com.android.art"],
8727 }
8728 `,
8729 android.MockFS{
8730 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8731 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8732 }.AddToFixture())
8733}
8734
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008735// TODO(jungjw): Move this to proptools
8736func intPtr(i int) *int {
8737 return &i
8738}
8739
8740func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008741 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008742 apex_set {
8743 name: "myapex",
8744 set: "myapex.apks",
8745 filename: "foo_v2.apex",
8746 overrides: ["foo"],
8747 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008748 `,
8749 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8750 variables.Platform_sdk_version = intPtr(30)
8751 }),
8752 android.FixtureModifyConfig(func(config android.Config) {
8753 config.Targets[android.Android] = []android.Target{
8754 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8755 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8756 }
8757 }),
8758 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008759
Spandan Das3576e762024-01-03 18:57:03 +00008760 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008761
8762 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008763 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008764 actual := extractedApex.Args["abis"]
8765 expected := "ARMEABI_V7A,ARM64_V8A"
8766 if actual != expected {
8767 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8768 }
8769 actual = extractedApex.Args["sdk-version"]
8770 expected = "30"
8771 if actual != expected {
8772 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8773 }
8774
Paul Duffin6717d882021-06-15 19:09:41 +01008775 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008776 a := m.Module().(*ApexSet)
8777 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008778 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008779 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8780 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8781 }
8782}
8783
Anton Hansson805e0a52022-11-25 14:06:46 +00008784func TestApexSet_NativeBridge(t *testing.T) {
8785 ctx := testApex(t, `
8786 apex_set {
8787 name: "myapex",
8788 set: "myapex.apks",
8789 filename: "foo_v2.apex",
8790 overrides: ["foo"],
8791 }
8792 `,
8793 android.FixtureModifyConfig(func(config android.Config) {
8794 config.Targets[android.Android] = []android.Target{
8795 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8796 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8797 }
8798 }),
8799 )
8800
Spandan Das3576e762024-01-03 18:57:03 +00008801 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008802
8803 // Check extract_apks tool parameters. No native bridge arch expected
8804 extractedApex := m.Output("extracted/myapex.apks")
8805 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8806}
8807
Jiyong Park7d95a512020-05-10 15:16:24 +09008808func TestNoStaticLinkingToStubsLib(t *testing.T) {
8809 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8810 apex {
8811 name: "myapex",
8812 key: "myapex.key",
8813 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008814 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008815 }
8816
8817 apex_key {
8818 name: "myapex.key",
8819 public_key: "testkey.avbpubkey",
8820 private_key: "testkey.pem",
8821 }
8822
8823 cc_library {
8824 name: "mylib",
8825 srcs: ["mylib.cpp"],
8826 static_libs: ["otherlib"],
8827 system_shared_libs: [],
8828 stl: "none",
8829 apex_available: [ "myapex" ],
8830 }
8831
8832 cc_library {
8833 name: "otherlib",
8834 srcs: ["mylib.cpp"],
8835 system_shared_libs: [],
8836 stl: "none",
8837 stubs: {
8838 versions: ["1", "2", "3"],
8839 },
8840 apex_available: [ "myapex" ],
8841 }
8842 `)
8843}
8844
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008845func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008846 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008847 apex {
8848 name: "myapex",
8849 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008850 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008851 custom_sign_tool: "sign_myapex",
8852 }
8853
8854 apex_key {
8855 name: "myapex.key",
8856 public_key: "testkey.avbpubkey",
8857 private_key: "testkey.pem",
8858 }
8859 `)
8860
Jooyung Han286957d2023-10-30 16:17:56 +09008861 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008862 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008863 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 +09008864}
8865
8866func TestApexKeysTxtOverrides(t *testing.T) {
8867 ctx := testApex(t, `
8868 apex {
8869 name: "myapex",
8870 key: "myapex.key",
8871 updatable: false,
8872 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008873 }
8874
8875 apex_key {
8876 name: "myapex.key",
8877 public_key: "testkey.avbpubkey",
8878 private_key: "testkey.pem",
8879 }
8880
8881 prebuilt_apex {
8882 name: "myapex",
8883 prefer: true,
8884 arch: {
8885 arm64: {
8886 src: "myapex-arm64.apex",
8887 },
8888 arm: {
8889 src: "myapex-arm.apex",
8890 },
8891 },
8892 }
8893
8894 apex_set {
8895 name: "myapex_set",
8896 set: "myapex.apks",
8897 filename: "myapex_set.apex",
8898 overrides: ["myapex"],
8899 }
8900 `)
8901
Colin Crossf61d03d2023-11-02 16:56:39 -07008902 content := android.ContentFromFileRuleForTests(t, ctx,
8903 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008904 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 -07008905 content = android.ContentFromFileRuleForTests(t, ctx,
8906 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008907 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 +09008908}
8909
Jooyung Han938b5932020-06-20 12:47:47 +09008910func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008911 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008912 apex {
8913 name: "myapex",
8914 key: "myapex.key",
8915 apps: ["app"],
8916 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008917 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008918 }
8919
8920 apex_key {
8921 name: "myapex.key",
8922 public_key: "testkey.avbpubkey",
8923 private_key: "testkey.pem",
8924 }
8925
8926 android_app {
8927 name: "app",
8928 srcs: ["foo/bar/MyClass.java"],
8929 package_name: "foo",
8930 sdk_version: "none",
8931 system_modules: "none",
8932 apex_available: [ "myapex" ],
8933 }
8934 `, withFiles(map[string][]byte{
8935 "sub/Android.bp": []byte(`
8936 override_apex {
8937 name: "override_myapex",
8938 base: "myapex",
8939 apps: ["override_app"],
8940 allowed_files: ":allowed",
8941 }
8942 // Overridable "path" property should be referenced indirectly
8943 filegroup {
8944 name: "allowed",
8945 srcs: ["allowed.txt"],
8946 }
8947 override_android_app {
8948 name: "override_app",
8949 base: "app",
8950 package_name: "bar",
8951 }
8952 `),
8953 }))
8954
Jooyung Hana0503a52023-08-23 13:12:50 +09008955 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008956 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8957 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8958 }
8959
Jooyung Hana0503a52023-08-23 13:12:50 +09008960 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008961 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8962 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8963 }
8964}
8965
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008966func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008967 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008968 apex {
8969 name: "myapex",
8970 key: "myapex.key",
8971 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008972 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008973 }
8974
8975 apex_key {
8976 name: "myapex.key",
8977 public_key: "testkey.avbpubkey",
8978 private_key: "testkey.pem",
8979 }
8980
8981 cc_library {
8982 name: "mylib",
8983 srcs: ["mylib.cpp"],
8984 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008985 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008986 },
8987 apex_available: ["myapex"],
8988 }
8989
8990 cc_prebuilt_library_shared {
8991 name: "mylib",
8992 prefer: false,
8993 srcs: ["prebuilt.so"],
8994 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008995 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008996 },
8997 apex_available: ["myapex"],
8998 }
8999 `)
9000}
9001
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009002func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009003 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009004 apex {
9005 name: "myapex",
9006 key: "myapex.key",
9007 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009008 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009009 }
9010 apex_key {
9011 name: "myapex.key",
9012 public_key: "testkey.avbpubkey",
9013 private_key: "testkey.pem",
9014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009015 `,
9016 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9017 variables.CompressedApex = proptools.BoolPtr(true)
9018 }),
9019 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009020
Jooyung Hana0503a52023-08-23 13:12:50 +09009021 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009022 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9023
Jooyung Hana0503a52023-08-23 13:12:50 +09009024 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009025 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9026
9027 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009028 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009029 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9030
9031 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009032 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009033 var builder strings.Builder
9034 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9035 androidMk := builder.String()
9036 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9037}
9038
Martin Stjernholm2856c662020-12-02 15:03:42 +00009039func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009040 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009041 apex {
9042 name: "myapex",
9043 key: "myapex.key",
9044 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009045 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009046 }
9047
9048 apex_key {
9049 name: "myapex.key",
9050 public_key: "testkey.avbpubkey",
9051 private_key: "testkey.pem",
9052 }
9053
9054 cc_library {
9055 name: "mylib",
9056 srcs: ["mylib.cpp"],
9057 apex_available: ["myapex"],
9058 shared_libs: ["otherlib"],
9059 system_shared_libs: [],
9060 }
9061
9062 cc_library {
9063 name: "otherlib",
9064 srcs: ["mylib.cpp"],
9065 stubs: {
9066 versions: ["current"],
9067 },
9068 }
9069
9070 cc_prebuilt_library_shared {
9071 name: "otherlib",
9072 prefer: true,
9073 srcs: ["prebuilt.so"],
9074 stubs: {
9075 versions: ["current"],
9076 },
9077 }
9078 `)
9079
Jooyung Hana0503a52023-08-23 13:12:50 +09009080 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009081 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009082 var builder strings.Builder
9083 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9084 androidMk := builder.String()
9085
9086 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9087 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009088 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009089}
9090
Jiyong Parke3867542020-12-03 17:28:25 +09009091func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009092 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009093 apex {
9094 name: "myapex",
9095 key: "myapex.key",
9096 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009097 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009098 }
9099
9100 apex_key {
9101 name: "myapex.key",
9102 public_key: "testkey.avbpubkey",
9103 private_key: "testkey.pem",
9104 }
9105
9106 cc_library {
9107 name: "mylib",
9108 srcs: ["mylib.cpp"],
9109 system_shared_libs: [],
9110 stl: "none",
9111 apex_available: ["myapex"],
9112 shared_libs: ["mylib2"],
9113 target: {
9114 apex: {
9115 exclude_shared_libs: ["mylib2"],
9116 },
9117 },
9118 }
9119
9120 cc_library {
9121 name: "mylib2",
9122 srcs: ["mylib.cpp"],
9123 system_shared_libs: [],
9124 stl: "none",
9125 }
9126 `)
9127
9128 // Check if mylib is linked to mylib2 for the non-apex target
9129 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9130 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9131
9132 // Make sure that the link doesn't occur for the apex target
9133 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9134 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9135
9136 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009137 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009138 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9139}
9140
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009141func TestPrebuiltStubLibDep(t *testing.T) {
9142 bpBase := `
9143 apex {
9144 name: "myapex",
9145 key: "myapex.key",
9146 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009147 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009148 }
9149 apex_key {
9150 name: "myapex.key",
9151 public_key: "testkey.avbpubkey",
9152 private_key: "testkey.pem",
9153 }
9154 cc_library {
9155 name: "mylib",
9156 srcs: ["mylib.cpp"],
9157 apex_available: ["myapex"],
9158 shared_libs: ["stublib"],
9159 system_shared_libs: [],
9160 }
9161 apex {
9162 name: "otherapex",
9163 enabled: %s,
9164 key: "myapex.key",
9165 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009166 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009167 }
9168 `
9169
9170 stublibSourceBp := `
9171 cc_library {
9172 name: "stublib",
9173 srcs: ["mylib.cpp"],
9174 apex_available: ["otherapex"],
9175 system_shared_libs: [],
9176 stl: "none",
9177 stubs: {
9178 versions: ["1"],
9179 },
9180 }
9181 `
9182
9183 stublibPrebuiltBp := `
9184 cc_prebuilt_library_shared {
9185 name: "stublib",
9186 srcs: ["prebuilt.so"],
9187 apex_available: ["otherapex"],
9188 stubs: {
9189 versions: ["1"],
9190 },
9191 %s
9192 }
9193 `
9194
9195 tests := []struct {
9196 name string
9197 stublibBp string
9198 usePrebuilt bool
9199 modNames []string // Modules to collect AndroidMkEntries for
9200 otherApexEnabled []string
9201 }{
9202 {
9203 name: "only_source",
9204 stublibBp: stublibSourceBp,
9205 usePrebuilt: false,
9206 modNames: []string{"stublib"},
9207 otherApexEnabled: []string{"true", "false"},
9208 },
9209 {
9210 name: "source_preferred",
9211 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9212 usePrebuilt: false,
9213 modNames: []string{"stublib", "prebuilt_stublib"},
9214 otherApexEnabled: []string{"true", "false"},
9215 },
9216 {
9217 name: "prebuilt_preferred",
9218 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9219 usePrebuilt: true,
9220 modNames: []string{"stublib", "prebuilt_stublib"},
9221 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9222 },
9223 {
9224 name: "only_prebuilt",
9225 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9226 usePrebuilt: true,
9227 modNames: []string{"stublib"},
9228 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9229 },
9230 }
9231
9232 for _, test := range tests {
9233 t.Run(test.name, func(t *testing.T) {
9234 for _, otherApexEnabled := range test.otherApexEnabled {
9235 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009236 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009237
9238 type modAndMkEntries struct {
9239 mod *cc.Module
9240 mkEntries android.AndroidMkEntries
9241 }
9242 entries := []*modAndMkEntries{}
9243
9244 // Gather shared lib modules that are installable
9245 for _, modName := range test.modNames {
9246 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9247 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9248 continue
9249 }
9250 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009251 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009252 continue
9253 }
Colin Crossaa255532020-07-03 13:18:24 -07009254 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009255 if ent.Disabled {
9256 continue
9257 }
9258 entries = append(entries, &modAndMkEntries{
9259 mod: mod,
9260 mkEntries: ent,
9261 })
9262 }
9263 }
9264 }
9265
9266 var entry *modAndMkEntries = nil
9267 for _, ent := range entries {
9268 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9269 if entry != nil {
9270 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9271 } else {
9272 entry = ent
9273 }
9274 }
9275 }
9276
9277 if entry == nil {
9278 t.Errorf("AndroidMk entry for \"stublib\" missing")
9279 } else {
9280 isPrebuilt := entry.mod.Prebuilt() != nil
9281 if isPrebuilt != test.usePrebuilt {
9282 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9283 }
9284 if !entry.mod.IsStubs() {
9285 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9286 }
9287 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9288 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9289 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009290 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009291 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009292 if !android.InList(expected, cflags) {
9293 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9294 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009295 }
9296 })
9297 }
9298 })
9299 }
9300}
9301
Colin Crossc33e5212021-05-25 18:16:02 -07009302func TestApexJavaCoverage(t *testing.T) {
9303 bp := `
9304 apex {
9305 name: "myapex",
9306 key: "myapex.key",
9307 java_libs: ["mylib"],
9308 bootclasspath_fragments: ["mybootclasspathfragment"],
9309 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9310 updatable: false,
9311 }
9312
9313 apex_key {
9314 name: "myapex.key",
9315 public_key: "testkey.avbpubkey",
9316 private_key: "testkey.pem",
9317 }
9318
9319 java_library {
9320 name: "mylib",
9321 srcs: ["mylib.java"],
9322 apex_available: ["myapex"],
9323 compile_dex: true,
9324 }
9325
9326 bootclasspath_fragment {
9327 name: "mybootclasspathfragment",
9328 contents: ["mybootclasspathlib"],
9329 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009330 hidden_api: {
9331 split_packages: ["*"],
9332 },
Colin Crossc33e5212021-05-25 18:16:02 -07009333 }
9334
9335 java_library {
9336 name: "mybootclasspathlib",
9337 srcs: ["mybootclasspathlib.java"],
9338 apex_available: ["myapex"],
9339 compile_dex: true,
9340 }
9341
9342 systemserverclasspath_fragment {
9343 name: "mysystemserverclasspathfragment",
9344 contents: ["mysystemserverclasspathlib"],
9345 apex_available: ["myapex"],
9346 }
9347
9348 java_library {
9349 name: "mysystemserverclasspathlib",
9350 srcs: ["mysystemserverclasspathlib.java"],
9351 apex_available: ["myapex"],
9352 compile_dex: true,
9353 }
9354 `
9355
9356 result := android.GroupFixturePreparers(
9357 PrepareForTestWithApexBuildComponents,
9358 prepareForTestWithMyapex,
9359 java.PrepareForTestWithJavaDefaultModules,
9360 android.PrepareForTestWithAndroidBuildComponents,
9361 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009362 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9363 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009364 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009365 ).RunTest(t)
9366
9367 // Make sure jacoco ran on both mylib and mybootclasspathlib
9368 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9369 t.Errorf("Failed to find jacoco rule for mylib")
9370 }
9371 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9372 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9373 }
9374 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9375 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9376 }
9377}
9378
Jiyong Park192600a2021-08-03 07:52:17 +00009379func TestProhibitStaticExecutable(t *testing.T) {
9380 testApexError(t, `executable mybin is static`, `
9381 apex {
9382 name: "myapex",
9383 key: "myapex.key",
9384 binaries: ["mybin"],
9385 min_sdk_version: "29",
9386 }
9387
9388 apex_key {
9389 name: "myapex.key",
9390 public_key: "testkey.avbpubkey",
9391 private_key: "testkey.pem",
9392 }
9393
9394 cc_binary {
9395 name: "mybin",
9396 srcs: ["mylib.cpp"],
9397 relative_install_path: "foo/bar",
9398 static_executable: true,
9399 system_shared_libs: [],
9400 stl: "none",
9401 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009402 min_sdk_version: "29",
9403 }
9404 `)
9405
9406 testApexError(t, `executable mybin.rust is static`, `
9407 apex {
9408 name: "myapex",
9409 key: "myapex.key",
9410 binaries: ["mybin.rust"],
9411 min_sdk_version: "29",
9412 }
9413
9414 apex_key {
9415 name: "myapex.key",
9416 public_key: "testkey.avbpubkey",
9417 private_key: "testkey.pem",
9418 }
9419
9420 rust_binary {
9421 name: "mybin.rust",
9422 srcs: ["foo.rs"],
9423 static_executable: true,
9424 apex_available: ["myapex"],
9425 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009426 }
9427 `)
9428}
9429
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009430func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9431 ctx := testApex(t, `
9432 apex {
9433 name: "myapex",
9434 key: "myapex.key",
9435 updatable: false,
9436 java_libs: ["foo"],
9437 }
9438
9439 apex_key {
9440 name: "myapex.key",
9441 public_key: "testkey.avbpubkey",
9442 private_key: "testkey.pem",
9443 }
9444
9445 java_library {
9446 name: "foo",
9447 srcs: ["foo.java"],
9448 apex_available: ["myapex"],
9449 installable: true,
9450 }
9451 `,
9452 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9453 )
9454
Jooyung Hana0503a52023-08-23 13:12:50 +09009455 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009456 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9457 var builder strings.Builder
9458 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9459 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009460 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 +00009461}
9462
9463func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9464 ctx := testApex(t, `
9465 prebuilt_apex {
9466 name: "myapex",
9467 arch: {
9468 arm64: {
9469 src: "myapex-arm64.apex",
9470 },
9471 arm: {
9472 src: "myapex-arm.apex",
9473 },
9474 },
9475 exported_java_libs: ["foo"],
9476 }
9477
9478 java_import {
9479 name: "foo",
9480 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009481 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009482 }
9483 `,
9484 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9485 )
9486
9487 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9488 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9489 mainModuleEntries := entriesList[0]
9490 android.AssertArrayString(t,
9491 "LOCAL_REQUIRED_MODULES",
9492 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9493 []string{
9494 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9495 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9496 })
9497}
9498
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009499func TestAndroidMk_RequiredModules(t *testing.T) {
9500 ctx := testApex(t, `
9501 apex {
9502 name: "myapex",
9503 key: "myapex.key",
9504 updatable: false,
9505 java_libs: ["foo"],
9506 required: ["otherapex"],
9507 }
9508
9509 apex {
9510 name: "otherapex",
9511 key: "myapex.key",
9512 updatable: false,
9513 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009514 }
9515
9516 apex_key {
9517 name: "myapex.key",
9518 public_key: "testkey.avbpubkey",
9519 private_key: "testkey.pem",
9520 }
9521
9522 java_library {
9523 name: "foo",
9524 srcs: ["foo.java"],
9525 apex_available: ["myapex", "otherapex"],
9526 installable: true,
9527 }
9528 `)
9529
Jooyung Hana0503a52023-08-23 13:12:50 +09009530 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009531 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9532 var builder strings.Builder
9533 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9534 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009535 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009536}
9537
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009538func TestAndroidMk_RequiredDeps(t *testing.T) {
9539 ctx := testApex(t, `
9540 apex {
9541 name: "myapex",
9542 key: "myapex.key",
9543 updatable: false,
9544 }
9545
9546 apex_key {
9547 name: "myapex.key",
9548 public_key: "testkey.avbpubkey",
9549 private_key: "testkey.pem",
9550 }
9551 `)
9552
Jooyung Hana0503a52023-08-23 13:12:50 +09009553 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009554 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009555 data := android.AndroidMkDataForTest(t, ctx, bundle)
9556 var builder strings.Builder
9557 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9558 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009559 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009560}
9561
Jooyung Hana6d36672022-02-24 13:58:07 +09009562func TestApexOutputFileProducer(t *testing.T) {
9563 for _, tc := range []struct {
9564 name string
9565 ref string
9566 expected_data []string
9567 }{
9568 {
9569 name: "test_using_output",
9570 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009571 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009572 },
9573 {
9574 name: "test_using_apex",
9575 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009576 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009577 },
9578 } {
9579 t.Run(tc.name, func(t *testing.T) {
9580 ctx := testApex(t, `
9581 apex {
9582 name: "myapex",
9583 key: "myapex.key",
9584 compressible: true,
9585 updatable: false,
9586 }
9587
9588 apex_key {
9589 name: "myapex.key",
9590 public_key: "testkey.avbpubkey",
9591 private_key: "testkey.pem",
9592 }
9593
9594 java_test {
9595 name: "`+tc.name+`",
9596 srcs: ["a.java"],
9597 data: ["`+tc.ref+`"],
9598 }
9599 `,
9600 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9601 variables.CompressedApex = proptools.BoolPtr(true)
9602 }))
9603 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9604 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9605 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9606 })
9607 }
9608}
9609
satayev758968a2021-12-06 11:42:40 +00009610func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9611 preparer := android.GroupFixturePreparers(
9612 PrepareForTestWithApexBuildComponents,
9613 prepareForTestWithMyapex,
9614 java.PrepareForTestWithJavaSdkLibraryFiles,
9615 java.PrepareForTestWithJavaDefaultModules,
9616 android.PrepareForTestWithAndroidBuildComponents,
9617 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9618 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9619 )
9620
9621 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9622 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9623 preparer.RunTestWithBp(t, `
9624 apex {
9625 name: "myapex",
9626 key: "myapex.key",
9627 bootclasspath_fragments: ["mybootclasspathfragment"],
9628 min_sdk_version: "30",
9629 updatable: false,
9630 }
9631
9632 apex_key {
9633 name: "myapex.key",
9634 public_key: "testkey.avbpubkey",
9635 private_key: "testkey.pem",
9636 }
9637
9638 bootclasspath_fragment {
9639 name: "mybootclasspathfragment",
9640 contents: ["mybootclasspathlib"],
9641 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009642 hidden_api: {
9643 split_packages: ["*"],
9644 },
satayev758968a2021-12-06 11:42:40 +00009645 }
9646
9647 java_sdk_library {
9648 name: "mybootclasspathlib",
9649 srcs: ["mybootclasspathlib.java"],
9650 apex_available: ["myapex"],
9651 compile_dex: true,
9652 unsafe_ignore_missing_latest_api: true,
9653 min_sdk_version: "31",
9654 static_libs: ["util"],
9655 }
9656
9657 java_library {
9658 name: "util",
9659 srcs: ["a.java"],
9660 apex_available: ["myapex"],
9661 min_sdk_version: "31",
9662 static_libs: ["another_util"],
9663 }
9664
9665 java_library {
9666 name: "another_util",
9667 srcs: ["a.java"],
9668 min_sdk_version: "31",
9669 apex_available: ["myapex"],
9670 }
9671 `)
9672 })
9673
9674 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9675 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9676 preparer.RunTestWithBp(t, `
9677 apex {
9678 name: "myapex",
9679 key: "myapex.key",
9680 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9681 min_sdk_version: "30",
9682 updatable: false,
9683 }
9684
9685 apex_key {
9686 name: "myapex.key",
9687 public_key: "testkey.avbpubkey",
9688 private_key: "testkey.pem",
9689 }
9690
9691 systemserverclasspath_fragment {
9692 name: "mysystemserverclasspathfragment",
9693 contents: ["mysystemserverclasspathlib"],
9694 apex_available: ["myapex"],
9695 }
9696
9697 java_sdk_library {
9698 name: "mysystemserverclasspathlib",
9699 srcs: ["mysystemserverclasspathlib.java"],
9700 apex_available: ["myapex"],
9701 compile_dex: true,
9702 min_sdk_version: "32",
9703 unsafe_ignore_missing_latest_api: true,
9704 static_libs: ["util"],
9705 }
9706
9707 java_library {
9708 name: "util",
9709 srcs: ["a.java"],
9710 apex_available: ["myapex"],
9711 min_sdk_version: "31",
9712 static_libs: ["another_util"],
9713 }
9714
9715 java_library {
9716 name: "another_util",
9717 srcs: ["a.java"],
9718 min_sdk_version: "31",
9719 apex_available: ["myapex"],
9720 }
9721 `)
9722 })
9723
9724 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9725 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9726 RunTestWithBp(t, `
9727 apex {
9728 name: "myapex",
9729 key: "myapex.key",
9730 bootclasspath_fragments: ["mybootclasspathfragment"],
9731 min_sdk_version: "30",
9732 updatable: false,
9733 }
9734
9735 apex_key {
9736 name: "myapex.key",
9737 public_key: "testkey.avbpubkey",
9738 private_key: "testkey.pem",
9739 }
9740
9741 bootclasspath_fragment {
9742 name: "mybootclasspathfragment",
9743 contents: ["mybootclasspathlib"],
9744 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009745 hidden_api: {
9746 split_packages: ["*"],
9747 },
satayev758968a2021-12-06 11:42:40 +00009748 }
9749
9750 java_sdk_library {
9751 name: "mybootclasspathlib",
9752 srcs: ["mybootclasspathlib.java"],
9753 apex_available: ["myapex"],
9754 compile_dex: true,
9755 unsafe_ignore_missing_latest_api: true,
9756 }
9757 `)
9758 })
9759
9760 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9761 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9762 RunTestWithBp(t, `
9763 apex {
9764 name: "myapex",
9765 key: "myapex.key",
9766 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9767 min_sdk_version: "30",
9768 updatable: false,
9769 }
9770
9771 apex_key {
9772 name: "myapex.key",
9773 public_key: "testkey.avbpubkey",
9774 private_key: "testkey.pem",
9775 }
9776
9777 systemserverclasspath_fragment {
9778 name: "mysystemserverclasspathfragment",
9779 contents: ["mysystemserverclasspathlib"],
9780 apex_available: ["myapex"],
9781 }
9782
9783 java_sdk_library {
9784 name: "mysystemserverclasspathlib",
9785 srcs: ["mysystemserverclasspathlib.java"],
9786 apex_available: ["myapex"],
9787 compile_dex: true,
9788 unsafe_ignore_missing_latest_api: true,
9789 }
9790 `)
9791 })
9792}
9793
Jiakai Zhang6decef92022-01-12 17:56:19 +00009794// Verifies that the APEX depends on all the Make modules in the list.
9795func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9796 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9797 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009798 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009799 }
9800}
9801
9802// Verifies that the APEX does not depend on any of the Make modules in the list.
9803func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9804 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9805 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009806 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009807 }
9808}
9809
Cole Faust1021ccd2023-02-26 21:15:25 -08009810// TODO(b/193460475): Re-enable this test
9811//func TestApexStrictUpdtabilityLint(t *testing.T) {
9812// bpTemplate := `
9813// apex {
9814// name: "myapex",
9815// key: "myapex.key",
9816// java_libs: ["myjavalib"],
9817// updatable: %v,
9818// min_sdk_version: "29",
9819// }
9820// apex_key {
9821// name: "myapex.key",
9822// }
9823// java_library {
9824// name: "myjavalib",
9825// srcs: ["MyClass.java"],
9826// apex_available: [ "myapex" ],
9827// lint: {
9828// strict_updatability_linting: %v,
9829// },
9830// sdk_version: "current",
9831// min_sdk_version: "29",
9832// }
9833// `
9834// fs := android.MockFS{
9835// "lint-baseline.xml": nil,
9836// }
9837//
9838// testCases := []struct {
9839// testCaseName string
9840// apexUpdatable bool
9841// javaStrictUpdtabilityLint bool
9842// lintFileExists bool
9843// disallowedFlagExpected bool
9844// }{
9845// {
9846// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9847// apexUpdatable: true,
9848// javaStrictUpdtabilityLint: true,
9849// lintFileExists: false,
9850// disallowedFlagExpected: false,
9851// },
9852// {
9853// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9854// apexUpdatable: false,
9855// javaStrictUpdtabilityLint: false,
9856// lintFileExists: true,
9857// disallowedFlagExpected: false,
9858// },
9859// {
9860// testCaseName: "non-updatable apex respects strict updatability of javalib",
9861// apexUpdatable: false,
9862// javaStrictUpdtabilityLint: true,
9863// lintFileExists: true,
9864// disallowedFlagExpected: true,
9865// },
9866// {
9867// testCaseName: "updatable apex sets strict updatability of javalib to true",
9868// apexUpdatable: true,
9869// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9870// lintFileExists: true,
9871// disallowedFlagExpected: true,
9872// },
9873// }
9874//
9875// for _, testCase := range testCases {
9876// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9877// fixtures := []android.FixturePreparer{}
9878// if testCase.lintFileExists {
9879// fixtures = append(fixtures, fs.AddToFixture())
9880// }
9881//
9882// result := testApex(t, bp, fixtures...)
9883// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9884// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9885// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9886//
9887// if disallowedFlagActual != testCase.disallowedFlagExpected {
9888// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9889// }
9890// }
9891//}
9892//
9893//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9894// bp := `
9895// apex {
9896// name: "myapex",
9897// key: "myapex.key",
9898// java_libs: ["myjavalib"],
9899// updatable: true,
9900// min_sdk_version: "29",
9901// }
9902// apex_key {
9903// name: "myapex.key",
9904// }
9905// java_library {
9906// name: "myjavalib",
9907// srcs: ["MyClass.java"],
9908// apex_available: [ "myapex" ],
9909// sdk_version: "current",
9910// min_sdk_version: "29",
9911// }
9912// `
9913//
9914// testCases := []struct {
9915// testCaseName string
9916// moduleDirectory string
9917// disallowedFlagExpected bool
9918// }{
9919// {
9920// testCaseName: "lintable module defined outside libcore",
9921// moduleDirectory: "",
9922// disallowedFlagExpected: true,
9923// },
9924// {
9925// testCaseName: "lintable module defined in libcore root directory",
9926// moduleDirectory: "libcore/",
9927// disallowedFlagExpected: false,
9928// },
9929// {
9930// testCaseName: "lintable module defined in libcore child directory",
9931// moduleDirectory: "libcore/childdir/",
9932// disallowedFlagExpected: true,
9933// },
9934// }
9935//
9936// for _, testCase := range testCases {
9937// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9938// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9939// result := testApex(t, "", lintFileCreator, bpFileCreator)
9940// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9941// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9942// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9943// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9944//
9945// if disallowedFlagActual != testCase.disallowedFlagExpected {
9946// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9947// }
9948// }
9949//}
9950//
9951//// checks transtive deps of an apex coming from bootclasspath_fragment
9952//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9953// bp := `
9954// apex {
9955// name: "myapex",
9956// key: "myapex.key",
9957// bootclasspath_fragments: ["mybootclasspathfragment"],
9958// updatable: true,
9959// min_sdk_version: "29",
9960// }
9961// apex_key {
9962// name: "myapex.key",
9963// }
9964// bootclasspath_fragment {
9965// name: "mybootclasspathfragment",
9966// contents: ["myjavalib"],
9967// apex_available: ["myapex"],
9968// hidden_api: {
9969// split_packages: ["*"],
9970// },
9971// }
9972// java_library {
9973// name: "myjavalib",
9974// srcs: ["MyClass.java"],
9975// apex_available: [ "myapex" ],
9976// sdk_version: "current",
9977// min_sdk_version: "29",
9978// compile_dex: true,
9979// }
9980// `
9981// fs := android.MockFS{
9982// "lint-baseline.xml": nil,
9983// }
9984//
9985// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9986// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9987// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9988// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9989// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9990// }
9991//}
Spandan Das66773252022-01-15 00:23:18 +00009992
Spandan Das42e89502022-05-06 22:12:55 +00009993// updatable apexes should propagate updatable=true to its apps
9994func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9995 bp := `
9996 apex {
9997 name: "myapex",
9998 key: "myapex.key",
9999 updatable: %v,
10000 apps: [
10001 "myapp",
10002 ],
10003 min_sdk_version: "30",
10004 }
10005 apex_key {
10006 name: "myapex.key",
10007 }
10008 android_app {
10009 name: "myapp",
10010 updatable: %v,
10011 apex_available: [
10012 "myapex",
10013 ],
10014 sdk_version: "current",
10015 min_sdk_version: "30",
10016 }
10017 `
10018 testCases := []struct {
10019 name string
10020 apex_is_updatable_bp bool
10021 app_is_updatable_bp bool
10022 app_is_updatable_expected bool
10023 }{
10024 {
10025 name: "Non-updatable apex respects updatable property of non-updatable app",
10026 apex_is_updatable_bp: false,
10027 app_is_updatable_bp: false,
10028 app_is_updatable_expected: false,
10029 },
10030 {
10031 name: "Non-updatable apex respects updatable property of updatable app",
10032 apex_is_updatable_bp: false,
10033 app_is_updatable_bp: true,
10034 app_is_updatable_expected: true,
10035 },
10036 {
10037 name: "Updatable apex respects updatable property of updatable app",
10038 apex_is_updatable_bp: true,
10039 app_is_updatable_bp: true,
10040 app_is_updatable_expected: true,
10041 },
10042 {
10043 name: "Updatable apex sets updatable=true on non-updatable app",
10044 apex_is_updatable_bp: true,
10045 app_is_updatable_bp: false,
10046 app_is_updatable_expected: true,
10047 },
10048 }
10049 for _, testCase := range testCases {
10050 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10051 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10052 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10053 }
10054}
10055
Kiyoung Kim487689e2022-07-26 09:48:22 +090010056func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10057 bp := `
10058 apex {
10059 name: "myapex",
10060 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010061 native_shared_libs: ["libbaz"],
10062 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010063 min_sdk_version: "29",
10064 }
10065 apex_key {
10066 name: "myapex.key",
10067 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010068 cc_binary {
10069 name: "binfoo",
10070 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010071 apex_available: ["myapex"],
10072 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010073 recovery_available: false,
10074 }
10075 cc_library {
10076 name: "libbar",
10077 srcs: ["libbar.cc"],
10078 stubs: {
10079 symbol_file: "libbar.map.txt",
10080 versions: [
10081 "29",
10082 ],
10083 },
10084 }
10085 cc_library {
10086 name: "libbaz",
10087 srcs: ["libbaz.cc"],
10088 apex_available: ["myapex"],
10089 min_sdk_version: "29",
10090 stubs: {
10091 symbol_file: "libbaz.map.txt",
10092 versions: [
10093 "29",
10094 ],
10095 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010096 }
10097 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010098 name: "libbar",
10099 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010100 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010101 variants: ["apex.29"],
10102 }
10103 cc_api_variant {
10104 name: "libbar",
10105 variant: "apex",
10106 version: "29",
10107 src: "libbar_apex_29.so",
10108 }
10109 cc_api_library {
10110 name: "libbaz",
10111 src: "libbaz_stub.so",
10112 min_sdk_version: "29",
10113 variants: ["apex.29"],
10114 }
10115 cc_api_variant {
10116 name: "libbaz",
10117 variant: "apex",
10118 version: "29",
10119 src: "libbaz_apex_29.so",
10120 }
10121 cc_api_library {
10122 name: "libqux",
10123 src: "libqux_stub.so",
10124 min_sdk_version: "29",
10125 variants: ["apex.29"],
10126 }
10127 cc_api_variant {
10128 name: "libqux",
10129 variant: "apex",
10130 version: "29",
10131 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010132 }
10133 api_imports {
10134 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010135 apex_shared_libs: [
10136 "libbar",
10137 "libbaz",
10138 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010139 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010140 }
10141 `
10142 result := testApex(t, bp)
10143
10144 hasDep := func(m android.Module, wantDep android.Module) bool {
10145 t.Helper()
10146 var found bool
10147 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10148 if dep == wantDep {
10149 found = true
10150 }
10151 })
10152 return found
10153 }
10154
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010155 // Library defines stubs and cc_api_library should be used with cc_api_library
10156 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10157 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10158 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010159
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010160 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10161 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010162
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010163 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10164 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10165 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10166 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10167
10168 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10169 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10170 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10171 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10172 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10173
10174 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10175 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10176 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10177
10178 // cc_api_library defined without original library should be linked with cc_api_library
10179 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10180 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10181 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10182}
10183
10184func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10185 bp := `
10186 apex {
10187 name: "myapex",
10188 key: "myapex.key",
10189 native_shared_libs: ["libbar"],
10190 min_sdk_version: "29",
10191 }
10192 apex_key {
10193 name: "myapex.key",
10194 }
10195 cc_binary {
10196 name: "binfoo",
10197 shared_libs: ["libbar"],
10198 recovery_available: false,
10199 }
10200 cc_library {
10201 name: "libbar",
10202 srcs: ["libbar.cc"],
10203 apex_available: ["myapex"],
10204 min_sdk_version: "29",
10205 stubs: {
10206 symbol_file: "libbar.map.txt",
10207 versions: [
10208 "29",
10209 ],
10210 },
10211 }
10212 cc_api_library {
10213 name: "libbar",
10214 src: "libbar_stub.so",
10215 variants: ["apex.29"],
10216 }
10217 cc_api_variant {
10218 name: "libbar",
10219 variant: "apex",
10220 version: "29",
10221 src: "libbar_apex_29.so",
10222 }
10223 api_imports {
10224 name: "api_imports",
10225 apex_shared_libs: [
10226 "libbar",
10227 ],
10228 }
10229 `
10230
10231 result := testApex(t, bp)
10232
10233 hasDep := func(m android.Module, wantDep android.Module) bool {
10234 t.Helper()
10235 var found bool
10236 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10237 if dep == wantDep {
10238 found = true
10239 }
10240 })
10241 return found
10242 }
10243
10244 // Library defines stubs and cc_api_library should be used with cc_api_library
10245 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10246 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10247 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10248
10249 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10250 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10251
10252 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10253 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10254 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10255 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010256}
Dennis Shend4f5d932023-01-31 20:27:21 +000010257
10258func TestTrimmedApex(t *testing.T) {
10259 bp := `
10260 apex {
10261 name: "myapex",
10262 key: "myapex.key",
10263 native_shared_libs: ["libfoo","libbaz"],
10264 min_sdk_version: "29",
10265 trim_against: "mydcla",
10266 }
10267 apex {
10268 name: "mydcla",
10269 key: "myapex.key",
10270 native_shared_libs: ["libfoo","libbar"],
10271 min_sdk_version: "29",
10272 file_contexts: ":myapex-file_contexts",
10273 dynamic_common_lib_apex: true,
10274 }
10275 apex_key {
10276 name: "myapex.key",
10277 }
10278 cc_library {
10279 name: "libfoo",
10280 shared_libs: ["libc"],
10281 apex_available: ["myapex","mydcla"],
10282 min_sdk_version: "29",
10283 }
10284 cc_library {
10285 name: "libbar",
10286 shared_libs: ["libc"],
10287 apex_available: ["myapex","mydcla"],
10288 min_sdk_version: "29",
10289 }
10290 cc_library {
10291 name: "libbaz",
10292 shared_libs: ["libc"],
10293 apex_available: ["myapex","mydcla"],
10294 min_sdk_version: "29",
10295 }
10296 cc_api_library {
10297 name: "libc",
10298 src: "libc.so",
10299 min_sdk_version: "29",
10300 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010301 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010302 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010303 }
10304 api_imports {
10305 name: "api_imports",
10306 shared_libs: [
10307 "libc",
10308 ],
10309 header_libs: [],
10310 }
10311 `
10312 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010313 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010314 apexRule := module.MaybeRule("apexRule")
10315 if apexRule.Rule == nil {
10316 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10317 }
10318
10319 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010320 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010321 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10322 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10323 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10324 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10325}
Jingwen Chendea7a642023-03-28 11:30:50 +000010326
10327func TestCannedFsConfig(t *testing.T) {
10328 ctx := testApex(t, `
10329 apex {
10330 name: "myapex",
10331 key: "myapex.key",
10332 updatable: false,
10333 }
10334
10335 apex_key {
10336 name: "myapex.key",
10337 public_key: "testkey.avbpubkey",
10338 private_key: "testkey.pem",
10339 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010340 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010341 generateFsRule := mod.Rule("generateFsConfig")
10342 cmd := generateFsRule.RuleParams.Command
10343
10344 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10345}
10346
10347func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10348 ctx := testApex(t, `
10349 apex {
10350 name: "myapex",
10351 key: "myapex.key",
10352 canned_fs_config: "my_config",
10353 updatable: false,
10354 }
10355
10356 apex_key {
10357 name: "myapex.key",
10358 public_key: "testkey.avbpubkey",
10359 private_key: "testkey.pem",
10360 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010361 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010362 generateFsRule := mod.Rule("generateFsConfig")
10363 cmd := generateFsRule.RuleParams.Command
10364
10365 // Ensure that canned_fs_config has "cat my_config" at the end
10366 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10367}
Spandan Das20fce2d2023-04-12 17:21:39 +000010368
10369func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10370 testCases := []struct {
10371 desc string
10372 hasStubs bool
10373 apexAvailable string
10374 expectedError string
10375 }{
10376 {
10377 desc: "non-stub library can have multiple apex_available",
10378 hasStubs: false,
10379 apexAvailable: `["myapex", "otherapex"]`,
10380 },
10381 {
10382 desc: "stub library should not be available to anyapex",
10383 hasStubs: true,
10384 apexAvailable: `["//apex_available:anyapex"]`,
10385 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10386 },
10387 {
10388 desc: "stub library should not be available to multiple apexes",
10389 hasStubs: true,
10390 apexAvailable: `["myapex", "otherapex"]`,
10391 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10392 },
10393 {
10394 desc: "stub library can be available to a core apex and a test apex",
10395 hasStubs: true,
10396 apexAvailable: `["myapex", "test_myapex"]`,
10397 },
10398 }
10399 bpTemplate := `
10400 cc_library {
10401 name: "libfoo",
10402 %v
10403 apex_available: %v,
10404 }
10405 apex {
10406 name: "myapex",
10407 key: "apex.key",
10408 updatable: false,
10409 native_shared_libs: ["libfoo"],
10410 }
10411 apex {
10412 name: "otherapex",
10413 key: "apex.key",
10414 updatable: false,
10415 }
10416 apex_test {
10417 name: "test_myapex",
10418 key: "apex.key",
10419 updatable: false,
10420 native_shared_libs: ["libfoo"],
10421 }
10422 apex_key {
10423 name: "apex.key",
10424 }
10425 `
10426 for _, tc := range testCases {
10427 stubs := ""
10428 if tc.hasStubs {
10429 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10430 }
10431 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10432 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10433 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10434 })
10435 if tc.expectedError == "" {
10436 testApex(t, bp, mockFsFixturePreparer)
10437 } else {
10438 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10439 }
10440 }
10441}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010442
10443func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10444 context := android.GroupFixturePreparers(
10445 android.PrepareForIntegrationTestWithAndroid,
10446 cc.PrepareForIntegrationTestWithCc,
10447 PrepareForTestWithApexBuildComponents,
10448 prepareForTestWithMyapex,
10449 filesystem.PrepareForTestWithFilesystemBuildComponents,
10450 )
10451 result := context.RunTestWithBp(t, `
10452 android_system_image {
10453 name: "myfilesystem",
10454 deps: [
10455 "libfoo",
10456 ],
10457 linker_config_src: "linker.config.json",
10458 }
10459
10460 cc_library {
10461 name: "libfoo",
10462 shared_libs: [
10463 "libbar",
10464 ],
10465 stl: "none",
10466 }
10467
10468 cc_library {
10469 name: "libbar",
10470 stl: "none",
10471 apex_available: ["myapex"],
10472 }
10473
10474 apex {
10475 name: "myapex",
10476 native_shared_libs: ["libbar"],
10477 key: "myapex.key",
10478 updatable: false,
10479 }
10480
10481 apex_key {
10482 name: "myapex.key",
10483 public_key: "testkey.avbpubkey",
10484 private_key: "testkey.pem",
10485 }
10486 `)
10487
Cole Faust3b806d32024-03-11 15:15:03 -070010488 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010489 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10490 inputs.Strings(),
10491 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10492}
Yu Liueae7b362023-11-16 17:05:47 -080010493
10494var apex_default_bp = `
10495 apex_key {
10496 name: "myapex.key",
10497 public_key: "testkey.avbpubkey",
10498 private_key: "testkey.pem",
10499 }
10500
10501 filegroup {
10502 name: "myapex.manifest",
10503 srcs: ["apex_manifest.json"],
10504 }
10505
10506 filegroup {
10507 name: "myapex.androidmanifest",
10508 srcs: ["AndroidManifest.xml"],
10509 }
10510`
10511
10512func TestAconfigFilesJavaDeps(t *testing.T) {
10513 ctx := testApex(t, apex_default_bp+`
10514 apex {
10515 name: "myapex",
10516 manifest: ":myapex.manifest",
10517 androidManifest: ":myapex.androidmanifest",
10518 key: "myapex.key",
10519 java_libs: [
10520 "my_java_library_foo",
10521 "my_java_library_bar",
10522 ],
10523 updatable: false,
10524 }
10525
10526 java_library {
10527 name: "my_java_library_foo",
10528 srcs: ["foo/bar/MyClass.java"],
10529 sdk_version: "none",
10530 system_modules: "none",
10531 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010532 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010533 "myapex",
10534 ],
10535 }
10536
10537 java_library {
10538 name: "my_java_library_bar",
10539 srcs: ["foo/bar/MyClass.java"],
10540 sdk_version: "none",
10541 system_modules: "none",
10542 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010543 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010544 "myapex",
10545 ],
10546 }
10547
10548 aconfig_declarations {
10549 name: "my_aconfig_declarations_foo",
10550 package: "com.example.package",
10551 container: "myapex",
10552 srcs: ["foo.aconfig"],
10553 }
10554
10555 java_aconfig_library {
10556 name: "my_java_aconfig_library_foo",
10557 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010558 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010559 "myapex",
10560 ],
10561 }
10562
10563 aconfig_declarations {
10564 name: "my_aconfig_declarations_bar",
10565 package: "com.example.package",
10566 container: "myapex",
10567 srcs: ["bar.aconfig"],
10568 }
10569
10570 java_aconfig_library {
10571 name: "my_java_aconfig_library_bar",
10572 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010573 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010574 "myapex",
10575 ],
10576 }
10577 `)
10578
10579 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10580 s := mod.Rule("apexRule").Args["copy_commands"]
10581 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010582 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080010583 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10584 }
10585
Yu Liuab31c822024-02-28 22:21:31 +000010586 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10587 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
10588 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
10589 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010590
Yu Liubba555e2024-02-17 00:36:42 +000010591 inputs := []string{
10592 "my_aconfig_declarations_foo/intermediate.pb",
10593 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010594 }
Yu Liubba555e2024-02-17 00:36:42 +000010595 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10596 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10597 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10598 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010599}
10600
10601func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10602 ctx := testApex(t, apex_default_bp+`
10603 apex {
10604 name: "myapex",
10605 manifest: ":myapex.manifest",
10606 androidManifest: ":myapex.androidmanifest",
10607 key: "myapex.key",
10608 java_libs: [
10609 "my_java_library_foo",
10610 ],
10611 native_shared_libs: [
10612 "my_cc_library_bar",
10613 ],
10614 binaries: [
10615 "my_cc_binary_baz",
10616 ],
10617 updatable: false,
10618 }
10619
10620 java_library {
10621 name: "my_java_library_foo",
10622 srcs: ["foo/bar/MyClass.java"],
10623 sdk_version: "none",
10624 system_modules: "none",
10625 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010626 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010627 "myapex",
10628 ],
10629 }
10630
10631 cc_library {
10632 name: "my_cc_library_bar",
10633 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010634 static_libs: [
10635 "my_cc_aconfig_library_bar",
10636 "my_cc_aconfig_library_baz",
10637 ],
Yu Liueae7b362023-11-16 17:05:47 -080010638 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010639 "myapex",
10640 ],
10641 }
10642
10643 cc_binary {
10644 name: "my_cc_binary_baz",
10645 srcs: ["foo/bar/MyClass.cc"],
10646 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010647 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010648 "myapex",
10649 ],
10650 }
10651
10652 aconfig_declarations {
10653 name: "my_aconfig_declarations_foo",
10654 package: "com.example.package",
10655 container: "myapex",
10656 srcs: ["foo.aconfig"],
10657 }
10658
10659 java_aconfig_library {
10660 name: "my_java_aconfig_library_foo",
10661 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010662 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010663 "myapex",
10664 ],
10665 }
10666
10667 aconfig_declarations {
10668 name: "my_aconfig_declarations_bar",
10669 package: "com.example.package",
10670 container: "myapex",
10671 srcs: ["bar.aconfig"],
10672 }
10673
10674 cc_aconfig_library {
10675 name: "my_cc_aconfig_library_bar",
10676 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010677 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010678 "myapex",
10679 ],
10680 }
10681
10682 aconfig_declarations {
10683 name: "my_aconfig_declarations_baz",
10684 package: "com.example.package",
10685 container: "myapex",
10686 srcs: ["baz.aconfig"],
10687 }
10688
10689 cc_aconfig_library {
10690 name: "my_cc_aconfig_library_baz",
10691 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010692 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010693 "myapex",
10694 ],
10695 }
10696
10697 cc_library {
10698 name: "server_configurable_flags",
10699 srcs: ["server_configurable_flags.cc"],
10700 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010701 cc_library {
10702 name: "libbase",
10703 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010704 apex_available: [
10705 "myapex",
10706 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010707 }
10708 cc_library {
10709 name: "libaconfig_storage_read_api_cc",
10710 srcs: ["libaconfig_storage_read_api_cc.cc"],
10711 }
10712 cc_library {
10713 name: "libaconfig_storage_protos_cc",
10714 srcs: ["libaconfig_storage_protos_cc.cc"],
10715 }
Yu Liueae7b362023-11-16 17:05:47 -080010716 `)
10717
10718 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10719 s := mod.Rule("apexRule").Args["copy_commands"]
10720 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010721 if len(copyCmds) != 12 {
10722 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010723 }
10724
Yu Liuab31c822024-02-28 22:21:31 +000010725 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10726 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
10727 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
10728 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010729
Yu Liubba555e2024-02-17 00:36:42 +000010730 inputs := []string{
10731 "my_aconfig_declarations_foo/intermediate.pb",
10732 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10733 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010734 }
Yu Liubba555e2024-02-17 00:36:42 +000010735 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10736 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10737 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10738 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010739}
10740
Yu Liucec0e412023-11-30 16:45:50 -080010741func TestAconfigFilesRustDeps(t *testing.T) {
10742 ctx := testApex(t, apex_default_bp+`
10743 apex {
10744 name: "myapex",
10745 manifest: ":myapex.manifest",
10746 androidManifest: ":myapex.androidmanifest",
10747 key: "myapex.key",
10748 native_shared_libs: [
10749 "libmy_rust_library",
10750 ],
10751 binaries: [
10752 "my_rust_binary",
10753 ],
10754 rust_dyn_libs: [
10755 "libmy_rust_dylib",
10756 ],
10757 updatable: false,
10758 }
10759
10760 rust_library {
10761 name: "libflags_rust", // test mock
10762 crate_name: "flags_rust",
10763 srcs: ["lib.rs"],
10764 apex_available: [
10765 "myapex",
10766 ],
10767 }
10768
10769 rust_library {
10770 name: "liblazy_static", // test mock
10771 crate_name: "lazy_static",
10772 srcs: ["src/lib.rs"],
10773 apex_available: [
10774 "myapex",
10775 ],
10776 }
10777
Ted Bauer02d475c2024-03-27 20:56:26 +000010778 rust_library {
10779 name: "libaconfig_storage_read_api", // test mock
10780 crate_name: "aconfig_storage_read_api",
10781 srcs: ["src/lib.rs"],
10782 apex_available: [
10783 "myapex",
10784 ],
10785 }
10786
Ted Bauer6ef40db2024-03-29 14:04:10 +000010787 rust_library {
10788 name: "liblogger", // test mock
10789 crate_name: "logger",
10790 srcs: ["src/lib.rs"],
10791 apex_available: [
10792 "myapex",
10793 ],
10794 }
10795
10796 rust_library {
10797 name: "liblog_rust", // test mock
10798 crate_name: "log_rust",
10799 srcs: ["src/lib.rs"],
10800 apex_available: [
10801 "myapex",
10802 ],
10803 }
10804
Yu Liucec0e412023-11-30 16:45:50 -080010805 rust_ffi_shared {
10806 name: "libmy_rust_library",
10807 srcs: ["src/lib.rs"],
10808 rustlibs: ["libmy_rust_aconfig_library_foo"],
10809 crate_name: "my_rust_library",
10810 apex_available: [
10811 "myapex",
10812 ],
10813 }
10814
10815 rust_library_dylib {
10816 name: "libmy_rust_dylib",
10817 srcs: ["foo/bar/MyClass.rs"],
10818 rustlibs: ["libmy_rust_aconfig_library_bar"],
10819 crate_name: "my_rust_dylib",
10820 apex_available: [
10821 "myapex",
10822 ],
10823 }
10824
10825 rust_binary {
10826 name: "my_rust_binary",
10827 srcs: ["foo/bar/MyClass.rs"],
10828 rustlibs: [
10829 "libmy_rust_aconfig_library_baz",
10830 "libmy_rust_dylib",
10831 ],
10832 apex_available: [
10833 "myapex",
10834 ],
10835 }
10836
10837 aconfig_declarations {
10838 name: "my_aconfig_declarations_foo",
10839 package: "com.example.package",
10840 container: "myapex",
10841 srcs: ["foo.aconfig"],
10842 }
10843
10844 aconfig_declarations {
10845 name: "my_aconfig_declarations_bar",
10846 package: "com.example.package",
10847 container: "myapex",
10848 srcs: ["bar.aconfig"],
10849 }
10850
10851 aconfig_declarations {
10852 name: "my_aconfig_declarations_baz",
10853 package: "com.example.package",
10854 container: "myapex",
10855 srcs: ["baz.aconfig"],
10856 }
10857
10858 rust_aconfig_library {
10859 name: "libmy_rust_aconfig_library_foo",
10860 aconfig_declarations: "my_aconfig_declarations_foo",
10861 crate_name: "my_rust_aconfig_library_foo",
10862 apex_available: [
10863 "myapex",
10864 ],
10865 }
10866
10867 rust_aconfig_library {
10868 name: "libmy_rust_aconfig_library_bar",
10869 aconfig_declarations: "my_aconfig_declarations_bar",
10870 crate_name: "my_rust_aconfig_library_bar",
10871 apex_available: [
10872 "myapex",
10873 ],
10874 }
10875
10876 rust_aconfig_library {
10877 name: "libmy_rust_aconfig_library_baz",
10878 aconfig_declarations: "my_aconfig_declarations_baz",
10879 crate_name: "my_rust_aconfig_library_baz",
10880 apex_available: [
10881 "myapex",
10882 ],
10883 }
10884 `)
10885
10886 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10887 s := mod.Rule("apexRule").Args["copy_commands"]
10888 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ted Bauer6ef40db2024-03-29 14:04:10 +000010889 if len(copyCmds) != 32 {
Ted Bauer02d475c2024-03-27 20:56:26 +000010890 t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010891 }
10892
Ted Bauer6ef40db2024-03-29 14:04:10 +000010893 ensureMatches(t, copyCmds[28], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10894 ensureMatches(t, copyCmds[29], "^cp -f .*/package.map .*/image.apex/etc$")
10895 ensureMatches(t, copyCmds[30], "^cp -f .*/flag.map .*/image.apex/etc$")
10896 ensureMatches(t, copyCmds[31], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080010897
Yu Liubba555e2024-02-17 00:36:42 +000010898 inputs := []string{
10899 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010900 "my_aconfig_declarations_bar/intermediate.pb",
10901 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010902 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10903 }
10904 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10905 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10906 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10907 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
10908}
10909
10910func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10911 aconfigRule := mod.Description(desc)
10912 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010913 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010914 if len(aconfigArgs) != len(inputs) {
10915 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010916 }
Yu Liucec0e412023-11-30 16:45:50 -080010917
Yu Liubba555e2024-02-17 00:36:42 +000010918 ensureEquals(t, container, aconfigRule.Args["container"])
10919 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10920
10921 buildParams := aconfigRule.BuildParams
10922 for _, input := range inputs {
10923 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10924 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010925 }
Yu Liubba555e2024-02-17 00:36:42 +000010926
10927 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010928}
10929
Yu Liueae7b362023-11-16 17:05:47 -080010930func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
10931 ctx := testApex(t, apex_default_bp+`
10932 apex {
10933 name: "myapex",
10934 manifest: ":myapex.manifest",
10935 androidManifest: ":myapex.androidmanifest",
10936 key: "myapex.key",
10937 java_libs: [
10938 "my_java_library_foo",
10939 "other_java_library_bar",
10940 ],
10941 updatable: false,
10942 }
10943
10944 java_library {
10945 name: "my_java_library_foo",
10946 srcs: ["foo/bar/MyClass.java"],
10947 sdk_version: "none",
10948 system_modules: "none",
10949 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010950 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010951 "myapex",
10952 ],
10953 }
10954
10955 java_library {
10956 name: "other_java_library_bar",
10957 srcs: ["foo/bar/MyClass.java"],
10958 sdk_version: "none",
10959 system_modules: "none",
10960 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010961 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010962 "myapex",
10963 ],
10964 }
10965
10966 aconfig_declarations {
10967 name: "my_aconfig_declarations_foo",
10968 package: "com.example.package",
10969 container: "myapex",
10970 srcs: ["foo.aconfig"],
10971 }
10972
10973 java_aconfig_library {
10974 name: "my_java_aconfig_library_foo",
10975 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010976 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010977 "myapex",
10978 ],
10979 }
10980
10981 aconfig_declarations {
10982 name: "other_aconfig_declarations_bar",
10983 package: "com.example.package",
10984 container: "otherapex",
10985 srcs: ["bar.aconfig"],
10986 }
10987
10988 java_aconfig_library {
10989 name: "other_java_aconfig_library_bar",
10990 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010991 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010992 "myapex",
10993 ],
10994 }
10995 `)
10996
10997 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10998 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10999 s := " " + combineAconfigRule.Args["cache_files"]
11000 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11001 if len(aconfigArgs) != 1 {
11002 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11003 }
11004 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11005
11006 buildParams := combineAconfigRule.BuildParams
11007 if len(buildParams.Inputs) != 1 {
11008 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11009 }
11010 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11011 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11012}
11013
11014func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11015 ctx := testApex(t, apex_default_bp+`
11016 apex {
11017 name: "myapex",
11018 manifest: ":myapex.manifest",
11019 androidManifest: ":myapex.androidmanifest",
11020 key: "myapex.key",
11021 java_libs: [
11022 "my_java_library_foo",
11023 "my_java_library_bar",
11024 ],
11025 updatable: false,
11026 }
11027
11028 java_library {
11029 name: "my_java_library_foo",
11030 srcs: ["foo/bar/MyClass.java"],
11031 sdk_version: "none",
11032 system_modules: "none",
11033 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011034 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011035 "myapex",
11036 ],
11037 }
11038
11039 java_library {
11040 name: "my_java_library_bar",
11041 srcs: ["foo/bar/MyClass.java"],
11042 sdk_version: "none",
11043 system_modules: "none",
11044 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011045 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011046 "myapex",
11047 ],
11048 }
11049
11050 aconfig_declarations {
11051 name: "my_aconfig_declarations_foo",
11052 package: "com.example.package",
11053 container: "myapex",
11054 srcs: ["foo.aconfig"],
11055 }
11056
11057 java_aconfig_library {
11058 name: "my_java_aconfig_library_foo",
11059 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011060 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011061 "myapex",
11062 ],
11063 }
11064
11065 java_aconfig_library {
11066 name: "my_java_aconfig_library_bar",
11067 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011068 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011069 "myapex",
11070 ],
11071 }
11072 `)
11073
11074 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11075 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11076 s := " " + combineAconfigRule.Args["cache_files"]
11077 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11078 if len(aconfigArgs) != 1 {
11079 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11080 }
11081 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11082
11083 buildParams := combineAconfigRule.BuildParams
11084 if len(buildParams.Inputs) != 1 {
11085 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11086 }
11087 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11088 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11089}
Spandan Das5be63332023-12-13 00:06:32 +000011090
11091// Test that the boot jars come from the _selected_ apex prebuilt
11092// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11093func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11094 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11095 t.Helper()
11096 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11097 foundLibfooJar := false
11098 base := stem + ".jar"
11099 for _, output := range s.AllOutputs() {
11100 if filepath.Base(output) == base {
11101 foundLibfooJar = true
11102 buildRule := s.Output(output)
11103 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11104 }
11105 }
11106 if !foundLibfooJar {
11107 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11108 }
11109 }
11110
Spandan Das64c9e0c2023-12-20 20:13:34 +000011111 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11112 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11113 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11114 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11115 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11116 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)
11117 }
11118
11119 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11120 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11121 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11122 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11123 }
11124
Spandan Das5be63332023-12-13 00:06:32 +000011125 bp := `
11126 // Source APEX.
11127
11128 java_library {
11129 name: "framework-foo",
11130 srcs: ["foo.java"],
11131 installable: true,
11132 apex_available: [
11133 "com.android.foo",
11134 ],
11135 }
11136
11137 bootclasspath_fragment {
11138 name: "foo-bootclasspath-fragment",
11139 contents: ["framework-foo"],
11140 apex_available: [
11141 "com.android.foo",
11142 ],
11143 hidden_api: {
11144 split_packages: ["*"],
11145 },
11146 }
11147
11148 apex_key {
11149 name: "com.android.foo.key",
11150 public_key: "com.android.foo.avbpubkey",
11151 private_key: "com.android.foo.pem",
11152 }
11153
11154 apex {
11155 name: "com.android.foo",
11156 key: "com.android.foo.key",
11157 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11158 updatable: false,
11159 }
11160
11161 // Prebuilt APEX.
11162
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011163 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011164 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011165 public: {
11166 jars: ["foo.jar"],
11167 },
Spandan Das5be63332023-12-13 00:06:32 +000011168 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011169 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011170 }
11171
11172 prebuilt_bootclasspath_fragment {
11173 name: "foo-bootclasspath-fragment",
11174 contents: ["framework-foo"],
11175 hidden_api: {
11176 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11177 metadata: "my-bootclasspath-fragment/metadata.csv",
11178 index: "my-bootclasspath-fragment/index.csv",
11179 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11180 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11181 },
11182 apex_available: [
11183 "com.android.foo",
11184 ],
11185 }
11186
11187 prebuilt_apex {
11188 name: "com.android.foo",
11189 apex_name: "com.android.foo",
11190 src: "com.android.foo-arm.apex",
11191 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11192 }
11193
11194 // Another Prebuilt ART APEX
11195 prebuilt_apex {
11196 name: "com.android.foo.v2",
11197 apex_name: "com.android.foo", // Used to determine the API domain
11198 src: "com.android.foo-arm.apex",
11199 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11200 }
11201
11202 // APEX contribution modules
11203
11204 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011205 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011206 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011207 contents: ["com.android.foo"],
11208 }
11209
11210 apex_contributions {
11211 name: "foo.prebuilt.contributions",
11212 api_domain: "com.android.foo",
11213 contents: ["prebuilt_com.android.foo"],
11214 }
11215
11216 apex_contributions {
11217 name: "foo.prebuilt.v2.contributions",
11218 api_domain: "com.android.foo",
11219 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011220 }
11221 `
11222
11223 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011224 desc string
11225 selectedApexContributions string
11226 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011227 }{
11228 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011229 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11230 selectedApexContributions: "foo.source.contributions",
11231 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011232 },
11233 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011234 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11235 selectedApexContributions: "foo.prebuilt.contributions",
11236 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011237 },
11238 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011239 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11240 selectedApexContributions: "foo.prebuilt.v2.contributions",
11241 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011242 },
11243 }
11244
11245 fragment := java.ApexVariantReference{
11246 Apex: proptools.StringPtr("com.android.foo"),
11247 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11248 }
11249
11250 for _, tc := range testCases {
11251 preparer := android.GroupFixturePreparers(
11252 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11253 android.FixtureMergeMockFs(map[string][]byte{
11254 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11255 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011256 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11257 // file creation.
11258 java.FixtureConfigureBootJars("platform:foo"),
11259 android.FixtureModifyMockFS(func(fs android.MockFS) {
11260 fs["platform/Android.bp"] = []byte(`
11261 java_library {
11262 name: "foo",
11263 srcs: ["Test.java"],
11264 compile_dex: true,
11265 }
11266 `)
11267 fs["platform/Test.java"] = nil
11268 }),
11269
Spandan Das5be63332023-12-13 00:06:32 +000011270 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11271 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011272 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011273 }
11274 }),
11275 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011276 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011277 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011278 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11279 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011280 }
11281}
Spandan Das3576e762024-01-03 18:57:03 +000011282
11283// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11284// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11285func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11286 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11287 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11288 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11289 // Variations are created based on apex_name
11290 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11291 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11292 }
11293 // for a mainline module family, check that only the flagged soong module is visible to make
11294 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11295 variation := func(moduleName string) string {
11296 ret := "android_common_com.android.foo"
11297 if moduleName == "com.google.android.foo" {
11298 ret = "android_common_com.google.android.foo_com.android.foo"
11299 }
11300 return ret
11301 }
11302
11303 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11304 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11305
11306 for _, hiddenModuleName := range hiddenModuleNames {
11307 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11308 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11309
11310 }
11311 }
11312
11313 bp := `
11314 apex_key {
11315 name: "com.android.foo.key",
11316 public_key: "com.android.foo.avbpubkey",
11317 private_key: "com.android.foo.pem",
11318 }
11319
11320 // AOSP source apex
11321 apex {
11322 name: "com.android.foo",
11323 key: "com.android.foo.key",
11324 updatable: false,
11325 }
11326
11327 // Google source apex
11328 override_apex {
11329 name: "com.google.android.foo",
11330 base: "com.android.foo",
11331 key: "com.android.foo.key",
11332 }
11333
11334 // Prebuilt Google APEX.
11335
11336 prebuilt_apex {
11337 name: "com.google.android.foo",
11338 apex_name: "com.android.foo",
11339 src: "com.android.foo-arm.apex",
11340 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11341 }
11342
11343 // Another Prebuilt Google APEX
11344 prebuilt_apex {
11345 name: "com.google.android.foo.v2",
11346 apex_name: "com.android.foo",
11347 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11348 src: "com.android.foo-arm.apex",
11349 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11350 }
11351
11352 // APEX contribution modules
11353
11354 apex_contributions {
11355 name: "foo.source.contributions",
11356 api_domain: "com.android.foo",
11357 contents: ["com.google.android.foo"],
11358 }
11359
11360 apex_contributions {
11361 name: "foo.prebuilt.contributions",
11362 api_domain: "com.android.foo",
11363 contents: ["prebuilt_com.google.android.foo"],
11364 }
11365
11366 apex_contributions {
11367 name: "foo.prebuilt.v2.contributions",
11368 api_domain: "com.android.foo",
11369 contents: ["prebuilt_com.google.android.foo.v2"],
11370 }
11371
11372 // This is an incompatible module because it selects multiple versions of the same mainline module
11373 apex_contributions {
11374 name: "foo.prebuilt.duplicate.contributions",
11375 api_domain: "com.android.foo",
11376 contents: [
11377 "prebuilt_com.google.android.foo",
11378 "prebuilt_com.google.android.foo.v2",
11379 ],
11380 }
11381 `
11382
11383 testCases := []struct {
11384 desc string
11385 selectedApexContributions string
11386 expectedVisibleModuleName string
11387 expectedHiddenModuleNames []string
11388 expectedError string
11389 }{
11390 {
11391 desc: "Source apex is selected, prebuilts should be hidden from make",
11392 selectedApexContributions: "foo.source.contributions",
11393 expectedVisibleModuleName: "com.google.android.foo",
11394 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11395 },
11396 {
11397 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11398 selectedApexContributions: "foo.prebuilt.contributions",
11399 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11400 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11401 },
11402 {
11403 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11404 selectedApexContributions: "foo.prebuilt.v2.contributions",
11405 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11406 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11407 },
11408 {
11409 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11410 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11411 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11412 },
11413 }
11414
11415 for _, tc := range testCases {
11416 preparer := android.GroupFixturePreparers(
11417 android.FixtureMergeMockFs(map[string][]byte{
11418 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11419 }),
11420 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11421 variables.BuildFlags = map[string]string{
11422 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11423 }
11424 }),
11425 )
11426 if tc.expectedError != "" {
11427 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11428 testApex(t, bp, preparer)
11429 return
11430 }
11431 ctx := testApex(t, bp, preparer)
11432
11433 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11434 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11435 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11436 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11437
11438 // Check that
11439 // 1. The contents of the selected apex_contributions are visible to make
11440 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11441 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11442 }
11443}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011444
11445func TestAconfifDeclarationsValidation(t *testing.T) {
11446 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11447 for _, moduleName := range moduleNames {
11448 ret += fmt.Sprintf(`
11449 aconfig_declarations {
11450 name: "%[1]s",
11451 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011452 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011453 srcs: [
11454 "%[1]s.aconfig",
11455 ],
11456 }
11457 java_aconfig_library {
11458 name: "%[1]s-lib",
11459 aconfig_declarations: "%[1]s",
11460 }
11461 `, moduleName)
11462 }
11463 return ret
11464 }
11465
11466 result := android.GroupFixturePreparers(
11467 prepareForApexTest,
11468 java.PrepareForTestWithJavaSdkLibraryFiles,
11469 java.FixtureWithLastReleaseApis("foo"),
11470 android.FixtureModifyConfig(func(config android.Config) {
11471 config.SetApiLibraries([]string{"foo"})
11472 }),
11473 ).RunTestWithBp(t, `
11474 java_library {
11475 name: "baz-java-lib",
11476 static_libs: [
11477 "baz-lib",
11478 ],
11479 }
11480 filegroup {
11481 name: "qux-filegroup",
11482 srcs: [
11483 ":qux-lib{.generated_srcjars}",
11484 ],
11485 }
11486 filegroup {
11487 name: "qux-another-filegroup",
11488 srcs: [
11489 ":qux-filegroup",
11490 ],
11491 }
11492 java_library {
11493 name: "quux-java-lib",
11494 srcs: [
11495 "a.java",
11496 ],
11497 libs: [
11498 "quux-lib",
11499 ],
11500 }
11501 java_sdk_library {
11502 name: "foo",
11503 srcs: [
11504 ":qux-another-filegroup",
11505 ],
11506 api_packages: ["foo"],
11507 system: {
11508 enabled: true,
11509 },
11510 module_lib: {
11511 enabled: true,
11512 },
11513 test: {
11514 enabled: true,
11515 },
11516 static_libs: [
11517 "bar-lib",
11518 ],
11519 libs: [
11520 "baz-java-lib",
11521 "quux-java-lib",
11522 ],
11523 aconfig_declarations: [
11524 "bar",
11525 ],
11526 }
11527 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11528
11529 m := result.ModuleForTests("foo.stubs.source", "android_common")
11530 outDir := "out/soong/.intermediates"
11531
11532 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11533 // textproto files
11534 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11535
11536 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11537 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11538 // to aconfig.
11539 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11540 "passed as an input",
11541 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11542
11543 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11544 // to metalava as classpath. Thus the cache file provided by the associated
11545 // aconfig_declarations module "baz" should be passed to aconfig.
11546 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11547 "java_aconfig_library passed as an input",
11548 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11549
11550 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11551 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11552 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11553 "input",
11554 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11555
11556 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11557 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11558 // aconfig_declarations module "quux" should not be passed to aconfig.
11559 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11560 "depend on java_aconfig_library not passed as an input",
11561 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11562}
Cole Faust7c991b42024-05-15 11:17:55 -070011563
11564func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11565 ctx := testApex(t, `
11566 apex {
11567 name: "myapex",
11568 key: "myapex.key",
11569 prebuilts: ["myetc", "myetc2"],
11570 min_sdk_version: "29",
11571 }
11572 apex_key {
11573 name: "myapex.key",
11574 public_key: "testkey.avbpubkey",
11575 private_key: "testkey.pem",
11576 }
11577
11578 prebuilt_etc {
11579 name: "myetc",
11580 src: "myprebuilt",
11581 filename: "myfilename",
11582 }
11583 prebuilt_etc {
11584 name: "myetc2",
11585 sub_dir: "mysubdir",
11586 src: "myprebuilt",
11587 filename: "myfilename",
11588 }
11589 `, withFiles(android.MockFS{
11590 "packages/modules/common/build/allowed_deps.txt": nil,
11591 }))
11592
11593 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11594 data := android.AndroidMkDataForTest(t, ctx, ab)
11595 var builder strings.Builder
11596 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11597 androidMk := builder.String()
11598
11599 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11600 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11601}