blob: eacbcebca3a70f75abe960fe1e9efc8c2d46f35e [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 {
3674 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003675 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003677 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003678 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003679 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003680 }
3681 `
3682 }
Justin Yund5784122023-10-25 13:25:32 +09003683 result += `
3684 llndk_libraries_txt {
3685 name: "llndk.libraries.txt",
3686 }
3687 llndk_libraries_txt_for_apex {
3688 name: "llndk.libraries.txt.apex",
3689 stem: "llndk.libraries.txt",
3690 insert_vndk_version: true,
3691 }
3692 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003693 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003694 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003695 result += `
3696 prebuilt_etc {
3697 name: "` + txt + `.libraries.` + v + `.txt",
3698 src: "dummy.txt",
3699 }
3700 `
3701 }
3702 }
3703 }
3704 return
3705}
3706
Jooyung Han344d5432019-08-23 11:17:39 +09003707func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003708 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003709 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003710 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003711 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003712 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003713 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003714 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003715 }
3716
3717 apex_key {
3718 name: "myapex.key",
3719 public_key: "testkey.avbpubkey",
3720 private_key: "testkey.pem",
3721 }
3722
Jooyung Han31c470b2019-10-18 16:26:59 +09003723 vndk_prebuilt_shared {
3724 name: "libvndk27",
3725 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003726 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003727 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003728 vndk: {
3729 enabled: true,
3730 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003731 target_arch: "arm64",
3732 arch: {
3733 arm: {
3734 srcs: ["libvndk27_arm.so"],
3735 },
3736 arm64: {
3737 srcs: ["libvndk27_arm64.so"],
3738 },
3739 },
Colin Cross2807f002021-03-02 10:15:29 -08003740 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003741 }
3742
3743 vndk_prebuilt_shared {
3744 name: "libvndk27",
3745 version: "27",
3746 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003747 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003748 vndk: {
3749 enabled: true,
3750 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003751 target_arch: "x86_64",
3752 arch: {
3753 x86: {
3754 srcs: ["libvndk27_x86.so"],
3755 },
3756 x86_64: {
3757 srcs: ["libvndk27_x86_64.so"],
3758 },
3759 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003760 }
3761 `+vndkLibrariesTxtFiles("27"),
3762 withFiles(map[string][]byte{
3763 "libvndk27_arm.so": nil,
3764 "libvndk27_arm64.so": nil,
3765 "libvndk27_x86.so": nil,
3766 "libvndk27_x86_64.so": nil,
3767 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003768
Jooyung Hana0503a52023-08-23 13:12:50 +09003769 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003770 "lib/libvndk27_arm.so",
3771 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003772 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003773 })
Jooyung Han344d5432019-08-23 11:17:39 +09003774}
3775
Jooyung Han90eee022019-10-01 20:02:42 +09003776func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003777 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003778 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003779 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003780 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003781 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003782 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003783 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003784 }
3785 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003786 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003787 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003788 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003789 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003790 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003791 }
3792 apex_key {
3793 name: "myapex.key",
3794 public_key: "testkey.avbpubkey",
3795 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003796 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003797
3798 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003799 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003800 apexManifestRule := module.Rule("apexManifestRule")
3801 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003802 }
3803
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003804 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003805 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003806}
3807
Jooyung Han344d5432019-08-23 11:17:39 +09003808func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003809 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003810 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003811 name: "com.android.vndk.current",
3812 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003813 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003814 native_bridge_supported: true,
3815 }
3816
3817 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003818 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003819 public_key: "testkey.avbpubkey",
3820 private_key: "testkey.pem",
3821 }
3822
3823 cc_library {
3824 name: "libvndk",
3825 srcs: ["mylib.cpp"],
3826 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003827 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003828 native_bridge_supported: true,
3829 host_supported: true,
3830 vndk: {
3831 enabled: true,
3832 },
3833 system_shared_libs: [],
3834 stl: "none",
3835 }
3836 `)
3837}
3838
Jooyung Han31c470b2019-10-18 16:26:59 +09003839func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003840 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003841 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003842 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003843 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003844 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003845 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003846 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 }
3848
3849 apex_key {
3850 name: "myapex.key",
3851 public_key: "testkey.avbpubkey",
3852 private_key: "testkey.pem",
3853 }
3854
3855 vndk_prebuilt_shared {
3856 name: "libvndk27",
3857 version: "27",
3858 target_arch: "arm",
3859 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003860 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003861 vndk: {
3862 enabled: true,
3863 },
3864 arch: {
3865 arm: {
3866 srcs: ["libvndk27.so"],
3867 }
3868 },
3869 }
3870
3871 vndk_prebuilt_shared {
3872 name: "libvndk27",
3873 version: "27",
3874 target_arch: "arm",
3875 binder32bit: true,
3876 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003877 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 vndk: {
3879 enabled: true,
3880 },
3881 arch: {
3882 arm: {
3883 srcs: ["libvndk27binder32.so"],
3884 }
3885 },
Colin Cross2807f002021-03-02 10:15:29 -08003886 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003887 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003888 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003889 withFiles(map[string][]byte{
3890 "libvndk27.so": nil,
3891 "libvndk27binder32.so": nil,
3892 }),
3893 withBinder32bit,
3894 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003895 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003896 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3897 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003898 },
3899 }),
3900 )
3901
Jooyung Hana0503a52023-08-23 13:12:50 +09003902 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003903 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003904 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003905 })
3906}
3907
Jooyung Hane3f02812023-05-08 13:54:50 +09003908func TestVendorApexWithVndkPrebuilts(t *testing.T) {
3909 ctx := testApex(t, "",
3910 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3911 variables.DeviceVndkVersion = proptools.StringPtr("27")
3912 }),
3913 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
3914 cc.RegisterVendorSnapshotModules(ctx)
3915 }),
3916 withFiles(map[string][]byte{
3917 "vendor/foo/Android.bp": []byte(`
3918 apex {
3919 name: "myapex",
3920 binaries: ["foo"],
3921 key: "myapex.key",
3922 min_sdk_version: "27",
3923 vendor: true,
3924 }
3925
3926 cc_binary {
3927 name: "foo",
3928 vendor: true,
3929 srcs: ["abc.cpp"],
3930 shared_libs: [
3931 "libllndk",
3932 "libvndk",
3933 ],
3934 nocrt: true,
3935 system_shared_libs: [],
3936 min_sdk_version: "27",
3937 }
3938
3939 apex_key {
3940 name: "myapex.key",
3941 public_key: "testkey.avbpubkey",
3942 private_key: "testkey.pem",
3943 }
3944 `),
3945 // Simulate VNDK prebuilts with vendor_snapshot
3946 "prebuilts/vndk/Android.bp": []byte(`
3947 vndk_prebuilt_shared {
3948 name: "libllndk",
3949 version: "27",
3950 vendor_available: true,
3951 product_available: true,
3952 target_arch: "arm64",
3953 arch: {
3954 arm64: {
3955 srcs: ["libllndk.so"],
3956 },
3957 },
3958 }
3959
3960 vndk_prebuilt_shared {
3961 name: "libvndk",
3962 version: "27",
3963 vendor_available: true,
3964 product_available: true,
3965 target_arch: "arm64",
3966 arch: {
3967 arm64: {
3968 srcs: ["libvndk.so"],
3969 },
3970 },
3971 vndk: {
3972 enabled: true,
3973 },
3974 min_sdk_version: "27",
3975 }
3976
3977 vndk_prebuilt_shared {
3978 name: "libc++",
3979 version: "27",
3980 target_arch: "arm64",
3981 vendor_available: true,
3982 product_available: true,
3983 vndk: {
3984 enabled: true,
3985 support_system_process: true,
3986 },
3987 arch: {
3988 arm64: {
3989 srcs: ["libc++.so"],
3990 },
3991 },
3992 min_sdk_version: "apex_inherit",
3993 }
3994
3995 vendor_snapshot {
3996 name: "vendor_snapshot",
3997 version: "27",
3998 arch: {
3999 arm64: {
4000 vndk_libs: [
4001 "libc++",
4002 "libllndk",
4003 "libvndk",
4004 ],
4005 static_libs: [
4006 "libc++demangle",
4007 "libclang_rt.builtins",
4008 "libunwind",
4009 ],
4010 },
4011 }
4012 }
4013
4014 vendor_snapshot_static {
4015 name: "libclang_rt.builtins",
4016 version: "27",
4017 target_arch: "arm64",
4018 vendor: true,
4019 arch: {
4020 arm64: {
4021 src: "libclang_rt.builtins-aarch64-android.a",
4022 },
4023 },
4024 }
4025
4026 vendor_snapshot_static {
4027 name: "libc++demangle",
4028 version: "27",
4029 target_arch: "arm64",
4030 compile_multilib: "64",
4031 vendor: true,
4032 arch: {
4033 arm64: {
4034 src: "libc++demangle.a",
4035 },
4036 },
4037 min_sdk_version: "apex_inherit",
4038 }
4039
4040 vendor_snapshot_static {
4041 name: "libunwind",
4042 version: "27",
4043 target_arch: "arm64",
4044 compile_multilib: "64",
4045 vendor: true,
4046 arch: {
4047 arm64: {
4048 src: "libunwind.a",
4049 },
4050 },
4051 min_sdk_version: "apex_inherit",
4052 }
4053 `),
4054 }))
4055
4056 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004057 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004058 "bin/foo",
4059 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4060 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4061 })
4062
4063 // Should link foo with prebuilt libraries (shared/static)
4064 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4065 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4066 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4067 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4068 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4069
4070 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004071 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004072 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4073 ensureListContains(t, requireNativeLibs, "libllndk.so")
4074}
4075
Jooyung Hane1633032019-08-01 17:41:43 +09004076func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004077 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004078 apex {
4079 name: "myapex_nodep",
4080 key: "myapex.key",
4081 native_shared_libs: ["lib_nodep"],
4082 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004083 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004084 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004085 }
4086
4087 apex {
4088 name: "myapex_dep",
4089 key: "myapex.key",
4090 native_shared_libs: ["lib_dep"],
4091 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004092 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004093 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004094 }
4095
4096 apex {
4097 name: "myapex_provider",
4098 key: "myapex.key",
4099 native_shared_libs: ["libfoo"],
4100 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004102 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004103 }
4104
4105 apex {
4106 name: "myapex_selfcontained",
4107 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004108 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004109 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004110 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004111 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004112 }
4113
4114 apex_key {
4115 name: "myapex.key",
4116 public_key: "testkey.avbpubkey",
4117 private_key: "testkey.pem",
4118 }
4119
4120 cc_library {
4121 name: "lib_nodep",
4122 srcs: ["mylib.cpp"],
4123 system_shared_libs: [],
4124 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004125 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004126 }
4127
4128 cc_library {
4129 name: "lib_dep",
4130 srcs: ["mylib.cpp"],
4131 shared_libs: ["libfoo"],
4132 system_shared_libs: [],
4133 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004134 apex_available: [
4135 "myapex_dep",
4136 "myapex_provider",
4137 "myapex_selfcontained",
4138 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004139 }
4140
4141 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004142 name: "lib_dep_on_bar",
4143 srcs: ["mylib.cpp"],
4144 shared_libs: ["libbar"],
4145 system_shared_libs: [],
4146 stl: "none",
4147 apex_available: [
4148 "myapex_selfcontained",
4149 ],
4150 }
4151
4152
4153 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004154 name: "libfoo",
4155 srcs: ["mytest.cpp"],
4156 stubs: {
4157 versions: ["1"],
4158 },
4159 system_shared_libs: [],
4160 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004161 apex_available: [
4162 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004163 ],
4164 }
4165
4166 cc_library {
4167 name: "libbar",
4168 srcs: ["mytest.cpp"],
4169 stubs: {
4170 versions: ["1"],
4171 },
4172 system_shared_libs: [],
4173 stl: "none",
4174 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004175 "myapex_selfcontained",
4176 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004177 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004178
Jooyung Hane1633032019-08-01 17:41:43 +09004179 `)
4180
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004181 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004182 var provideNativeLibs, requireNativeLibs []string
4183
Jooyung Hana0503a52023-08-23 13:12:50 +09004184 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004185 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4186 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004187 ensureListEmpty(t, provideNativeLibs)
4188 ensureListEmpty(t, requireNativeLibs)
4189
Jooyung Hana0503a52023-08-23 13:12:50 +09004190 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004191 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4192 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004193 ensureListEmpty(t, provideNativeLibs)
4194 ensureListContains(t, requireNativeLibs, "libfoo.so")
4195
Jooyung Hana0503a52023-08-23 13:12:50 +09004196 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004197 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4198 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004199 ensureListContains(t, provideNativeLibs, "libfoo.so")
4200 ensureListEmpty(t, requireNativeLibs)
4201
Jooyung Hana0503a52023-08-23 13:12:50 +09004202 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004203 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4204 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004205 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004206 ensureListEmpty(t, requireNativeLibs)
4207}
4208
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004209func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4210 ctx := testApex(t, `
4211 apex {
4212 name: "myapex",
4213 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004214 native_shared_libs: ["mylib"],
4215 updatable: false,
4216 }
4217
4218 apex_key {
4219 name: "myapex.key",
4220 public_key: "testkey.avbpubkey",
4221 private_key: "testkey.pem",
4222 }
4223
4224 cc_library {
4225 name: "mylib",
4226 srcs: ["mylib.cpp"],
4227 system_shared_libs: [],
4228 stl: "none",
4229 apex_available: [
4230 "//apex_available:platform",
4231 "myapex",
4232 ],
4233 }
4234 `, android.FixtureMergeEnv(map[string]string{
4235 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4236 }))
4237
Jooyung Hana0503a52023-08-23 13:12:50 +09004238 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004239 apexManifestRule := module.Rule("apexManifestRule")
4240 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4241}
4242
Vinh Tran8f5310f2022-10-07 18:16:47 -04004243func TestCompileMultilibProp(t *testing.T) {
4244 testCases := []struct {
4245 compileMultiLibProp string
4246 containedLibs []string
4247 notContainedLibs []string
4248 }{
4249 {
4250 containedLibs: []string{
4251 "image.apex/lib64/mylib.so",
4252 "image.apex/lib/mylib.so",
4253 },
4254 compileMultiLibProp: `compile_multilib: "both",`,
4255 },
4256 {
4257 containedLibs: []string{"image.apex/lib64/mylib.so"},
4258 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4259 compileMultiLibProp: `compile_multilib: "first",`,
4260 },
4261 {
4262 containedLibs: []string{"image.apex/lib64/mylib.so"},
4263 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4264 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4265 },
4266 {
4267 containedLibs: []string{"image.apex/lib64/mylib.so"},
4268 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4269 compileMultiLibProp: `compile_multilib: "64",`,
4270 },
4271 {
4272 containedLibs: []string{"image.apex/lib/mylib.so"},
4273 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4274 compileMultiLibProp: `compile_multilib: "32",`,
4275 },
4276 }
4277 for _, testCase := range testCases {
4278 ctx := testApex(t, fmt.Sprintf(`
4279 apex {
4280 name: "myapex",
4281 key: "myapex.key",
4282 %s
4283 native_shared_libs: ["mylib"],
4284 updatable: false,
4285 }
4286 apex_key {
4287 name: "myapex.key",
4288 public_key: "testkey.avbpubkey",
4289 private_key: "testkey.pem",
4290 }
4291 cc_library {
4292 name: "mylib",
4293 srcs: ["mylib.cpp"],
4294 apex_available: [
4295 "//apex_available:platform",
4296 "myapex",
4297 ],
4298 }
4299 `, testCase.compileMultiLibProp),
4300 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004301 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004302 apexRule := module.Rule("apexRule")
4303 copyCmds := apexRule.Args["copy_commands"]
4304 for _, containedLib := range testCase.containedLibs {
4305 ensureContains(t, copyCmds, containedLib)
4306 }
4307 for _, notContainedLib := range testCase.notContainedLibs {
4308 ensureNotContains(t, copyCmds, notContainedLib)
4309 }
4310 }
4311}
4312
Alex Light0851b882019-02-07 13:20:53 -08004313func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004314 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004315 apex {
4316 name: "myapex",
4317 key: "myapex.key",
4318 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004319 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004320 }
4321
4322 apex_key {
4323 name: "myapex.key",
4324 public_key: "testkey.avbpubkey",
4325 private_key: "testkey.pem",
4326 }
4327
4328 cc_library {
4329 name: "mylib_common",
4330 srcs: ["mylib.cpp"],
4331 system_shared_libs: [],
4332 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004333 apex_available: [
4334 "//apex_available:platform",
4335 "myapex",
4336 ],
Alex Light0851b882019-02-07 13:20:53 -08004337 }
4338 `)
4339
Jooyung Hana0503a52023-08-23 13:12:50 +09004340 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004341 apexRule := module.Rule("apexRule")
4342 copyCmds := apexRule.Args["copy_commands"]
4343
4344 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4345 t.Log("Apex was a test apex!")
4346 t.Fail()
4347 }
4348 // Ensure that main rule creates an output
4349 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4350
4351 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004352 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004353
4354 // Ensure that both direct and indirect deps are copied into apex
4355 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4356
Colin Cross7113d202019-11-20 16:39:12 -08004357 // Ensure that the platform variant ends with _shared
4358 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004359
Colin Cross56a83212020-09-15 18:30:11 -07004360 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004361 t.Log("Found mylib_common not in any apex!")
4362 t.Fail()
4363 }
4364}
4365
4366func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004367 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004368 apex_test {
4369 name: "myapex",
4370 key: "myapex.key",
4371 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004372 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004373 }
4374
4375 apex_key {
4376 name: "myapex.key",
4377 public_key: "testkey.avbpubkey",
4378 private_key: "testkey.pem",
4379 }
4380
4381 cc_library {
4382 name: "mylib_common_test",
4383 srcs: ["mylib.cpp"],
4384 system_shared_libs: [],
4385 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004386 // TODO: remove //apex_available:platform
4387 apex_available: [
4388 "//apex_available:platform",
4389 "myapex",
4390 ],
Alex Light0851b882019-02-07 13:20:53 -08004391 }
4392 `)
4393
Jooyung Hana0503a52023-08-23 13:12:50 +09004394 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004395 apexRule := module.Rule("apexRule")
4396 copyCmds := apexRule.Args["copy_commands"]
4397
4398 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4399 t.Log("Apex was not a test apex!")
4400 t.Fail()
4401 }
4402 // Ensure that main rule creates an output
4403 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4404
4405 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004406 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004407
4408 // Ensure that both direct and indirect deps are copied into apex
4409 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4410
Colin Cross7113d202019-11-20 16:39:12 -08004411 // Ensure that the platform variant ends with _shared
4412 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004413}
4414
Jooyung Han85707de2023-12-01 14:21:13 +09004415func TestLibzVendorIsntStable(t *testing.T) {
4416 ctx := testApex(t, `
4417 apex {
4418 name: "myapex",
4419 key: "myapex.key",
4420 updatable: false,
4421 binaries: ["mybin"],
4422 }
4423 apex {
4424 name: "myvendorapex",
4425 key: "myapex.key",
4426 file_contexts: "myvendorapex_file_contexts",
4427 vendor: true,
4428 updatable: false,
4429 binaries: ["mybin"],
4430 }
4431 apex_key {
4432 name: "myapex.key",
4433 public_key: "testkey.avbpubkey",
4434 private_key: "testkey.pem",
4435 }
4436 cc_binary {
4437 name: "mybin",
4438 vendor_available: true,
4439 system_shared_libs: [],
4440 stl: "none",
4441 shared_libs: ["libz"],
4442 apex_available: ["//apex_available:anyapex"],
4443 }
4444 cc_library {
4445 name: "libz",
4446 vendor_available: true,
4447 system_shared_libs: [],
4448 stl: "none",
4449 stubs: {
4450 versions: ["28", "30"],
4451 },
4452 target: {
4453 vendor: {
4454 no_stubs: true,
4455 },
4456 },
4457 }
4458 `, withFiles(map[string][]byte{
4459 "myvendorapex_file_contexts": nil,
4460 }))
4461
4462 // libz provides stubs for core variant.
4463 {
4464 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4465 "bin/mybin",
4466 })
4467 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4468 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4469 }
4470 // libz doesn't provide stubs for vendor variant.
4471 {
4472 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4473 "bin/mybin",
4474 "lib64/libz.so",
4475 })
4476 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4477 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4478 }
4479}
4480
Alex Light9670d332019-01-29 18:07:33 -08004481func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004482 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004483 apex {
4484 name: "myapex",
4485 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004486 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004487 multilib: {
4488 first: {
4489 native_shared_libs: ["mylib_common"],
4490 }
4491 },
4492 target: {
4493 android: {
4494 multilib: {
4495 first: {
4496 native_shared_libs: ["mylib"],
4497 }
4498 }
4499 },
4500 host: {
4501 multilib: {
4502 first: {
4503 native_shared_libs: ["mylib2"],
4504 }
4505 }
4506 }
4507 }
4508 }
4509
4510 apex_key {
4511 name: "myapex.key",
4512 public_key: "testkey.avbpubkey",
4513 private_key: "testkey.pem",
4514 }
4515
4516 cc_library {
4517 name: "mylib",
4518 srcs: ["mylib.cpp"],
4519 system_shared_libs: [],
4520 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004521 // TODO: remove //apex_available:platform
4522 apex_available: [
4523 "//apex_available:platform",
4524 "myapex",
4525 ],
Alex Light9670d332019-01-29 18:07:33 -08004526 }
4527
4528 cc_library {
4529 name: "mylib_common",
4530 srcs: ["mylib.cpp"],
4531 system_shared_libs: [],
4532 stl: "none",
4533 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004534 // TODO: remove //apex_available:platform
4535 apex_available: [
4536 "//apex_available:platform",
4537 "myapex",
4538 ],
Alex Light9670d332019-01-29 18:07:33 -08004539 }
4540
4541 cc_library {
4542 name: "mylib2",
4543 srcs: ["mylib.cpp"],
4544 system_shared_libs: [],
4545 stl: "none",
4546 compile_multilib: "first",
4547 }
4548 `)
4549
Jooyung Hana0503a52023-08-23 13:12:50 +09004550 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004551 copyCmds := apexRule.Args["copy_commands"]
4552
4553 // Ensure that main rule creates an output
4554 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4555
4556 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004557 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4558 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4559 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004560
4561 // Ensure that both direct and indirect deps are copied into apex
4562 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4563 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4564 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4565
Colin Cross7113d202019-11-20 16:39:12 -08004566 // Ensure that the platform variant ends with _shared
4567 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4568 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4569 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004570}
Jiyong Park04480cf2019-02-06 00:16:29 +09004571
Jiyong Park59140302020-12-14 18:44:04 +09004572func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004573 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004574 apex {
4575 name: "myapex",
4576 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004577 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004578 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004579 arch: {
4580 arm64: {
4581 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004582 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004583 },
4584 x86_64: {
4585 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004586 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004587 },
4588 }
4589 }
4590
4591 apex_key {
4592 name: "myapex.key",
4593 public_key: "testkey.avbpubkey",
4594 private_key: "testkey.pem",
4595 }
4596
4597 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004598 name: "mylib.generic",
4599 srcs: ["mylib.cpp"],
4600 system_shared_libs: [],
4601 stl: "none",
4602 // TODO: remove //apex_available:platform
4603 apex_available: [
4604 "//apex_available:platform",
4605 "myapex",
4606 ],
4607 }
4608
4609 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004610 name: "mylib.arm64",
4611 srcs: ["mylib.cpp"],
4612 system_shared_libs: [],
4613 stl: "none",
4614 // TODO: remove //apex_available:platform
4615 apex_available: [
4616 "//apex_available:platform",
4617 "myapex",
4618 ],
4619 }
4620
4621 cc_library {
4622 name: "mylib.x64",
4623 srcs: ["mylib.cpp"],
4624 system_shared_libs: [],
4625 stl: "none",
4626 // TODO: remove //apex_available:platform
4627 apex_available: [
4628 "//apex_available:platform",
4629 "myapex",
4630 ],
4631 }
4632 `)
4633
Jooyung Hana0503a52023-08-23 13:12:50 +09004634 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004635 copyCmds := apexRule.Args["copy_commands"]
4636
4637 // Ensure that apex variant is created for the direct dep
4638 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004639 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004640 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4641
4642 // Ensure that both direct and indirect deps are copied into apex
4643 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4644 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4645}
4646
Jiyong Park04480cf2019-02-06 00:16:29 +09004647func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004648 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004649 apex {
4650 name: "myapex",
4651 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004652 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004653 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004654 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004655 }
4656
4657 apex_key {
4658 name: "myapex.key",
4659 public_key: "testkey.avbpubkey",
4660 private_key: "testkey.pem",
4661 }
4662
4663 sh_binary {
4664 name: "myscript",
4665 src: "mylib.cpp",
4666 filename: "myscript.sh",
4667 sub_dir: "script",
4668 }
4669 `)
4670
Jooyung Hana0503a52023-08-23 13:12:50 +09004671 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004672 copyCmds := apexRule.Args["copy_commands"]
4673
4674 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4675}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004676
Jooyung Han91df2082019-11-20 01:49:42 +09004677func TestApexInVariousPartition(t *testing.T) {
4678 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004679 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004680 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004681 {"", "system"},
4682 {"product_specific: true", "product"},
4683 {"soc_specific: true", "vendor"},
4684 {"proprietary: true", "vendor"},
4685 {"vendor: true", "vendor"},
4686 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004687 }
4688 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004689 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004690 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004691 apex {
4692 name: "myapex",
4693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004694 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004695 `+tc.propName+`
4696 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004697
Jooyung Han91df2082019-11-20 01:49:42 +09004698 apex_key {
4699 name: "myapex.key",
4700 public_key: "testkey.avbpubkey",
4701 private_key: "testkey.pem",
4702 }
4703 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004704
Jooyung Hana0503a52023-08-23 13:12:50 +09004705 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004706 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004707 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004708 if actual != expected {
4709 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4710 }
Jooyung Han91df2082019-11-20 01:49:42 +09004711 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004712 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004713}
Jiyong Park67882562019-03-21 01:11:21 +09004714
Jooyung Han580eb4f2020-06-24 19:33:06 +09004715func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004716 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004717 apex {
4718 name: "myapex",
4719 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004720 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004721 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004722
Jooyung Han580eb4f2020-06-24 19:33:06 +09004723 apex_key {
4724 name: "myapex.key",
4725 public_key: "testkey.avbpubkey",
4726 private_key: "testkey.pem",
4727 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004728 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004729 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004730 rule := module.Output("file_contexts")
4731 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4732}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004733
Jooyung Han580eb4f2020-06-24 19:33:06 +09004734func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004735 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004736 apex {
4737 name: "myapex",
4738 key: "myapex.key",
4739 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004740 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004741 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004742
Jooyung Han580eb4f2020-06-24 19:33:06 +09004743 apex_key {
4744 name: "myapex.key",
4745 public_key: "testkey.avbpubkey",
4746 private_key: "testkey.pem",
4747 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004748 `, withFiles(map[string][]byte{
4749 "my_own_file_contexts": nil,
4750 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004751}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004752
Jooyung Han580eb4f2020-06-24 19:33:06 +09004753func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004754 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004755 apex {
4756 name: "myapex",
4757 key: "myapex.key",
4758 product_specific: true,
4759 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004760 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004761 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004762
Jooyung Han580eb4f2020-06-24 19:33:06 +09004763 apex_key {
4764 name: "myapex.key",
4765 public_key: "testkey.avbpubkey",
4766 private_key: "testkey.pem",
4767 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004768 `)
4769
Colin Cross1c460562021-02-16 17:55:47 -08004770 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004771 apex {
4772 name: "myapex",
4773 key: "myapex.key",
4774 product_specific: true,
4775 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004776 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004777 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004778
Jooyung Han580eb4f2020-06-24 19:33:06 +09004779 apex_key {
4780 name: "myapex.key",
4781 public_key: "testkey.avbpubkey",
4782 private_key: "testkey.pem",
4783 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004784 `, withFiles(map[string][]byte{
4785 "product_specific_file_contexts": nil,
4786 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004787 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004788 rule := module.Output("file_contexts")
4789 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4790}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004791
Jooyung Han580eb4f2020-06-24 19:33:06 +09004792func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004793 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004794 apex {
4795 name: "myapex",
4796 key: "myapex.key",
4797 product_specific: true,
4798 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004799 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004800 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004801
Jooyung Han580eb4f2020-06-24 19:33:06 +09004802 apex_key {
4803 name: "myapex.key",
4804 public_key: "testkey.avbpubkey",
4805 private_key: "testkey.pem",
4806 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004807
Jooyung Han580eb4f2020-06-24 19:33:06 +09004808 filegroup {
4809 name: "my-file-contexts",
4810 srcs: ["product_specific_file_contexts"],
4811 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004812 `, withFiles(map[string][]byte{
4813 "product_specific_file_contexts": nil,
4814 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004815 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004816 rule := module.Output("file_contexts")
4817 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004818}
4819
Jiyong Park67882562019-03-21 01:11:21 +09004820func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004821 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004822 apex_key {
4823 name: "myapex.key",
4824 public_key: ":my.avbpubkey",
4825 private_key: ":my.pem",
4826 product_specific: true,
4827 }
4828
4829 filegroup {
4830 name: "my.avbpubkey",
4831 srcs: ["testkey2.avbpubkey"],
4832 }
4833
4834 filegroup {
4835 name: "my.pem",
4836 srcs: ["testkey2.pem"],
4837 }
4838 `)
4839
4840 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4841 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004842 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004843 if actual_pubkey != expected_pubkey {
4844 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4845 }
4846 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004847 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004848 if actual_privkey != expected_privkey {
4849 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4850 }
4851}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004852
4853func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004854 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004855 prebuilt_apex {
4856 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004857 arch: {
4858 arm64: {
4859 src: "myapex-arm64.apex",
4860 },
4861 arm: {
4862 src: "myapex-arm.apex",
4863 },
4864 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004865 }
4866 `)
4867
Wei Li340ee8e2022-03-18 17:33:24 -07004868 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4869 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004870
Jiyong Parkc95714e2019-03-29 14:23:10 +09004871 expectedInput := "myapex-arm64.apex"
4872 if prebuilt.inputApex.String() != expectedInput {
4873 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4874 }
Wei Li340ee8e2022-03-18 17:33:24 -07004875 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4876 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4877 rule := testingModule.Rule("genProvenanceMetaData")
4878 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4879 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4880 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4881 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004882
4883 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4884 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004885}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004886
Paul Duffinc0609c62021-03-01 17:27:16 +00004887func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004888 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004889 prebuilt_apex {
4890 name: "myapex",
4891 }
4892 `)
4893}
4894
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004895func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004896 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004897 prebuilt_apex {
4898 name: "myapex",
4899 src: "myapex-arm.apex",
4900 filename: "notmyapex.apex",
4901 }
4902 `)
4903
Wei Li340ee8e2022-03-18 17:33:24 -07004904 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4905 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004906
4907 expected := "notmyapex.apex"
4908 if p.installFilename != expected {
4909 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4910 }
Wei Li340ee8e2022-03-18 17:33:24 -07004911 rule := testingModule.Rule("genProvenanceMetaData")
4912 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4913 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4914 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4915 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004916}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004917
Samiul Islam7c02e262021-09-08 17:48:28 +01004918func TestApexSetFilenameOverride(t *testing.T) {
4919 testApex(t, `
4920 apex_set {
4921 name: "com.company.android.myapex",
4922 apex_name: "com.android.myapex",
4923 set: "company-myapex.apks",
4924 filename: "com.company.android.myapex.apex"
4925 }
4926 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4927
4928 testApex(t, `
4929 apex_set {
4930 name: "com.company.android.myapex",
4931 apex_name: "com.android.myapex",
4932 set: "company-myapex.apks",
4933 filename: "com.company.android.myapex.capex"
4934 }
4935 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4936
4937 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4938 apex_set {
4939 name: "com.company.android.myapex",
4940 apex_name: "com.android.myapex",
4941 set: "company-myapex.apks",
4942 filename: "some-random-suffix"
4943 }
4944 `)
4945}
4946
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004947func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004948 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004949 prebuilt_apex {
4950 name: "myapex.prebuilt",
4951 src: "myapex-arm.apex",
4952 overrides: [
4953 "myapex",
4954 ],
4955 }
4956 `)
4957
Wei Li340ee8e2022-03-18 17:33:24 -07004958 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4959 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004960
4961 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004962 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004963 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004964 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004965 }
Wei Li340ee8e2022-03-18 17:33:24 -07004966 rule := testingModule.Rule("genProvenanceMetaData")
4967 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4968 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4969 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4970 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004971}
4972
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004973func TestPrebuiltApexName(t *testing.T) {
4974 testApex(t, `
4975 prebuilt_apex {
4976 name: "com.company.android.myapex",
4977 apex_name: "com.android.myapex",
4978 src: "company-myapex-arm.apex",
4979 }
4980 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4981
4982 testApex(t, `
4983 apex_set {
4984 name: "com.company.android.myapex",
4985 apex_name: "com.android.myapex",
4986 set: "company-myapex.apks",
4987 }
4988 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4989}
4990
4991func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4992 _ = android.GroupFixturePreparers(
4993 java.PrepareForTestWithJavaDefaultModules,
4994 PrepareForTestWithApexBuildComponents,
4995 android.FixtureWithRootAndroidBp(`
4996 platform_bootclasspath {
4997 name: "platform-bootclasspath",
4998 fragments: [
4999 {
5000 apex: "com.android.art",
5001 module: "art-bootclasspath-fragment",
5002 },
5003 ],
5004 }
5005
5006 prebuilt_apex {
5007 name: "com.company.android.art",
5008 apex_name: "com.android.art",
5009 src: "com.company.android.art-arm.apex",
5010 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5011 }
5012
5013 prebuilt_bootclasspath_fragment {
5014 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005015 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005016 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005017 hidden_api: {
5018 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5019 metadata: "my-bootclasspath-fragment/metadata.csv",
5020 index: "my-bootclasspath-fragment/index.csv",
5021 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5022 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5023 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005024 }
5025
5026 java_import {
5027 name: "core-oj",
5028 jars: ["prebuilt.jar"],
5029 }
5030 `),
5031 ).RunTest(t)
5032}
5033
Spandan Das59a4a2b2024-01-09 21:35:56 +00005034// A minimal context object for use with DexJarBuildPath
5035type moduleErrorfTestCtx struct {
5036}
5037
5038func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5039}
5040
Paul Duffin092153d2021-01-26 11:42:39 +00005041// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5042// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005043func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005044 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005045
Paul Duffin89886cb2021-02-05 16:44:03 +00005046 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005047 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005048 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005049 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005050 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005051 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005052 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00005053 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09005054 android.NormalizePathForTesting(dexJarBuildPath))
5055 }
5056
5057 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005058 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005059 // Make sure the import has been given the correct path to the dex jar.
5060 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5061 dexJarBuildPath := p.DexJarInstallPath()
5062 stem := android.RemoveOptionalPrebuiltPrefix(name)
5063 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5064 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5065 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005066 }
5067
Paul Duffin39853512021-02-26 11:09:39 +00005068 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005069 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005070 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005071 android.AssertArrayString(t, "Check if there is no source variant",
5072 []string{"android_common"},
5073 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005074 }
5075
5076 t.Run("prebuilt only", func(t *testing.T) {
5077 bp := `
5078 prebuilt_apex {
5079 name: "myapex",
5080 arch: {
5081 arm64: {
5082 src: "myapex-arm64.apex",
5083 },
5084 arm: {
5085 src: "myapex-arm.apex",
5086 },
5087 },
Paul Duffin39853512021-02-26 11:09:39 +00005088 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005089 }
5090
5091 java_import {
5092 name: "libfoo",
5093 jars: ["libfoo.jar"],
5094 }
Paul Duffin39853512021-02-26 11:09:39 +00005095
5096 java_sdk_library_import {
5097 name: "libbar",
5098 public: {
5099 jars: ["libbar.jar"],
5100 },
5101 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005102 `
5103
5104 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5105 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5106
Spandan Das3576e762024-01-03 18:57:03 +00005107 deapexerName := deapexerModuleName("prebuilt_myapex")
5108 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01005109
Paul Duffinf6932af2021-02-26 18:21:56 +00005110 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005111 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005112 rule := deapexer.Rule("deapexer")
5113 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5114 t.Errorf("expected: %q, found: %q", expected, actual)
5115 }
5116
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005117 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005118 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005119 rule = prebuiltApex.Rule("android/soong/android.Cp")
5120 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5121 t.Errorf("expected: %q, found: %q", expected, actual)
5122 }
5123
Paul Duffin89886cb2021-02-05 16:44:03 +00005124 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005125 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005126
5127 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005128 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005129 })
5130
5131 t.Run("prebuilt with source preferred", func(t *testing.T) {
5132
5133 bp := `
5134 prebuilt_apex {
5135 name: "myapex",
5136 arch: {
5137 arm64: {
5138 src: "myapex-arm64.apex",
5139 },
5140 arm: {
5141 src: "myapex-arm.apex",
5142 },
5143 },
Paul Duffin39853512021-02-26 11:09:39 +00005144 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005145 }
5146
5147 java_import {
5148 name: "libfoo",
5149 jars: ["libfoo.jar"],
5150 }
5151
5152 java_library {
5153 name: "libfoo",
5154 }
Paul Duffin39853512021-02-26 11:09:39 +00005155
5156 java_sdk_library_import {
5157 name: "libbar",
5158 public: {
5159 jars: ["libbar.jar"],
5160 },
5161 }
5162
5163 java_sdk_library {
5164 name: "libbar",
5165 srcs: ["foo/bar/MyClass.java"],
5166 unsafe_ignore_missing_latest_api: true,
5167 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005168 `
5169
5170 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5171 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5172
Paul Duffin89886cb2021-02-05 16:44:03 +00005173 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005174 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005175 ensureNoSourceVariant(t, ctx, "libfoo")
5176
5177 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005178 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005179 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005180 })
5181
5182 t.Run("prebuilt preferred with source", func(t *testing.T) {
5183 bp := `
5184 prebuilt_apex {
5185 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005186 arch: {
5187 arm64: {
5188 src: "myapex-arm64.apex",
5189 },
5190 arm: {
5191 src: "myapex-arm.apex",
5192 },
5193 },
Paul Duffin39853512021-02-26 11:09:39 +00005194 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005195 }
5196
5197 java_import {
5198 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005199 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005200 jars: ["libfoo.jar"],
5201 }
5202
5203 java_library {
5204 name: "libfoo",
5205 }
Paul Duffin39853512021-02-26 11:09:39 +00005206
5207 java_sdk_library_import {
5208 name: "libbar",
5209 prefer: true,
5210 public: {
5211 jars: ["libbar.jar"],
5212 },
5213 }
5214
5215 java_sdk_library {
5216 name: "libbar",
5217 srcs: ["foo/bar/MyClass.java"],
5218 unsafe_ignore_missing_latest_api: true,
5219 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005220 `
5221
5222 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5223 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5224
Paul Duffin89886cb2021-02-05 16:44:03 +00005225 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005226 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005227 ensureNoSourceVariant(t, ctx, "libfoo")
5228
5229 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005230 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005231 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005232 })
5233}
5234
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005235func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005236 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005237 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005238 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5239 // is disabled.
5240 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5241 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005242
Paul Duffin37856732021-02-26 14:24:15 +00005243 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5244 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005245 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005246 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005247 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005248 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005249 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005250 foundLibfooJar = true
5251 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005252 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005253 }
5254 }
5255 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005256 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 +00005257 }
5258 }
5259
Paul Duffin40a3f652021-07-19 13:11:24 +01005260 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005261 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005262 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005263 var rule android.TestingBuildParams
5264
5265 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5266 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005267 }
5268
Paul Duffin40a3f652021-07-19 13:11:24 +01005269 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5270 t.Helper()
5271 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5272 var rule android.TestingBuildParams
5273
5274 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5275 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5276 }
5277
Paul Duffin89f570a2021-06-16 01:42:33 +01005278 fragment := java.ApexVariantReference{
5279 Apex: proptools.StringPtr("myapex"),
5280 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5281 }
5282
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005283 t.Run("prebuilt only", func(t *testing.T) {
5284 bp := `
5285 prebuilt_apex {
5286 name: "myapex",
5287 arch: {
5288 arm64: {
5289 src: "myapex-arm64.apex",
5290 },
5291 arm: {
5292 src: "myapex-arm.apex",
5293 },
5294 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005295 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5296 }
5297
5298 prebuilt_bootclasspath_fragment {
5299 name: "my-bootclasspath-fragment",
5300 contents: ["libfoo", "libbar"],
5301 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005302 hidden_api: {
5303 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5304 metadata: "my-bootclasspath-fragment/metadata.csv",
5305 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005306 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5307 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5308 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005309 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310 }
5311
5312 java_import {
5313 name: "libfoo",
5314 jars: ["libfoo.jar"],
5315 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005316 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005317 }
Paul Duffin37856732021-02-26 14:24:15 +00005318
5319 java_sdk_library_import {
5320 name: "libbar",
5321 public: {
5322 jars: ["libbar.jar"],
5323 },
5324 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005325 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005326 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005327 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005328 `
5329
Paul Duffin89f570a2021-06-16 01:42:33 +01005330 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005331 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5332 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005333
Paul Duffin537ea3d2021-05-14 10:38:00 +01005334 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005335 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005336 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005337 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005338 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005339 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 +01005340 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005341 })
5342
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005343 t.Run("apex_set only", func(t *testing.T) {
5344 bp := `
5345 apex_set {
5346 name: "myapex",
5347 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005348 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005349 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005350 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5351 }
5352
5353 java_import {
5354 name: "myjavalib",
5355 jars: ["myjavalib.jar"],
5356 apex_available: ["myapex"],
5357 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005358 }
5359
5360 prebuilt_bootclasspath_fragment {
5361 name: "my-bootclasspath-fragment",
5362 contents: ["libfoo", "libbar"],
5363 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005364 hidden_api: {
5365 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5366 metadata: "my-bootclasspath-fragment/metadata.csv",
5367 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005368 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5369 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5370 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005371 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005372 }
5373
Liz Kammer2dc72442023-04-20 10:10:48 -04005374 prebuilt_systemserverclasspath_fragment {
5375 name: "my-systemserverclasspath-fragment",
5376 contents: ["libbaz"],
5377 apex_available: ["myapex"],
5378 }
5379
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005380 java_import {
5381 name: "libfoo",
5382 jars: ["libfoo.jar"],
5383 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005384 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005385 }
5386
5387 java_sdk_library_import {
5388 name: "libbar",
5389 public: {
5390 jars: ["libbar.jar"],
5391 },
5392 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005393 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005394 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005395 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005396
5397 java_sdk_library_import {
5398 name: "libbaz",
5399 public: {
5400 jars: ["libbaz.jar"],
5401 },
5402 apex_available: ["myapex"],
5403 shared_library: false,
5404 permitted_packages: ["baz"],
5405 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005406 `
5407
Paul Duffin89f570a2021-06-16 01:42:33 +01005408 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005409 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5410 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005411
Paul Duffin537ea3d2021-05-14 10:38:00 +01005412 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005413 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005414 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005415 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005416 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005417 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 +01005418 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005419
5420 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5421
5422 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005423 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005424 "myjavalib.myapex",
5425 "libfoo.myapex",
5426 "libbar.myapex",
5427 "libbaz.myapex",
5428 }
5429 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5430 for i, e := range mkEntries {
5431 g := e.OverrideName
5432 if w := overrideNames[i]; w != g {
5433 t.Errorf("Expected override name %q, got %q", w, g)
5434 }
5435 }
5436
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005437 })
5438
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005439 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5440 bp := `
5441 prebuilt_apex {
5442 name: "myapex",
5443 arch: {
5444 arm64: {
5445 src: "myapex-arm64.apex",
5446 },
5447 arm: {
5448 src: "myapex-arm.apex",
5449 },
5450 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005451 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5452 }
5453
5454 prebuilt_bootclasspath_fragment {
5455 name: "my-bootclasspath-fragment",
5456 contents: ["libfoo", "libbar"],
5457 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005458 hidden_api: {
5459 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5460 metadata: "my-bootclasspath-fragment/metadata.csv",
5461 index: "my-bootclasspath-fragment/index.csv",
5462 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5463 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5464 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 }
5466
5467 java_import {
5468 name: "libfoo",
5469 jars: ["libfoo.jar"],
5470 apex_available: ["myapex"],
5471 }
5472
5473 java_library {
5474 name: "libfoo",
5475 srcs: ["foo/bar/MyClass.java"],
5476 apex_available: ["myapex"],
5477 }
Paul Duffin37856732021-02-26 14:24:15 +00005478
5479 java_sdk_library_import {
5480 name: "libbar",
5481 public: {
5482 jars: ["libbar.jar"],
5483 },
5484 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005485 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005486 }
5487
5488 java_sdk_library {
5489 name: "libbar",
5490 srcs: ["foo/bar/MyClass.java"],
5491 unsafe_ignore_missing_latest_api: true,
5492 apex_available: ["myapex"],
5493 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005494 `
5495
5496 // In this test the source (java_library) libfoo is active since the
5497 // prebuilt (java_import) defaults to prefer:false. However the
5498 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5499 // find the dex boot jar in it. We either need to disable the source libfoo
5500 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005501 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005502 // dexbootjar check is skipped if AllowMissingDependencies is true
5503 preparerAllowMissingDeps := android.GroupFixturePreparers(
5504 preparer,
5505 android.PrepareForTestWithAllowMissingDependencies,
5506 )
5507 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005508 })
5509
5510 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5511 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005512 apex {
5513 name: "myapex",
5514 key: "myapex.key",
5515 updatable: false,
5516 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5517 }
5518
5519 apex_key {
5520 name: "myapex.key",
5521 public_key: "testkey.avbpubkey",
5522 private_key: "testkey.pem",
5523 }
5524
5525 bootclasspath_fragment {
5526 name: "my-bootclasspath-fragment",
5527 contents: ["libfoo", "libbar"],
5528 apex_available: ["myapex"],
5529 hidden_api: {
5530 split_packages: ["*"],
5531 },
5532 }
5533
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005534 prebuilt_apex {
5535 name: "myapex",
5536 arch: {
5537 arm64: {
5538 src: "myapex-arm64.apex",
5539 },
5540 arm: {
5541 src: "myapex-arm.apex",
5542 },
5543 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005544 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5545 }
5546
5547 prebuilt_bootclasspath_fragment {
5548 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005549 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005550 contents: ["libfoo", "libbar"],
5551 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005552 hidden_api: {
5553 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5554 metadata: "my-bootclasspath-fragment/metadata.csv",
5555 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005556 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5557 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5558 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005559 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005560 }
5561
5562 java_import {
5563 name: "libfoo",
5564 prefer: true,
5565 jars: ["libfoo.jar"],
5566 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005567 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005568 }
5569
5570 java_library {
5571 name: "libfoo",
5572 srcs: ["foo/bar/MyClass.java"],
5573 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005574 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005575 }
Paul Duffin37856732021-02-26 14:24:15 +00005576
5577 java_sdk_library_import {
5578 name: "libbar",
5579 prefer: true,
5580 public: {
5581 jars: ["libbar.jar"],
5582 },
5583 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005584 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005585 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005586 }
5587
5588 java_sdk_library {
5589 name: "libbar",
5590 srcs: ["foo/bar/MyClass.java"],
5591 unsafe_ignore_missing_latest_api: true,
5592 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005593 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005594 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005595 `
5596
Paul Duffin89f570a2021-06-16 01:42:33 +01005597 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005598 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5599 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005600
Paul Duffin537ea3d2021-05-14 10:38:00 +01005601 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005602 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005603 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005604 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005605 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005606 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 +01005607 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005608 })
5609
5610 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5611 bp := `
5612 apex {
5613 name: "myapex",
5614 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005615 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005616 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005617 }
5618
5619 apex_key {
5620 name: "myapex.key",
5621 public_key: "testkey.avbpubkey",
5622 private_key: "testkey.pem",
5623 }
5624
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005625 bootclasspath_fragment {
5626 name: "my-bootclasspath-fragment",
5627 contents: ["libfoo", "libbar"],
5628 apex_available: ["myapex"],
5629 hidden_api: {
5630 split_packages: ["*"],
5631 },
5632 }
5633
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005634 prebuilt_apex {
5635 name: "myapex",
5636 arch: {
5637 arm64: {
5638 src: "myapex-arm64.apex",
5639 },
5640 arm: {
5641 src: "myapex-arm.apex",
5642 },
5643 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005644 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5645 }
5646
5647 prebuilt_bootclasspath_fragment {
5648 name: "my-bootclasspath-fragment",
5649 contents: ["libfoo", "libbar"],
5650 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005651 hidden_api: {
5652 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5653 metadata: "my-bootclasspath-fragment/metadata.csv",
5654 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005655 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5656 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5657 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005658 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005659 }
5660
5661 java_import {
5662 name: "libfoo",
5663 jars: ["libfoo.jar"],
5664 apex_available: ["myapex"],
5665 }
5666
5667 java_library {
5668 name: "libfoo",
5669 srcs: ["foo/bar/MyClass.java"],
5670 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005671 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005672 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005673 }
Paul Duffin37856732021-02-26 14:24:15 +00005674
5675 java_sdk_library_import {
5676 name: "libbar",
5677 public: {
5678 jars: ["libbar.jar"],
5679 },
5680 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005681 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005682 }
5683
5684 java_sdk_library {
5685 name: "libbar",
5686 srcs: ["foo/bar/MyClass.java"],
5687 unsafe_ignore_missing_latest_api: true,
5688 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005689 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005690 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005691 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005692 `
5693
Paul Duffin89f570a2021-06-16 01:42:33 +01005694 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005695 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5696 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 +00005697
Paul Duffin537ea3d2021-05-14 10:38:00 +01005698 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005699 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005700 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5701 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005702 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5703 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 +01005704 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005705 })
5706
5707 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5708 bp := `
5709 apex {
5710 name: "myapex",
5711 enabled: false,
5712 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005713 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005714 }
5715
5716 apex_key {
5717 name: "myapex.key",
5718 public_key: "testkey.avbpubkey",
5719 private_key: "testkey.pem",
5720 }
5721
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005722 bootclasspath_fragment {
5723 name: "my-bootclasspath-fragment",
5724 enabled: false,
5725 contents: ["libfoo", "libbar"],
5726 apex_available: ["myapex"],
5727 hidden_api: {
5728 split_packages: ["*"],
5729 },
5730 }
5731
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005732 prebuilt_apex {
5733 name: "myapex",
5734 arch: {
5735 arm64: {
5736 src: "myapex-arm64.apex",
5737 },
5738 arm: {
5739 src: "myapex-arm.apex",
5740 },
5741 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005742 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5743 }
5744
5745 prebuilt_bootclasspath_fragment {
5746 name: "my-bootclasspath-fragment",
5747 contents: ["libfoo", "libbar"],
5748 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005749 hidden_api: {
5750 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5751 metadata: "my-bootclasspath-fragment/metadata.csv",
5752 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005753 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5754 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5755 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005756 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005757 }
5758
5759 java_import {
5760 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005761 jars: ["libfoo.jar"],
5762 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005763 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005764 }
5765
5766 java_library {
5767 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005768 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005769 srcs: ["foo/bar/MyClass.java"],
5770 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005771 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005772 }
Paul Duffin37856732021-02-26 14:24:15 +00005773
5774 java_sdk_library_import {
5775 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005776 public: {
5777 jars: ["libbar.jar"],
5778 },
5779 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005780 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005781 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005782 }
5783
5784 java_sdk_library {
5785 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005786 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005787 srcs: ["foo/bar/MyClass.java"],
5788 unsafe_ignore_missing_latest_api: true,
5789 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005790 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005791 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005792 `
5793
Paul Duffin89f570a2021-06-16 01:42:33 +01005794 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005795 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5796 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005797
Paul Duffin537ea3d2021-05-14 10:38:00 +01005798 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005799 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005800 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005801 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005802 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005803 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 +01005804 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005805 })
Spandan Das3a392012024-01-17 18:26:27 +00005806
Spandan Dasf2c10572024-02-27 04:49:52 +00005807 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005808 bp := `
5809 // Source
5810 apex {
5811 name: "myapex",
5812 enabled: false,
5813 key: "myapex.key",
5814 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5815 }
5816
5817 apex_key {
5818 name: "myapex.key",
5819 public_key: "testkey.avbpubkey",
5820 private_key: "testkey.pem",
5821 }
5822
5823 // Prebuilt
5824 prebuilt_apex {
5825 name: "myapex.v1",
5826 source_apex_name: "myapex",
5827 arch: {
5828 arm64: {
5829 src: "myapex-arm64.apex",
5830 },
5831 arm: {
5832 src: "myapex-arm.apex",
5833 },
5834 },
5835 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5836 prefer: true,
5837 }
5838 prebuilt_apex {
5839 name: "myapex.v2",
5840 source_apex_name: "myapex",
5841 arch: {
5842 arm64: {
5843 src: "myapex-arm64.apex",
5844 },
5845 arm: {
5846 src: "myapex-arm.apex",
5847 },
5848 },
5849 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5850 prefer: true,
5851 }
5852
5853 prebuilt_bootclasspath_fragment {
5854 name: "my-bootclasspath-fragment",
5855 contents: ["libfoo", "libbar"],
5856 apex_available: ["myapex"],
5857 hidden_api: {
5858 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5859 metadata: "my-bootclasspath-fragment/metadata.csv",
5860 index: "my-bootclasspath-fragment/index.csv",
5861 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5862 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5863 },
5864 prefer: true,
5865 }
5866
5867 java_import {
5868 name: "libfoo",
5869 jars: ["libfoo.jar"],
5870 apex_available: ["myapex"],
5871 prefer: true,
5872 }
5873 java_import {
5874 name: "libbar",
5875 jars: ["libbar.jar"],
5876 apex_available: ["myapex"],
5877 prefer: true,
5878 }
5879 `
5880
Spandan Dasf2c10572024-02-27 04:49:52 +00005881 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 +00005882 })
5883
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005884}
5885
Roland Levillain630846d2019-06-26 12:48:34 +01005886func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005887 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005888 apex_test {
5889 name: "myapex",
5890 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005891 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005892 tests: [
5893 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005894 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005895 ],
5896 }
5897
5898 apex_key {
5899 name: "myapex.key",
5900 public_key: "testkey.avbpubkey",
5901 private_key: "testkey.pem",
5902 }
5903
Liz Kammer1c14a212020-05-12 15:26:55 -07005904 filegroup {
5905 name: "fg",
5906 srcs: [
5907 "baz",
5908 "bar/baz"
5909 ],
5910 }
5911
Roland Levillain630846d2019-06-26 12:48:34 +01005912 cc_test {
5913 name: "mytest",
5914 gtest: false,
5915 srcs: ["mytest.cpp"],
5916 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005917 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005918 system_shared_libs: [],
5919 static_executable: true,
5920 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005921 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005922 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005923
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005924 cc_library {
5925 name: "mylib",
5926 srcs: ["mylib.cpp"],
5927 system_shared_libs: [],
5928 stl: "none",
5929 }
5930
Liz Kammer5bd365f2020-05-27 15:15:11 -07005931 filegroup {
5932 name: "fg2",
5933 srcs: [
5934 "testdata/baz"
5935 ],
5936 }
5937
Roland Levillain9b5fde92019-06-28 15:41:19 +01005938 cc_test {
5939 name: "mytests",
5940 gtest: false,
5941 srcs: [
5942 "mytest1.cpp",
5943 "mytest2.cpp",
5944 "mytest3.cpp",
5945 ],
5946 test_per_src: true,
5947 relative_install_path: "test",
5948 system_shared_libs: [],
5949 static_executable: true,
5950 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005951 data: [
5952 ":fg",
5953 ":fg2",
5954 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005955 }
Roland Levillain630846d2019-06-26 12:48:34 +01005956 `)
5957
Jooyung Hana0503a52023-08-23 13:12:50 +09005958 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005959 copyCmds := apexRule.Args["copy_commands"]
5960
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005961 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005962 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005963 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005964
Liz Kammer1c14a212020-05-12 15:26:55 -07005965 //Ensure that test data are copied into apex.
5966 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5967 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5968
Roland Levillain9b5fde92019-06-28 15:41:19 +01005969 // Ensure that test deps built with `test_per_src` are copied into apex.
5970 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5971 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5972 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005973
5974 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005975 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005976 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005977 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005978 prefix := "TARGET_"
5979 var builder strings.Builder
5980 data.Custom(&builder, name, prefix, "", data)
5981 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005982 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5983 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5984 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5985 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005986 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005987}
5988
Jooyung Hand48f3c32019-08-23 11:18:57 +09005989func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5990 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5991 apex {
5992 name: "myapex",
5993 key: "myapex.key",
5994 native_shared_libs: ["libfoo"],
5995 }
5996
5997 apex_key {
5998 name: "myapex.key",
5999 public_key: "testkey.avbpubkey",
6000 private_key: "testkey.pem",
6001 }
6002
6003 cc_library {
6004 name: "libfoo",
6005 stl: "none",
6006 system_shared_libs: [],
6007 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006008 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006009 }
6010 `)
6011 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6012 apex {
6013 name: "myapex",
6014 key: "myapex.key",
6015 java_libs: ["myjar"],
6016 }
6017
6018 apex_key {
6019 name: "myapex.key",
6020 public_key: "testkey.avbpubkey",
6021 private_key: "testkey.pem",
6022 }
6023
6024 java_library {
6025 name: "myjar",
6026 srcs: ["foo/bar/MyClass.java"],
6027 sdk_version: "none",
6028 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006029 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006030 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006031 }
6032 `)
6033}
6034
Bill Peckhama41a6962021-01-11 10:58:54 -08006035func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006036 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006037 apex {
6038 name: "myapex",
6039 key: "myapex.key",
6040 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006041 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006042 }
6043
6044 apex_key {
6045 name: "myapex.key",
6046 public_key: "testkey.avbpubkey",
6047 private_key: "testkey.pem",
6048 }
6049
6050 java_import {
6051 name: "myjavaimport",
6052 apex_available: ["myapex"],
6053 jars: ["my.jar"],
6054 compile_dex: true,
6055 }
6056 `)
6057
Jooyung Hana0503a52023-08-23 13:12:50 +09006058 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006059 apexRule := module.Rule("apexRule")
6060 copyCmds := apexRule.Args["copy_commands"]
6061 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6062}
6063
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006064func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006065 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006066 apex {
6067 name: "myapex",
6068 key: "myapex.key",
6069 apps: [
6070 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006071 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006072 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006073 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006074 }
6075
6076 apex_key {
6077 name: "myapex.key",
6078 public_key: "testkey.avbpubkey",
6079 private_key: "testkey.pem",
6080 }
6081
6082 android_app {
6083 name: "AppFoo",
6084 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006085 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006086 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006087 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006088 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006089 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006090 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006091
6092 android_app {
6093 name: "AppFooPriv",
6094 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006095 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006096 system_modules: "none",
6097 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006098 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006099 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006100 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006101 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006102
6103 cc_library_shared {
6104 name: "libjni",
6105 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006106 shared_libs: ["libfoo"],
6107 stl: "none",
6108 system_shared_libs: [],
6109 apex_available: [ "myapex" ],
6110 sdk_version: "current",
6111 }
6112
6113 cc_library_shared {
6114 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006115 stl: "none",
6116 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006117 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006118 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006119 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006120 `)
6121
Jooyung Hana0503a52023-08-23 13:12:50 +09006122 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006123 apexRule := module.Rule("apexRule")
6124 copyCmds := apexRule.Args["copy_commands"]
6125
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006126 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6127 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006128 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006129
Colin Crossaede88c2020-08-11 12:17:01 -07006130 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006131 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006132 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006133 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006134 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006135 // JNI libraries including transitive deps are
6136 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006137 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006138 // ... embedded inside APK (jnilibs.zip)
6139 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6140 // ... and not directly inside the APEX
6141 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6142 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006143
6144 apexBundle := module.Module().(*apexBundle)
6145 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6146 var builder strings.Builder
6147 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6148 androidMk := builder.String()
6149 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6150 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6151 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6152 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6153 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6154 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 +01006155}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006156
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006157func TestApexWithAppImportBuildId(t *testing.T) {
6158 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6159 for _, id := range invalidBuildIds {
6160 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6161 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6162 variables.BuildId = proptools.StringPtr(id)
6163 })
6164 testApexError(t, message, `apex {
6165 name: "myapex",
6166 key: "myapex.key",
6167 apps: ["AppFooPrebuilt"],
6168 updatable: false,
6169 }
6170
6171 apex_key {
6172 name: "myapex.key",
6173 public_key: "testkey.avbpubkey",
6174 private_key: "testkey.pem",
6175 }
6176
6177 android_app_import {
6178 name: "AppFooPrebuilt",
6179 apk: "PrebuiltAppFoo.apk",
6180 presigned: true,
6181 apex_available: ["myapex"],
6182 }
6183 `, fixture)
6184 }
6185}
6186
Dario Frenicde2a032019-10-27 00:29:22 +01006187func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006188 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006189 apex {
6190 name: "myapex",
6191 key: "myapex.key",
6192 apps: [
6193 "AppFooPrebuilt",
6194 "AppFooPrivPrebuilt",
6195 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006196 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006197 }
6198
6199 apex_key {
6200 name: "myapex.key",
6201 public_key: "testkey.avbpubkey",
6202 private_key: "testkey.pem",
6203 }
6204
6205 android_app_import {
6206 name: "AppFooPrebuilt",
6207 apk: "PrebuiltAppFoo.apk",
6208 presigned: true,
6209 dex_preopt: {
6210 enabled: false,
6211 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006212 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006213 }
6214
6215 android_app_import {
6216 name: "AppFooPrivPrebuilt",
6217 apk: "PrebuiltAppFooPriv.apk",
6218 privileged: true,
6219 presigned: true,
6220 dex_preopt: {
6221 enabled: false,
6222 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006223 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006224 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006225 }
6226 `)
6227
Jooyung Hana0503a52023-08-23 13:12:50 +09006228 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006229 apexRule := module.Rule("apexRule")
6230 copyCmds := apexRule.Args["copy_commands"]
6231
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006232 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6233 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006234}
6235
6236func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006237 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006238 apex {
6239 name: "myapex",
6240 key: "myapex.key",
6241 apps: [
6242 "AppFoo",
6243 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006244 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006245 }
6246
6247 apex_key {
6248 name: "myapex.key",
6249 public_key: "testkey.avbpubkey",
6250 private_key: "testkey.pem",
6251 }
6252
6253 android_app {
6254 name: "AppFoo",
6255 srcs: ["foo/bar/MyClass.java"],
6256 sdk_version: "none",
6257 system_modules: "none",
6258 apex_available: [ "myapex" ],
6259 }
6260
6261 android_app_import {
6262 name: "AppFoo",
6263 apk: "AppFooPrebuilt.apk",
6264 filename: "AppFooPrebuilt.apk",
6265 presigned: true,
6266 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006267 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006268 }
6269 `, withFiles(map[string][]byte{
6270 "AppFooPrebuilt.apk": nil,
6271 }))
6272
Jooyung Hana0503a52023-08-23 13:12:50 +09006273 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006274 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006275 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006276}
6277
Dario Freni6f3937c2019-12-20 22:58:03 +00006278func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006279 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006280 apex {
6281 name: "myapex",
6282 key: "myapex.key",
6283 apps: [
6284 "TesterHelpAppFoo",
6285 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006286 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006287 }
6288
6289 apex_key {
6290 name: "myapex.key",
6291 public_key: "testkey.avbpubkey",
6292 private_key: "testkey.pem",
6293 }
6294
6295 android_test_helper_app {
6296 name: "TesterHelpAppFoo",
6297 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006298 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006299 }
6300
6301 `)
6302
Jooyung Hana0503a52023-08-23 13:12:50 +09006303 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006304 apexRule := module.Rule("apexRule")
6305 copyCmds := apexRule.Args["copy_commands"]
6306
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006307 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006308}
6309
Jooyung Han18020ea2019-11-13 10:50:48 +09006310func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6311 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006312 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006313 apex {
6314 name: "myapex",
6315 key: "myapex.key",
6316 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006317 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006318 }
6319
6320 apex_key {
6321 name: "myapex.key",
6322 public_key: "testkey.avbpubkey",
6323 private_key: "testkey.pem",
6324 }
6325
6326 apex {
6327 name: "otherapex",
6328 key: "myapex.key",
6329 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006330 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006331 }
6332
6333 cc_defaults {
6334 name: "libfoo-defaults",
6335 apex_available: ["otherapex"],
6336 }
6337
6338 cc_library {
6339 name: "libfoo",
6340 defaults: ["libfoo-defaults"],
6341 stl: "none",
6342 system_shared_libs: [],
6343 }`)
6344}
6345
Paul Duffine52e66f2020-03-30 17:54:29 +01006346func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006347 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006348 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006349 apex {
6350 name: "myapex",
6351 key: "myapex.key",
6352 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006353 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006354 }
6355
6356 apex_key {
6357 name: "myapex.key",
6358 public_key: "testkey.avbpubkey",
6359 private_key: "testkey.pem",
6360 }
6361
6362 apex {
6363 name: "otherapex",
6364 key: "otherapex.key",
6365 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006366 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006367 }
6368
6369 apex_key {
6370 name: "otherapex.key",
6371 public_key: "testkey.avbpubkey",
6372 private_key: "testkey.pem",
6373 }
6374
6375 cc_library {
6376 name: "libfoo",
6377 stl: "none",
6378 system_shared_libs: [],
6379 apex_available: ["otherapex"],
6380 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006381}
Jiyong Park127b40b2019-09-30 16:04:35 +09006382
Paul Duffine52e66f2020-03-30 17:54:29 +01006383func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006384 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006385 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006386.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006387.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006388.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006389.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006390.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006391.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006392 apex {
6393 name: "myapex",
6394 key: "myapex.key",
6395 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006396 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006397 }
6398
6399 apex_key {
6400 name: "myapex.key",
6401 public_key: "testkey.avbpubkey",
6402 private_key: "testkey.pem",
6403 }
6404
Jiyong Park127b40b2019-09-30 16:04:35 +09006405 cc_library {
6406 name: "libfoo",
6407 stl: "none",
6408 shared_libs: ["libbar"],
6409 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006410 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006411 }
6412
6413 cc_library {
6414 name: "libbar",
6415 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006416 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006417 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006418 apex_available: ["myapex"],
6419 }
6420
6421 cc_library {
6422 name: "libbaz",
6423 stl: "none",
6424 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006425 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006426}
Jiyong Park127b40b2019-09-30 16:04:35 +09006427
Liz Kammer5f108fa2023-05-11 14:33:17 -04006428func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6429 testApex(t, `
6430 apex {
6431 name: "myapex",
6432 key: "myapex.key",
6433 native_shared_libs: ["libfoo"],
6434 updatable: false,
6435 }
6436
6437 apex_key {
6438 name: "myapex.key",
6439 public_key: "testkey.avbpubkey",
6440 private_key: "testkey.pem",
6441 }
6442
6443 cc_library {
6444 name: "libfoo",
6445 stl: "none",
6446 static_libs: ["libbar"],
6447 system_shared_libs: [],
6448 apex_available: ["myapex"],
6449 }
6450
6451 cc_library {
6452 name: "libbar",
6453 stl: "none",
6454 shared_libs: ["libbaz"],
6455 system_shared_libs: [],
6456 apex_available: ["myapex"],
6457 }
6458
6459 cc_library {
6460 name: "libbaz",
6461 stl: "none",
6462 system_shared_libs: [],
6463 }`)
6464
6465 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6466 apex {
6467 name: "myapex",
6468 key: "myapex.key",
6469 native_shared_libs: ["libfoo"],
6470 updatable: false,
6471 }
6472
6473 apex_key {
6474 name: "myapex.key",
6475 public_key: "testkey.avbpubkey",
6476 private_key: "testkey.pem",
6477 }
6478
6479 cc_library {
6480 name: "libfoo",
6481 stl: "none",
6482 static_libs: ["libbar"],
6483 system_shared_libs: [],
6484 apex_available: ["myapex"],
6485 }
6486
6487 cc_library {
6488 name: "libbar",
6489 stl: "none",
6490 system_shared_libs: [],
6491 }`)
6492}
6493
Paul Duffine52e66f2020-03-30 17:54:29 +01006494func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006495 testApexError(t, "\"otherapex\" is not a valid module name", `
6496 apex {
6497 name: "myapex",
6498 key: "myapex.key",
6499 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006500 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006501 }
6502
6503 apex_key {
6504 name: "myapex.key",
6505 public_key: "testkey.avbpubkey",
6506 private_key: "testkey.pem",
6507 }
6508
6509 cc_library {
6510 name: "libfoo",
6511 stl: "none",
6512 system_shared_libs: [],
6513 apex_available: ["otherapex"],
6514 }`)
6515
Paul Duffine52e66f2020-03-30 17:54:29 +01006516 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006517 apex {
6518 name: "myapex",
6519 key: "myapex.key",
6520 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006521 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006522 }
6523
6524 apex_key {
6525 name: "myapex.key",
6526 public_key: "testkey.avbpubkey",
6527 private_key: "testkey.pem",
6528 }
6529
6530 cc_library {
6531 name: "libfoo",
6532 stl: "none",
6533 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006534 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006535 apex_available: ["myapex"],
6536 }
6537
6538 cc_library {
6539 name: "libbar",
6540 stl: "none",
6541 system_shared_libs: [],
6542 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006543 }
6544
6545 cc_library {
6546 name: "libbaz",
6547 stl: "none",
6548 system_shared_libs: [],
6549 stubs: {
6550 versions: ["10", "20", "30"],
6551 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006552 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006553}
Jiyong Park127b40b2019-09-30 16:04:35 +09006554
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006555func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6556 t.Run("negative variant_version produces error", func(t *testing.T) {
6557 testApexError(t, "expected an integer between 0-9; got -1", `
6558 apex {
6559 name: "myapex",
6560 key: "myapex.key",
6561 apex_available_name: "com.android.foo",
6562 variant_version: "-1",
6563 updatable: false,
6564 }
6565 apex_key {
6566 name: "myapex.key",
6567 public_key: "testkey.avbpubkey",
6568 private_key: "testkey.pem",
6569 }
6570 `)
6571 })
6572
6573 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6574 testApexError(t, "expected an integer between 0-9; got 10", `
6575 apex {
6576 name: "myapex",
6577 key: "myapex.key",
6578 apex_available_name: "com.android.foo",
6579 variant_version: "10",
6580 updatable: false,
6581 }
6582 apex_key {
6583 name: "myapex.key",
6584 public_key: "testkey.avbpubkey",
6585 private_key: "testkey.pem",
6586 }
6587 `)
6588 })
6589}
6590
6591func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6592 context := android.GroupFixturePreparers(
6593 android.PrepareForIntegrationTestWithAndroid,
6594 PrepareForTestWithApexBuildComponents,
6595 android.FixtureMergeMockFs(android.MockFS{
6596 "system/sepolicy/apex/foo-file_contexts": nil,
6597 "system/sepolicy/apex/bar-file_contexts": nil,
6598 }),
6599 )
6600 result := context.RunTestWithBp(t, `
6601 apex {
6602 name: "foo",
6603 key: "myapex.key",
6604 apex_available_name: "com.android.foo",
6605 variant_version: "0",
6606 updatable: false,
6607 }
6608 apex {
6609 name: "bar",
6610 key: "myapex.key",
6611 apex_available_name: "com.android.foo",
6612 variant_version: "3",
6613 updatable: false,
6614 }
6615 apex_key {
6616 name: "myapex.key",
6617 public_key: "testkey.avbpubkey",
6618 private_key: "testkey.pem",
6619 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006620 override_apex {
6621 name: "myoverrideapex",
6622 base: "bar",
6623 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006624 `)
6625
Jooyung Hana0503a52023-08-23 13:12:50 +09006626 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006627 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6628 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6629 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6630 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6631 }
6632
Jooyung Hana0503a52023-08-23 13:12:50 +09006633 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006634 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6635 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6636 barActualDefaultVersion := barManifestRule.Args["default_version"]
6637 if barActualDefaultVersion != barExpectedDefaultVersion {
6638 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6639 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006640
Jooyung Hana0503a52023-08-23 13:12:50 +09006641 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006642 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6643 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6644 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6645 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006646}
6647
Sam Delmericoca816532023-06-02 14:09:50 -04006648func TestApexAvailable_ApexAvailableName(t *testing.T) {
6649 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6650 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6651 apex {
6652 name: "myapex_sminus",
6653 key: "myapex.key",
6654 apps: ["AppFoo"],
6655 apex_available_name: "myapex",
6656 updatable: false,
6657 }
6658 apex {
6659 name: "myapex",
6660 key: "myapex.key",
6661 apps: ["AppFoo"],
6662 updatable: false,
6663 }
6664 apex_key {
6665 name: "myapex.key",
6666 public_key: "testkey.avbpubkey",
6667 private_key: "testkey.pem",
6668 }
6669 android_app {
6670 name: "AppFoo",
6671 srcs: ["foo/bar/MyClass.java"],
6672 sdk_version: "none",
6673 system_modules: "none",
6674 apex_available: [ "myapex_sminus" ],
6675 }`,
6676 android.FixtureMergeMockFs(android.MockFS{
6677 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6678 }),
6679 )
6680 })
6681
6682 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6683 testApex(t, `
6684 apex {
6685 name: "myapex_sminus",
6686 key: "myapex.key",
6687 apps: ["AppFoo"],
6688 apex_available_name: "myapex",
6689 updatable: false,
6690 }
6691 apex {
6692 name: "myapex",
6693 key: "myapex.key",
6694 apps: ["AppFoo"],
6695 updatable: false,
6696 }
6697 apex_key {
6698 name: "myapex.key",
6699 public_key: "testkey.avbpubkey",
6700 private_key: "testkey.pem",
6701 }
6702 android_app {
6703 name: "AppFoo",
6704 srcs: ["foo/bar/MyClass.java"],
6705 sdk_version: "none",
6706 system_modules: "none",
6707 apex_available: [ "myapex" ],
6708 }`,
6709 android.FixtureMergeMockFs(android.MockFS{
6710 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6711 }),
6712 )
6713 })
6714
6715 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6716 testApex(t, `
6717 override_apex {
6718 name: "myoverrideapex_sminus",
6719 base: "myapex_sminus",
6720 key: "myapex.key",
6721 apps: ["AppFooOverride"],
6722 }
6723 override_apex {
6724 name: "myoverrideapex",
6725 base: "myapex",
6726 key: "myapex.key",
6727 apps: ["AppFooOverride"],
6728 }
6729 apex {
6730 name: "myapex_sminus",
6731 key: "myapex.key",
6732 apps: ["AppFoo"],
6733 apex_available_name: "myapex",
6734 updatable: false,
6735 }
6736 apex {
6737 name: "myapex",
6738 key: "myapex.key",
6739 apps: ["AppFoo"],
6740 updatable: false,
6741 }
6742 apex_key {
6743 name: "myapex.key",
6744 public_key: "testkey.avbpubkey",
6745 private_key: "testkey.pem",
6746 }
6747 android_app {
6748 name: "AppFooOverride",
6749 srcs: ["foo/bar/MyClass.java"],
6750 sdk_version: "none",
6751 system_modules: "none",
6752 apex_available: [ "myapex" ],
6753 }
6754 android_app {
6755 name: "AppFoo",
6756 srcs: ["foo/bar/MyClass.java"],
6757 sdk_version: "none",
6758 system_modules: "none",
6759 apex_available: [ "myapex" ],
6760 }`,
6761 android.FixtureMergeMockFs(android.MockFS{
6762 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6763 }),
6764 )
6765 })
6766}
6767
6768func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6769 context := android.GroupFixturePreparers(
6770 android.PrepareForIntegrationTestWithAndroid,
6771 PrepareForTestWithApexBuildComponents,
6772 java.PrepareForTestWithDexpreopt,
6773 android.FixtureMergeMockFs(android.MockFS{
6774 "system/sepolicy/apex/myapex-file_contexts": nil,
6775 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6776 }),
6777 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6778 variables.BuildId = proptools.StringPtr("buildid")
6779 }),
6780 )
6781 context.RunTestWithBp(t, `
6782 override_apex {
6783 name: "myoverrideapex_sminus",
6784 base: "myapex_sminus",
6785 }
6786 override_apex {
6787 name: "myoverrideapex",
6788 base: "myapex",
6789 }
6790 apex {
6791 name: "myapex",
6792 key: "myapex.key",
6793 apps: ["AppFoo"],
6794 updatable: false,
6795 }
6796 apex {
6797 name: "myapex_sminus",
6798 apex_available_name: "myapex",
6799 key: "myapex.key",
6800 apps: ["AppFoo_sminus"],
6801 updatable: false,
6802 }
6803 apex_key {
6804 name: "myapex.key",
6805 public_key: "testkey.avbpubkey",
6806 private_key: "testkey.pem",
6807 }
6808 android_app {
6809 name: "AppFoo",
6810 srcs: ["foo/bar/MyClass.java"],
6811 sdk_version: "none",
6812 system_modules: "none",
6813 apex_available: [ "myapex" ],
6814 }
6815 android_app {
6816 name: "AppFoo_sminus",
6817 srcs: ["foo/bar/MyClass.java"],
6818 sdk_version: "none",
6819 min_sdk_version: "29",
6820 system_modules: "none",
6821 apex_available: [ "myapex" ],
6822 }`)
6823}
6824
Jiyong Park89e850a2020-04-07 16:37:39 +09006825func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006826 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006827 apex {
6828 name: "myapex",
6829 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006830 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006831 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006832 }
6833
6834 apex_key {
6835 name: "myapex.key",
6836 public_key: "testkey.avbpubkey",
6837 private_key: "testkey.pem",
6838 }
6839
6840 cc_library {
6841 name: "libfoo",
6842 stl: "none",
6843 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006844 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006845 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006846 }
6847
6848 cc_library {
6849 name: "libfoo2",
6850 stl: "none",
6851 system_shared_libs: [],
6852 shared_libs: ["libbaz"],
6853 apex_available: ["//apex_available:platform"],
6854 }
6855
6856 cc_library {
6857 name: "libbar",
6858 stl: "none",
6859 system_shared_libs: [],
6860 apex_available: ["myapex"],
6861 }
6862
6863 cc_library {
6864 name: "libbaz",
6865 stl: "none",
6866 system_shared_libs: [],
6867 apex_available: ["myapex"],
6868 stubs: {
6869 versions: ["1"],
6870 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006871 }`)
6872
Jiyong Park89e850a2020-04-07 16:37:39 +09006873 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6874 // because it depends on libbar which isn't available to platform
6875 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6876 if libfoo.NotAvailableForPlatform() != true {
6877 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6878 }
6879
6880 // libfoo2 however can be available to platform because it depends on libbaz which provides
6881 // stubs
6882 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6883 if libfoo2.NotAvailableForPlatform() == true {
6884 t.Errorf("%q should be available to platform", libfoo2.String())
6885 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006886}
Jiyong Parka90ca002019-10-07 15:47:24 +09006887
Paul Duffine52e66f2020-03-30 17:54:29 +01006888func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006889 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006890 apex {
6891 name: "myapex",
6892 key: "myapex.key",
6893 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006894 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006895 }
6896
6897 apex_key {
6898 name: "myapex.key",
6899 public_key: "testkey.avbpubkey",
6900 private_key: "testkey.pem",
6901 }
6902
6903 cc_library {
6904 name: "libfoo",
6905 stl: "none",
6906 system_shared_libs: [],
6907 apex_available: ["myapex"],
6908 static: {
6909 apex_available: ["//apex_available:platform"],
6910 },
6911 }`)
6912
Jiyong Park89e850a2020-04-07 16:37:39 +09006913 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6914 if libfooShared.NotAvailableForPlatform() != true {
6915 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6916 }
6917 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6918 if libfooStatic.NotAvailableForPlatform() != false {
6919 t.Errorf("%q should be available to platform", libfooStatic.String())
6920 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006921}
6922
Jiyong Park5d790c32019-11-15 18:40:32 +09006923func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006924 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006925 apex {
6926 name: "myapex",
6927 key: "myapex.key",
6928 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006929 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006930 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006931 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006932 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006933 }
6934
6935 override_apex {
6936 name: "override_myapex",
6937 base: "myapex",
6938 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006939 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006940 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006941 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006942 compile_multilib: "first",
6943 multilib: {
6944 lib32: {
6945 native_shared_libs: ["mylib32"],
6946 },
6947 lib64: {
6948 native_shared_libs: ["mylib64"],
6949 },
6950 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006951 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006952 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006953 key: "mynewapex.key",
6954 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006955 }
6956
6957 apex_key {
6958 name: "myapex.key",
6959 public_key: "testkey.avbpubkey",
6960 private_key: "testkey.pem",
6961 }
6962
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006963 apex_key {
6964 name: "mynewapex.key",
6965 public_key: "testkey2.avbpubkey",
6966 private_key: "testkey2.pem",
6967 }
6968
6969 android_app_certificate {
6970 name: "myapex.certificate",
6971 certificate: "testkey",
6972 }
6973
Jiyong Park5d790c32019-11-15 18:40:32 +09006974 android_app {
6975 name: "app",
6976 srcs: ["foo/bar/MyClass.java"],
6977 package_name: "foo",
6978 sdk_version: "none",
6979 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006980 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006981 }
6982
6983 override_android_app {
6984 name: "override_app",
6985 base: "app",
6986 package_name: "bar",
6987 }
markchien7c803b82021-08-26 22:10:06 +08006988
6989 bpf {
6990 name: "bpf",
6991 srcs: ["bpf.c"],
6992 }
6993
6994 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006995 name: "overrideBpf",
6996 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006997 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006998
6999 prebuilt_etc {
7000 name: "myetc",
7001 src: "myprebuilt",
7002 }
7003
7004 prebuilt_etc {
7005 name: "override_myetc",
7006 src: "override_myprebuilt",
7007 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007008
7009 cc_library {
7010 name: "mylib32",
7011 apex_available: [ "myapex" ],
7012 }
7013
7014 cc_library {
7015 name: "mylib64",
7016 apex_available: [ "myapex" ],
7017 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007018 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007019
Jooyung Hana0503a52023-08-23 13:12:50 +09007020 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7021 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007022 if originalVariant.GetOverriddenBy() != "" {
7023 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7024 }
7025 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7026 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7027 }
7028
Jooyung Hana0503a52023-08-23 13:12:50 +09007029 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007030 apexRule := module.Rule("apexRule")
7031 copyCmds := apexRule.Args["copy_commands"]
7032
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007033 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7034 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007035
markchien7c803b82021-08-26 22:10:06 +08007036 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007037 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007038
Daniel Norman5a3ce132021-08-26 15:44:43 -07007039 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7040 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7041
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007042 apexBundle := module.Module().(*apexBundle)
7043 name := apexBundle.Name()
7044 if name != "override_myapex" {
7045 t.Errorf("name should be \"override_myapex\", but was %q", name)
7046 }
7047
Baligh Uddin004d7172020-02-19 21:29:28 -08007048 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7049 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7050 }
7051
Jiyong Park20bacab2020-03-03 11:45:41 +09007052 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007053 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007054 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7055
7056 signApkRule := module.Rule("signapk")
7057 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007058
Colin Crossaa255532020-07-03 13:18:24 -07007059 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007060 var builder strings.Builder
7061 data.Custom(&builder, name, "TARGET_", "", data)
7062 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007063 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7064 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007065 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007066 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007067 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007068 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007069 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007070 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007071}
7072
Albert Martineefabcf2022-03-21 20:11:16 +00007073func TestMinSdkVersionOverride(t *testing.T) {
7074 // Override from 29 to 31
7075 minSdkOverride31 := "31"
7076 ctx := testApex(t, `
7077 apex {
7078 name: "myapex",
7079 key: "myapex.key",
7080 native_shared_libs: ["mylib"],
7081 updatable: true,
7082 min_sdk_version: "29"
7083 }
7084
7085 override_apex {
7086 name: "override_myapex",
7087 base: "myapex",
7088 logging_parent: "com.foo.bar",
7089 package_name: "test.overridden.package"
7090 }
7091
7092 apex_key {
7093 name: "myapex.key",
7094 public_key: "testkey.avbpubkey",
7095 private_key: "testkey.pem",
7096 }
7097
7098 cc_library {
7099 name: "mylib",
7100 srcs: ["mylib.cpp"],
7101 runtime_libs: ["libbar"],
7102 system_shared_libs: [],
7103 stl: "none",
7104 apex_available: [ "myapex" ],
7105 min_sdk_version: "apex_inherit"
7106 }
7107
7108 cc_library {
7109 name: "libbar",
7110 srcs: ["mylib.cpp"],
7111 system_shared_libs: [],
7112 stl: "none",
7113 apex_available: [ "myapex" ],
7114 min_sdk_version: "apex_inherit"
7115 }
7116
7117 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7118
Jooyung Hana0503a52023-08-23 13:12:50 +09007119 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007120 copyCmds := apexRule.Args["copy_commands"]
7121
7122 // Ensure that direct non-stubs dep is always included
7123 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7124
7125 // Ensure that runtime_libs dep in included
7126 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7127
7128 // Ensure libraries target overridden min_sdk_version value
7129 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7130}
7131
7132func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7133 // Attempt to override from 31 to 29, should be a NOOP
7134 minSdkOverride29 := "29"
7135 ctx := testApex(t, `
7136 apex {
7137 name: "myapex",
7138 key: "myapex.key",
7139 native_shared_libs: ["mylib"],
7140 updatable: true,
7141 min_sdk_version: "31"
7142 }
7143
7144 override_apex {
7145 name: "override_myapex",
7146 base: "myapex",
7147 logging_parent: "com.foo.bar",
7148 package_name: "test.overridden.package"
7149 }
7150
7151 apex_key {
7152 name: "myapex.key",
7153 public_key: "testkey.avbpubkey",
7154 private_key: "testkey.pem",
7155 }
7156
7157 cc_library {
7158 name: "mylib",
7159 srcs: ["mylib.cpp"],
7160 runtime_libs: ["libbar"],
7161 system_shared_libs: [],
7162 stl: "none",
7163 apex_available: [ "myapex" ],
7164 min_sdk_version: "apex_inherit"
7165 }
7166
7167 cc_library {
7168 name: "libbar",
7169 srcs: ["mylib.cpp"],
7170 system_shared_libs: [],
7171 stl: "none",
7172 apex_available: [ "myapex" ],
7173 min_sdk_version: "apex_inherit"
7174 }
7175
7176 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7177
Jooyung Hana0503a52023-08-23 13:12:50 +09007178 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007179 copyCmds := apexRule.Args["copy_commands"]
7180
7181 // Ensure that direct non-stubs dep is always included
7182 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7183
7184 // Ensure that runtime_libs dep in included
7185 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7186
7187 // Ensure libraries target the original min_sdk_version value rather than the overridden
7188 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7189}
7190
Jooyung Han214bf372019-11-12 13:03:50 +09007191func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007192 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007193 apex {
7194 name: "myapex",
7195 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007196 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007197 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007198 }
7199
7200 apex_key {
7201 name: "myapex.key",
7202 public_key: "testkey.avbpubkey",
7203 private_key: "testkey.pem",
7204 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007205
7206 cc_library {
7207 name: "mylib",
7208 srcs: ["mylib.cpp"],
7209 stl: "libc++",
7210 system_shared_libs: [],
7211 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007212 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007213 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007214 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007215
Jooyung Hana0503a52023-08-23 13:12:50 +09007216 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007217 args := module.Rule("apexRule").Args
7218 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007219 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007220
7221 // The copies of the libraries in the apex should have one more dependency than
7222 // the ones outside the apex, namely the unwinder. Ideally we should check
7223 // the dependency names directly here but for some reason the names are blank in
7224 // this test.
7225 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007226 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007227 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7228 if len(apexImplicits) != len(nonApexImplicits)+1 {
7229 t.Errorf("%q missing unwinder dep", lib)
7230 }
7231 }
Jooyung Han214bf372019-11-12 13:03:50 +09007232}
7233
Paul Duffine05480a2021-03-08 15:07:14 +00007234var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007235 "api/current.txt": nil,
7236 "api/removed.txt": nil,
7237 "api/system-current.txt": nil,
7238 "api/system-removed.txt": nil,
7239 "api/test-current.txt": nil,
7240 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007241
Anton Hanssondff2c782020-12-21 17:10:01 +00007242 "100/public/api/foo.txt": nil,
7243 "100/public/api/foo-removed.txt": nil,
7244 "100/system/api/foo.txt": nil,
7245 "100/system/api/foo-removed.txt": nil,
7246
Paul Duffineedc5d52020-06-12 17:46:39 +01007247 // For java_sdk_library_import
7248 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007249}
7250
Jooyung Han58f26ab2019-12-18 15:34:32 +09007251func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007252 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007253 apex {
7254 name: "myapex",
7255 key: "myapex.key",
7256 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007257 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007258 }
7259
7260 apex_key {
7261 name: "myapex.key",
7262 public_key: "testkey.avbpubkey",
7263 private_key: "testkey.pem",
7264 }
7265
7266 java_sdk_library {
7267 name: "foo",
7268 srcs: ["a.java"],
7269 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007270 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007271 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007272
7273 prebuilt_apis {
7274 name: "sdk",
7275 api_dirs: ["100"],
7276 }
Paul Duffin9b879592020-05-26 13:21:35 +01007277 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007278
7279 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007280 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007281 "javalib/foo.jar",
7282 "etc/permissions/foo.xml",
7283 })
7284 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007285 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007286 ensureMatches(t, sdkLibrary.RuleParams.Command, `<library\\n\s+name=\\\"foo\\\"\\n\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09007287}
7288
Paul Duffin9b879592020-05-26 13:21:35 +01007289func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007290 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007291 apex {
7292 name: "myapex",
7293 key: "myapex.key",
7294 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007295 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007296 }
7297
7298 apex_key {
7299 name: "myapex.key",
7300 public_key: "testkey.avbpubkey",
7301 private_key: "testkey.pem",
7302 }
7303
7304 java_sdk_library {
7305 name: "foo",
7306 srcs: ["a.java"],
7307 api_packages: ["foo"],
7308 apex_available: ["myapex"],
7309 sdk_version: "none",
7310 system_modules: "none",
7311 }
7312
7313 java_library {
7314 name: "bar",
7315 srcs: ["a.java"],
7316 libs: ["foo"],
7317 apex_available: ["myapex"],
7318 sdk_version: "none",
7319 system_modules: "none",
7320 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007321
7322 prebuilt_apis {
7323 name: "sdk",
7324 api_dirs: ["100"],
7325 }
Paul Duffin9b879592020-05-26 13:21:35 +01007326 `, withFiles(filesForSdkLibrary))
7327
7328 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007329 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007330 "javalib/bar.jar",
7331 "javalib/foo.jar",
7332 "etc/permissions/foo.xml",
7333 })
7334
7335 // The bar library should depend on the implementation jar.
7336 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007337 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007338 t.Errorf("expected %q, found %#q", expected, actual)
7339 }
7340}
7341
7342func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007343 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007344 apex {
7345 name: "myapex",
7346 key: "myapex.key",
7347 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007348 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007349 }
7350
7351 apex_key {
7352 name: "myapex.key",
7353 public_key: "testkey.avbpubkey",
7354 private_key: "testkey.pem",
7355 }
7356
7357 java_sdk_library {
7358 name: "foo",
7359 srcs: ["a.java"],
7360 api_packages: ["foo"],
7361 apex_available: ["myapex"],
7362 sdk_version: "none",
7363 system_modules: "none",
7364 }
7365
7366 java_library {
7367 name: "bar",
7368 srcs: ["a.java"],
7369 libs: ["foo"],
7370 sdk_version: "none",
7371 system_modules: "none",
7372 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007373
7374 prebuilt_apis {
7375 name: "sdk",
7376 api_dirs: ["100"],
7377 }
Paul Duffin9b879592020-05-26 13:21:35 +01007378 `, withFiles(filesForSdkLibrary))
7379
7380 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007381 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007382 "javalib/foo.jar",
7383 "etc/permissions/foo.xml",
7384 })
7385
7386 // The bar library should depend on the stubs jar.
7387 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007388 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007389 t.Errorf("expected %q, found %#q", expected, actual)
7390 }
7391}
7392
Paul Duffineedc5d52020-06-12 17:46:39 +01007393func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007394 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007395 prebuilt_apis {
7396 name: "sdk",
7397 api_dirs: ["100"],
7398 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007399 withFiles(map[string][]byte{
7400 "apex/a.java": nil,
7401 "apex/apex_manifest.json": nil,
7402 "apex/Android.bp": []byte(`
7403 package {
7404 default_visibility: ["//visibility:private"],
7405 }
7406
7407 apex {
7408 name: "myapex",
7409 key: "myapex.key",
7410 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007411 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007412 }
7413
7414 apex_key {
7415 name: "myapex.key",
7416 public_key: "testkey.avbpubkey",
7417 private_key: "testkey.pem",
7418 }
7419
7420 java_library {
7421 name: "bar",
7422 srcs: ["a.java"],
7423 libs: ["foo"],
7424 apex_available: ["myapex"],
7425 sdk_version: "none",
7426 system_modules: "none",
7427 }
7428`),
7429 "source/a.java": nil,
7430 "source/api/current.txt": nil,
7431 "source/api/removed.txt": nil,
7432 "source/Android.bp": []byte(`
7433 package {
7434 default_visibility: ["//visibility:private"],
7435 }
7436
7437 java_sdk_library {
7438 name: "foo",
7439 visibility: ["//apex"],
7440 srcs: ["a.java"],
7441 api_packages: ["foo"],
7442 apex_available: ["myapex"],
7443 sdk_version: "none",
7444 system_modules: "none",
7445 public: {
7446 enabled: true,
7447 },
7448 }
7449`),
7450 "prebuilt/a.jar": nil,
7451 "prebuilt/Android.bp": []byte(`
7452 package {
7453 default_visibility: ["//visibility:private"],
7454 }
7455
7456 java_sdk_library_import {
7457 name: "foo",
7458 visibility: ["//apex", "//source"],
7459 apex_available: ["myapex"],
7460 prefer: true,
7461 public: {
7462 jars: ["a.jar"],
7463 },
7464 }
7465`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007466 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007467 )
7468
7469 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007470 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007471 "javalib/bar.jar",
7472 "javalib/foo.jar",
7473 "etc/permissions/foo.xml",
7474 })
7475
7476 // The bar library should depend on the implementation jar.
7477 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007478 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007479 t.Errorf("expected %q, found %#q", expected, actual)
7480 }
7481}
7482
7483func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7484 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7485 apex {
7486 name: "myapex",
7487 key: "myapex.key",
7488 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007489 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007490 }
7491
7492 apex_key {
7493 name: "myapex.key",
7494 public_key: "testkey.avbpubkey",
7495 private_key: "testkey.pem",
7496 }
7497
7498 java_sdk_library_import {
7499 name: "foo",
7500 apex_available: ["myapex"],
7501 prefer: true,
7502 public: {
7503 jars: ["a.jar"],
7504 },
7505 }
7506
7507 `, withFiles(filesForSdkLibrary))
7508}
7509
atrost6e126252020-01-27 17:01:16 +00007510func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007511 result := android.GroupFixturePreparers(
7512 prepareForApexTest,
7513 java.PrepareForTestWithPlatformCompatConfig,
7514 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007515 apex {
7516 name: "myapex",
7517 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007518 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007519 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007520 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007521 }
7522
7523 apex_key {
7524 name: "myapex.key",
7525 public_key: "testkey.avbpubkey",
7526 private_key: "testkey.pem",
7527 }
7528
7529 platform_compat_config {
7530 name: "myjar-platform-compat-config",
7531 src: ":myjar",
7532 }
7533
7534 java_library {
7535 name: "myjar",
7536 srcs: ["foo/bar/MyClass.java"],
7537 sdk_version: "none",
7538 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007539 apex_available: [ "myapex" ],
7540 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007541
7542 // Make sure that a preferred prebuilt does not affect the apex contents.
7543 prebuilt_platform_compat_config {
7544 name: "myjar-platform-compat-config",
7545 metadata: "compat-config/metadata.xml",
7546 prefer: true,
7547 }
atrost6e126252020-01-27 17:01:16 +00007548 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007549 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007550 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007551 "etc/compatconfig/myjar-platform-compat-config.xml",
7552 "javalib/myjar.jar",
7553 })
7554}
7555
Jooyung Han862c0d62022-12-21 10:15:37 +09007556func TestNoDupeApexFiles(t *testing.T) {
7557 android.GroupFixturePreparers(
7558 android.PrepareForTestWithAndroidBuildComponents,
7559 PrepareForTestWithApexBuildComponents,
7560 prepareForTestWithMyapex,
7561 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7562 ).
7563 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7564 RunTestWithBp(t, `
7565 apex {
7566 name: "myapex",
7567 key: "myapex.key",
7568 prebuilts: ["foo", "bar"],
7569 updatable: false,
7570 }
7571
7572 apex_key {
7573 name: "myapex.key",
7574 public_key: "testkey.avbpubkey",
7575 private_key: "testkey.pem",
7576 }
7577
7578 prebuilt_etc {
7579 name: "foo",
7580 src: "myprebuilt",
7581 filename_from_src: true,
7582 }
7583
7584 prebuilt_etc {
7585 name: "bar",
7586 src: "myprebuilt",
7587 filename_from_src: true,
7588 }
7589 `)
7590}
7591
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007592func TestApexUnwantedTransitiveDeps(t *testing.T) {
7593 bp := `
7594 apex {
7595 name: "myapex",
7596 key: "myapex.key",
7597 native_shared_libs: ["libfoo"],
7598 updatable: false,
7599 unwanted_transitive_deps: ["libbar"],
7600 }
7601
7602 apex_key {
7603 name: "myapex.key",
7604 public_key: "testkey.avbpubkey",
7605 private_key: "testkey.pem",
7606 }
7607
7608 cc_library {
7609 name: "libfoo",
7610 srcs: ["foo.cpp"],
7611 shared_libs: ["libbar"],
7612 apex_available: ["myapex"],
7613 }
7614
7615 cc_library {
7616 name: "libbar",
7617 srcs: ["bar.cpp"],
7618 apex_available: ["myapex"],
7619 }`
7620 ctx := testApex(t, bp)
7621 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7622 "*/libc++.so",
7623 "*/libfoo.so",
7624 // not libbar.so
7625 })
7626}
7627
Jiyong Park479321d2019-12-16 11:47:12 +09007628func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7629 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7630 apex {
7631 name: "myapex",
7632 key: "myapex.key",
7633 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007634 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007635 }
7636
7637 apex_key {
7638 name: "myapex.key",
7639 public_key: "testkey.avbpubkey",
7640 private_key: "testkey.pem",
7641 }
7642
7643 java_library {
7644 name: "myjar",
7645 srcs: ["foo/bar/MyClass.java"],
7646 sdk_version: "none",
7647 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007648 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007649 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007650 }
7651 `)
7652}
7653
Jiyong Park7afd1072019-12-30 16:56:33 +09007654func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007655 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007656 apex {
7657 name: "myapex",
7658 key: "myapex.key",
7659 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007660 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007661 }
7662
7663 apex_key {
7664 name: "myapex.key",
7665 public_key: "testkey.avbpubkey",
7666 private_key: "testkey.pem",
7667 }
7668
7669 cc_library {
7670 name: "mylib",
7671 srcs: ["mylib.cpp"],
7672 system_shared_libs: [],
7673 stl: "none",
7674 required: ["a", "b"],
7675 host_required: ["c", "d"],
7676 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007677 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007678 }
7679 `)
7680
Jooyung Hana0503a52023-08-23 13:12:50 +09007681 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007682 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007683 name := apexBundle.BaseModuleName()
7684 prefix := "TARGET_"
7685 var builder strings.Builder
7686 data.Custom(&builder, name, prefix, "", data)
7687 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007688 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007689 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7690 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007691}
7692
Jiyong Park7cd10e32020-01-14 09:22:18 +09007693func TestSymlinksFromApexToSystem(t *testing.T) {
7694 bp := `
7695 apex {
7696 name: "myapex",
7697 key: "myapex.key",
7698 native_shared_libs: ["mylib"],
7699 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007700 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007701 }
7702
Jiyong Park9d677202020-02-19 16:29:35 +09007703 apex {
7704 name: "myapex.updatable",
7705 key: "myapex.key",
7706 native_shared_libs: ["mylib"],
7707 java_libs: ["myjar"],
7708 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007709 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007710 }
7711
Jiyong Park7cd10e32020-01-14 09:22:18 +09007712 apex_key {
7713 name: "myapex.key",
7714 public_key: "testkey.avbpubkey",
7715 private_key: "testkey.pem",
7716 }
7717
7718 cc_library {
7719 name: "mylib",
7720 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007721 shared_libs: [
7722 "myotherlib",
7723 "myotherlib_ext",
7724 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007725 system_shared_libs: [],
7726 stl: "none",
7727 apex_available: [
7728 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007729 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007730 "//apex_available:platform",
7731 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007732 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007733 }
7734
7735 cc_library {
7736 name: "myotherlib",
7737 srcs: ["mylib.cpp"],
7738 system_shared_libs: [],
7739 stl: "none",
7740 apex_available: [
7741 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007742 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007743 "//apex_available:platform",
7744 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007745 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007746 }
7747
Jiyong Parkce243632023-02-17 18:22:25 +09007748 cc_library {
7749 name: "myotherlib_ext",
7750 srcs: ["mylib.cpp"],
7751 system_shared_libs: [],
7752 system_ext_specific: true,
7753 stl: "none",
7754 apex_available: [
7755 "myapex",
7756 "myapex.updatable",
7757 "//apex_available:platform",
7758 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007759 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007760 }
7761
Jiyong Park7cd10e32020-01-14 09:22:18 +09007762 java_library {
7763 name: "myjar",
7764 srcs: ["foo/bar/MyClass.java"],
7765 sdk_version: "none",
7766 system_modules: "none",
7767 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007768 apex_available: [
7769 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007770 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007771 "//apex_available:platform",
7772 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007773 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007774 }
7775
7776 java_library {
7777 name: "myotherjar",
7778 srcs: ["foo/bar/MyClass.java"],
7779 sdk_version: "none",
7780 system_modules: "none",
7781 apex_available: [
7782 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007783 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007784 "//apex_available:platform",
7785 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007786 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007787 }
7788 `
7789
7790 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7791 for _, f := range files {
7792 if f.path == file {
7793 if f.isLink {
7794 t.Errorf("%q is not a real file", file)
7795 }
7796 return
7797 }
7798 }
7799 t.Errorf("%q is not found", file)
7800 }
7801
Jiyong Parkce243632023-02-17 18:22:25 +09007802 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007803 for _, f := range files {
7804 if f.path == file {
7805 if !f.isLink {
7806 t.Errorf("%q is not a symlink", file)
7807 }
Jiyong Parkce243632023-02-17 18:22:25 +09007808 if f.src != target {
7809 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7810 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007811 return
7812 }
7813 }
7814 t.Errorf("%q is not found", file)
7815 }
7816
Jiyong Park9d677202020-02-19 16:29:35 +09007817 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7818 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007819 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007820 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007821 ensureRealfileExists(t, files, "javalib/myjar.jar")
7822 ensureRealfileExists(t, files, "lib64/mylib.so")
7823 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007824 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007825
Jooyung Hana0503a52023-08-23 13:12:50 +09007826 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007827 ensureRealfileExists(t, files, "javalib/myjar.jar")
7828 ensureRealfileExists(t, files, "lib64/mylib.so")
7829 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007830 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007831
7832 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007833 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007834 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007835 ensureRealfileExists(t, files, "javalib/myjar.jar")
7836 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007837 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7838 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007839
Jooyung Hana0503a52023-08-23 13:12:50 +09007840 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007841 ensureRealfileExists(t, files, "javalib/myjar.jar")
7842 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007843 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7844 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007845}
7846
Yo Chiange8128052020-07-23 20:09:18 +08007847func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007848 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007849 apex {
7850 name: "myapex",
7851 key: "myapex.key",
7852 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007853 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007854 }
7855
7856 apex_key {
7857 name: "myapex.key",
7858 public_key: "testkey.avbpubkey",
7859 private_key: "testkey.pem",
7860 }
7861
7862 cc_library_shared {
7863 name: "mylib",
7864 srcs: ["mylib.cpp"],
7865 shared_libs: ["myotherlib"],
7866 system_shared_libs: [],
7867 stl: "none",
7868 apex_available: [
7869 "myapex",
7870 "//apex_available:platform",
7871 ],
7872 }
7873
7874 cc_prebuilt_library_shared {
7875 name: "myotherlib",
7876 srcs: ["prebuilt.so"],
7877 system_shared_libs: [],
7878 stl: "none",
7879 apex_available: [
7880 "myapex",
7881 "//apex_available:platform",
7882 ],
7883 }
7884 `)
7885
Jooyung Hana0503a52023-08-23 13:12:50 +09007886 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007887 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007888 var builder strings.Builder
7889 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7890 androidMk := builder.String()
7891 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007892 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007893 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7894 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7895 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007896 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007897}
7898
Jooyung Han643adc42020-02-27 13:50:06 +09007899func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007900 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007901 apex {
7902 name: "myapex",
7903 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007904 binaries: ["mybin"],
7905 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007906 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007907 }
7908
7909 apex_key {
7910 name: "myapex.key",
7911 public_key: "testkey.avbpubkey",
7912 private_key: "testkey.pem",
7913 }
7914
7915 cc_library {
7916 name: "mylib",
7917 srcs: ["mylib.cpp"],
7918 shared_libs: ["mylib2"],
7919 system_shared_libs: [],
7920 stl: "none",
7921 apex_available: [ "myapex" ],
7922 }
7923
7924 cc_library {
7925 name: "mylib2",
7926 srcs: ["mylib.cpp"],
7927 system_shared_libs: [],
7928 stl: "none",
7929 apex_available: [ "myapex" ],
7930 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007931
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007932 // Used as both a JNI library and a regular shared library.
7933 cc_library {
7934 name: "mylib3",
7935 srcs: ["mylib.cpp"],
7936 system_shared_libs: [],
7937 stl: "none",
7938 apex_available: [ "myapex" ],
7939 }
7940
7941 cc_binary {
7942 name: "mybin",
7943 srcs: ["mybin.cpp"],
7944 shared_libs: ["mylib3"],
7945 system_shared_libs: [],
7946 stl: "none",
7947 apex_available: [ "myapex" ],
7948 }
7949
Jiyong Park34d5c332022-02-24 18:02:44 +09007950 rust_ffi_shared {
7951 name: "libfoo.rust",
7952 crate_name: "foo",
7953 srcs: ["foo.rs"],
7954 shared_libs: ["libfoo.shared_from_rust"],
7955 prefer_rlib: true,
7956 apex_available: ["myapex"],
7957 }
7958
7959 cc_library_shared {
7960 name: "libfoo.shared_from_rust",
7961 srcs: ["mylib.cpp"],
7962 system_shared_libs: [],
7963 stl: "none",
7964 stubs: {
7965 versions: ["10", "11", "12"],
7966 },
7967 }
7968
Jooyung Han643adc42020-02-27 13:50:06 +09007969 `)
7970
Jooyung Hana0503a52023-08-23 13:12:50 +09007971 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007972 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007973 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007974 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007975 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007976 "lib64/mylib.so",
7977 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007978 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007979 "lib64/libfoo.rust.so",
7980 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7981 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007982 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007983
7984 // b/220397949
7985 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007986}
7987
Jooyung Han49f67012020-04-17 13:43:10 +09007988func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007989 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007990 apex {
7991 name: "myapex",
7992 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007993 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007994 }
7995 apex_key {
7996 name: "myapex.key",
7997 public_key: "testkey.avbpubkey",
7998 private_key: "testkey.pem",
7999 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008000 `,
8001 android.FixtureModifyConfig(func(config android.Config) {
8002 delete(config.Targets, android.Android)
8003 config.AndroidCommonTarget = android.Target{}
8004 }),
8005 )
Jooyung Han49f67012020-04-17 13:43:10 +09008006
8007 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8008 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8009 }
8010}
8011
Jiyong Parkbd159612020-02-28 15:22:21 +09008012func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008013 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008014 apex {
8015 name: "myapex",
8016 key: "myapex.key",
8017 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008018 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008019 }
8020
8021 apex_key {
8022 name: "myapex.key",
8023 public_key: "testkey.avbpubkey",
8024 private_key: "testkey.pem",
8025 }
8026
8027 android_app {
8028 name: "AppFoo",
8029 srcs: ["foo/bar/MyClass.java"],
8030 sdk_version: "none",
8031 system_modules: "none",
8032 apex_available: [ "myapex" ],
8033 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008034 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008035
Jooyung Hana0503a52023-08-23 13:12:50 +09008036 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008037 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008038
8039 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008040 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 +09008041}
8042
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008043func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008044 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008045 apex {
8046 name: "myapex",
8047 key: "myapex.key",
8048 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008049 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008050 }
8051
8052 apex_key {
8053 name: "myapex.key",
8054 public_key: "testkey.avbpubkey",
8055 private_key: "testkey.pem",
8056 }
8057
8058 android_app_set {
8059 name: "AppSet",
8060 set: "AppSet.apks",
8061 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008062 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008063 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008064 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008065 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8066 s := mod.Rule("apexRule").Args["copy_commands"]
8067 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008068 if len(copyCmds) != 4 {
8069 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008070 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008071 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8072 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008073 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8074 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008075
8076 // Ensure that canned_fs_config has an entry for the app set zip file
8077 generateFsRule := mod.Rule("generateFsConfig")
8078 cmd := generateFsRule.RuleParams.Command
8079 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008080}
8081
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008082func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008083 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008084 apex_set {
8085 name: "myapex",
8086 filename: "foo_v2.apex",
8087 sanitized: {
8088 none: { set: "myapex.apks", },
8089 hwaddress: { set: "myapex.hwasan.apks", },
8090 },
Paul Duffin24704672021-04-06 16:09:30 +01008091 }
8092 `
8093 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008094
Paul Duffin24704672021-04-06 16:09:30 +01008095 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008096 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008097
Spandan Das3576e762024-01-03 18:57:03 +00008098 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008099 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008100
Paul Duffin24704672021-04-06 16:09:30 +01008101 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8102
8103 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008104 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8105 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008106
8107 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008108}
8109
Pranav Guptaeba03b02022-09-27 00:27:08 +00008110func TestApexSetApksModuleAssignment(t *testing.T) {
8111 ctx := testApex(t, `
8112 apex_set {
8113 name: "myapex",
8114 set: ":myapex_apks_file",
8115 }
8116
8117 filegroup {
8118 name: "myapex_apks_file",
8119 srcs: ["myapex.apks"],
8120 }
8121 `)
8122
Spandan Das3576e762024-01-03 18:57:03 +00008123 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008124
8125 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008126 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008127 extractedApex := m.Output(extractorOutput)
8128
8129 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8130}
8131
Paul Duffin89f570a2021-06-16 01:42:33 +01008132func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008133 t.Helper()
8134
Paul Duffin55607122021-03-30 23:32:51 +01008135 fs := android.MockFS{
8136 "a.java": nil,
8137 "a.jar": nil,
8138 "apex_manifest.json": nil,
8139 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008140 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008141 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8142 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8143 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008144 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008145 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008146
Paul Duffin55607122021-03-30 23:32:51 +01008147 errorHandler := android.FixtureExpectsNoErrors
8148 if errmsg != "" {
8149 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008150 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008151
Paul Duffin55607122021-03-30 23:32:51 +01008152 result := android.GroupFixturePreparers(
8153 cc.PrepareForTestWithCcDefaultModules,
8154 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008155 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008156 java.PrepareForTestWithJavaSdkLibraryFiles,
8157 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008158 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008159 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008160 android.FixtureModifyMockFS(func(fs android.MockFS) {
8161 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8162 insert := ""
8163 for _, fragment := range fragments {
8164 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8165 }
8166 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8167 platform_bootclasspath {
8168 name: "platform-bootclasspath",
8169 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008170 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008171 %s
8172 ],
8173 }
8174 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008175 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008176 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008177 // Dexpreopt for boot jars requires the ART boot image profile.
8178 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8179 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008180 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008181 ).
8182 ExtendWithErrorHandler(errorHandler).
8183 RunTestWithBp(t, bp)
8184
8185 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008186}
8187
Paul Duffin5556c5f2022-06-09 17:32:21 +00008188func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008189 preparers := android.GroupFixturePreparers(
8190 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008191 prepareForTestWithBootclasspathFragment,
8192 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008193 PrepareForTestWithApexBuildComponents,
8194 ).
8195 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008196 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008197
8198 bpBase := `
8199 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008200 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008201 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008202 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008203 set: "myapex.apks",
8204 }
8205
8206 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008207 name: "com.mycompany.android.art",
8208 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008209 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008210 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008211 set: "company-myapex.apks",
8212 }
8213
8214 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008215 name: "art-bootclasspath-fragment",
8216 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008217 hidden_api: {
8218 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8219 metadata: "my-bootclasspath-fragment/metadata.csv",
8220 index: "my-bootclasspath-fragment/index.csv",
8221 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8222 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8223 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008224 %s
8225 }
8226 `
8227
8228 t.Run("java_import", func(t *testing.T) {
8229 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8230 java_import {
8231 name: "libfoo",
8232 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008233 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008234 }
8235 `)
8236 })
8237
8238 t.Run("java_sdk_library_import", func(t *testing.T) {
8239 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8240 java_sdk_library_import {
8241 name: "libfoo",
8242 public: {
8243 jars: ["libbar.jar"],
8244 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008245 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008246 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008247 }
8248 `)
8249 })
8250
8251 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8252 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8253 image_name: "art",
8254 contents: ["libfoo"],
8255 `)+`
8256 java_sdk_library_import {
8257 name: "libfoo",
8258 public: {
8259 jars: ["libbar.jar"],
8260 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008261 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008262 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008263 }
8264 `)
8265 })
8266}
8267
Paul Duffin5556c5f2022-06-09 17:32:21 +00008268func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8269 preparers := android.GroupFixturePreparers(
8270 java.PrepareForTestWithJavaDefaultModules,
8271 PrepareForTestWithApexBuildComponents,
8272 )
8273
Spandan Das59a4a2b2024-01-09 21:35:56 +00008274 errCtx := moduleErrorfTestCtx{}
8275
Paul Duffin5556c5f2022-06-09 17:32:21 +00008276 bpBase := `
8277 apex_set {
8278 name: "com.android.myapex",
8279 installable: true,
8280 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8281 set: "myapex.apks",
8282 }
8283
8284 apex_set {
8285 name: "com.android.myapex_compressed",
8286 apex_name: "com.android.myapex",
8287 installable: true,
8288 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8289 set: "myapex_compressed.apks",
8290 }
8291
8292 prebuilt_bootclasspath_fragment {
8293 name: "my-bootclasspath-fragment",
8294 apex_available: [
8295 "com.android.myapex",
8296 "com.android.myapex_compressed",
8297 ],
8298 hidden_api: {
8299 annotation_flags: "annotation-flags.csv",
8300 metadata: "metadata.csv",
8301 index: "index.csv",
8302 signature_patterns: "signature_patterns.csv",
8303 },
8304 %s
8305 }
8306 `
8307
8308 t.Run("java_import", func(t *testing.T) {
8309 result := preparers.RunTestWithBp(t,
8310 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8311 java_import {
8312 name: "libfoo",
8313 jars: ["libfoo.jar"],
8314 apex_available: [
8315 "com.android.myapex",
8316 "com.android.myapex_compressed",
8317 ],
8318 }
8319 `)
8320
8321 module := result.Module("libfoo", "android_common_com.android.myapex")
8322 usesLibraryDep := module.(java.UsesLibraryDependency)
8323 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008324 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008325 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008326 })
8327
8328 t.Run("java_sdk_library_import", func(t *testing.T) {
8329 result := preparers.RunTestWithBp(t,
8330 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8331 java_sdk_library_import {
8332 name: "libfoo",
8333 public: {
8334 jars: ["libbar.jar"],
8335 },
8336 apex_available: [
8337 "com.android.myapex",
8338 "com.android.myapex_compressed",
8339 ],
8340 compile_dex: true,
8341 }
8342 `)
8343
8344 module := result.Module("libfoo", "android_common_com.android.myapex")
8345 usesLibraryDep := module.(java.UsesLibraryDependency)
8346 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008347 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008348 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008349 })
8350
8351 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8352 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8353 image_name: "art",
8354 contents: ["libfoo"],
8355 `)+`
8356 java_sdk_library_import {
8357 name: "libfoo",
8358 public: {
8359 jars: ["libbar.jar"],
8360 },
8361 apex_available: [
8362 "com.android.myapex",
8363 "com.android.myapex_compressed",
8364 ],
8365 compile_dex: true,
8366 }
8367 `)
8368 })
8369}
8370
Jooyung Han548640b2020-04-27 12:10:30 +09008371func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8372 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8373 apex {
8374 name: "myapex",
8375 key: "myapex.key",
8376 updatable: true,
8377 }
8378
8379 apex_key {
8380 name: "myapex.key",
8381 public_key: "testkey.avbpubkey",
8382 private_key: "testkey.pem",
8383 }
8384 `)
8385}
8386
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008387func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8388 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8389 apex {
8390 name: "myapex",
8391 key: "myapex.key",
8392 }
8393
8394 apex_key {
8395 name: "myapex.key",
8396 public_key: "testkey.avbpubkey",
8397 private_key: "testkey.pem",
8398 }
8399 `)
8400}
8401
Jooyung Handfc864c2023-03-20 18:19:07 +09008402func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8403 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008404 apex {
8405 name: "myapex",
8406 key: "myapex.key",
8407 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008408 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008409 soc_specific: true,
8410 }
8411
8412 apex_key {
8413 name: "myapex.key",
8414 public_key: "testkey.avbpubkey",
8415 private_key: "testkey.pem",
8416 }
8417 `)
8418}
8419
Jooyung Han02873da2023-03-22 17:41:03 +09008420func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8421 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8422 apex {
8423 name: "myapex",
8424 key: "myapex.key",
8425 updatable: false,
8426 min_sdk_version: "29",
8427 use_vndk_as_stable: true,
8428 vendor: true,
8429 }
8430
8431 apex_key {
8432 name: "myapex.key",
8433 public_key: "testkey.avbpubkey",
8434 private_key: "testkey.pem",
8435 }
8436 `)
8437}
8438
Jooyung Handfc864c2023-03-20 18:19:07 +09008439func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8440 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8441 apex {
8442 name: "myapex",
8443 key: "myapex.key",
8444 updatable: false,
8445 use_vndk_as_stable: true,
8446 }
8447
8448 apex_key {
8449 name: "myapex.key",
8450 public_key: "testkey.avbpubkey",
8451 private_key: "testkey.pem",
8452 }
8453 `)
8454}
8455
satayevb98371c2021-06-15 16:49:50 +01008456func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8457 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8458 apex {
8459 name: "myapex",
8460 key: "myapex.key",
8461 systemserverclasspath_fragments: [
8462 "mysystemserverclasspathfragment",
8463 ],
8464 min_sdk_version: "29",
8465 updatable: true,
8466 }
8467
8468 apex_key {
8469 name: "myapex.key",
8470 public_key: "testkey.avbpubkey",
8471 private_key: "testkey.pem",
8472 }
8473
8474 java_library {
8475 name: "foo",
8476 srcs: ["b.java"],
8477 min_sdk_version: "29",
8478 installable: true,
8479 apex_available: [
8480 "myapex",
8481 ],
8482 }
8483
8484 systemserverclasspath_fragment {
8485 name: "mysystemserverclasspathfragment",
8486 generate_classpaths_proto: false,
8487 contents: [
8488 "foo",
8489 ],
8490 apex_available: [
8491 "myapex",
8492 ],
8493 }
satayevabcd5972021-08-06 17:49:46 +01008494 `,
8495 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8496 )
satayevb98371c2021-06-15 16:49:50 +01008497}
8498
Paul Duffin064b70c2020-11-02 17:32:38 +00008499func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008500 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008501 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008502 fragment := java.ApexVariantReference{
8503 Apex: proptools.StringPtr("myapex"),
8504 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8505 }
8506
Paul Duffin064b70c2020-11-02 17:32:38 +00008507 testDexpreoptWithApexes(t, `
8508 prebuilt_apex {
8509 name: "myapex" ,
8510 arch: {
8511 arm64: {
8512 src: "myapex-arm64.apex",
8513 },
8514 arm: {
8515 src: "myapex-arm.apex",
8516 },
8517 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008518 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8519 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008520
Paul Duffin89f570a2021-06-16 01:42:33 +01008521 prebuilt_bootclasspath_fragment {
8522 name: "my-bootclasspath-fragment",
8523 contents: ["libfoo"],
8524 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008525 hidden_api: {
8526 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8527 metadata: "my-bootclasspath-fragment/metadata.csv",
8528 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008529 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8530 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8531 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008532 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008533 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008534
Paul Duffin89f570a2021-06-16 01:42:33 +01008535 java_import {
8536 name: "libfoo",
8537 jars: ["libfoo.jar"],
8538 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008539 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008540 }
8541 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008542 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008543}
8544
Spandan Dasf14e2542021-11-12 00:01:37 +00008545func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008546 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008547 bp += `
8548 apex_key {
8549 name: "myapex.key",
8550 public_key: "testkey.avbpubkey",
8551 private_key: "testkey.pem",
8552 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008553 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008554 "lib1/src/A.java": nil,
8555 "lib2/src/B.java": nil,
8556 "system/sepolicy/apex/myapex-file_contexts": nil,
8557 }
8558
Paul Duffin45338f02021-03-30 23:07:52 +01008559 errorHandler := android.FixtureExpectsNoErrors
8560 if errmsg != "" {
8561 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008562 }
Colin Crossae8600b2020-10-29 17:09:13 -07008563
Paul Duffin45338f02021-03-30 23:07:52 +01008564 android.GroupFixturePreparers(
8565 android.PrepareForTestWithAndroidBuildComponents,
8566 java.PrepareForTestWithJavaBuildComponents,
8567 PrepareForTestWithApexBuildComponents,
8568 android.PrepareForTestWithNeverallowRules(rules),
8569 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008570 apexBootJars := make([]string, 0, len(bootJars))
8571 for _, apexBootJar := range bootJars {
8572 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008573 }
satayevd604b212021-07-21 14:23:52 +01008574 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008575 }),
8576 fs.AddToFixture(),
8577 ).
8578 ExtendWithErrorHandler(errorHandler).
8579 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008580}
8581
8582func TestApexPermittedPackagesRules(t *testing.T) {
8583 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008584 name string
8585 expectedError string
8586 bp string
8587 bootJars []string
8588 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008589 }{
8590
8591 {
8592 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8593 expectedError: "",
8594 bp: `
8595 java_library {
8596 name: "bcp_lib1",
8597 srcs: ["lib1/src/*.java"],
8598 permitted_packages: ["foo.bar"],
8599 apex_available: ["myapex"],
8600 sdk_version: "none",
8601 system_modules: "none",
8602 }
8603 java_library {
8604 name: "nonbcp_lib2",
8605 srcs: ["lib2/src/*.java"],
8606 apex_available: ["myapex"],
8607 permitted_packages: ["a.b"],
8608 sdk_version: "none",
8609 system_modules: "none",
8610 }
8611 apex {
8612 name: "myapex",
8613 key: "myapex.key",
8614 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008615 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008616 }`,
8617 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008618 bcpPermittedPackages: map[string][]string{
8619 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008620 "foo.bar",
8621 },
8622 },
8623 },
8624 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008625 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008626 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 +01008627 bp: `
8628 java_library {
8629 name: "bcp_lib1",
8630 srcs: ["lib1/src/*.java"],
8631 apex_available: ["myapex"],
8632 permitted_packages: ["foo.bar"],
8633 sdk_version: "none",
8634 system_modules: "none",
8635 }
8636 java_library {
8637 name: "bcp_lib2",
8638 srcs: ["lib2/src/*.java"],
8639 apex_available: ["myapex"],
8640 permitted_packages: ["foo.bar", "bar.baz"],
8641 sdk_version: "none",
8642 system_modules: "none",
8643 }
8644 apex {
8645 name: "myapex",
8646 key: "myapex.key",
8647 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008648 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008649 }
8650 `,
8651 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008652 bcpPermittedPackages: map[string][]string{
8653 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008654 "foo.bar",
8655 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008656 "bcp_lib2": []string{
8657 "foo.bar",
8658 },
8659 },
8660 },
8661 {
8662 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8663 expectedError: "",
8664 bp: `
8665 java_library {
8666 name: "bcp_lib_restricted",
8667 srcs: ["lib1/src/*.java"],
8668 apex_available: ["myapex"],
8669 permitted_packages: ["foo.bar"],
8670 sdk_version: "none",
8671 min_sdk_version: "29",
8672 system_modules: "none",
8673 }
8674 java_library {
8675 name: "bcp_lib_unrestricted",
8676 srcs: ["lib2/src/*.java"],
8677 apex_available: ["myapex"],
8678 permitted_packages: ["foo.bar", "bar.baz"],
8679 sdk_version: "none",
8680 min_sdk_version: "29",
8681 system_modules: "none",
8682 }
8683 apex {
8684 name: "myapex",
8685 key: "myapex.key",
8686 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8687 updatable: true,
8688 min_sdk_version: "29",
8689 }
8690 `,
8691 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8692 bcpPermittedPackages: map[string][]string{
8693 "bcp_lib1_non_updateable": []string{
8694 "foo.bar",
8695 },
8696 // 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 +01008697 },
8698 },
8699 }
8700 for _, tc := range testcases {
8701 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008702 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8703 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008704 })
8705 }
8706}
8707
Jiyong Park62304bb2020-04-13 16:19:48 +09008708func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008709 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008710 apex {
8711 name: "myapex",
8712 key: "myapex.key",
8713 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008714 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008715 }
8716
8717 apex_key {
8718 name: "myapex.key",
8719 public_key: "testkey.avbpubkey",
8720 private_key: "testkey.pem",
8721 }
8722
8723 cc_library {
8724 name: "mylib",
8725 srcs: ["mylib.cpp"],
8726 system_shared_libs: [],
8727 stl: "none",
8728 stubs: {
8729 versions: ["1"],
8730 },
8731 apex_available: ["myapex"],
8732 }
8733
8734 cc_library {
8735 name: "myprivlib",
8736 srcs: ["mylib.cpp"],
8737 system_shared_libs: [],
8738 stl: "none",
8739 apex_available: ["myapex"],
8740 }
8741
8742
8743 cc_test {
8744 name: "mytest",
8745 gtest: false,
8746 srcs: ["mylib.cpp"],
8747 system_shared_libs: [],
8748 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008749 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008750 test_for: ["myapex"]
8751 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008752
8753 cc_library {
8754 name: "mytestlib",
8755 srcs: ["mylib.cpp"],
8756 system_shared_libs: [],
8757 shared_libs: ["mylib", "myprivlib"],
8758 stl: "none",
8759 test_for: ["myapex"],
8760 }
8761
8762 cc_benchmark {
8763 name: "mybench",
8764 srcs: ["mylib.cpp"],
8765 system_shared_libs: [],
8766 shared_libs: ["mylib", "myprivlib"],
8767 stl: "none",
8768 test_for: ["myapex"],
8769 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008770 `)
8771
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008772 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008773 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008774 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8775 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8776 }
8777
8778 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008779 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008780 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8781 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8782 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8783}
Jiyong Park46a512f2020-12-04 18:02:13 +09008784
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008785func TestIndirectTestFor(t *testing.T) {
8786 ctx := testApex(t, `
8787 apex {
8788 name: "myapex",
8789 key: "myapex.key",
8790 native_shared_libs: ["mylib", "myprivlib"],
8791 updatable: false,
8792 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008793
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008794 apex_key {
8795 name: "myapex.key",
8796 public_key: "testkey.avbpubkey",
8797 private_key: "testkey.pem",
8798 }
8799
8800 cc_library {
8801 name: "mylib",
8802 srcs: ["mylib.cpp"],
8803 system_shared_libs: [],
8804 stl: "none",
8805 stubs: {
8806 versions: ["1"],
8807 },
8808 apex_available: ["myapex"],
8809 }
8810
8811 cc_library {
8812 name: "myprivlib",
8813 srcs: ["mylib.cpp"],
8814 system_shared_libs: [],
8815 stl: "none",
8816 shared_libs: ["mylib"],
8817 apex_available: ["myapex"],
8818 }
8819
8820 cc_library {
8821 name: "mytestlib",
8822 srcs: ["mylib.cpp"],
8823 system_shared_libs: [],
8824 shared_libs: ["myprivlib"],
8825 stl: "none",
8826 test_for: ["myapex"],
8827 }
8828 `)
8829
8830 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008831 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008832 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8833 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8834 }
8835
8836 // The platform variant of mytestlib links to the platform variant of the
8837 // internal myprivlib.
8838 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8839
8840 // The platform variant of myprivlib links to the platform variant of mylib
8841 // and bypasses its stubs.
8842 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 +09008843}
8844
Martin Stjernholmec009002021-03-27 15:18:31 +00008845func TestTestForForLibInOtherApex(t *testing.T) {
8846 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8847 _ = testApex(t, `
8848 apex {
8849 name: "com.android.art",
8850 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008851 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008852 updatable: false,
8853 }
8854
8855 apex {
8856 name: "com.android.art.debug",
8857 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008858 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008859 updatable: false,
8860 }
8861
8862 apex_key {
8863 name: "myapex.key",
8864 public_key: "testkey.avbpubkey",
8865 private_key: "testkey.pem",
8866 }
8867
8868 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008869 name: "libnativebridge",
8870 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008871 system_shared_libs: [],
8872 stl: "none",
8873 stubs: {
8874 versions: ["1"],
8875 },
8876 apex_available: ["com.android.art", "com.android.art.debug"],
8877 }
8878
8879 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008880 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008881 srcs: ["mylib.cpp"],
8882 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008883 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008884 stl: "none",
8885 apex_available: ["com.android.art.debug"],
8886 test_for: ["com.android.art"],
8887 }
8888 `,
8889 android.MockFS{
8890 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8891 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8892 }.AddToFixture())
8893}
8894
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008895// TODO(jungjw): Move this to proptools
8896func intPtr(i int) *int {
8897 return &i
8898}
8899
8900func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008901 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008902 apex_set {
8903 name: "myapex",
8904 set: "myapex.apks",
8905 filename: "foo_v2.apex",
8906 overrides: ["foo"],
8907 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008908 `,
8909 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8910 variables.Platform_sdk_version = intPtr(30)
8911 }),
8912 android.FixtureModifyConfig(func(config android.Config) {
8913 config.Targets[android.Android] = []android.Target{
8914 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8915 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8916 }
8917 }),
8918 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008919
Spandan Das3576e762024-01-03 18:57:03 +00008920 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008921
8922 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008923 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008924 actual := extractedApex.Args["abis"]
8925 expected := "ARMEABI_V7A,ARM64_V8A"
8926 if actual != expected {
8927 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8928 }
8929 actual = extractedApex.Args["sdk-version"]
8930 expected = "30"
8931 if actual != expected {
8932 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8933 }
8934
Paul Duffin6717d882021-06-15 19:09:41 +01008935 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008936 a := m.Module().(*ApexSet)
8937 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008938 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008939 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8940 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8941 }
8942}
8943
Anton Hansson805e0a52022-11-25 14:06:46 +00008944func TestApexSet_NativeBridge(t *testing.T) {
8945 ctx := testApex(t, `
8946 apex_set {
8947 name: "myapex",
8948 set: "myapex.apks",
8949 filename: "foo_v2.apex",
8950 overrides: ["foo"],
8951 }
8952 `,
8953 android.FixtureModifyConfig(func(config android.Config) {
8954 config.Targets[android.Android] = []android.Target{
8955 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8956 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8957 }
8958 }),
8959 )
8960
Spandan Das3576e762024-01-03 18:57:03 +00008961 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008962
8963 // Check extract_apks tool parameters. No native bridge arch expected
8964 extractedApex := m.Output("extracted/myapex.apks")
8965 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8966}
8967
Jiyong Park7d95a512020-05-10 15:16:24 +09008968func TestNoStaticLinkingToStubsLib(t *testing.T) {
8969 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8970 apex {
8971 name: "myapex",
8972 key: "myapex.key",
8973 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008974 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008975 }
8976
8977 apex_key {
8978 name: "myapex.key",
8979 public_key: "testkey.avbpubkey",
8980 private_key: "testkey.pem",
8981 }
8982
8983 cc_library {
8984 name: "mylib",
8985 srcs: ["mylib.cpp"],
8986 static_libs: ["otherlib"],
8987 system_shared_libs: [],
8988 stl: "none",
8989 apex_available: [ "myapex" ],
8990 }
8991
8992 cc_library {
8993 name: "otherlib",
8994 srcs: ["mylib.cpp"],
8995 system_shared_libs: [],
8996 stl: "none",
8997 stubs: {
8998 versions: ["1", "2", "3"],
8999 },
9000 apex_available: [ "myapex" ],
9001 }
9002 `)
9003}
9004
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009005func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009006 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009007 apex {
9008 name: "myapex",
9009 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009010 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009011 custom_sign_tool: "sign_myapex",
9012 }
9013
9014 apex_key {
9015 name: "myapex.key",
9016 public_key: "testkey.avbpubkey",
9017 private_key: "testkey.pem",
9018 }
9019 `)
9020
Jooyung Han286957d2023-10-30 16:17:56 +09009021 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009022 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009023 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 +09009024}
9025
9026func TestApexKeysTxtOverrides(t *testing.T) {
9027 ctx := testApex(t, `
9028 apex {
9029 name: "myapex",
9030 key: "myapex.key",
9031 updatable: false,
9032 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009033 }
9034
9035 apex_key {
9036 name: "myapex.key",
9037 public_key: "testkey.avbpubkey",
9038 private_key: "testkey.pem",
9039 }
9040
9041 prebuilt_apex {
9042 name: "myapex",
9043 prefer: true,
9044 arch: {
9045 arm64: {
9046 src: "myapex-arm64.apex",
9047 },
9048 arm: {
9049 src: "myapex-arm.apex",
9050 },
9051 },
9052 }
9053
9054 apex_set {
9055 name: "myapex_set",
9056 set: "myapex.apks",
9057 filename: "myapex_set.apex",
9058 overrides: ["myapex"],
9059 }
9060 `)
9061
Colin Crossf61d03d2023-11-02 16:56:39 -07009062 content := android.ContentFromFileRuleForTests(t, ctx,
9063 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009064 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 -07009065 content = android.ContentFromFileRuleForTests(t, ctx,
9066 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009067 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 +09009068}
9069
Jooyung Han938b5932020-06-20 12:47:47 +09009070func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009071 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009072 apex {
9073 name: "myapex",
9074 key: "myapex.key",
9075 apps: ["app"],
9076 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009077 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009078 }
9079
9080 apex_key {
9081 name: "myapex.key",
9082 public_key: "testkey.avbpubkey",
9083 private_key: "testkey.pem",
9084 }
9085
9086 android_app {
9087 name: "app",
9088 srcs: ["foo/bar/MyClass.java"],
9089 package_name: "foo",
9090 sdk_version: "none",
9091 system_modules: "none",
9092 apex_available: [ "myapex" ],
9093 }
9094 `, withFiles(map[string][]byte{
9095 "sub/Android.bp": []byte(`
9096 override_apex {
9097 name: "override_myapex",
9098 base: "myapex",
9099 apps: ["override_app"],
9100 allowed_files: ":allowed",
9101 }
9102 // Overridable "path" property should be referenced indirectly
9103 filegroup {
9104 name: "allowed",
9105 srcs: ["allowed.txt"],
9106 }
9107 override_android_app {
9108 name: "override_app",
9109 base: "app",
9110 package_name: "bar",
9111 }
9112 `),
9113 }))
9114
Jooyung Hana0503a52023-08-23 13:12:50 +09009115 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009116 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9117 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9118 }
9119
Jooyung Hana0503a52023-08-23 13:12:50 +09009120 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009121 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9122 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9123 }
9124}
9125
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009126func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009127 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009128 apex {
9129 name: "myapex",
9130 key: "myapex.key",
9131 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009132 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009133 }
9134
9135 apex_key {
9136 name: "myapex.key",
9137 public_key: "testkey.avbpubkey",
9138 private_key: "testkey.pem",
9139 }
9140
9141 cc_library {
9142 name: "mylib",
9143 srcs: ["mylib.cpp"],
9144 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009145 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009146 },
9147 apex_available: ["myapex"],
9148 }
9149
9150 cc_prebuilt_library_shared {
9151 name: "mylib",
9152 prefer: false,
9153 srcs: ["prebuilt.so"],
9154 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009155 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009156 },
9157 apex_available: ["myapex"],
9158 }
9159 `)
9160}
9161
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009162func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009163 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009164 apex {
9165 name: "myapex",
9166 key: "myapex.key",
9167 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009168 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009169 }
9170 apex_key {
9171 name: "myapex.key",
9172 public_key: "testkey.avbpubkey",
9173 private_key: "testkey.pem",
9174 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009175 `,
9176 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9177 variables.CompressedApex = proptools.BoolPtr(true)
9178 }),
9179 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009180
Jooyung Hana0503a52023-08-23 13:12:50 +09009181 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009182 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9183
Jooyung Hana0503a52023-08-23 13:12:50 +09009184 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009185 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9186
9187 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009188 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009189 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9190
9191 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009192 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009193 var builder strings.Builder
9194 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9195 androidMk := builder.String()
9196 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9197}
9198
Martin Stjernholm2856c662020-12-02 15:03:42 +00009199func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009200 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009201 apex {
9202 name: "myapex",
9203 key: "myapex.key",
9204 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009205 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009206 }
9207
9208 apex_key {
9209 name: "myapex.key",
9210 public_key: "testkey.avbpubkey",
9211 private_key: "testkey.pem",
9212 }
9213
9214 cc_library {
9215 name: "mylib",
9216 srcs: ["mylib.cpp"],
9217 apex_available: ["myapex"],
9218 shared_libs: ["otherlib"],
9219 system_shared_libs: [],
9220 }
9221
9222 cc_library {
9223 name: "otherlib",
9224 srcs: ["mylib.cpp"],
9225 stubs: {
9226 versions: ["current"],
9227 },
9228 }
9229
9230 cc_prebuilt_library_shared {
9231 name: "otherlib",
9232 prefer: true,
9233 srcs: ["prebuilt.so"],
9234 stubs: {
9235 versions: ["current"],
9236 },
9237 }
9238 `)
9239
Jooyung Hana0503a52023-08-23 13:12:50 +09009240 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009241 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009242 var builder strings.Builder
9243 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9244 androidMk := builder.String()
9245
9246 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9247 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009248 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009249}
9250
Jiyong Parke3867542020-12-03 17:28:25 +09009251func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009252 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009253 apex {
9254 name: "myapex",
9255 key: "myapex.key",
9256 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009257 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009258 }
9259
9260 apex_key {
9261 name: "myapex.key",
9262 public_key: "testkey.avbpubkey",
9263 private_key: "testkey.pem",
9264 }
9265
9266 cc_library {
9267 name: "mylib",
9268 srcs: ["mylib.cpp"],
9269 system_shared_libs: [],
9270 stl: "none",
9271 apex_available: ["myapex"],
9272 shared_libs: ["mylib2"],
9273 target: {
9274 apex: {
9275 exclude_shared_libs: ["mylib2"],
9276 },
9277 },
9278 }
9279
9280 cc_library {
9281 name: "mylib2",
9282 srcs: ["mylib.cpp"],
9283 system_shared_libs: [],
9284 stl: "none",
9285 }
9286 `)
9287
9288 // Check if mylib is linked to mylib2 for the non-apex target
9289 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9290 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9291
9292 // Make sure that the link doesn't occur for the apex target
9293 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9294 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9295
9296 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009297 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009298 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9299}
9300
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009301func TestPrebuiltStubLibDep(t *testing.T) {
9302 bpBase := `
9303 apex {
9304 name: "myapex",
9305 key: "myapex.key",
9306 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009307 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009308 }
9309 apex_key {
9310 name: "myapex.key",
9311 public_key: "testkey.avbpubkey",
9312 private_key: "testkey.pem",
9313 }
9314 cc_library {
9315 name: "mylib",
9316 srcs: ["mylib.cpp"],
9317 apex_available: ["myapex"],
9318 shared_libs: ["stublib"],
9319 system_shared_libs: [],
9320 }
9321 apex {
9322 name: "otherapex",
9323 enabled: %s,
9324 key: "myapex.key",
9325 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009326 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009327 }
9328 `
9329
9330 stublibSourceBp := `
9331 cc_library {
9332 name: "stublib",
9333 srcs: ["mylib.cpp"],
9334 apex_available: ["otherapex"],
9335 system_shared_libs: [],
9336 stl: "none",
9337 stubs: {
9338 versions: ["1"],
9339 },
9340 }
9341 `
9342
9343 stublibPrebuiltBp := `
9344 cc_prebuilt_library_shared {
9345 name: "stublib",
9346 srcs: ["prebuilt.so"],
9347 apex_available: ["otherapex"],
9348 stubs: {
9349 versions: ["1"],
9350 },
9351 %s
9352 }
9353 `
9354
9355 tests := []struct {
9356 name string
9357 stublibBp string
9358 usePrebuilt bool
9359 modNames []string // Modules to collect AndroidMkEntries for
9360 otherApexEnabled []string
9361 }{
9362 {
9363 name: "only_source",
9364 stublibBp: stublibSourceBp,
9365 usePrebuilt: false,
9366 modNames: []string{"stublib"},
9367 otherApexEnabled: []string{"true", "false"},
9368 },
9369 {
9370 name: "source_preferred",
9371 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9372 usePrebuilt: false,
9373 modNames: []string{"stublib", "prebuilt_stublib"},
9374 otherApexEnabled: []string{"true", "false"},
9375 },
9376 {
9377 name: "prebuilt_preferred",
9378 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9379 usePrebuilt: true,
9380 modNames: []string{"stublib", "prebuilt_stublib"},
9381 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9382 },
9383 {
9384 name: "only_prebuilt",
9385 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9386 usePrebuilt: true,
9387 modNames: []string{"stublib"},
9388 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9389 },
9390 }
9391
9392 for _, test := range tests {
9393 t.Run(test.name, func(t *testing.T) {
9394 for _, otherApexEnabled := range test.otherApexEnabled {
9395 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009396 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009397
9398 type modAndMkEntries struct {
9399 mod *cc.Module
9400 mkEntries android.AndroidMkEntries
9401 }
9402 entries := []*modAndMkEntries{}
9403
9404 // Gather shared lib modules that are installable
9405 for _, modName := range test.modNames {
9406 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9407 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9408 continue
9409 }
9410 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009411 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009412 continue
9413 }
Colin Crossaa255532020-07-03 13:18:24 -07009414 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009415 if ent.Disabled {
9416 continue
9417 }
9418 entries = append(entries, &modAndMkEntries{
9419 mod: mod,
9420 mkEntries: ent,
9421 })
9422 }
9423 }
9424 }
9425
9426 var entry *modAndMkEntries = nil
9427 for _, ent := range entries {
9428 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9429 if entry != nil {
9430 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9431 } else {
9432 entry = ent
9433 }
9434 }
9435 }
9436
9437 if entry == nil {
9438 t.Errorf("AndroidMk entry for \"stublib\" missing")
9439 } else {
9440 isPrebuilt := entry.mod.Prebuilt() != nil
9441 if isPrebuilt != test.usePrebuilt {
9442 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9443 }
9444 if !entry.mod.IsStubs() {
9445 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9446 }
9447 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9448 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9449 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009450 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009451 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009452 if !android.InList(expected, cflags) {
9453 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9454 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009455 }
9456 })
9457 }
9458 })
9459 }
9460}
9461
Colin Crossc33e5212021-05-25 18:16:02 -07009462func TestApexJavaCoverage(t *testing.T) {
9463 bp := `
9464 apex {
9465 name: "myapex",
9466 key: "myapex.key",
9467 java_libs: ["mylib"],
9468 bootclasspath_fragments: ["mybootclasspathfragment"],
9469 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9470 updatable: false,
9471 }
9472
9473 apex_key {
9474 name: "myapex.key",
9475 public_key: "testkey.avbpubkey",
9476 private_key: "testkey.pem",
9477 }
9478
9479 java_library {
9480 name: "mylib",
9481 srcs: ["mylib.java"],
9482 apex_available: ["myapex"],
9483 compile_dex: true,
9484 }
9485
9486 bootclasspath_fragment {
9487 name: "mybootclasspathfragment",
9488 contents: ["mybootclasspathlib"],
9489 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009490 hidden_api: {
9491 split_packages: ["*"],
9492 },
Colin Crossc33e5212021-05-25 18:16:02 -07009493 }
9494
9495 java_library {
9496 name: "mybootclasspathlib",
9497 srcs: ["mybootclasspathlib.java"],
9498 apex_available: ["myapex"],
9499 compile_dex: true,
9500 }
9501
9502 systemserverclasspath_fragment {
9503 name: "mysystemserverclasspathfragment",
9504 contents: ["mysystemserverclasspathlib"],
9505 apex_available: ["myapex"],
9506 }
9507
9508 java_library {
9509 name: "mysystemserverclasspathlib",
9510 srcs: ["mysystemserverclasspathlib.java"],
9511 apex_available: ["myapex"],
9512 compile_dex: true,
9513 }
9514 `
9515
9516 result := android.GroupFixturePreparers(
9517 PrepareForTestWithApexBuildComponents,
9518 prepareForTestWithMyapex,
9519 java.PrepareForTestWithJavaDefaultModules,
9520 android.PrepareForTestWithAndroidBuildComponents,
9521 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009522 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9523 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009524 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009525 ).RunTest(t)
9526
9527 // Make sure jacoco ran on both mylib and mybootclasspathlib
9528 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9529 t.Errorf("Failed to find jacoco rule for mylib")
9530 }
9531 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9532 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9533 }
9534 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9535 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9536 }
9537}
9538
Jiyong Park192600a2021-08-03 07:52:17 +00009539func TestProhibitStaticExecutable(t *testing.T) {
9540 testApexError(t, `executable mybin is static`, `
9541 apex {
9542 name: "myapex",
9543 key: "myapex.key",
9544 binaries: ["mybin"],
9545 min_sdk_version: "29",
9546 }
9547
9548 apex_key {
9549 name: "myapex.key",
9550 public_key: "testkey.avbpubkey",
9551 private_key: "testkey.pem",
9552 }
9553
9554 cc_binary {
9555 name: "mybin",
9556 srcs: ["mylib.cpp"],
9557 relative_install_path: "foo/bar",
9558 static_executable: true,
9559 system_shared_libs: [],
9560 stl: "none",
9561 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009562 min_sdk_version: "29",
9563 }
9564 `)
9565
9566 testApexError(t, `executable mybin.rust is static`, `
9567 apex {
9568 name: "myapex",
9569 key: "myapex.key",
9570 binaries: ["mybin.rust"],
9571 min_sdk_version: "29",
9572 }
9573
9574 apex_key {
9575 name: "myapex.key",
9576 public_key: "testkey.avbpubkey",
9577 private_key: "testkey.pem",
9578 }
9579
9580 rust_binary {
9581 name: "mybin.rust",
9582 srcs: ["foo.rs"],
9583 static_executable: true,
9584 apex_available: ["myapex"],
9585 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009586 }
9587 `)
9588}
9589
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009590func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9591 ctx := testApex(t, `
9592 apex {
9593 name: "myapex",
9594 key: "myapex.key",
9595 updatable: false,
9596 java_libs: ["foo"],
9597 }
9598
9599 apex_key {
9600 name: "myapex.key",
9601 public_key: "testkey.avbpubkey",
9602 private_key: "testkey.pem",
9603 }
9604
9605 java_library {
9606 name: "foo",
9607 srcs: ["foo.java"],
9608 apex_available: ["myapex"],
9609 installable: true,
9610 }
9611 `,
9612 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9613 )
9614
Jooyung Hana0503a52023-08-23 13:12:50 +09009615 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009616 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9617 var builder strings.Builder
9618 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9619 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009620 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 +00009621}
9622
9623func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9624 ctx := testApex(t, `
9625 prebuilt_apex {
9626 name: "myapex",
9627 arch: {
9628 arm64: {
9629 src: "myapex-arm64.apex",
9630 },
9631 arm: {
9632 src: "myapex-arm.apex",
9633 },
9634 },
9635 exported_java_libs: ["foo"],
9636 }
9637
9638 java_import {
9639 name: "foo",
9640 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009641 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009642 }
9643 `,
9644 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9645 )
9646
9647 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9648 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9649 mainModuleEntries := entriesList[0]
9650 android.AssertArrayString(t,
9651 "LOCAL_REQUIRED_MODULES",
9652 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9653 []string{
9654 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9655 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9656 })
9657}
9658
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009659func TestAndroidMk_RequiredModules(t *testing.T) {
9660 ctx := testApex(t, `
9661 apex {
9662 name: "myapex",
9663 key: "myapex.key",
9664 updatable: false,
9665 java_libs: ["foo"],
9666 required: ["otherapex"],
9667 }
9668
9669 apex {
9670 name: "otherapex",
9671 key: "myapex.key",
9672 updatable: false,
9673 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009674 }
9675
9676 apex_key {
9677 name: "myapex.key",
9678 public_key: "testkey.avbpubkey",
9679 private_key: "testkey.pem",
9680 }
9681
9682 java_library {
9683 name: "foo",
9684 srcs: ["foo.java"],
9685 apex_available: ["myapex", "otherapex"],
9686 installable: true,
9687 }
9688 `)
9689
Jooyung Hana0503a52023-08-23 13:12:50 +09009690 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009691 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9692 var builder strings.Builder
9693 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9694 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009695 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009696}
9697
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009698func TestAndroidMk_RequiredDeps(t *testing.T) {
9699 ctx := testApex(t, `
9700 apex {
9701 name: "myapex",
9702 key: "myapex.key",
9703 updatable: false,
9704 }
9705
9706 apex_key {
9707 name: "myapex.key",
9708 public_key: "testkey.avbpubkey",
9709 private_key: "testkey.pem",
9710 }
9711 `)
9712
Jooyung Hana0503a52023-08-23 13:12:50 +09009713 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009714 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009715 data := android.AndroidMkDataForTest(t, ctx, bundle)
9716 var builder strings.Builder
9717 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9718 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009719 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009720}
9721
Jooyung Hana6d36672022-02-24 13:58:07 +09009722func TestApexOutputFileProducer(t *testing.T) {
9723 for _, tc := range []struct {
9724 name string
9725 ref string
9726 expected_data []string
9727 }{
9728 {
9729 name: "test_using_output",
9730 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009731 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009732 },
9733 {
9734 name: "test_using_apex",
9735 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009736 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009737 },
9738 } {
9739 t.Run(tc.name, func(t *testing.T) {
9740 ctx := testApex(t, `
9741 apex {
9742 name: "myapex",
9743 key: "myapex.key",
9744 compressible: true,
9745 updatable: false,
9746 }
9747
9748 apex_key {
9749 name: "myapex.key",
9750 public_key: "testkey.avbpubkey",
9751 private_key: "testkey.pem",
9752 }
9753
9754 java_test {
9755 name: "`+tc.name+`",
9756 srcs: ["a.java"],
9757 data: ["`+tc.ref+`"],
9758 }
9759 `,
9760 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9761 variables.CompressedApex = proptools.BoolPtr(true)
9762 }))
9763 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9764 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9765 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9766 })
9767 }
9768}
9769
satayev758968a2021-12-06 11:42:40 +00009770func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9771 preparer := android.GroupFixturePreparers(
9772 PrepareForTestWithApexBuildComponents,
9773 prepareForTestWithMyapex,
9774 java.PrepareForTestWithJavaSdkLibraryFiles,
9775 java.PrepareForTestWithJavaDefaultModules,
9776 android.PrepareForTestWithAndroidBuildComponents,
9777 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9778 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9779 )
9780
9781 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9782 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9783 preparer.RunTestWithBp(t, `
9784 apex {
9785 name: "myapex",
9786 key: "myapex.key",
9787 bootclasspath_fragments: ["mybootclasspathfragment"],
9788 min_sdk_version: "30",
9789 updatable: false,
9790 }
9791
9792 apex_key {
9793 name: "myapex.key",
9794 public_key: "testkey.avbpubkey",
9795 private_key: "testkey.pem",
9796 }
9797
9798 bootclasspath_fragment {
9799 name: "mybootclasspathfragment",
9800 contents: ["mybootclasspathlib"],
9801 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009802 hidden_api: {
9803 split_packages: ["*"],
9804 },
satayev758968a2021-12-06 11:42:40 +00009805 }
9806
9807 java_sdk_library {
9808 name: "mybootclasspathlib",
9809 srcs: ["mybootclasspathlib.java"],
9810 apex_available: ["myapex"],
9811 compile_dex: true,
9812 unsafe_ignore_missing_latest_api: true,
9813 min_sdk_version: "31",
9814 static_libs: ["util"],
9815 }
9816
9817 java_library {
9818 name: "util",
9819 srcs: ["a.java"],
9820 apex_available: ["myapex"],
9821 min_sdk_version: "31",
9822 static_libs: ["another_util"],
9823 }
9824
9825 java_library {
9826 name: "another_util",
9827 srcs: ["a.java"],
9828 min_sdk_version: "31",
9829 apex_available: ["myapex"],
9830 }
9831 `)
9832 })
9833
9834 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9835 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9836 preparer.RunTestWithBp(t, `
9837 apex {
9838 name: "myapex",
9839 key: "myapex.key",
9840 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9841 min_sdk_version: "30",
9842 updatable: false,
9843 }
9844
9845 apex_key {
9846 name: "myapex.key",
9847 public_key: "testkey.avbpubkey",
9848 private_key: "testkey.pem",
9849 }
9850
9851 systemserverclasspath_fragment {
9852 name: "mysystemserverclasspathfragment",
9853 contents: ["mysystemserverclasspathlib"],
9854 apex_available: ["myapex"],
9855 }
9856
9857 java_sdk_library {
9858 name: "mysystemserverclasspathlib",
9859 srcs: ["mysystemserverclasspathlib.java"],
9860 apex_available: ["myapex"],
9861 compile_dex: true,
9862 min_sdk_version: "32",
9863 unsafe_ignore_missing_latest_api: true,
9864 static_libs: ["util"],
9865 }
9866
9867 java_library {
9868 name: "util",
9869 srcs: ["a.java"],
9870 apex_available: ["myapex"],
9871 min_sdk_version: "31",
9872 static_libs: ["another_util"],
9873 }
9874
9875 java_library {
9876 name: "another_util",
9877 srcs: ["a.java"],
9878 min_sdk_version: "31",
9879 apex_available: ["myapex"],
9880 }
9881 `)
9882 })
9883
9884 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9885 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9886 RunTestWithBp(t, `
9887 apex {
9888 name: "myapex",
9889 key: "myapex.key",
9890 bootclasspath_fragments: ["mybootclasspathfragment"],
9891 min_sdk_version: "30",
9892 updatable: false,
9893 }
9894
9895 apex_key {
9896 name: "myapex.key",
9897 public_key: "testkey.avbpubkey",
9898 private_key: "testkey.pem",
9899 }
9900
9901 bootclasspath_fragment {
9902 name: "mybootclasspathfragment",
9903 contents: ["mybootclasspathlib"],
9904 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009905 hidden_api: {
9906 split_packages: ["*"],
9907 },
satayev758968a2021-12-06 11:42:40 +00009908 }
9909
9910 java_sdk_library {
9911 name: "mybootclasspathlib",
9912 srcs: ["mybootclasspathlib.java"],
9913 apex_available: ["myapex"],
9914 compile_dex: true,
9915 unsafe_ignore_missing_latest_api: true,
9916 }
9917 `)
9918 })
9919
9920 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9921 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9922 RunTestWithBp(t, `
9923 apex {
9924 name: "myapex",
9925 key: "myapex.key",
9926 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9927 min_sdk_version: "30",
9928 updatable: false,
9929 }
9930
9931 apex_key {
9932 name: "myapex.key",
9933 public_key: "testkey.avbpubkey",
9934 private_key: "testkey.pem",
9935 }
9936
9937 systemserverclasspath_fragment {
9938 name: "mysystemserverclasspathfragment",
9939 contents: ["mysystemserverclasspathlib"],
9940 apex_available: ["myapex"],
9941 }
9942
9943 java_sdk_library {
9944 name: "mysystemserverclasspathlib",
9945 srcs: ["mysystemserverclasspathlib.java"],
9946 apex_available: ["myapex"],
9947 compile_dex: true,
9948 unsafe_ignore_missing_latest_api: true,
9949 }
9950 `)
9951 })
9952}
9953
Jiakai Zhang6decef92022-01-12 17:56:19 +00009954// Verifies that the APEX depends on all the Make modules in the list.
9955func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9956 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9957 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009958 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009959 }
9960}
9961
9962// Verifies that the APEX does not depend on any of the Make modules in the list.
9963func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9964 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9965 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009966 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009967 }
9968}
9969
Cole Faust1021ccd2023-02-26 21:15:25 -08009970// TODO(b/193460475): Re-enable this test
9971//func TestApexStrictUpdtabilityLint(t *testing.T) {
9972// bpTemplate := `
9973// apex {
9974// name: "myapex",
9975// key: "myapex.key",
9976// java_libs: ["myjavalib"],
9977// updatable: %v,
9978// min_sdk_version: "29",
9979// }
9980// apex_key {
9981// name: "myapex.key",
9982// }
9983// java_library {
9984// name: "myjavalib",
9985// srcs: ["MyClass.java"],
9986// apex_available: [ "myapex" ],
9987// lint: {
9988// strict_updatability_linting: %v,
9989// },
9990// sdk_version: "current",
9991// min_sdk_version: "29",
9992// }
9993// `
9994// fs := android.MockFS{
9995// "lint-baseline.xml": nil,
9996// }
9997//
9998// testCases := []struct {
9999// testCaseName string
10000// apexUpdatable bool
10001// javaStrictUpdtabilityLint bool
10002// lintFileExists bool
10003// disallowedFlagExpected bool
10004// }{
10005// {
10006// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10007// apexUpdatable: true,
10008// javaStrictUpdtabilityLint: true,
10009// lintFileExists: false,
10010// disallowedFlagExpected: false,
10011// },
10012// {
10013// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10014// apexUpdatable: false,
10015// javaStrictUpdtabilityLint: false,
10016// lintFileExists: true,
10017// disallowedFlagExpected: false,
10018// },
10019// {
10020// testCaseName: "non-updatable apex respects strict updatability of javalib",
10021// apexUpdatable: false,
10022// javaStrictUpdtabilityLint: true,
10023// lintFileExists: true,
10024// disallowedFlagExpected: true,
10025// },
10026// {
10027// testCaseName: "updatable apex sets strict updatability of javalib to true",
10028// apexUpdatable: true,
10029// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10030// lintFileExists: true,
10031// disallowedFlagExpected: true,
10032// },
10033// }
10034//
10035// for _, testCase := range testCases {
10036// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10037// fixtures := []android.FixturePreparer{}
10038// if testCase.lintFileExists {
10039// fixtures = append(fixtures, fs.AddToFixture())
10040// }
10041//
10042// result := testApex(t, bp, fixtures...)
10043// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10044// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10045// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10046//
10047// if disallowedFlagActual != testCase.disallowedFlagExpected {
10048// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10049// }
10050// }
10051//}
10052//
10053//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10054// bp := `
10055// apex {
10056// name: "myapex",
10057// key: "myapex.key",
10058// java_libs: ["myjavalib"],
10059// updatable: true,
10060// min_sdk_version: "29",
10061// }
10062// apex_key {
10063// name: "myapex.key",
10064// }
10065// java_library {
10066// name: "myjavalib",
10067// srcs: ["MyClass.java"],
10068// apex_available: [ "myapex" ],
10069// sdk_version: "current",
10070// min_sdk_version: "29",
10071// }
10072// `
10073//
10074// testCases := []struct {
10075// testCaseName string
10076// moduleDirectory string
10077// disallowedFlagExpected bool
10078// }{
10079// {
10080// testCaseName: "lintable module defined outside libcore",
10081// moduleDirectory: "",
10082// disallowedFlagExpected: true,
10083// },
10084// {
10085// testCaseName: "lintable module defined in libcore root directory",
10086// moduleDirectory: "libcore/",
10087// disallowedFlagExpected: false,
10088// },
10089// {
10090// testCaseName: "lintable module defined in libcore child directory",
10091// moduleDirectory: "libcore/childdir/",
10092// disallowedFlagExpected: true,
10093// },
10094// }
10095//
10096// for _, testCase := range testCases {
10097// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10098// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10099// result := testApex(t, "", lintFileCreator, bpFileCreator)
10100// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10101// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10102// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10103// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10104//
10105// if disallowedFlagActual != testCase.disallowedFlagExpected {
10106// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10107// }
10108// }
10109//}
10110//
10111//// checks transtive deps of an apex coming from bootclasspath_fragment
10112//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10113// bp := `
10114// apex {
10115// name: "myapex",
10116// key: "myapex.key",
10117// bootclasspath_fragments: ["mybootclasspathfragment"],
10118// updatable: true,
10119// min_sdk_version: "29",
10120// }
10121// apex_key {
10122// name: "myapex.key",
10123// }
10124// bootclasspath_fragment {
10125// name: "mybootclasspathfragment",
10126// contents: ["myjavalib"],
10127// apex_available: ["myapex"],
10128// hidden_api: {
10129// split_packages: ["*"],
10130// },
10131// }
10132// java_library {
10133// name: "myjavalib",
10134// srcs: ["MyClass.java"],
10135// apex_available: [ "myapex" ],
10136// sdk_version: "current",
10137// min_sdk_version: "29",
10138// compile_dex: true,
10139// }
10140// `
10141// fs := android.MockFS{
10142// "lint-baseline.xml": nil,
10143// }
10144//
10145// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10146// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10147// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10148// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10149// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10150// }
10151//}
Spandan Das66773252022-01-15 00:23:18 +000010152
Spandan Das42e89502022-05-06 22:12:55 +000010153// updatable apexes should propagate updatable=true to its apps
10154func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10155 bp := `
10156 apex {
10157 name: "myapex",
10158 key: "myapex.key",
10159 updatable: %v,
10160 apps: [
10161 "myapp",
10162 ],
10163 min_sdk_version: "30",
10164 }
10165 apex_key {
10166 name: "myapex.key",
10167 }
10168 android_app {
10169 name: "myapp",
10170 updatable: %v,
10171 apex_available: [
10172 "myapex",
10173 ],
10174 sdk_version: "current",
10175 min_sdk_version: "30",
10176 }
10177 `
10178 testCases := []struct {
10179 name string
10180 apex_is_updatable_bp bool
10181 app_is_updatable_bp bool
10182 app_is_updatable_expected bool
10183 }{
10184 {
10185 name: "Non-updatable apex respects updatable property of non-updatable app",
10186 apex_is_updatable_bp: false,
10187 app_is_updatable_bp: false,
10188 app_is_updatable_expected: false,
10189 },
10190 {
10191 name: "Non-updatable apex respects updatable property of updatable app",
10192 apex_is_updatable_bp: false,
10193 app_is_updatable_bp: true,
10194 app_is_updatable_expected: true,
10195 },
10196 {
10197 name: "Updatable apex respects updatable property of updatable app",
10198 apex_is_updatable_bp: true,
10199 app_is_updatable_bp: true,
10200 app_is_updatable_expected: true,
10201 },
10202 {
10203 name: "Updatable apex sets updatable=true on non-updatable app",
10204 apex_is_updatable_bp: true,
10205 app_is_updatable_bp: false,
10206 app_is_updatable_expected: true,
10207 },
10208 }
10209 for _, testCase := range testCases {
10210 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10211 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10212 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10213 }
10214}
10215
Kiyoung Kim487689e2022-07-26 09:48:22 +090010216func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10217 bp := `
10218 apex {
10219 name: "myapex",
10220 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010221 native_shared_libs: ["libbaz"],
10222 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010223 min_sdk_version: "29",
10224 }
10225 apex_key {
10226 name: "myapex.key",
10227 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010228 cc_binary {
10229 name: "binfoo",
10230 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010231 apex_available: ["myapex"],
10232 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010233 recovery_available: false,
10234 }
10235 cc_library {
10236 name: "libbar",
10237 srcs: ["libbar.cc"],
10238 stubs: {
10239 symbol_file: "libbar.map.txt",
10240 versions: [
10241 "29",
10242 ],
10243 },
10244 }
10245 cc_library {
10246 name: "libbaz",
10247 srcs: ["libbaz.cc"],
10248 apex_available: ["myapex"],
10249 min_sdk_version: "29",
10250 stubs: {
10251 symbol_file: "libbaz.map.txt",
10252 versions: [
10253 "29",
10254 ],
10255 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010256 }
10257 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010258 name: "libbar",
10259 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010260 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010261 variants: ["apex.29"],
10262 }
10263 cc_api_variant {
10264 name: "libbar",
10265 variant: "apex",
10266 version: "29",
10267 src: "libbar_apex_29.so",
10268 }
10269 cc_api_library {
10270 name: "libbaz",
10271 src: "libbaz_stub.so",
10272 min_sdk_version: "29",
10273 variants: ["apex.29"],
10274 }
10275 cc_api_variant {
10276 name: "libbaz",
10277 variant: "apex",
10278 version: "29",
10279 src: "libbaz_apex_29.so",
10280 }
10281 cc_api_library {
10282 name: "libqux",
10283 src: "libqux_stub.so",
10284 min_sdk_version: "29",
10285 variants: ["apex.29"],
10286 }
10287 cc_api_variant {
10288 name: "libqux",
10289 variant: "apex",
10290 version: "29",
10291 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010292 }
10293 api_imports {
10294 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010295 apex_shared_libs: [
10296 "libbar",
10297 "libbaz",
10298 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010299 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010300 }
10301 `
10302 result := testApex(t, bp)
10303
10304 hasDep := func(m android.Module, wantDep android.Module) bool {
10305 t.Helper()
10306 var found bool
10307 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10308 if dep == wantDep {
10309 found = true
10310 }
10311 })
10312 return found
10313 }
10314
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010315 // Library defines stubs and cc_api_library should be used with cc_api_library
10316 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10317 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10318 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010319
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010320 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10321 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010322
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010323 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10324 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10325 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10326 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10327
10328 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10329 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10330 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10331 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10332 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10333
10334 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10335 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10336 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10337
10338 // cc_api_library defined without original library should be linked with cc_api_library
10339 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10340 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10341 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10342}
10343
10344func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10345 bp := `
10346 apex {
10347 name: "myapex",
10348 key: "myapex.key",
10349 native_shared_libs: ["libbar"],
10350 min_sdk_version: "29",
10351 }
10352 apex_key {
10353 name: "myapex.key",
10354 }
10355 cc_binary {
10356 name: "binfoo",
10357 shared_libs: ["libbar"],
10358 recovery_available: false,
10359 }
10360 cc_library {
10361 name: "libbar",
10362 srcs: ["libbar.cc"],
10363 apex_available: ["myapex"],
10364 min_sdk_version: "29",
10365 stubs: {
10366 symbol_file: "libbar.map.txt",
10367 versions: [
10368 "29",
10369 ],
10370 },
10371 }
10372 cc_api_library {
10373 name: "libbar",
10374 src: "libbar_stub.so",
10375 variants: ["apex.29"],
10376 }
10377 cc_api_variant {
10378 name: "libbar",
10379 variant: "apex",
10380 version: "29",
10381 src: "libbar_apex_29.so",
10382 }
10383 api_imports {
10384 name: "api_imports",
10385 apex_shared_libs: [
10386 "libbar",
10387 ],
10388 }
10389 `
10390
10391 result := testApex(t, bp)
10392
10393 hasDep := func(m android.Module, wantDep android.Module) bool {
10394 t.Helper()
10395 var found bool
10396 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10397 if dep == wantDep {
10398 found = true
10399 }
10400 })
10401 return found
10402 }
10403
10404 // Library defines stubs and cc_api_library should be used with cc_api_library
10405 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10406 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10407 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10408
10409 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10410 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10411
10412 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10413 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10414 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10415 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010416}
Dennis Shend4f5d932023-01-31 20:27:21 +000010417
10418func TestTrimmedApex(t *testing.T) {
10419 bp := `
10420 apex {
10421 name: "myapex",
10422 key: "myapex.key",
10423 native_shared_libs: ["libfoo","libbaz"],
10424 min_sdk_version: "29",
10425 trim_against: "mydcla",
10426 }
10427 apex {
10428 name: "mydcla",
10429 key: "myapex.key",
10430 native_shared_libs: ["libfoo","libbar"],
10431 min_sdk_version: "29",
10432 file_contexts: ":myapex-file_contexts",
10433 dynamic_common_lib_apex: true,
10434 }
10435 apex_key {
10436 name: "myapex.key",
10437 }
10438 cc_library {
10439 name: "libfoo",
10440 shared_libs: ["libc"],
10441 apex_available: ["myapex","mydcla"],
10442 min_sdk_version: "29",
10443 }
10444 cc_library {
10445 name: "libbar",
10446 shared_libs: ["libc"],
10447 apex_available: ["myapex","mydcla"],
10448 min_sdk_version: "29",
10449 }
10450 cc_library {
10451 name: "libbaz",
10452 shared_libs: ["libc"],
10453 apex_available: ["myapex","mydcla"],
10454 min_sdk_version: "29",
10455 }
10456 cc_api_library {
10457 name: "libc",
10458 src: "libc.so",
10459 min_sdk_version: "29",
10460 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010461 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010462 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010463 }
10464 api_imports {
10465 name: "api_imports",
10466 shared_libs: [
10467 "libc",
10468 ],
10469 header_libs: [],
10470 }
10471 `
10472 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010473 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010474 apexRule := module.MaybeRule("apexRule")
10475 if apexRule.Rule == nil {
10476 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10477 }
10478
10479 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010480 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010481 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10482 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10483 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10484 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10485}
Jingwen Chendea7a642023-03-28 11:30:50 +000010486
10487func TestCannedFsConfig(t *testing.T) {
10488 ctx := testApex(t, `
10489 apex {
10490 name: "myapex",
10491 key: "myapex.key",
10492 updatable: false,
10493 }
10494
10495 apex_key {
10496 name: "myapex.key",
10497 public_key: "testkey.avbpubkey",
10498 private_key: "testkey.pem",
10499 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010500 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010501 generateFsRule := mod.Rule("generateFsConfig")
10502 cmd := generateFsRule.RuleParams.Command
10503
10504 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10505}
10506
10507func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10508 ctx := testApex(t, `
10509 apex {
10510 name: "myapex",
10511 key: "myapex.key",
10512 canned_fs_config: "my_config",
10513 updatable: false,
10514 }
10515
10516 apex_key {
10517 name: "myapex.key",
10518 public_key: "testkey.avbpubkey",
10519 private_key: "testkey.pem",
10520 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010521 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010522 generateFsRule := mod.Rule("generateFsConfig")
10523 cmd := generateFsRule.RuleParams.Command
10524
10525 // Ensure that canned_fs_config has "cat my_config" at the end
10526 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10527}
Spandan Das20fce2d2023-04-12 17:21:39 +000010528
10529func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10530 testCases := []struct {
10531 desc string
10532 hasStubs bool
10533 apexAvailable string
10534 expectedError string
10535 }{
10536 {
10537 desc: "non-stub library can have multiple apex_available",
10538 hasStubs: false,
10539 apexAvailable: `["myapex", "otherapex"]`,
10540 },
10541 {
10542 desc: "stub library should not be available to anyapex",
10543 hasStubs: true,
10544 apexAvailable: `["//apex_available:anyapex"]`,
10545 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10546 },
10547 {
10548 desc: "stub library should not be available to multiple apexes",
10549 hasStubs: true,
10550 apexAvailable: `["myapex", "otherapex"]`,
10551 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10552 },
10553 {
10554 desc: "stub library can be available to a core apex and a test apex",
10555 hasStubs: true,
10556 apexAvailable: `["myapex", "test_myapex"]`,
10557 },
10558 }
10559 bpTemplate := `
10560 cc_library {
10561 name: "libfoo",
10562 %v
10563 apex_available: %v,
10564 }
10565 apex {
10566 name: "myapex",
10567 key: "apex.key",
10568 updatable: false,
10569 native_shared_libs: ["libfoo"],
10570 }
10571 apex {
10572 name: "otherapex",
10573 key: "apex.key",
10574 updatable: false,
10575 }
10576 apex_test {
10577 name: "test_myapex",
10578 key: "apex.key",
10579 updatable: false,
10580 native_shared_libs: ["libfoo"],
10581 }
10582 apex_key {
10583 name: "apex.key",
10584 }
10585 `
10586 for _, tc := range testCases {
10587 stubs := ""
10588 if tc.hasStubs {
10589 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10590 }
10591 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10592 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10593 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10594 })
10595 if tc.expectedError == "" {
10596 testApex(t, bp, mockFsFixturePreparer)
10597 } else {
10598 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10599 }
10600 }
10601}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010602
10603func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10604 context := android.GroupFixturePreparers(
10605 android.PrepareForIntegrationTestWithAndroid,
10606 cc.PrepareForIntegrationTestWithCc,
10607 PrepareForTestWithApexBuildComponents,
10608 prepareForTestWithMyapex,
10609 filesystem.PrepareForTestWithFilesystemBuildComponents,
10610 )
10611 result := context.RunTestWithBp(t, `
10612 android_system_image {
10613 name: "myfilesystem",
10614 deps: [
10615 "libfoo",
10616 ],
10617 linker_config_src: "linker.config.json",
10618 }
10619
10620 cc_library {
10621 name: "libfoo",
10622 shared_libs: [
10623 "libbar",
10624 ],
10625 stl: "none",
10626 }
10627
10628 cc_library {
10629 name: "libbar",
10630 stl: "none",
10631 apex_available: ["myapex"],
10632 }
10633
10634 apex {
10635 name: "myapex",
10636 native_shared_libs: ["libbar"],
10637 key: "myapex.key",
10638 updatable: false,
10639 }
10640
10641 apex_key {
10642 name: "myapex.key",
10643 public_key: "testkey.avbpubkey",
10644 private_key: "testkey.pem",
10645 }
10646 `)
10647
Cole Faust3b806d32024-03-11 15:15:03 -070010648 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010649 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10650 inputs.Strings(),
10651 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10652}
Yu Liueae7b362023-11-16 17:05:47 -080010653
10654var apex_default_bp = `
10655 apex_key {
10656 name: "myapex.key",
10657 public_key: "testkey.avbpubkey",
10658 private_key: "testkey.pem",
10659 }
10660
10661 filegroup {
10662 name: "myapex.manifest",
10663 srcs: ["apex_manifest.json"],
10664 }
10665
10666 filegroup {
10667 name: "myapex.androidmanifest",
10668 srcs: ["AndroidManifest.xml"],
10669 }
10670`
10671
10672func TestAconfigFilesJavaDeps(t *testing.T) {
10673 ctx := testApex(t, apex_default_bp+`
10674 apex {
10675 name: "myapex",
10676 manifest: ":myapex.manifest",
10677 androidManifest: ":myapex.androidmanifest",
10678 key: "myapex.key",
10679 java_libs: [
10680 "my_java_library_foo",
10681 "my_java_library_bar",
10682 ],
10683 updatable: false,
10684 }
10685
10686 java_library {
10687 name: "my_java_library_foo",
10688 srcs: ["foo/bar/MyClass.java"],
10689 sdk_version: "none",
10690 system_modules: "none",
10691 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010692 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010693 "myapex",
10694 ],
10695 }
10696
10697 java_library {
10698 name: "my_java_library_bar",
10699 srcs: ["foo/bar/MyClass.java"],
10700 sdk_version: "none",
10701 system_modules: "none",
10702 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010703 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010704 "myapex",
10705 ],
10706 }
10707
10708 aconfig_declarations {
10709 name: "my_aconfig_declarations_foo",
10710 package: "com.example.package",
10711 container: "myapex",
10712 srcs: ["foo.aconfig"],
10713 }
10714
10715 java_aconfig_library {
10716 name: "my_java_aconfig_library_foo",
10717 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010718 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010719 "myapex",
10720 ],
10721 }
10722
10723 aconfig_declarations {
10724 name: "my_aconfig_declarations_bar",
10725 package: "com.example.package",
10726 container: "myapex",
10727 srcs: ["bar.aconfig"],
10728 }
10729
10730 java_aconfig_library {
10731 name: "my_java_aconfig_library_bar",
10732 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010733 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010734 "myapex",
10735 ],
10736 }
10737 `)
10738
10739 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10740 s := mod.Rule("apexRule").Args["copy_commands"]
10741 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010742 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080010743 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10744 }
10745
Yu Liuab31c822024-02-28 22:21:31 +000010746 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10747 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
10748 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
10749 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010750
Yu Liubba555e2024-02-17 00:36:42 +000010751 inputs := []string{
10752 "my_aconfig_declarations_foo/intermediate.pb",
10753 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010754 }
Yu Liubba555e2024-02-17 00:36:42 +000010755 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10756 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10757 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10758 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010759}
10760
10761func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10762 ctx := testApex(t, apex_default_bp+`
10763 apex {
10764 name: "myapex",
10765 manifest: ":myapex.manifest",
10766 androidManifest: ":myapex.androidmanifest",
10767 key: "myapex.key",
10768 java_libs: [
10769 "my_java_library_foo",
10770 ],
10771 native_shared_libs: [
10772 "my_cc_library_bar",
10773 ],
10774 binaries: [
10775 "my_cc_binary_baz",
10776 ],
10777 updatable: false,
10778 }
10779
10780 java_library {
10781 name: "my_java_library_foo",
10782 srcs: ["foo/bar/MyClass.java"],
10783 sdk_version: "none",
10784 system_modules: "none",
10785 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010786 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010787 "myapex",
10788 ],
10789 }
10790
10791 cc_library {
10792 name: "my_cc_library_bar",
10793 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010794 static_libs: [
10795 "my_cc_aconfig_library_bar",
10796 "my_cc_aconfig_library_baz",
10797 ],
Yu Liueae7b362023-11-16 17:05:47 -080010798 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010799 "myapex",
10800 ],
10801 }
10802
10803 cc_binary {
10804 name: "my_cc_binary_baz",
10805 srcs: ["foo/bar/MyClass.cc"],
10806 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010807 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010808 "myapex",
10809 ],
10810 }
10811
10812 aconfig_declarations {
10813 name: "my_aconfig_declarations_foo",
10814 package: "com.example.package",
10815 container: "myapex",
10816 srcs: ["foo.aconfig"],
10817 }
10818
10819 java_aconfig_library {
10820 name: "my_java_aconfig_library_foo",
10821 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010822 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010823 "myapex",
10824 ],
10825 }
10826
10827 aconfig_declarations {
10828 name: "my_aconfig_declarations_bar",
10829 package: "com.example.package",
10830 container: "myapex",
10831 srcs: ["bar.aconfig"],
10832 }
10833
10834 cc_aconfig_library {
10835 name: "my_cc_aconfig_library_bar",
10836 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010837 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010838 "myapex",
10839 ],
10840 }
10841
10842 aconfig_declarations {
10843 name: "my_aconfig_declarations_baz",
10844 package: "com.example.package",
10845 container: "myapex",
10846 srcs: ["baz.aconfig"],
10847 }
10848
10849 cc_aconfig_library {
10850 name: "my_cc_aconfig_library_baz",
10851 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010852 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010853 "myapex",
10854 ],
10855 }
10856
10857 cc_library {
10858 name: "server_configurable_flags",
10859 srcs: ["server_configurable_flags.cc"],
10860 }
10861 `)
10862
10863 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10864 s := mod.Rule("apexRule").Args["copy_commands"]
10865 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010866 if len(copyCmds) != 12 {
10867 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010868 }
10869
Yu Liuab31c822024-02-28 22:21:31 +000010870 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10871 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
10872 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
10873 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010874
Yu Liubba555e2024-02-17 00:36:42 +000010875 inputs := []string{
10876 "my_aconfig_declarations_foo/intermediate.pb",
10877 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10878 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010879 }
Yu Liubba555e2024-02-17 00:36:42 +000010880 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10881 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10882 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10883 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010884}
10885
Yu Liucec0e412023-11-30 16:45:50 -080010886func TestAconfigFilesRustDeps(t *testing.T) {
10887 ctx := testApex(t, apex_default_bp+`
10888 apex {
10889 name: "myapex",
10890 manifest: ":myapex.manifest",
10891 androidManifest: ":myapex.androidmanifest",
10892 key: "myapex.key",
10893 native_shared_libs: [
10894 "libmy_rust_library",
10895 ],
10896 binaries: [
10897 "my_rust_binary",
10898 ],
10899 rust_dyn_libs: [
10900 "libmy_rust_dylib",
10901 ],
10902 updatable: false,
10903 }
10904
10905 rust_library {
10906 name: "libflags_rust", // test mock
10907 crate_name: "flags_rust",
10908 srcs: ["lib.rs"],
10909 apex_available: [
10910 "myapex",
10911 ],
10912 }
10913
10914 rust_library {
10915 name: "liblazy_static", // test mock
10916 crate_name: "lazy_static",
10917 srcs: ["src/lib.rs"],
10918 apex_available: [
10919 "myapex",
10920 ],
10921 }
10922
Ted Bauer02d475c2024-03-27 20:56:26 +000010923 rust_library {
10924 name: "libaconfig_storage_read_api", // test mock
10925 crate_name: "aconfig_storage_read_api",
10926 srcs: ["src/lib.rs"],
10927 apex_available: [
10928 "myapex",
10929 ],
10930 }
10931
Ted Bauer6ef40db2024-03-29 14:04:10 +000010932 rust_library {
10933 name: "liblogger", // test mock
10934 crate_name: "logger",
10935 srcs: ["src/lib.rs"],
10936 apex_available: [
10937 "myapex",
10938 ],
10939 }
10940
10941 rust_library {
10942 name: "liblog_rust", // test mock
10943 crate_name: "log_rust",
10944 srcs: ["src/lib.rs"],
10945 apex_available: [
10946 "myapex",
10947 ],
10948 }
10949
Yu Liucec0e412023-11-30 16:45:50 -080010950 rust_ffi_shared {
10951 name: "libmy_rust_library",
10952 srcs: ["src/lib.rs"],
10953 rustlibs: ["libmy_rust_aconfig_library_foo"],
10954 crate_name: "my_rust_library",
10955 apex_available: [
10956 "myapex",
10957 ],
10958 }
10959
10960 rust_library_dylib {
10961 name: "libmy_rust_dylib",
10962 srcs: ["foo/bar/MyClass.rs"],
10963 rustlibs: ["libmy_rust_aconfig_library_bar"],
10964 crate_name: "my_rust_dylib",
10965 apex_available: [
10966 "myapex",
10967 ],
10968 }
10969
10970 rust_binary {
10971 name: "my_rust_binary",
10972 srcs: ["foo/bar/MyClass.rs"],
10973 rustlibs: [
10974 "libmy_rust_aconfig_library_baz",
10975 "libmy_rust_dylib",
10976 ],
10977 apex_available: [
10978 "myapex",
10979 ],
10980 }
10981
10982 aconfig_declarations {
10983 name: "my_aconfig_declarations_foo",
10984 package: "com.example.package",
10985 container: "myapex",
10986 srcs: ["foo.aconfig"],
10987 }
10988
10989 aconfig_declarations {
10990 name: "my_aconfig_declarations_bar",
10991 package: "com.example.package",
10992 container: "myapex",
10993 srcs: ["bar.aconfig"],
10994 }
10995
10996 aconfig_declarations {
10997 name: "my_aconfig_declarations_baz",
10998 package: "com.example.package",
10999 container: "myapex",
11000 srcs: ["baz.aconfig"],
11001 }
11002
11003 rust_aconfig_library {
11004 name: "libmy_rust_aconfig_library_foo",
11005 aconfig_declarations: "my_aconfig_declarations_foo",
11006 crate_name: "my_rust_aconfig_library_foo",
11007 apex_available: [
11008 "myapex",
11009 ],
11010 }
11011
11012 rust_aconfig_library {
11013 name: "libmy_rust_aconfig_library_bar",
11014 aconfig_declarations: "my_aconfig_declarations_bar",
11015 crate_name: "my_rust_aconfig_library_bar",
11016 apex_available: [
11017 "myapex",
11018 ],
11019 }
11020
11021 rust_aconfig_library {
11022 name: "libmy_rust_aconfig_library_baz",
11023 aconfig_declarations: "my_aconfig_declarations_baz",
11024 crate_name: "my_rust_aconfig_library_baz",
11025 apex_available: [
11026 "myapex",
11027 ],
11028 }
11029 `)
11030
11031 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11032 s := mod.Rule("apexRule").Args["copy_commands"]
11033 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ted Bauer6ef40db2024-03-29 14:04:10 +000011034 if len(copyCmds) != 32 {
Ted Bauer02d475c2024-03-27 20:56:26 +000011035 t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080011036 }
11037
Ted Bauer6ef40db2024-03-29 14:04:10 +000011038 ensureMatches(t, copyCmds[28], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11039 ensureMatches(t, copyCmds[29], "^cp -f .*/package.map .*/image.apex/etc$")
11040 ensureMatches(t, copyCmds[30], "^cp -f .*/flag.map .*/image.apex/etc$")
11041 ensureMatches(t, copyCmds[31], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080011042
Yu Liubba555e2024-02-17 00:36:42 +000011043 inputs := []string{
11044 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011045 "my_aconfig_declarations_bar/intermediate.pb",
11046 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011047 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11048 }
11049 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11050 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11051 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11052 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
11053}
11054
11055func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11056 aconfigRule := mod.Description(desc)
11057 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011058 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011059 if len(aconfigArgs) != len(inputs) {
11060 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011061 }
Yu Liucec0e412023-11-30 16:45:50 -080011062
Yu Liubba555e2024-02-17 00:36:42 +000011063 ensureEquals(t, container, aconfigRule.Args["container"])
11064 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11065
11066 buildParams := aconfigRule.BuildParams
11067 for _, input := range inputs {
11068 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11069 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011070 }
Yu Liubba555e2024-02-17 00:36:42 +000011071
11072 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011073}
11074
Yu Liueae7b362023-11-16 17:05:47 -080011075func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11076 ctx := testApex(t, apex_default_bp+`
11077 apex {
11078 name: "myapex",
11079 manifest: ":myapex.manifest",
11080 androidManifest: ":myapex.androidmanifest",
11081 key: "myapex.key",
11082 java_libs: [
11083 "my_java_library_foo",
11084 "other_java_library_bar",
11085 ],
11086 updatable: false,
11087 }
11088
11089 java_library {
11090 name: "my_java_library_foo",
11091 srcs: ["foo/bar/MyClass.java"],
11092 sdk_version: "none",
11093 system_modules: "none",
11094 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011095 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011096 "myapex",
11097 ],
11098 }
11099
11100 java_library {
11101 name: "other_java_library_bar",
11102 srcs: ["foo/bar/MyClass.java"],
11103 sdk_version: "none",
11104 system_modules: "none",
11105 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011106 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011107 "myapex",
11108 ],
11109 }
11110
11111 aconfig_declarations {
11112 name: "my_aconfig_declarations_foo",
11113 package: "com.example.package",
11114 container: "myapex",
11115 srcs: ["foo.aconfig"],
11116 }
11117
11118 java_aconfig_library {
11119 name: "my_java_aconfig_library_foo",
11120 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011121 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011122 "myapex",
11123 ],
11124 }
11125
11126 aconfig_declarations {
11127 name: "other_aconfig_declarations_bar",
11128 package: "com.example.package",
11129 container: "otherapex",
11130 srcs: ["bar.aconfig"],
11131 }
11132
11133 java_aconfig_library {
11134 name: "other_java_aconfig_library_bar",
11135 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011136 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011137 "myapex",
11138 ],
11139 }
11140 `)
11141
11142 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11143 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11144 s := " " + combineAconfigRule.Args["cache_files"]
11145 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11146 if len(aconfigArgs) != 1 {
11147 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11148 }
11149 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11150
11151 buildParams := combineAconfigRule.BuildParams
11152 if len(buildParams.Inputs) != 1 {
11153 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11154 }
11155 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11156 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11157}
11158
11159func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11160 ctx := testApex(t, apex_default_bp+`
11161 apex {
11162 name: "myapex",
11163 manifest: ":myapex.manifest",
11164 androidManifest: ":myapex.androidmanifest",
11165 key: "myapex.key",
11166 java_libs: [
11167 "my_java_library_foo",
11168 "my_java_library_bar",
11169 ],
11170 updatable: false,
11171 }
11172
11173 java_library {
11174 name: "my_java_library_foo",
11175 srcs: ["foo/bar/MyClass.java"],
11176 sdk_version: "none",
11177 system_modules: "none",
11178 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011179 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011180 "myapex",
11181 ],
11182 }
11183
11184 java_library {
11185 name: "my_java_library_bar",
11186 srcs: ["foo/bar/MyClass.java"],
11187 sdk_version: "none",
11188 system_modules: "none",
11189 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011190 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011191 "myapex",
11192 ],
11193 }
11194
11195 aconfig_declarations {
11196 name: "my_aconfig_declarations_foo",
11197 package: "com.example.package",
11198 container: "myapex",
11199 srcs: ["foo.aconfig"],
11200 }
11201
11202 java_aconfig_library {
11203 name: "my_java_aconfig_library_foo",
11204 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011205 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011206 "myapex",
11207 ],
11208 }
11209
11210 java_aconfig_library {
11211 name: "my_java_aconfig_library_bar",
11212 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011213 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011214 "myapex",
11215 ],
11216 }
11217 `)
11218
11219 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11220 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11221 s := " " + combineAconfigRule.Args["cache_files"]
11222 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11223 if len(aconfigArgs) != 1 {
11224 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11225 }
11226 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11227
11228 buildParams := combineAconfigRule.BuildParams
11229 if len(buildParams.Inputs) != 1 {
11230 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11231 }
11232 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11233 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11234}
Spandan Das5be63332023-12-13 00:06:32 +000011235
11236// Test that the boot jars come from the _selected_ apex prebuilt
11237// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11238func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11239 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11240 t.Helper()
11241 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11242 foundLibfooJar := false
11243 base := stem + ".jar"
11244 for _, output := range s.AllOutputs() {
11245 if filepath.Base(output) == base {
11246 foundLibfooJar = true
11247 buildRule := s.Output(output)
11248 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11249 }
11250 }
11251 if !foundLibfooJar {
11252 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11253 }
11254 }
11255
Spandan Das64c9e0c2023-12-20 20:13:34 +000011256 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11257 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11258 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11259 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11260 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11261 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)
11262 }
11263
11264 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11265 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11266 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11267 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11268 }
11269
Spandan Das5be63332023-12-13 00:06:32 +000011270 bp := `
11271 // Source APEX.
11272
11273 java_library {
11274 name: "framework-foo",
11275 srcs: ["foo.java"],
11276 installable: true,
11277 apex_available: [
11278 "com.android.foo",
11279 ],
11280 }
11281
11282 bootclasspath_fragment {
11283 name: "foo-bootclasspath-fragment",
11284 contents: ["framework-foo"],
11285 apex_available: [
11286 "com.android.foo",
11287 ],
11288 hidden_api: {
11289 split_packages: ["*"],
11290 },
11291 }
11292
11293 apex_key {
11294 name: "com.android.foo.key",
11295 public_key: "com.android.foo.avbpubkey",
11296 private_key: "com.android.foo.pem",
11297 }
11298
11299 apex {
11300 name: "com.android.foo",
11301 key: "com.android.foo.key",
11302 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11303 updatable: false,
11304 }
11305
11306 // Prebuilt APEX.
11307
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011308 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011309 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011310 public: {
11311 jars: ["foo.jar"],
11312 },
Spandan Das5be63332023-12-13 00:06:32 +000011313 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011314 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011315 }
11316
11317 prebuilt_bootclasspath_fragment {
11318 name: "foo-bootclasspath-fragment",
11319 contents: ["framework-foo"],
11320 hidden_api: {
11321 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11322 metadata: "my-bootclasspath-fragment/metadata.csv",
11323 index: "my-bootclasspath-fragment/index.csv",
11324 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11325 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11326 },
11327 apex_available: [
11328 "com.android.foo",
11329 ],
11330 }
11331
11332 prebuilt_apex {
11333 name: "com.android.foo",
11334 apex_name: "com.android.foo",
11335 src: "com.android.foo-arm.apex",
11336 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11337 }
11338
11339 // Another Prebuilt ART APEX
11340 prebuilt_apex {
11341 name: "com.android.foo.v2",
11342 apex_name: "com.android.foo", // Used to determine the API domain
11343 src: "com.android.foo-arm.apex",
11344 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11345 }
11346
11347 // APEX contribution modules
11348
11349 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011350 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011351 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011352 contents: ["com.android.foo"],
11353 }
11354
11355 apex_contributions {
11356 name: "foo.prebuilt.contributions",
11357 api_domain: "com.android.foo",
11358 contents: ["prebuilt_com.android.foo"],
11359 }
11360
11361 apex_contributions {
11362 name: "foo.prebuilt.v2.contributions",
11363 api_domain: "com.android.foo",
11364 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011365 }
11366 `
11367
11368 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011369 desc string
11370 selectedApexContributions string
11371 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011372 }{
11373 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011374 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11375 selectedApexContributions: "foo.source.contributions",
11376 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011377 },
11378 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011379 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11380 selectedApexContributions: "foo.prebuilt.contributions",
11381 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011382 },
11383 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011384 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11385 selectedApexContributions: "foo.prebuilt.v2.contributions",
11386 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011387 },
11388 }
11389
11390 fragment := java.ApexVariantReference{
11391 Apex: proptools.StringPtr("com.android.foo"),
11392 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11393 }
11394
11395 for _, tc := range testCases {
11396 preparer := android.GroupFixturePreparers(
11397 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11398 android.FixtureMergeMockFs(map[string][]byte{
11399 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11400 }),
11401 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11402 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011403 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011404 }
11405 }),
11406 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011407 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011408 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011409 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11410 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011411 }
11412}
Spandan Das3576e762024-01-03 18:57:03 +000011413
11414// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11415// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11416func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11417 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11418 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11419 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11420 // Variations are created based on apex_name
11421 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11422 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11423 }
11424 // for a mainline module family, check that only the flagged soong module is visible to make
11425 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11426 variation := func(moduleName string) string {
11427 ret := "android_common_com.android.foo"
11428 if moduleName == "com.google.android.foo" {
11429 ret = "android_common_com.google.android.foo_com.android.foo"
11430 }
11431 return ret
11432 }
11433
11434 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11435 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11436
11437 for _, hiddenModuleName := range hiddenModuleNames {
11438 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11439 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11440
11441 }
11442 }
11443
11444 bp := `
11445 apex_key {
11446 name: "com.android.foo.key",
11447 public_key: "com.android.foo.avbpubkey",
11448 private_key: "com.android.foo.pem",
11449 }
11450
11451 // AOSP source apex
11452 apex {
11453 name: "com.android.foo",
11454 key: "com.android.foo.key",
11455 updatable: false,
11456 }
11457
11458 // Google source apex
11459 override_apex {
11460 name: "com.google.android.foo",
11461 base: "com.android.foo",
11462 key: "com.android.foo.key",
11463 }
11464
11465 // Prebuilt Google APEX.
11466
11467 prebuilt_apex {
11468 name: "com.google.android.foo",
11469 apex_name: "com.android.foo",
11470 src: "com.android.foo-arm.apex",
11471 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11472 }
11473
11474 // Another Prebuilt Google APEX
11475 prebuilt_apex {
11476 name: "com.google.android.foo.v2",
11477 apex_name: "com.android.foo",
11478 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11479 src: "com.android.foo-arm.apex",
11480 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11481 }
11482
11483 // APEX contribution modules
11484
11485 apex_contributions {
11486 name: "foo.source.contributions",
11487 api_domain: "com.android.foo",
11488 contents: ["com.google.android.foo"],
11489 }
11490
11491 apex_contributions {
11492 name: "foo.prebuilt.contributions",
11493 api_domain: "com.android.foo",
11494 contents: ["prebuilt_com.google.android.foo"],
11495 }
11496
11497 apex_contributions {
11498 name: "foo.prebuilt.v2.contributions",
11499 api_domain: "com.android.foo",
11500 contents: ["prebuilt_com.google.android.foo.v2"],
11501 }
11502
11503 // This is an incompatible module because it selects multiple versions of the same mainline module
11504 apex_contributions {
11505 name: "foo.prebuilt.duplicate.contributions",
11506 api_domain: "com.android.foo",
11507 contents: [
11508 "prebuilt_com.google.android.foo",
11509 "prebuilt_com.google.android.foo.v2",
11510 ],
11511 }
11512 `
11513
11514 testCases := []struct {
11515 desc string
11516 selectedApexContributions string
11517 expectedVisibleModuleName string
11518 expectedHiddenModuleNames []string
11519 expectedError string
11520 }{
11521 {
11522 desc: "Source apex is selected, prebuilts should be hidden from make",
11523 selectedApexContributions: "foo.source.contributions",
11524 expectedVisibleModuleName: "com.google.android.foo",
11525 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11526 },
11527 {
11528 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11529 selectedApexContributions: "foo.prebuilt.contributions",
11530 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11531 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11532 },
11533 {
11534 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11535 selectedApexContributions: "foo.prebuilt.v2.contributions",
11536 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11537 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11538 },
11539 {
11540 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11541 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11542 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11543 },
11544 }
11545
11546 for _, tc := range testCases {
11547 preparer := android.GroupFixturePreparers(
11548 android.FixtureMergeMockFs(map[string][]byte{
11549 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11550 }),
11551 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11552 variables.BuildFlags = map[string]string{
11553 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11554 }
11555 }),
11556 )
11557 if tc.expectedError != "" {
11558 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11559 testApex(t, bp, preparer)
11560 return
11561 }
11562 ctx := testApex(t, bp, preparer)
11563
11564 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11565 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11566 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11567 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11568
11569 // Check that
11570 // 1. The contents of the selected apex_contributions are visible to make
11571 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11572 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11573 }
11574}