blob: 6b9944d76da9cf14c3ff55cbe0d0a6584ae4c017 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000221 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
222 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
223 variables.Platform_sdk_codename = proptools.StringPtr("Q")
224 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000225 // "Tiramisu" needs to be in the next line for compatibility with soong code,
226 // not because of these tests specifically (it's not used by the tests)
227 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000228 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000229 }),
230)
231
Paul Duffin52bfaa42021-03-23 23:40:12 +0000232var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
233 "system/sepolicy/apex/myapex-file_contexts": nil,
234})
235
Jooyung Han643adc42020-02-27 13:50:06 +0900236// ensure that 'result' equals 'expected'
237func ensureEquals(t *testing.T, result string, expected string) {
238 t.Helper()
239 if result != expected {
240 t.Errorf("%q != %q", expected, result)
241 }
242}
243
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244// ensure that 'result' contains 'expected'
245func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900246 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247 if !strings.Contains(result, expected) {
248 t.Errorf("%q is not found in %q", expected, result)
249 }
250}
251
Liz Kammer5bd365f2020-05-27 15:15:11 -0700252// ensure that 'result' contains 'expected' exactly one time
253func ensureContainsOnce(t *testing.T, result string, expected string) {
254 t.Helper()
255 count := strings.Count(result, expected)
256 if count != 1 {
257 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
258 }
259}
260
Jiyong Park25fc6a92018-11-18 18:02:45 +0900261// ensures that 'result' does not contain 'notExpected'
262func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264 if strings.Contains(result, notExpected) {
265 t.Errorf("%q is found in %q", notExpected, result)
266 }
267}
268
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269func ensureMatches(t *testing.T, result string, expectedRex string) {
270 ok, err := regexp.MatchString(expectedRex, result)
271 if err != nil {
272 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
273 return
274 }
275 if !ok {
276 t.Errorf("%s does not match regular expession %s", result, expectedRex)
277 }
278}
279
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900281 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 if !android.InList(expected, result) {
283 t.Errorf("%q is not found in %v", expected, result)
284 }
285}
286
287func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if android.InList(notExpected, result) {
290 t.Errorf("%q is found in %v", notExpected, result)
291 }
292}
293
Jooyung Hane1633032019-08-01 17:41:43 +0900294func ensureListEmpty(t *testing.T, result []string) {
295 t.Helper()
296 if len(result) > 0 {
297 t.Errorf("%q is expected to be empty", result)
298 }
299}
300
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000301func ensureListNotEmpty(t *testing.T, result []string) {
302 t.Helper()
303 if len(result) == 0 {
304 t.Errorf("%q is expected to be not empty", result)
305 }
306}
307
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308// Minimal test
309func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800310 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900311 apex_defaults {
312 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900313 manifest: ":myapex.manifest",
314 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900315 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900316 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900317 native_shared_libs: [
318 "mylib",
319 "libfoo.ffi",
320 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900321 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800322 multilib: {
323 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900324 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800325 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900326 },
Jiyong Park77acec62020-06-01 21:39:15 +0900327 java_libs: [
328 "myjar",
329 "myjar_dex",
330 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000331 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 }
333
Jiyong Park30ca9372019-02-07 16:27:23 +0900334 apex {
335 name: "myapex",
336 defaults: ["myapex-defaults"],
337 }
338
Jiyong Park25fc6a92018-11-18 18:02:45 +0900339 apex_key {
340 name: "myapex.key",
341 public_key: "testkey.avbpubkey",
342 private_key: "testkey.pem",
343 }
344
Jiyong Park809bb722019-02-13 21:33:49 +0900345 filegroup {
346 name: "myapex.manifest",
347 srcs: ["apex_manifest.json"],
348 }
349
350 filegroup {
351 name: "myapex.androidmanifest",
352 srcs: ["AndroidManifest.xml"],
353 }
354
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 cc_library {
356 name: "mylib",
357 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900358 shared_libs: [
359 "mylib2",
360 "libbar.ffi",
361 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 system_shared_libs: [],
363 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000364 // TODO: remove //apex_available:platform
365 apex_available: [
366 "//apex_available:platform",
367 "myapex",
368 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900369 }
370
Alex Light3d673592019-01-18 14:37:31 -0800371 cc_binary {
372 name: "foo",
373 srcs: ["mylib.cpp"],
374 compile_multilib: "both",
375 multilib: {
376 lib32: {
377 suffix: "32",
378 },
379 lib64: {
380 suffix: "64",
381 },
382 },
383 symlinks: ["foo_link_"],
384 symlink_preferred_arch: true,
385 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800386 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900387 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700388 }
389
Jiyong Park99644e92020-11-17 22:21:02 +0900390 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000391 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900392 srcs: ["foo.rs"],
393 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400394 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900395 apex_available: ["myapex"],
396 }
397
398 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000399 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900400 srcs: ["foo.rs"],
401 crate_name: "foo",
402 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900403 shared_libs: ["libfoo.shared_from_rust"],
404 }
405
406 cc_library_shared {
407 name: "libfoo.shared_from_rust",
408 srcs: ["mylib.cpp"],
409 system_shared_libs: [],
410 stl: "none",
411 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900412 }
413
414 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000415 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900421 rust_ffi_shared {
422 name: "libfoo.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "foo",
425 apex_available: ["myapex"],
426 }
427
428 rust_ffi_shared {
429 name: "libbar.ffi",
430 srcs: ["foo.rs"],
431 crate_name: "bar",
432 apex_available: ["myapex"],
433 }
434
Paul Duffindddd5462020-04-07 15:25:44 +0100435 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900436 name: "mylib2",
437 srcs: ["mylib.cpp"],
438 system_shared_libs: [],
439 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900440 static_libs: ["libstatic"],
441 // TODO: remove //apex_available:platform
442 apex_available: [
443 "//apex_available:platform",
444 "myapex",
445 ],
446 }
447
Paul Duffindddd5462020-04-07 15:25:44 +0100448 cc_prebuilt_library_shared {
449 name: "mylib2",
450 srcs: ["prebuilt.so"],
451 // TODO: remove //apex_available:platform
452 apex_available: [
453 "//apex_available:platform",
454 "myapex",
455 ],
456 }
457
Jiyong Park9918e1a2020-03-17 19:16:40 +0900458 cc_library_static {
459 name: "libstatic",
460 srcs: ["mylib.cpp"],
461 system_shared_libs: [],
462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000463 // TODO: remove //apex_available:platform
464 apex_available: [
465 "//apex_available:platform",
466 "myapex",
467 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900468 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469
470 java_library {
471 name: "myjar",
472 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900473 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900474 sdk_version: "none",
475 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900477 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000478 // TODO: remove //apex_available:platform
479 apex_available: [
480 "//apex_available:platform",
481 "myapex",
482 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 }
484
Jiyong Park77acec62020-06-01 21:39:15 +0900485 dex_import {
486 name: "myjar_dex",
487 jars: ["prebuilt.jar"],
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
492 }
493
Jiyong Park7f7766d2019-07-25 22:02:35 +0900494 java_library {
495 name: "myotherjar",
496 srcs: ["foo/bar/MyClass.java"],
497 sdk_version: "none",
498 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900499 // TODO: remove //apex_available:platform
500 apex_available: [
501 "//apex_available:platform",
502 "myapex",
503 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900505
506 java_library {
507 name: "mysharedjar",
508 srcs: ["foo/bar/MyClass.java"],
509 sdk_version: "none",
510 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900511 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900512 `)
513
Jooyung Hana0503a52023-08-23 13:12:50 +0900514 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900515
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900516 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900517 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700518 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900519 var builder strings.Builder
520 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
521
522 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000523 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900524 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
525
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526 optFlags := apexRule.Args["opt_flags"]
527 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700528 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900529 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900530
Jiyong Park25fc6a92018-11-18 18:02:45 +0900531 copyCmds := apexRule.Args["copy_commands"]
532
533 // Ensure that main rule creates an output
534 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
535
536 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700537 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
538 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900540 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900541 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900542
543 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900550
551 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800552 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
553 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900554 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900555 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
558 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900559 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900560 // .. but not for java libs
561 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900562 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800563
Colin Cross7113d202019-11-20 16:39:12 -0800564 // Ensure that the platform variant ends with _shared or _common
565 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
566 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
568 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
570
571 // Ensure that dynamic dependency to java libs are not included
572 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800573
574 // Ensure that all symlinks are present.
575 found_foo_link_64 := false
576 found_foo := false
577 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900578 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800579 if strings.HasSuffix(cmd, "bin/foo") {
580 found_foo = true
581 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
582 found_foo_link_64 = true
583 }
584 }
585 }
586 good := found_foo && found_foo_link_64
587 if !good {
588 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
589 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900590
Colin Crossf61d03d2023-11-02 16:56:39 -0700591 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
592 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100593 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100594 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
595 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
596 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597
Colin Crossf61d03d2023-11-02 16:56:39 -0700598 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
599 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
602 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
603 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800604}
605
Jooyung Hanf21c7972019-12-16 22:32:06 +0900606func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800607 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900608 apex_defaults {
609 name: "myapex-defaults",
610 key: "myapex.key",
611 prebuilts: ["myetc"],
612 native_shared_libs: ["mylib"],
613 java_libs: ["myjar"],
614 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900615 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800616 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000617 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 }
619
620 prebuilt_etc {
621 name: "myetc",
622 src: "myprebuilt",
623 }
624
625 apex {
626 name: "myapex",
627 defaults: ["myapex-defaults"],
628 }
629
630 apex_key {
631 name: "myapex.key",
632 public_key: "testkey.avbpubkey",
633 private_key: "testkey.pem",
634 }
635
636 cc_library {
637 name: "mylib",
638 system_shared_libs: [],
639 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000640 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900641 }
642
643 java_library {
644 name: "myjar",
645 srcs: ["foo/bar/MyClass.java"],
646 sdk_version: "none",
647 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000648 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800689 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900690 apex {
691 name: "myapex",
692 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000693 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 }
695
696 apex_key {
697 name: "myapex.key",
698 public_key: "testkey.avbpubkey",
699 private_key: "testkey.pem",
700 }
701 `)
702
Jooyung Hana0503a52023-08-23 13:12:50 +0900703 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900704 args := module.Rule("apexRule").Args
705 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
706 t.Error("manifest should be apex_manifest.pb, but " + manifest)
707 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900708}
709
Liz Kammer4854a7d2021-05-27 14:28:27 -0400710func TestApexManifestMinSdkVersion(t *testing.T) {
711 ctx := testApex(t, `
712 apex_defaults {
713 name: "my_defaults",
714 key: "myapex.key",
715 product_specific: true,
716 file_contexts: ":my-file-contexts",
717 updatable: false,
718 }
719 apex {
720 name: "myapex_30",
721 min_sdk_version: "30",
722 defaults: ["my_defaults"],
723 }
724
725 apex {
726 name: "myapex_current",
727 min_sdk_version: "current",
728 defaults: ["my_defaults"],
729 }
730
731 apex {
732 name: "myapex_none",
733 defaults: ["my_defaults"],
734 }
735
736 apex_key {
737 name: "myapex.key",
738 public_key: "testkey.avbpubkey",
739 private_key: "testkey.pem",
740 }
741
742 filegroup {
743 name: "my-file-contexts",
744 srcs: ["product_specific_file_contexts"],
745 }
746 `, withFiles(map[string][]byte{
747 "product_specific_file_contexts": nil,
748 }), android.FixtureModifyProductVariables(
749 func(variables android.FixtureProductVariables) {
750 variables.Unbundled_build = proptools.BoolPtr(true)
751 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
752 }), android.FixtureMergeEnv(map[string]string{
753 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
754 }))
755
756 testCases := []struct {
757 module string
758 minSdkVersion string
759 }{
760 {
761 module: "myapex_30",
762 minSdkVersion: "30",
763 },
764 {
765 module: "myapex_current",
766 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
767 },
768 {
769 module: "myapex_none",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 }
773 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900774 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400775 args := module.Rule("apexRule").Args
776 optFlags := args["opt_flags"]
777 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
778 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
779 }
780 }
781}
782
Jihoon Kang842b9992024-02-08 01:41:51 +0000783func TestApexWithDessertSha(t *testing.T) {
784 ctx := testApex(t, `
785 apex_defaults {
786 name: "my_defaults",
787 key: "myapex.key",
788 product_specific: true,
789 file_contexts: ":my-file-contexts",
790 updatable: false,
791 }
792 apex {
793 name: "myapex_30",
794 min_sdk_version: "30",
795 defaults: ["my_defaults"],
796 }
797
798 apex {
799 name: "myapex_current",
800 min_sdk_version: "current",
801 defaults: ["my_defaults"],
802 }
803
804 apex {
805 name: "myapex_none",
806 defaults: ["my_defaults"],
807 }
808
809 apex_key {
810 name: "myapex.key",
811 public_key: "testkey.avbpubkey",
812 private_key: "testkey.pem",
813 }
814
815 filegroup {
816 name: "my-file-contexts",
817 srcs: ["product_specific_file_contexts"],
818 }
819 `, withFiles(map[string][]byte{
820 "product_specific_file_contexts": nil,
821 }), android.FixtureModifyProductVariables(
822 func(variables android.FixtureProductVariables) {
823 variables.Unbundled_build = proptools.BoolPtr(true)
824 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
825 }), android.FixtureMergeEnv(map[string]string{
826 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
827 }))
828
829 testCases := []struct {
830 module string
831 minSdkVersion string
832 }{
833 {
834 module: "myapex_30",
835 minSdkVersion: "30",
836 },
837 {
838 module: "myapex_current",
839 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
840 },
841 {
842 module: "myapex_none",
843 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
844 },
845 }
846 for _, tc := range testCases {
847 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
848 args := module.Rule("apexRule").Args
849 optFlags := args["opt_flags"]
850 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
851 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
852 }
853 }
854}
855
Jooyung Hanaf730952023-02-28 14:13:38 +0900856func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900857 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900858 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900859 if vendor {
860 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900861 }
862 ctx := testApex(t, `
863 apex {
864 name: "myapex",
865 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900866 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900867 `+prop+`
868 }
869
870 apex_key {
871 name: "myapex.key",
872 public_key: "testkey.avbpubkey",
873 private_key: "testkey.pem",
874 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900875 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900876
Jooyung Hana0503a52023-08-23 13:12:50 +0900877 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900878 if vendor {
879 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
880 rule.RuleParams.Command,
881 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900882 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900883 android.AssertStringDoesContain(t, "should force-label as system_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 }
887 }
888}
889
Jiyong Park25fc6a92018-11-18 18:02:45 +0900890func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800891 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900892 apex {
893 name: "myapex",
894 key: "myapex.key",
895 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900896 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000897 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 }
899
900 apex_key {
901 name: "myapex.key",
902 public_key: "testkey.avbpubkey",
903 private_key: "testkey.pem",
904 }
905
906 cc_library {
907 name: "mylib",
908 srcs: ["mylib.cpp"],
909 shared_libs: ["mylib2", "mylib3"],
910 system_shared_libs: [],
911 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000912 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913 }
914
915 cc_library {
916 name: "mylib2",
917 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900918 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 system_shared_libs: [],
920 stl: "none",
921 stubs: {
922 versions: ["1", "2", "3"],
923 },
924 }
925
926 cc_library {
927 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900928 srcs: ["mylib.cpp"],
929 shared_libs: ["mylib4"],
930 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931 stl: "none",
932 stubs: {
933 versions: ["10", "11", "12"],
934 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000935 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900937
938 cc_library {
939 name: "mylib4",
940 srcs: ["mylib.cpp"],
941 system_shared_libs: [],
942 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000943 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900944 }
Jiyong Park105dc322021-06-11 17:22:09 +0900945
946 rust_binary {
947 name: "foo.rust",
948 srcs: ["foo.rs"],
949 shared_libs: ["libfoo.shared_from_rust"],
950 prefer_rlib: true,
951 apex_available: ["myapex"],
952 }
953
954 cc_library_shared {
955 name: "libfoo.shared_from_rust",
956 srcs: ["mylib.cpp"],
957 system_shared_libs: [],
958 stl: "none",
959 stubs: {
960 versions: ["10", "11", "12"],
961 },
962 }
963
Jiyong Park25fc6a92018-11-18 18:02:45 +0900964 `)
965
Jooyung Hana0503a52023-08-23 13:12:50 +0900966 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967 copyCmds := apexRule.Args["copy_commands"]
968
969 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800970 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900971
972 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800973 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900974
975 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800976 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900977
Colin Crossaede88c2020-08-11 12:17:01 -0700978 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900979
980 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900981 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900982 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900983 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900984
985 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700986 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700988 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900989
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700990 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
991 // is replaced by sharing of "cFlags" in cc/builder.go.
992 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
993 // module variable representing "cflags". So it was not detected by ensureNotContains.
994 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
995 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
996 // including the original cflags's "-include mylib.h".
997 //
Jiyong Park64379952018-12-13 18:37:29 +0900998 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700999 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1000 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001001
Jiyong Park85cc35a2022-07-17 11:30:47 +09001002 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1003 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1004 // Ensure that genstub for apex-provided lib is invoked with --apex
1005 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001006
Jooyung Hana0503a52023-08-23 13:12:50 +09001007 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001008 "lib64/mylib.so",
1009 "lib64/mylib3.so",
1010 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001011 "bin/foo.rust",
1012 "lib64/libc++.so", // by the implicit dependency from foo.rust
1013 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001014 })
Jiyong Park105dc322021-06-11 17:22:09 +09001015
1016 // Ensure that stub dependency from a rust module is not included
1017 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1018 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001019 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001020 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1021 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001022
Jooyung Hana0503a52023-08-23 13:12:50 +09001023 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001024 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001025}
1026
Jooyung Han20348752023-12-05 15:23:56 +09001027func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1028 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1029 apex {
1030 name: "myapex",
1031 key: "myapex.key",
1032 vendor: true,
1033 updatable: false,
1034 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1035 }
1036
1037 apex_key {
1038 name: "myapex.key",
1039 public_key: "testkey.avbpubkey",
1040 private_key: "testkey.pem",
1041 }
1042
1043 cc_library {
1044 name: "libbar",
1045 srcs: ["mylib.cpp"],
1046 llndk: {
1047 symbol_file: "libbar.map.txt",
1048 }
1049 }
1050 `)
1051}
1052
Jiyong Park1bc84122021-06-22 20:23:05 +09001053func TestApexCanUsePrivateApis(t *testing.T) {
1054 ctx := testApex(t, `
1055 apex {
1056 name: "myapex",
1057 key: "myapex.key",
1058 native_shared_libs: ["mylib"],
1059 binaries: ["foo.rust"],
1060 updatable: false,
1061 platform_apis: true,
1062 }
1063
1064 apex_key {
1065 name: "myapex.key",
1066 public_key: "testkey.avbpubkey",
1067 private_key: "testkey.pem",
1068 }
1069
1070 cc_library {
1071 name: "mylib",
1072 srcs: ["mylib.cpp"],
1073 shared_libs: ["mylib2"],
1074 system_shared_libs: [],
1075 stl: "none",
1076 apex_available: [ "myapex" ],
1077 }
1078
1079 cc_library {
1080 name: "mylib2",
1081 srcs: ["mylib.cpp"],
1082 cflags: ["-include mylib.h"],
1083 system_shared_libs: [],
1084 stl: "none",
1085 stubs: {
1086 versions: ["1", "2", "3"],
1087 },
1088 }
1089
1090 rust_binary {
1091 name: "foo.rust",
1092 srcs: ["foo.rs"],
1093 shared_libs: ["libfoo.shared_from_rust"],
1094 prefer_rlib: true,
1095 apex_available: ["myapex"],
1096 }
1097
1098 cc_library_shared {
1099 name: "libfoo.shared_from_rust",
1100 srcs: ["mylib.cpp"],
1101 system_shared_libs: [],
1102 stl: "none",
1103 stubs: {
1104 versions: ["10", "11", "12"],
1105 },
1106 }
1107 `)
1108
Jooyung Hana0503a52023-08-23 13:12:50 +09001109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that indirect stubs dep is not included
1113 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1114 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1115
1116 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1117 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001118 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001119 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1120 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001121 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001122 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1123 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1124}
1125
Colin Cross7812fd32020-09-25 12:35:10 -07001126func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1127 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001128 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001129 apex {
1130 name: "myapex",
1131 key: "myapex.key",
1132 native_shared_libs: ["mylib", "mylib3"],
1133 min_sdk_version: "29",
1134 }
1135
1136 apex_key {
1137 name: "myapex.key",
1138 public_key: "testkey.avbpubkey",
1139 private_key: "testkey.pem",
1140 }
1141
1142 cc_library {
1143 name: "mylib",
1144 srcs: ["mylib.cpp"],
1145 shared_libs: ["mylib2", "mylib3"],
1146 system_shared_libs: [],
1147 stl: "none",
1148 apex_available: [ "myapex" ],
1149 min_sdk_version: "28",
1150 }
1151
1152 cc_library {
1153 name: "mylib2",
1154 srcs: ["mylib.cpp"],
1155 cflags: ["-include mylib.h"],
1156 system_shared_libs: [],
1157 stl: "none",
1158 stubs: {
1159 versions: ["28", "29", "30", "current"],
1160 },
1161 min_sdk_version: "28",
1162 }
1163
1164 cc_library {
1165 name: "mylib3",
1166 srcs: ["mylib.cpp"],
1167 shared_libs: ["mylib4"],
1168 system_shared_libs: [],
1169 stl: "none",
1170 stubs: {
1171 versions: ["28", "29", "30", "current"],
1172 },
1173 apex_available: [ "myapex" ],
1174 min_sdk_version: "28",
1175 }
1176
1177 cc_library {
1178 name: "mylib4",
1179 srcs: ["mylib.cpp"],
1180 system_shared_libs: [],
1181 stl: "none",
1182 apex_available: [ "myapex" ],
1183 min_sdk_version: "28",
1184 }
1185 `)
1186
Jooyung Hana0503a52023-08-23 13:12:50 +09001187 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001188 copyCmds := apexRule.Args["copy_commands"]
1189
1190 // Ensure that direct non-stubs dep is always included
1191 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1192
1193 // Ensure that indirect stubs dep is not included
1194 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1195
1196 // Ensure that direct stubs dep is included
1197 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1198
1199 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1200
Jiyong Park55549df2021-02-26 23:57:23 +09001201 // Ensure that mylib is linking with the latest version of stub for mylib2
1202 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001203 // ... and not linking to the non-stub (impl) variant of mylib2
1204 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1205
1206 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1207 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1208 // .. and not linking to the stubs variant of mylib3
1209 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1210
1211 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001212 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001213 ensureNotContains(t, mylib2Cflags, "-include ")
1214
Jiyong Park85cc35a2022-07-17 11:30:47 +09001215 // Ensure that genstub is invoked with --systemapi
1216 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001217
Jooyung Hana0503a52023-08-23 13:12:50 +09001218 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001219 "lib64/mylib.so",
1220 "lib64/mylib3.so",
1221 "lib64/mylib4.so",
1222 })
1223}
1224
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001225func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1226 t.Parallel()
1227 // myapex (Z)
1228 // mylib -----------------.
1229 // |
1230 // otherapex (29) |
1231 // libstub's versions: 29 Z current
1232 // |
1233 // <platform> |
1234 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001235 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001236 apex {
1237 name: "myapex",
1238 key: "myapex.key",
1239 native_shared_libs: ["mylib"],
1240 min_sdk_version: "Z", // non-final
1241 }
1242
1243 cc_library {
1244 name: "mylib",
1245 srcs: ["mylib.cpp"],
1246 shared_libs: ["libstub"],
1247 apex_available: ["myapex"],
1248 min_sdk_version: "Z",
1249 }
1250
1251 apex_key {
1252 name: "myapex.key",
1253 public_key: "testkey.avbpubkey",
1254 private_key: "testkey.pem",
1255 }
1256
1257 apex {
1258 name: "otherapex",
1259 key: "myapex.key",
1260 native_shared_libs: ["libstub"],
1261 min_sdk_version: "29",
1262 }
1263
1264 cc_library {
1265 name: "libstub",
1266 srcs: ["mylib.cpp"],
1267 stubs: {
1268 versions: ["29", "Z", "current"],
1269 },
1270 apex_available: ["otherapex"],
1271 min_sdk_version: "29",
1272 }
1273
1274 // platform module depending on libstub from otherapex should use the latest stub("current")
1275 cc_library {
1276 name: "libplatform",
1277 srcs: ["mylib.cpp"],
1278 shared_libs: ["libstub"],
1279 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001280 `,
1281 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1282 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1283 variables.Platform_sdk_final = proptools.BoolPtr(false)
1284 variables.Platform_version_active_codenames = []string{"Z"}
1285 }),
1286 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001287
Jiyong Park55549df2021-02-26 23:57:23 +09001288 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001289 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001290 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001291 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001292 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001293
1294 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1295 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1296 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1297 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1298 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1299}
1300
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001301func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001302 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001303 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001304 name: "myapex2",
1305 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001306 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001307 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001308 }
1309
1310 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001311 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 public_key: "testkey.avbpubkey",
1313 private_key: "testkey.pem",
1314 }
1315
1316 cc_library {
1317 name: "mylib",
1318 srcs: ["mylib.cpp"],
1319 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001320 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001321 system_shared_libs: [],
1322 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001323 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001324 }
1325
1326 cc_library {
1327 name: "libfoo",
1328 srcs: ["mylib.cpp"],
1329 shared_libs: ["libbar"],
1330 system_shared_libs: [],
1331 stl: "none",
1332 stubs: {
1333 versions: ["10", "20", "30"],
1334 },
1335 }
1336
1337 cc_library {
1338 name: "libbar",
1339 srcs: ["mylib.cpp"],
1340 system_shared_libs: [],
1341 stl: "none",
1342 }
1343
Jiyong Park678c8812020-02-07 17:25:49 +09001344 cc_library_static {
1345 name: "libbaz",
1346 srcs: ["mylib.cpp"],
1347 system_shared_libs: [],
1348 stl: "none",
1349 apex_available: [ "myapex2" ],
1350 }
1351
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001352 `)
1353
Jooyung Hana0503a52023-08-23 13:12:50 +09001354 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001355 copyCmds := apexRule.Args["copy_commands"]
1356
1357 // Ensure that direct non-stubs dep is always included
1358 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1359
1360 // Ensure that indirect stubs dep is not included
1361 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1362
1363 // Ensure that dependency of stubs is not included
1364 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1365
Colin Crossaede88c2020-08-11 12:17:01 -07001366 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001367
1368 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001369 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001370 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001371 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001372
Jiyong Park3ff16992019-12-27 14:11:47 +09001373 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001374
1375 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1376 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001377
Colin Crossf61d03d2023-11-02 16:56:39 -07001378 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1379 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001380 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001381
Colin Crossf61d03d2023-11-02 16:56:39 -07001382 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1383 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001384 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001385}
1386
Jooyung Hand3639552019-08-09 12:57:43 +09001387func TestApexWithRuntimeLibsDependency(t *testing.T) {
1388 /*
1389 myapex
1390 |
1391 v (runtime_libs)
1392 mylib ------+------> libfoo [provides stub]
1393 |
1394 `------> libbar
1395 */
Colin Cross1c460562021-02-16 17:55:47 -08001396 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001397 apex {
1398 name: "myapex",
1399 key: "myapex.key",
1400 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001401 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001402 }
1403
1404 apex_key {
1405 name: "myapex.key",
1406 public_key: "testkey.avbpubkey",
1407 private_key: "testkey.pem",
1408 }
1409
1410 cc_library {
1411 name: "mylib",
1412 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001413 static_libs: ["libstatic"],
1414 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001415 runtime_libs: ["libfoo", "libbar"],
1416 system_shared_libs: [],
1417 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001418 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001419 }
1420
1421 cc_library {
1422 name: "libfoo",
1423 srcs: ["mylib.cpp"],
1424 system_shared_libs: [],
1425 stl: "none",
1426 stubs: {
1427 versions: ["10", "20", "30"],
1428 },
1429 }
1430
1431 cc_library {
1432 name: "libbar",
1433 srcs: ["mylib.cpp"],
1434 system_shared_libs: [],
1435 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001436 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001437 }
1438
Liz Kammer5f108fa2023-05-11 14:33:17 -04001439 cc_library {
1440 name: "libstatic",
1441 srcs: ["mylib.cpp"],
1442 system_shared_libs: [],
1443 stl: "none",
1444 apex_available: [ "myapex" ],
1445 runtime_libs: ["libstatic_to_runtime"],
1446 }
1447
1448 cc_library {
1449 name: "libshared",
1450 srcs: ["mylib.cpp"],
1451 system_shared_libs: [],
1452 stl: "none",
1453 apex_available: [ "myapex" ],
1454 runtime_libs: ["libshared_to_runtime"],
1455 }
1456
1457 cc_library {
1458 name: "libstatic_to_runtime",
1459 srcs: ["mylib.cpp"],
1460 system_shared_libs: [],
1461 stl: "none",
1462 apex_available: [ "myapex" ],
1463 }
1464
1465 cc_library {
1466 name: "libshared_to_runtime",
1467 srcs: ["mylib.cpp"],
1468 system_shared_libs: [],
1469 stl: "none",
1470 apex_available: [ "myapex" ],
1471 }
Jooyung Hand3639552019-08-09 12:57:43 +09001472 `)
1473
Jooyung Hana0503a52023-08-23 13:12:50 +09001474 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001475 copyCmds := apexRule.Args["copy_commands"]
1476
1477 // Ensure that direct non-stubs dep is always included
1478 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1479
1480 // Ensure that indirect stubs dep is not included
1481 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1482
1483 // Ensure that runtime_libs dep in included
1484 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001485 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1486 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1487
1488 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001489
Jooyung Hana0503a52023-08-23 13:12:50 +09001490 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001491 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1492 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001493}
1494
Paul Duffina02cae32021-03-09 01:44:06 +00001495var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1496 cc.PrepareForTestWithCcBuildComponents,
1497 PrepareForTestWithApexBuildComponents,
1498 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001499 apex {
1500 name: "com.android.runtime",
1501 key: "com.android.runtime.key",
1502 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001503 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001504 }
1505
1506 apex_key {
1507 name: "com.android.runtime.key",
1508 public_key: "testkey.avbpubkey",
1509 private_key: "testkey.pem",
1510 }
Paul Duffina02cae32021-03-09 01:44:06 +00001511 `),
1512 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1513)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514
Paul Duffina02cae32021-03-09 01:44:06 +00001515func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001516 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001517 cc_library {
1518 name: "libc",
1519 no_libcrt: true,
1520 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001521 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522 stl: "none",
1523 system_shared_libs: [],
1524 stubs: { versions: ["1"] },
1525 apex_available: ["com.android.runtime"],
1526
1527 sanitize: {
1528 hwaddress: true,
1529 }
1530 }
1531
1532 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001533 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001534 no_libcrt: true,
1535 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001536 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001537 stl: "none",
1538 system_shared_libs: [],
1539 srcs: [""],
1540 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001541 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001542
1543 sanitize: {
1544 never: true,
1545 },
Spandan Das4de7b492023-05-05 21:13:01 +00001546 apex_available: [
1547 "//apex_available:anyapex",
1548 "//apex_available:platform",
1549 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001550 } `)
1551 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001552
Jooyung Hana0503a52023-08-23 13:12:50 +09001553 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001554 "lib64/bionic/libc.so",
1555 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1556 })
1557
Colin Cross4c4c1be2022-02-10 11:41:18 -08001558 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
1560 installed := hwasan.Description("install libclang_rt.hwasan")
1561 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1562
1563 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1564 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1565 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1566}
1567
1568func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001569 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001570 prepareForTestOfRuntimeApexWithHwasan,
1571 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1572 variables.SanitizeDevice = []string{"hwaddress"}
1573 }),
1574 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001575 cc_library {
1576 name: "libc",
1577 no_libcrt: true,
1578 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001579 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001580 stl: "none",
1581 system_shared_libs: [],
1582 stubs: { versions: ["1"] },
1583 apex_available: ["com.android.runtime"],
1584 }
1585
1586 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001587 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588 no_libcrt: true,
1589 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001590 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001591 stl: "none",
1592 system_shared_libs: [],
1593 srcs: [""],
1594 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001595 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001596
1597 sanitize: {
1598 never: true,
1599 },
Spandan Das4de7b492023-05-05 21:13:01 +00001600 apex_available: [
1601 "//apex_available:anyapex",
1602 "//apex_available:platform",
1603 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001604 }
Paul Duffina02cae32021-03-09 01:44:06 +00001605 `)
1606 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001607
Jooyung Hana0503a52023-08-23 13:12:50 +09001608 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001609 "lib64/bionic/libc.so",
1610 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1611 })
1612
Colin Cross4c4c1be2022-02-10 11:41:18 -08001613 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001614
1615 installed := hwasan.Description("install libclang_rt.hwasan")
1616 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1617
1618 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1619 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1620 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1621}
1622
Jooyung Han61b66e92020-03-21 14:21:46 +00001623func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1624 testcases := []struct {
1625 name string
1626 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001627 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001628 shouldLink string
1629 shouldNotLink []string
1630 }{
1631 {
Jiyong Park55549df2021-02-26 23:57:23 +09001632 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001633 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001634 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001635 shouldLink: "current",
1636 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001637 },
1638 {
Jiyong Park55549df2021-02-26 23:57:23 +09001639 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001640 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001641 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001642 shouldLink: "current",
1643 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001644 },
1645 }
1646 for _, tc := range testcases {
1647 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001648 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001649 apex {
1650 name: "myapex",
1651 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001652 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001653 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001654 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001655 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001656
Jooyung Han61b66e92020-03-21 14:21:46 +00001657 apex_key {
1658 name: "myapex.key",
1659 public_key: "testkey.avbpubkey",
1660 private_key: "testkey.pem",
1661 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001662
Jooyung Han61b66e92020-03-21 14:21:46 +00001663 cc_library {
1664 name: "mylib",
1665 srcs: ["mylib.cpp"],
1666 vendor_available: true,
1667 shared_libs: ["libbar"],
1668 system_shared_libs: [],
1669 stl: "none",
1670 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001671 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001672 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001673
Jooyung Han61b66e92020-03-21 14:21:46 +00001674 cc_library {
1675 name: "libbar",
1676 srcs: ["mylib.cpp"],
1677 system_shared_libs: [],
1678 stl: "none",
1679 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001680 llndk: {
1681 symbol_file: "libbar.map.txt",
1682 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001683 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001684 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001685 withUnbundledBuild,
1686 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001687
Jooyung Han61b66e92020-03-21 14:21:46 +00001688 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001689 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001690 "lib64/mylib.so",
1691 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001692
Jooyung Han61b66e92020-03-21 14:21:46 +00001693 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001694 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001695 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1696 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001697
Steven Moreland2c4000c2021-04-27 02:08:49 +00001698 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1699 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001700 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001701 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001702 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001703
Steven Moreland2c4000c2021-04-27 02:08:49 +00001704 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001705 ver := tc.shouldLink
1706 if tc.shouldLink == "current" {
1707 ver = strconv.Itoa(android.FutureApiLevelInt)
1708 }
1709 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 })
1711 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001712}
1713
Jiyong Park25fc6a92018-11-18 18:02:45 +09001714func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001715 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001716 apex {
1717 name: "myapex",
1718 key: "myapex.key",
1719 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001720 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001721 }
1722
1723 apex_key {
1724 name: "myapex.key",
1725 public_key: "testkey.avbpubkey",
1726 private_key: "testkey.pem",
1727 }
1728
1729 cc_library {
1730 name: "mylib",
1731 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001732 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001733 shared_libs: ["libdl#27"],
1734 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001735 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001736 }
1737
1738 cc_library_shared {
1739 name: "mylib_shared",
1740 srcs: ["mylib.cpp"],
1741 shared_libs: ["libdl#27"],
1742 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001743 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 }
1745
1746 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001747 name: "libBootstrap",
1748 srcs: ["mylib.cpp"],
1749 stl: "none",
1750 bootstrap: true,
1751 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001752 `)
1753
Jooyung Hana0503a52023-08-23 13:12:50 +09001754 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001755 copyCmds := apexRule.Args["copy_commands"]
1756
1757 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001758 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001759 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1760 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001761
1762 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001763 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001764
Colin Crossaede88c2020-08-11 12:17:01 -07001765 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1766 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1767 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001768
1769 // For dependency to libc
1770 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001771 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001772 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001773 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001774 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001775 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1776 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001777
1778 // For dependency to libm
1779 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001780 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001781 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001782 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001783 // ... and is not compiling with the stub
1784 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1785 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1786
1787 // For dependency to libdl
1788 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001789 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001790 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001791 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1792 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001793 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001794 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001795 // ... Cflags from stub is correctly exported to mylib
1796 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1797 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001798
1799 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001800 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1801 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1802 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1803 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001805
Jooyung Han749dc692020-04-15 11:03:39 +09001806func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001807 // there are three links between liba --> libz.
1808 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001809 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001810 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001811 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001812 apex {
1813 name: "myapex",
1814 key: "myapex.key",
1815 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001816 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001817 }
1818
1819 apex {
1820 name: "otherapex",
1821 key: "myapex.key",
1822 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001823 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001824 }
1825
1826 apex_key {
1827 name: "myapex.key",
1828 public_key: "testkey.avbpubkey",
1829 private_key: "testkey.pem",
1830 }
1831
1832 cc_library {
1833 name: "libx",
1834 shared_libs: ["liba"],
1835 system_shared_libs: [],
1836 stl: "none",
1837 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001838 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001839 }
1840
1841 cc_library {
1842 name: "liby",
1843 shared_libs: ["liba"],
1844 system_shared_libs: [],
1845 stl: "none",
1846 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001847 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001848 }
1849
1850 cc_library {
1851 name: "liba",
1852 shared_libs: ["libz"],
1853 system_shared_libs: [],
1854 stl: "none",
1855 apex_available: [
1856 "//apex_available:anyapex",
1857 "//apex_available:platform",
1858 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001859 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001860 }
1861
1862 cc_library {
1863 name: "libz",
1864 system_shared_libs: [],
1865 stl: "none",
1866 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001867 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001868 },
1869 }
Jooyung Han749dc692020-04-15 11:03:39 +09001870 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001871
1872 expectLink := func(from, from_variant, to, to_variant string) {
1873 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1874 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1875 }
1876 expectNoLink := func(from, from_variant, to, to_variant string) {
1877 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1878 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1879 }
1880 // platform liba is linked to non-stub version
1881 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001882 // liba in myapex is linked to current
1883 expectLink("liba", "shared_apex29", "libz", "shared_current")
1884 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001885 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001886 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 // liba in otherapex is linked to current
1888 expectLink("liba", "shared_apex30", "libz", "shared_current")
1889 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1891 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001892}
1893
Jooyung Hanaed150d2020-04-02 01:41:41 +09001894func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001895 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001896 apex {
1897 name: "myapex",
1898 key: "myapex.key",
1899 native_shared_libs: ["libx"],
1900 min_sdk_version: "R",
1901 }
1902
1903 apex_key {
1904 name: "myapex.key",
1905 public_key: "testkey.avbpubkey",
1906 private_key: "testkey.pem",
1907 }
1908
1909 cc_library {
1910 name: "libx",
1911 shared_libs: ["libz"],
1912 system_shared_libs: [],
1913 stl: "none",
1914 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001915 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001916 }
1917
1918 cc_library {
1919 name: "libz",
1920 system_shared_libs: [],
1921 stl: "none",
1922 stubs: {
1923 versions: ["29", "R"],
1924 },
1925 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001926 `,
1927 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1928 variables.Platform_version_active_codenames = []string{"R"}
1929 }),
1930 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001931
1932 expectLink := func(from, from_variant, to, to_variant string) {
1933 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1934 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1935 }
1936 expectNoLink := func(from, from_variant, to, to_variant string) {
1937 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1938 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1939 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001940 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1941 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001942 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1943 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001944}
1945
Jooyung Han4c4da062021-06-23 10:23:16 +09001946func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1947 testApex(t, `
1948 apex {
1949 name: "myapex",
1950 key: "myapex.key",
1951 java_libs: ["libx"],
1952 min_sdk_version: "S",
1953 }
1954
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960
1961 java_library {
1962 name: "libx",
1963 srcs: ["a.java"],
1964 apex_available: [ "myapex" ],
1965 sdk_version: "current",
1966 min_sdk_version: "S", // should be okay
1967 }
1968 `,
1969 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1970 variables.Platform_version_active_codenames = []string{"S"}
1971 variables.Platform_sdk_codename = proptools.StringPtr("S")
1972 }),
1973 )
1974}
1975
Jooyung Han749dc692020-04-15 11:03:39 +09001976func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001977 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001978 apex {
1979 name: "myapex",
1980 key: "myapex.key",
1981 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001982 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001983 }
1984
1985 apex_key {
1986 name: "myapex.key",
1987 public_key: "testkey.avbpubkey",
1988 private_key: "testkey.pem",
1989 }
1990
1991 cc_library {
1992 name: "libx",
1993 shared_libs: ["libz"],
1994 system_shared_libs: [],
1995 stl: "none",
1996 apex_available: [ "myapex" ],
1997 }
1998
1999 cc_library {
2000 name: "libz",
2001 system_shared_libs: [],
2002 stl: "none",
2003 stubs: {
2004 versions: ["1", "2"],
2005 },
2006 }
2007 `)
2008
2009 expectLink := func(from, from_variant, to, to_variant string) {
2010 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2011 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2012 }
2013 expectNoLink := func(from, from_variant, to, to_variant string) {
2014 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2015 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2016 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002017 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002018 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002019 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002020 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002021}
2022
Jooyung Handfc864c2023-03-20 18:19:07 +09002023func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002024 ctx := testApex(t, `
2025 apex {
2026 name: "myapex",
2027 key: "myapex.key",
2028 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002029 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002030 vendor: true,
2031 min_sdk_version: "29",
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library {
2041 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002042 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002043 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002044 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002045 shared_libs: ["libbar"],
2046 }
2047
2048 cc_library {
2049 name: "libbar",
2050 stubs: { versions: ["29", "30"] },
2051 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002052 }
2053 `)
2054
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002055 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002056
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002057 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002058
2059 // Ensure that mylib links with "current" LLNDK
2060 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002061 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002062
2063 // Ensure that mylib is targeting 29
2064 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2065 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2066
2067 // Ensure that the correct variant of crtbegin_so is used.
2068 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2069 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002070
2071 // Ensure that the crtbegin_so used by the APEX is targeting 29
2072 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2073 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2074}
2075
Jooyung Han4495f842023-04-25 16:39:59 +09002076func TestTrackAllowedDeps(t *testing.T) {
2077 ctx := testApex(t, `
2078 apex {
2079 name: "myapex",
2080 key: "myapex.key",
2081 updatable: true,
2082 native_shared_libs: [
2083 "mylib",
2084 "yourlib",
2085 ],
2086 min_sdk_version: "29",
2087 }
2088
2089 apex {
2090 name: "myapex2",
2091 key: "myapex.key",
2092 updatable: false,
2093 native_shared_libs: ["yourlib"],
2094 }
2095
2096 apex_key {
2097 name: "myapex.key",
2098 public_key: "testkey.avbpubkey",
2099 private_key: "testkey.pem",
2100 }
2101
2102 cc_library {
2103 name: "mylib",
2104 srcs: ["mylib.cpp"],
2105 shared_libs: ["libbar"],
2106 min_sdk_version: "29",
2107 apex_available: ["myapex"],
2108 }
2109
2110 cc_library {
2111 name: "libbar",
2112 stubs: { versions: ["29", "30"] },
2113 }
2114
2115 cc_library {
2116 name: "yourlib",
2117 srcs: ["mylib.cpp"],
2118 min_sdk_version: "29",
2119 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2120 }
2121 `, withFiles(android.MockFS{
2122 "packages/modules/common/build/allowed_deps.txt": nil,
2123 }))
2124
2125 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2126 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2127 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002128 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002129 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002130 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002131
Jooyung Hana0503a52023-08-23 13:12:50 +09002132 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002133 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2134 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002135 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2136 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2137 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2138 flatlist, "mylib:(minSdkVersion:29)")
2139 android.AssertStringListContains(t, "track platform-available lib",
2140 flatlist, "yourlib(minSdkVersion:29)")
2141}
2142
2143func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2144 ctx := testApex(t, `
2145 apex {
2146 name: "myapex",
2147 key: "myapex.key",
2148 updatable: true,
2149 min_sdk_version: "29",
2150 }
2151
2152 apex_key {
2153 name: "myapex.key",
2154 public_key: "testkey.avbpubkey",
2155 private_key: "testkey.pem",
2156 }
2157 `)
2158 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2159 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2160 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2161 }
2162}
2163
Jooyung Han03b51852020-02-26 22:45:42 +09002164func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002165 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002166 apex {
2167 name: "myapex",
2168 key: "myapex.key",
2169 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002170 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "libx",
2181 system_shared_libs: [],
2182 stl: "none",
2183 apex_available: [ "myapex" ],
2184 stubs: {
2185 versions: ["1", "2"],
2186 },
2187 }
2188
2189 cc_library {
2190 name: "libz",
2191 shared_libs: ["libx"],
2192 system_shared_libs: [],
2193 stl: "none",
2194 }
2195 `)
2196
2197 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002198 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002199 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2200 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2201 }
2202 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002203 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002204 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2205 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2206 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002207 expectLink("libz", "shared", "libx", "shared_current")
2208 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002209 expectNoLink("libz", "shared", "libz", "shared_1")
2210 expectNoLink("libz", "shared", "libz", "shared")
2211}
2212
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002213var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2214 func(variables android.FixtureProductVariables) {
2215 variables.SanitizeDevice = []string{"hwaddress"}
2216 },
2217)
2218
Jooyung Han75568392020-03-20 04:29:24 +09002219func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002220 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002221 apex {
2222 name: "myapex",
2223 key: "myapex.key",
2224 native_shared_libs: ["libx"],
2225 min_sdk_version: "29",
2226 }
2227
2228 apex_key {
2229 name: "myapex.key",
2230 public_key: "testkey.avbpubkey",
2231 private_key: "testkey.pem",
2232 }
2233
2234 cc_library {
2235 name: "libx",
2236 shared_libs: ["libbar"],
2237 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002238 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002239 }
2240
2241 cc_library {
2242 name: "libbar",
2243 stubs: {
2244 versions: ["29", "30"],
2245 },
2246 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002247 `,
2248 prepareForTestWithSantitizeHwaddress,
2249 )
Jooyung Han03b51852020-02-26 22:45:42 +09002250 expectLink := func(from, from_variant, to, to_variant string) {
2251 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2252 libFlags := ld.Args["libFlags"]
2253 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2254 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002255 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002256}
2257
Jooyung Han75568392020-03-20 04:29:24 +09002258func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002259 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002260 apex {
2261 name: "myapex",
2262 key: "myapex.key",
2263 native_shared_libs: ["libx"],
2264 min_sdk_version: "29",
2265 }
2266
2267 apex_key {
2268 name: "myapex.key",
2269 public_key: "testkey.avbpubkey",
2270 private_key: "testkey.pem",
2271 }
2272
2273 cc_library {
2274 name: "libx",
2275 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002276 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002277 }
Jooyung Han75568392020-03-20 04:29:24 +09002278 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002279
2280 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002281 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002282 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002283 // note that platform variant is not.
2284 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002285 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002286}
2287
Jooyung Han749dc692020-04-15 11:03:39 +09002288func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2289 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002290 apex {
2291 name: "myapex",
2292 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002293 native_shared_libs: ["mylib"],
2294 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002295 }
2296
2297 apex_key {
2298 name: "myapex.key",
2299 public_key: "testkey.avbpubkey",
2300 private_key: "testkey.pem",
2301 }
Jooyung Han749dc692020-04-15 11:03:39 +09002302
2303 cc_library {
2304 name: "mylib",
2305 srcs: ["mylib.cpp"],
2306 system_shared_libs: [],
2307 stl: "none",
2308 apex_available: [
2309 "myapex",
2310 ],
2311 min_sdk_version: "30",
2312 }
2313 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002314
2315 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2316 apex {
2317 name: "myapex",
2318 key: "myapex.key",
2319 native_shared_libs: ["libfoo.ffi"],
2320 min_sdk_version: "29",
2321 }
2322
2323 apex_key {
2324 name: "myapex.key",
2325 public_key: "testkey.avbpubkey",
2326 private_key: "testkey.pem",
2327 }
2328
2329 rust_ffi_shared {
2330 name: "libfoo.ffi",
2331 srcs: ["foo.rs"],
2332 crate_name: "foo",
2333 apex_available: [
2334 "myapex",
2335 ],
2336 min_sdk_version: "30",
2337 }
2338 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002339
2340 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2341 apex {
2342 name: "myapex",
2343 key: "myapex.key",
2344 java_libs: ["libfoo"],
2345 min_sdk_version: "29",
2346 }
2347
2348 apex_key {
2349 name: "myapex.key",
2350 public_key: "testkey.avbpubkey",
2351 private_key: "testkey.pem",
2352 }
2353
2354 java_import {
2355 name: "libfoo",
2356 jars: ["libfoo.jar"],
2357 apex_available: [
2358 "myapex",
2359 ],
2360 min_sdk_version: "30",
2361 }
2362 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002363
2364 // Skip check for modules compiling against core API surface
2365 testApex(t, `
2366 apex {
2367 name: "myapex",
2368 key: "myapex.key",
2369 java_libs: ["libfoo"],
2370 min_sdk_version: "29",
2371 }
2372
2373 apex_key {
2374 name: "myapex.key",
2375 public_key: "testkey.avbpubkey",
2376 private_key: "testkey.pem",
2377 }
2378
2379 java_library {
2380 name: "libfoo",
2381 srcs: ["Foo.java"],
2382 apex_available: [
2383 "myapex",
2384 ],
2385 // Compile against core API surface
2386 sdk_version: "core_current",
2387 min_sdk_version: "30",
2388 }
2389 `)
2390
Jooyung Han749dc692020-04-15 11:03:39 +09002391}
2392
2393func TestApexMinSdkVersion_Okay(t *testing.T) {
2394 testApex(t, `
2395 apex {
2396 name: "myapex",
2397 key: "myapex.key",
2398 native_shared_libs: ["libfoo"],
2399 java_libs: ["libbar"],
2400 min_sdk_version: "29",
2401 }
2402
2403 apex_key {
2404 name: "myapex.key",
2405 public_key: "testkey.avbpubkey",
2406 private_key: "testkey.pem",
2407 }
2408
2409 cc_library {
2410 name: "libfoo",
2411 srcs: ["mylib.cpp"],
2412 shared_libs: ["libfoo_dep"],
2413 apex_available: ["myapex"],
2414 min_sdk_version: "29",
2415 }
2416
2417 cc_library {
2418 name: "libfoo_dep",
2419 srcs: ["mylib.cpp"],
2420 apex_available: ["myapex"],
2421 min_sdk_version: "29",
2422 }
2423
2424 java_library {
2425 name: "libbar",
2426 sdk_version: "current",
2427 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002428 static_libs: [
2429 "libbar_dep",
2430 "libbar_import_dep",
2431 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002432 apex_available: ["myapex"],
2433 min_sdk_version: "29",
2434 }
2435
2436 java_library {
2437 name: "libbar_dep",
2438 sdk_version: "current",
2439 srcs: ["a.java"],
2440 apex_available: ["myapex"],
2441 min_sdk_version: "29",
2442 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002443
2444 java_import {
2445 name: "libbar_import_dep",
2446 jars: ["libbar.jar"],
2447 apex_available: ["myapex"],
2448 min_sdk_version: "29",
2449 }
Jooyung Han03b51852020-02-26 22:45:42 +09002450 `)
2451}
2452
Colin Cross8ca61c12022-10-06 21:00:14 -07002453func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2454 // Tests that an apex dependency with min_sdk_version higher than the
2455 // min_sdk_version of the apex is allowed as long as the dependency's
2456 // min_sdk_version is less than or equal to the api level that the
2457 // architecture was introduced in. In this case, arm64 didn't exist
2458 // until api level 21, so the arm64 code will never need to run on
2459 // an api level 20 device, even if other architectures of the apex
2460 // will.
2461 testApex(t, `
2462 apex {
2463 name: "myapex",
2464 key: "myapex.key",
2465 native_shared_libs: ["libfoo"],
2466 min_sdk_version: "20",
2467 }
2468
2469 apex_key {
2470 name: "myapex.key",
2471 public_key: "testkey.avbpubkey",
2472 private_key: "testkey.pem",
2473 }
2474
2475 cc_library {
2476 name: "libfoo",
2477 srcs: ["mylib.cpp"],
2478 apex_available: ["myapex"],
2479 min_sdk_version: "21",
2480 stl: "none",
2481 }
2482 `)
2483}
2484
Artur Satayev8cf899a2020-04-15 17:29:42 +01002485func TestJavaStableSdkVersion(t *testing.T) {
2486 testCases := []struct {
2487 name string
2488 expectedError string
2489 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002490 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002491 }{
2492 {
2493 name: "Non-updatable apex with non-stable dep",
2494 bp: `
2495 apex {
2496 name: "myapex",
2497 java_libs: ["myjar"],
2498 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002499 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002500 }
2501 apex_key {
2502 name: "myapex.key",
2503 public_key: "testkey.avbpubkey",
2504 private_key: "testkey.pem",
2505 }
2506 java_library {
2507 name: "myjar",
2508 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002509 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002510 apex_available: ["myapex"],
2511 }
2512 `,
2513 },
2514 {
2515 name: "Updatable apex with stable dep",
2516 bp: `
2517 apex {
2518 name: "myapex",
2519 java_libs: ["myjar"],
2520 key: "myapex.key",
2521 updatable: true,
2522 min_sdk_version: "29",
2523 }
2524 apex_key {
2525 name: "myapex.key",
2526 public_key: "testkey.avbpubkey",
2527 private_key: "testkey.pem",
2528 }
2529 java_library {
2530 name: "myjar",
2531 srcs: ["foo/bar/MyClass.java"],
2532 sdk_version: "current",
2533 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002534 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002535 }
2536 `,
2537 },
2538 {
2539 name: "Updatable apex with non-stable dep",
2540 expectedError: "cannot depend on \"myjar\"",
2541 bp: `
2542 apex {
2543 name: "myapex",
2544 java_libs: ["myjar"],
2545 key: "myapex.key",
2546 updatable: true,
2547 }
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }
2553 java_library {
2554 name: "myjar",
2555 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002556 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002557 apex_available: ["myapex"],
2558 }
2559 `,
2560 },
2561 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002562 name: "Updatable apex with non-stable legacy core platform dep",
2563 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2564 bp: `
2565 apex {
2566 name: "myapex",
2567 java_libs: ["myjar-uses-legacy"],
2568 key: "myapex.key",
2569 updatable: true,
2570 }
2571 apex_key {
2572 name: "myapex.key",
2573 public_key: "testkey.avbpubkey",
2574 private_key: "testkey.pem",
2575 }
2576 java_library {
2577 name: "myjar-uses-legacy",
2578 srcs: ["foo/bar/MyClass.java"],
2579 sdk_version: "core_platform",
2580 apex_available: ["myapex"],
2581 }
2582 `,
2583 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2584 },
2585 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002586 name: "Updatable apex with non-stable transitive dep",
2587 // This is not actually detecting that the transitive dependency is unstable, rather it is
2588 // detecting that the transitive dependency is building against a wider API surface than the
2589 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002590 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002591 bp: `
2592 apex {
2593 name: "myapex",
2594 java_libs: ["myjar"],
2595 key: "myapex.key",
2596 updatable: true,
2597 }
2598 apex_key {
2599 name: "myapex.key",
2600 public_key: "testkey.avbpubkey",
2601 private_key: "testkey.pem",
2602 }
2603 java_library {
2604 name: "myjar",
2605 srcs: ["foo/bar/MyClass.java"],
2606 sdk_version: "current",
2607 apex_available: ["myapex"],
2608 static_libs: ["transitive-jar"],
2609 }
2610 java_library {
2611 name: "transitive-jar",
2612 srcs: ["foo/bar/MyClass.java"],
2613 sdk_version: "core_platform",
2614 apex_available: ["myapex"],
2615 }
2616 `,
2617 },
2618 }
2619
2620 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002621 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2622 continue
2623 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002624 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002625 errorHandler := android.FixtureExpectsNoErrors
2626 if test.expectedError != "" {
2627 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002628 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002629 android.GroupFixturePreparers(
2630 java.PrepareForTestWithJavaDefaultModules,
2631 PrepareForTestWithApexBuildComponents,
2632 prepareForTestWithMyapex,
2633 android.OptionalFixturePreparer(test.preparer),
2634 ).
2635 ExtendWithErrorHandler(errorHandler).
2636 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002637 })
2638 }
2639}
2640
Jooyung Han749dc692020-04-15 11:03:39 +09002641func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2642 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2643 apex {
2644 name: "myapex",
2645 key: "myapex.key",
2646 native_shared_libs: ["mylib"],
2647 min_sdk_version: "29",
2648 }
2649
2650 apex_key {
2651 name: "myapex.key",
2652 public_key: "testkey.avbpubkey",
2653 private_key: "testkey.pem",
2654 }
2655
2656 cc_library {
2657 name: "mylib",
2658 srcs: ["mylib.cpp"],
2659 shared_libs: ["mylib2"],
2660 system_shared_libs: [],
2661 stl: "none",
2662 apex_available: [
2663 "myapex",
2664 ],
2665 min_sdk_version: "29",
2666 }
2667
2668 // indirect part of the apex
2669 cc_library {
2670 name: "mylib2",
2671 srcs: ["mylib.cpp"],
2672 system_shared_libs: [],
2673 stl: "none",
2674 apex_available: [
2675 "myapex",
2676 ],
2677 min_sdk_version: "30",
2678 }
2679 `)
2680}
2681
2682func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2683 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2684 apex {
2685 name: "myapex",
2686 key: "myapex.key",
2687 apps: ["AppFoo"],
2688 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002689 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002690 }
2691
2692 apex_key {
2693 name: "myapex.key",
2694 public_key: "testkey.avbpubkey",
2695 private_key: "testkey.pem",
2696 }
2697
2698 android_app {
2699 name: "AppFoo",
2700 srcs: ["foo/bar/MyClass.java"],
2701 sdk_version: "current",
2702 min_sdk_version: "29",
2703 system_modules: "none",
2704 stl: "none",
2705 static_libs: ["bar"],
2706 apex_available: [ "myapex" ],
2707 }
2708
2709 java_library {
2710 name: "bar",
2711 sdk_version: "current",
2712 srcs: ["a.java"],
2713 apex_available: [ "myapex" ],
2714 }
2715 `)
2716}
2717
2718func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002719 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002720 apex {
2721 name: "myapex",
2722 key: "myapex.key",
2723 native_shared_libs: ["mylib"],
2724 min_sdk_version: "29",
2725 }
2726
2727 apex_key {
2728 name: "myapex.key",
2729 public_key: "testkey.avbpubkey",
2730 private_key: "testkey.pem",
2731 }
2732
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002733 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002734 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2735 cc_library {
2736 name: "mylib",
2737 srcs: ["mylib.cpp"],
2738 shared_libs: ["mylib2"],
2739 system_shared_libs: [],
2740 stl: "none",
2741 apex_available: ["myapex", "otherapex"],
2742 min_sdk_version: "29",
2743 }
2744
2745 cc_library {
2746 name: "mylib2",
2747 srcs: ["mylib.cpp"],
2748 system_shared_libs: [],
2749 stl: "none",
2750 apex_available: ["otherapex"],
2751 stubs: { versions: ["29", "30"] },
2752 min_sdk_version: "30",
2753 }
2754
2755 apex {
2756 name: "otherapex",
2757 key: "myapex.key",
2758 native_shared_libs: ["mylib", "mylib2"],
2759 min_sdk_version: "30",
2760 }
2761 `)
2762 expectLink := func(from, from_variant, to, to_variant string) {
2763 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2764 libFlags := ld.Args["libFlags"]
2765 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2766 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002767 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002768 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002769}
2770
Jooyung Haned124c32021-01-26 11:43:46 +09002771func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002772 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2773 func(variables android.FixtureProductVariables) {
2774 variables.Platform_sdk_codename = proptools.StringPtr("S")
2775 variables.Platform_version_active_codenames = []string{"S"}
2776 },
2777 )
Jooyung Haned124c32021-01-26 11:43:46 +09002778 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2779 apex {
2780 name: "myapex",
2781 key: "myapex.key",
2782 native_shared_libs: ["libfoo"],
2783 min_sdk_version: "S",
2784 }
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790 cc_library {
2791 name: "libfoo",
2792 shared_libs: ["libbar"],
2793 apex_available: ["myapex"],
2794 min_sdk_version: "29",
2795 }
2796 cc_library {
2797 name: "libbar",
2798 apex_available: ["myapex"],
2799 }
2800 `, withSAsActiveCodeNames)
2801}
2802
2803func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002804 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2805 variables.Platform_sdk_codename = proptools.StringPtr("S")
2806 variables.Platform_version_active_codenames = []string{"S", "T"}
2807 })
Colin Cross1c460562021-02-16 17:55:47 -08002808 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002809 apex {
2810 name: "myapex",
2811 key: "myapex.key",
2812 native_shared_libs: ["libfoo"],
2813 min_sdk_version: "S",
2814 }
2815 apex_key {
2816 name: "myapex.key",
2817 public_key: "testkey.avbpubkey",
2818 private_key: "testkey.pem",
2819 }
2820 cc_library {
2821 name: "libfoo",
2822 shared_libs: ["libbar"],
2823 apex_available: ["myapex"],
2824 min_sdk_version: "S",
2825 }
2826 cc_library {
2827 name: "libbar",
2828 stubs: {
2829 symbol_file: "libbar.map.txt",
2830 versions: ["30", "S", "T"],
2831 },
2832 }
2833 `, withSAsActiveCodeNames)
2834
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002835 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002836 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2837 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002838 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002839}
2840
Jiyong Park7c2ee712018-12-07 00:42:25 +09002841func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002842 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002843 apex {
2844 name: "myapex",
2845 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002846 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002847 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002848 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002849 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002850 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002851 }
2852
2853 apex_key {
2854 name: "myapex.key",
2855 public_key: "testkey.avbpubkey",
2856 private_key: "testkey.pem",
2857 }
2858
2859 prebuilt_etc {
2860 name: "myetc",
2861 src: "myprebuilt",
2862 sub_dir: "foo/bar",
2863 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002864
2865 cc_library {
2866 name: "mylib",
2867 srcs: ["mylib.cpp"],
2868 relative_install_path: "foo/bar",
2869 system_shared_libs: [],
2870 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002871 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002872 }
2873
2874 cc_binary {
2875 name: "mybin",
2876 srcs: ["mylib.cpp"],
2877 relative_install_path: "foo/bar",
2878 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002879 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002880 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002881 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002882
2883 rust_binary {
2884 name: "mybin.rust",
2885 srcs: ["foo.rs"],
2886 relative_install_path: "rust_subdir",
2887 apex_available: [ "myapex" ],
2888 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002889 `)
2890
Jooyung Hana0503a52023-08-23 13:12:50 +09002891 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002892 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002893
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002894 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002895 ensureContains(t, cmd, "/etc ")
2896 ensureContains(t, cmd, "/etc/foo ")
2897 ensureContains(t, cmd, "/etc/foo/bar ")
2898 ensureContains(t, cmd, "/lib64 ")
2899 ensureContains(t, cmd, "/lib64/foo ")
2900 ensureContains(t, cmd, "/lib64/foo/bar ")
2901 ensureContains(t, cmd, "/lib ")
2902 ensureContains(t, cmd, "/lib/foo ")
2903 ensureContains(t, cmd, "/lib/foo/bar ")
2904 ensureContains(t, cmd, "/bin ")
2905 ensureContains(t, cmd, "/bin/foo ")
2906 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002907 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002908}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002909
Jooyung Han35155c42020-02-06 17:33:20 +09002910func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002911 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002912 apex {
2913 name: "myapex",
2914 key: "myapex.key",
2915 multilib: {
2916 both: {
2917 native_shared_libs: ["mylib"],
2918 binaries: ["mybin"],
2919 },
2920 },
2921 compile_multilib: "both",
2922 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002923 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002924 }
2925
2926 apex_key {
2927 name: "myapex.key",
2928 public_key: "testkey.avbpubkey",
2929 private_key: "testkey.pem",
2930 }
2931
2932 cc_library {
2933 name: "mylib",
2934 relative_install_path: "foo/bar",
2935 system_shared_libs: [],
2936 stl: "none",
2937 apex_available: [ "myapex" ],
2938 native_bridge_supported: true,
2939 }
2940
2941 cc_binary {
2942 name: "mybin",
2943 relative_install_path: "foo/bar",
2944 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002945 stl: "none",
2946 apex_available: [ "myapex" ],
2947 native_bridge_supported: true,
2948 compile_multilib: "both", // default is "first" for binary
2949 multilib: {
2950 lib64: {
2951 suffix: "64",
2952 },
2953 },
2954 }
2955 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002956 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002957 "bin/foo/bar/mybin",
2958 "bin/foo/bar/mybin64",
2959 "bin/arm/foo/bar/mybin",
2960 "bin/arm64/foo/bar/mybin64",
2961 "lib/foo/bar/mylib.so",
2962 "lib/arm/foo/bar/mylib.so",
2963 "lib64/foo/bar/mylib.so",
2964 "lib64/arm64/foo/bar/mylib.so",
2965 })
2966}
2967
Jooyung Han85d61762020-06-24 23:50:26 +09002968func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002969 result := android.GroupFixturePreparers(
2970 prepareForApexTest,
2971 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2972 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002973 apex {
2974 name: "myapex",
2975 key: "myapex.key",
2976 binaries: ["mybin"],
2977 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002978 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002979 }
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985 cc_binary {
2986 name: "mybin",
2987 vendor: true,
2988 shared_libs: ["libfoo"],
2989 }
2990 cc_library {
2991 name: "libfoo",
2992 proprietary: true,
2993 }
2994 `)
2995
Jooyung Hana0503a52023-08-23 13:12:50 +09002996 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002997 "bin/mybin",
2998 "lib64/libfoo.so",
2999 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3000 "lib64/libc++.so",
3001 })
3002
Jooyung Hana0503a52023-08-23 13:12:50 +09003003 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003004 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003005 name := apexBundle.BaseModuleName()
3006 prefix := "TARGET_"
3007 var builder strings.Builder
3008 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003009 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003010 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003011 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003012
Jooyung Hana0503a52023-08-23 13:12:50 +09003013 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003014 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3015 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003016}
3017
Justin Yun13decfb2021-03-08 19:25:55 +09003018func TestProductVariant(t *testing.T) {
3019 ctx := testApex(t, `
3020 apex {
3021 name: "myapex",
3022 key: "myapex.key",
3023 updatable: false,
3024 product_specific: true,
3025 binaries: ["foo"],
3026 }
3027
3028 apex_key {
3029 name: "myapex.key",
3030 public_key: "testkey.avbpubkey",
3031 private_key: "testkey.pem",
3032 }
3033
3034 cc_binary {
3035 name: "foo",
3036 product_available: true,
3037 apex_available: ["myapex"],
3038 srcs: ["foo.cpp"],
3039 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003040 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003041
3042 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003043 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003044 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3045 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3046 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3047 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3048}
3049
Jooyung Han8e5685d2020-09-21 11:02:57 +09003050func TestApex_withPrebuiltFirmware(t *testing.T) {
3051 testCases := []struct {
3052 name string
3053 additionalProp string
3054 }{
3055 {"system apex with prebuilt_firmware", ""},
3056 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3057 }
3058 for _, tc := range testCases {
3059 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003060 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003061 apex {
3062 name: "myapex",
3063 key: "myapex.key",
3064 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003065 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003066 `+tc.additionalProp+`
3067 }
3068 apex_key {
3069 name: "myapex.key",
3070 public_key: "testkey.avbpubkey",
3071 private_key: "testkey.pem",
3072 }
3073 prebuilt_firmware {
3074 name: "myfirmware",
3075 src: "myfirmware.bin",
3076 filename_from_src: true,
3077 `+tc.additionalProp+`
3078 }
3079 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003080 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003081 "etc/firmware/myfirmware.bin",
3082 })
3083 })
3084 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003085}
3086
Jooyung Hanefb184e2020-06-25 17:14:25 +09003087func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003088 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003089 apex {
3090 name: "myapex",
3091 key: "myapex.key",
3092 vendor: true,
3093 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003094 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003095 }
3096
3097 apex_key {
3098 name: "myapex.key",
3099 public_key: "testkey.avbpubkey",
3100 private_key: "testkey.pem",
3101 }
3102
3103 cc_library {
3104 name: "mylib",
3105 vendor_available: true,
3106 }
3107 `)
3108
Jooyung Hana0503a52023-08-23 13:12:50 +09003109 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003110 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003111 name := apexBundle.BaseModuleName()
3112 prefix := "TARGET_"
3113 var builder strings.Builder
3114 data.Custom(&builder, name, prefix, "", data)
3115 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003116 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003117}
3118
Jooyung Han2ed99d02020-06-24 23:26:26 +09003119func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003120 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003121 apex {
3122 name: "myapex",
3123 key: "myapex.key",
3124 vintf_fragments: ["fragment.xml"],
3125 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003126 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003127 }
3128 apex_key {
3129 name: "myapex.key",
3130 public_key: "testkey.avbpubkey",
3131 private_key: "testkey.pem",
3132 }
3133 cc_binary {
3134 name: "mybin",
3135 }
3136 `)
3137
Jooyung Hana0503a52023-08-23 13:12:50 +09003138 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003139 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003140 name := apexBundle.BaseModuleName()
3141 prefix := "TARGET_"
3142 var builder strings.Builder
3143 data.Custom(&builder, name, prefix, "", data)
3144 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003145 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003146 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003147}
3148
Jiyong Park16e91a02018-12-20 18:18:08 +09003149func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003150 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003151 apex {
3152 name: "myapex",
3153 key: "myapex.key",
3154 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003155 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003156 }
3157
3158 apex_key {
3159 name: "myapex.key",
3160 public_key: "testkey.avbpubkey",
3161 private_key: "testkey.pem",
3162 }
3163
3164 cc_library {
3165 name: "mylib",
3166 srcs: ["mylib.cpp"],
3167 system_shared_libs: [],
3168 stl: "none",
3169 stubs: {
3170 versions: ["1", "2", "3"],
3171 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003172 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003173 }
3174
3175 cc_binary {
3176 name: "not_in_apex",
3177 srcs: ["mylib.cpp"],
3178 static_libs: ["mylib"],
3179 static_executable: true,
3180 system_shared_libs: [],
3181 stl: "none",
3182 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003183 `)
3184
Colin Cross7113d202019-11-20 16:39:12 -08003185 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003186
3187 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003188 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003189}
Jiyong Park9335a262018-12-24 11:31:58 +09003190
3191func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003192 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003193 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003194 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003195 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003196 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003197 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003198 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003199 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003200 }
3201
3202 cc_library {
3203 name: "mylib",
3204 srcs: ["mylib.cpp"],
3205 system_shared_libs: [],
3206 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003207 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003208 }
3209
3210 apex_key {
3211 name: "myapex.key",
3212 public_key: "testkey.avbpubkey",
3213 private_key: "testkey.pem",
3214 }
3215
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003216 android_app_certificate {
3217 name: "myapex.certificate",
3218 certificate: "testkey",
3219 }
3220
3221 android_app_certificate {
3222 name: "myapex.certificate.override",
3223 certificate: "testkey.override",
3224 }
3225
Jiyong Park9335a262018-12-24 11:31:58 +09003226 `)
3227
3228 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003229 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003230
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003231 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3232 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003233 "vendor/foo/devkeys/testkey.avbpubkey")
3234 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003235 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3236 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003237 "vendor/foo/devkeys/testkey.pem")
3238 }
3239
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003240 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003241 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003242 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003243 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003244 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003245 }
3246}
Jiyong Park58e364a2019-01-19 19:24:06 +09003247
Jooyung Hanf121a652019-12-17 14:30:11 +09003248func TestCertificate(t *testing.T) {
3249 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003250 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003251 apex {
3252 name: "myapex",
3253 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003254 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003255 }
3256 apex_key {
3257 name: "myapex.key",
3258 public_key: "testkey.avbpubkey",
3259 private_key: "testkey.pem",
3260 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003261 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003262 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3263 if actual := rule.Args["certificates"]; actual != expected {
3264 t.Errorf("certificates should be %q, not %q", expected, actual)
3265 }
3266 })
3267 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003268 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003269 apex {
3270 name: "myapex_keytest",
3271 key: "myapex.key",
3272 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003273 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003274 }
3275 apex_key {
3276 name: "myapex.key",
3277 public_key: "testkey.avbpubkey",
3278 private_key: "testkey.pem",
3279 }
3280 android_app_certificate {
3281 name: "myapex.certificate.override",
3282 certificate: "testkey.override",
3283 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003284 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003285 expected := "testkey.override.x509.pem testkey.override.pk8"
3286 if actual := rule.Args["certificates"]; actual != expected {
3287 t.Errorf("certificates should be %q, not %q", expected, actual)
3288 }
3289 })
3290 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003291 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003292 apex {
3293 name: "myapex",
3294 key: "myapex.key",
3295 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003296 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003297 }
3298 apex_key {
3299 name: "myapex.key",
3300 public_key: "testkey.avbpubkey",
3301 private_key: "testkey.pem",
3302 }
3303 android_app_certificate {
3304 name: "myapex.certificate",
3305 certificate: "testkey",
3306 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003307 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003308 expected := "testkey.x509.pem testkey.pk8"
3309 if actual := rule.Args["certificates"]; actual != expected {
3310 t.Errorf("certificates should be %q, not %q", expected, actual)
3311 }
3312 })
3313 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003314 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003315 apex {
3316 name: "myapex_keytest",
3317 key: "myapex.key",
3318 file_contexts: ":myapex-file_contexts",
3319 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003320 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003321 }
3322 apex_key {
3323 name: "myapex.key",
3324 public_key: "testkey.avbpubkey",
3325 private_key: "testkey.pem",
3326 }
3327 android_app_certificate {
3328 name: "myapex.certificate.override",
3329 certificate: "testkey.override",
3330 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003331 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003332 expected := "testkey.override.x509.pem testkey.override.pk8"
3333 if actual := rule.Args["certificates"]; actual != expected {
3334 t.Errorf("certificates should be %q, not %q", expected, actual)
3335 }
3336 })
3337 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003338 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003339 apex {
3340 name: "myapex",
3341 key: "myapex.key",
3342 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003343 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003344 }
3345 apex_key {
3346 name: "myapex.key",
3347 public_key: "testkey.avbpubkey",
3348 private_key: "testkey.pem",
3349 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003350 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3352 if actual := rule.Args["certificates"]; actual != expected {
3353 t.Errorf("certificates should be %q, not %q", expected, actual)
3354 }
3355 })
3356 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003357 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003358 apex {
3359 name: "myapex_keytest",
3360 key: "myapex.key",
3361 file_contexts: ":myapex-file_contexts",
3362 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003363 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003364 }
3365 apex_key {
3366 name: "myapex.key",
3367 public_key: "testkey.avbpubkey",
3368 private_key: "testkey.pem",
3369 }
3370 android_app_certificate {
3371 name: "myapex.certificate.override",
3372 certificate: "testkey.override",
3373 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003374 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003375 expected := "testkey.override.x509.pem testkey.override.pk8"
3376 if actual := rule.Args["certificates"]; actual != expected {
3377 t.Errorf("certificates should be %q, not %q", expected, actual)
3378 }
3379 })
3380}
3381
Jiyong Park58e364a2019-01-19 19:24:06 +09003382func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003383 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003384 apex {
3385 name: "myapex",
3386 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003387 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003388 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003389 }
3390
3391 apex {
3392 name: "otherapex",
3393 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003394 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003395 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003396 }
3397
3398 apex_key {
3399 name: "myapex.key",
3400 public_key: "testkey.avbpubkey",
3401 private_key: "testkey.pem",
3402 }
3403
3404 cc_library {
3405 name: "mylib",
3406 srcs: ["mylib.cpp"],
3407 system_shared_libs: [],
3408 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003409 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003410 "myapex",
3411 "otherapex",
3412 ],
Jooyung Han24282772020-03-21 23:20:55 +09003413 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003414 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003415 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003416 cc_library {
3417 name: "mylib2",
3418 srcs: ["mylib.cpp"],
3419 system_shared_libs: [],
3420 stl: "none",
3421 apex_available: [
3422 "myapex",
3423 "otherapex",
3424 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003425 static_libs: ["mylib3"],
3426 recovery_available: true,
3427 min_sdk_version: "29",
3428 }
3429 cc_library {
3430 name: "mylib3",
3431 srcs: ["mylib.cpp"],
3432 system_shared_libs: [],
3433 stl: "none",
3434 apex_available: [
3435 "myapex",
3436 "otherapex",
3437 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003438 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003439 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003440 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003441 `)
3442
Jooyung Hanc87a0592020-03-02 17:44:33 +09003443 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003444 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003445 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003446
Vinh Tranf9754732023-01-19 22:41:46 -05003447 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003448 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003449 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003450
Vinh Tranf9754732023-01-19 22:41:46 -05003451 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003452 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003453 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003454
Colin Crossaede88c2020-08-11 12:17:01 -07003455 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3456 // each variant defines additional macros to distinguish which apex variant it is built for
3457
3458 // non-APEX variant does not have __ANDROID_APEX__ defined
3459 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3460 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3461
Vinh Tranf9754732023-01-19 22:41:46 -05003462 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003463 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3464 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003465
Jooyung Hanc87a0592020-03-02 17:44:33 +09003466 // non-APEX variant does not have __ANDROID_APEX__ defined
3467 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3468 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3469
Vinh Tranf9754732023-01-19 22:41:46 -05003470 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003471 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003472 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003473}
Jiyong Park7e636d02019-01-28 16:16:54 +09003474
3475func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003476 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003477 apex {
3478 name: "myapex",
3479 key: "myapex.key",
3480 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003481 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003482 }
3483
3484 apex_key {
3485 name: "myapex.key",
3486 public_key: "testkey.avbpubkey",
3487 private_key: "testkey.pem",
3488 }
3489
3490 cc_library_headers {
3491 name: "mylib_headers",
3492 export_include_dirs: ["my_include"],
3493 system_shared_libs: [],
3494 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003495 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003496 }
3497
3498 cc_library {
3499 name: "mylib",
3500 srcs: ["mylib.cpp"],
3501 system_shared_libs: [],
3502 stl: "none",
3503 header_libs: ["mylib_headers"],
3504 export_header_lib_headers: ["mylib_headers"],
3505 stubs: {
3506 versions: ["1", "2", "3"],
3507 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003508 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003509 }
3510
3511 cc_library {
3512 name: "otherlib",
3513 srcs: ["mylib.cpp"],
3514 system_shared_libs: [],
3515 stl: "none",
3516 shared_libs: ["mylib"],
3517 }
3518 `)
3519
Colin Cross7113d202019-11-20 16:39:12 -08003520 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003521
3522 // Ensure that the include path of the header lib is exported to 'otherlib'
3523 ensureContains(t, cFlags, "-Imy_include")
3524}
Alex Light9670d332019-01-29 18:07:33 -08003525
Jiyong Park7cd10e32020-01-14 09:22:18 +09003526type fileInApex struct {
3527 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003528 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003529 isLink bool
3530}
3531
Jooyung Han1724d582022-12-21 10:17:44 +09003532func (f fileInApex) String() string {
3533 return f.src + ":" + f.path
3534}
3535
3536func (f fileInApex) match(expectation string) bool {
3537 parts := strings.Split(expectation, ":")
3538 if len(parts) == 1 {
3539 match, _ := path.Match(parts[0], f.path)
3540 return match
3541 }
3542 if len(parts) == 2 {
3543 matchSrc, _ := path.Match(parts[0], f.src)
3544 matchDst, _ := path.Match(parts[1], f.path)
3545 return matchSrc && matchDst
3546 }
3547 panic("invalid expected file specification: " + expectation)
3548}
3549
Jooyung Hana57af4a2020-01-23 05:36:59 +00003550func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003551 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003552 module := ctx.ModuleForTests(moduleName, variant)
3553 apexRule := module.MaybeRule("apexRule")
3554 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003555 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003556 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003557 for _, cmd := range strings.Split(copyCmds, "&&") {
3558 cmd = strings.TrimSpace(cmd)
3559 if cmd == "" {
3560 continue
3561 }
3562 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003563 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003564 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003565 switch terms[0] {
3566 case "mkdir":
3567 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003568 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003569 t.Fatal("copyCmds contains invalid cp command", cmd)
3570 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003571 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003572 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003573 isLink = false
3574 case "ln":
3575 if len(terms) != 3 && len(terms) != 4 {
3576 // ln LINK TARGET or ln -s LINK TARGET
3577 t.Fatal("copyCmds contains invalid ln command", cmd)
3578 }
3579 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003580 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003581 isLink = true
3582 default:
3583 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3584 }
3585 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003586 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003587 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003588 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003589 }
Jooyung Han1724d582022-12-21 10:17:44 +09003590 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003591 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003592 }
3593 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003594 return ret
3595}
3596
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003597func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003598 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003599 var failed bool
3600 var surplus []string
3601 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003602 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003603 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003604 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003605 if file.match(expected) {
3606 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003607 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003608 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 }
3610 }
Jooyung Han1724d582022-12-21 10:17:44 +09003611 if !matchFound {
3612 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003613 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003614 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003615
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003617 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003618 t.Log("surplus files", surplus)
3619 failed = true
3620 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003621
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003622 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003623 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003624 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003625 if !filesMatched[expected] {
3626 missing = append(missing, expected)
3627 }
3628 }
3629 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003630 t.Log("missing files", missing)
3631 failed = true
3632 }
3633 if failed {
3634 t.Fail()
3635 }
3636}
3637
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003638func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3639 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3640}
3641
3642func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003643 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003644 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3645 if deapexer.Output != nil {
3646 outputs = append(outputs, deapexer.Output.String())
3647 }
3648 for _, output := range deapexer.ImplicitOutputs {
3649 outputs = append(outputs, output.String())
3650 }
3651 actualFiles := make([]fileInApex, 0, len(outputs))
3652 for _, output := range outputs {
3653 dir := "/deapexer/"
3654 pos := strings.LastIndex(output, dir)
3655 if pos == -1 {
3656 t.Fatal("Unknown deapexer output ", output)
3657 }
3658 path := output[pos+len(dir):]
3659 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3660 }
3661 assertFileListEquals(t, files, actualFiles)
3662}
3663
Jooyung Han39edb6c2019-11-06 16:53:07 +09003664func vndkLibrariesTxtFiles(vers ...string) (result string) {
3665 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003666 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003667 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003668 prebuilt_etc {
3669 name: "` + txt + `.libraries.` + v + `.txt",
3670 src: "dummy.txt",
3671 }
3672 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003673 }
3674 }
3675 return
3676}
3677
Jooyung Han344d5432019-08-23 11:17:39 +09003678func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003679 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003680 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003681 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003682 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003683 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003684 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003685 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003686 }
3687
3688 apex_key {
3689 name: "myapex.key",
3690 public_key: "testkey.avbpubkey",
3691 private_key: "testkey.pem",
3692 }
3693
Jooyung Han31c470b2019-10-18 16:26:59 +09003694 vndk_prebuilt_shared {
3695 name: "libvndk27",
3696 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003697 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003698 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003699 vndk: {
3700 enabled: true,
3701 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003702 target_arch: "arm64",
3703 arch: {
3704 arm: {
3705 srcs: ["libvndk27_arm.so"],
3706 },
3707 arm64: {
3708 srcs: ["libvndk27_arm64.so"],
3709 },
3710 },
Colin Cross2807f002021-03-02 10:15:29 -08003711 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003712 }
3713
3714 vndk_prebuilt_shared {
3715 name: "libvndk27",
3716 version: "27",
3717 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003718 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003719 vndk: {
3720 enabled: true,
3721 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003722 target_arch: "x86_64",
3723 arch: {
3724 x86: {
3725 srcs: ["libvndk27_x86.so"],
3726 },
3727 x86_64: {
3728 srcs: ["libvndk27_x86_64.so"],
3729 },
3730 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003731 }
3732 `+vndkLibrariesTxtFiles("27"),
3733 withFiles(map[string][]byte{
3734 "libvndk27_arm.so": nil,
3735 "libvndk27_arm64.so": nil,
3736 "libvndk27_x86.so": nil,
3737 "libvndk27_x86_64.so": nil,
3738 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003739
Jooyung Hana0503a52023-08-23 13:12:50 +09003740 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003741 "lib/libvndk27_arm.so",
3742 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003743 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003744 })
Jooyung Han344d5432019-08-23 11:17:39 +09003745}
3746
Jooyung Han90eee022019-10-01 20:02:42 +09003747func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003748 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003749 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003750 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003751 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003752 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003753 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003754 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003755 }
3756 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003757 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003758 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003759 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003760 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003761 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003762 }
3763 apex_key {
3764 name: "myapex.key",
3765 public_key: "testkey.avbpubkey",
3766 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003767 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003768
3769 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003770 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003771 apexManifestRule := module.Rule("apexManifestRule")
3772 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003773 }
3774
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003775 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003776 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003777}
3778
Jooyung Han344d5432019-08-23 11:17:39 +09003779func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003780 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003781 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003782 name: "com.android.vndk.v30",
3783 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003784 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003785 native_bridge_supported: true,
3786 }
3787
3788 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003789 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003790 public_key: "testkey.avbpubkey",
3791 private_key: "testkey.pem",
3792 }
3793
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003794 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003795 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003796 version: "30",
3797 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003798 srcs: ["mylib.cpp"],
3799 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003800 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003801 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003802 vndk: {
3803 enabled: true,
3804 },
Jooyung Han344d5432019-08-23 11:17:39 +09003805 }
3806 `)
3807}
3808
Jooyung Han31c470b2019-10-18 16:26:59 +09003809func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003810 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003813 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003814 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003815 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003816 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003817 }
3818
3819 apex_key {
3820 name: "myapex.key",
3821 public_key: "testkey.avbpubkey",
3822 private_key: "testkey.pem",
3823 }
3824
3825 vndk_prebuilt_shared {
3826 name: "libvndk27",
3827 version: "27",
3828 target_arch: "arm",
3829 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003830 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003831 vndk: {
3832 enabled: true,
3833 },
3834 arch: {
3835 arm: {
3836 srcs: ["libvndk27.so"],
3837 }
3838 },
3839 }
3840
3841 vndk_prebuilt_shared {
3842 name: "libvndk27",
3843 version: "27",
3844 target_arch: "arm",
3845 binder32bit: true,
3846 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003847 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003848 vndk: {
3849 enabled: true,
3850 },
3851 arch: {
3852 arm: {
3853 srcs: ["libvndk27binder32.so"],
3854 }
3855 },
Colin Cross2807f002021-03-02 10:15:29 -08003856 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003857 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003858 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003859 withFiles(map[string][]byte{
3860 "libvndk27.so": nil,
3861 "libvndk27binder32.so": nil,
3862 }),
3863 withBinder32bit,
3864 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003865 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003866 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3867 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 },
3869 }),
3870 )
3871
Jooyung Hana0503a52023-08-23 13:12:50 +09003872 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003873 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003874 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 })
3876}
3877
Jooyung Hane1633032019-08-01 17:41:43 +09003878func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003879 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003880 apex {
3881 name: "myapex_nodep",
3882 key: "myapex.key",
3883 native_shared_libs: ["lib_nodep"],
3884 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003885 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003886 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003887 }
3888
3889 apex {
3890 name: "myapex_dep",
3891 key: "myapex.key",
3892 native_shared_libs: ["lib_dep"],
3893 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003894 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003895 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003896 }
3897
3898 apex {
3899 name: "myapex_provider",
3900 key: "myapex.key",
3901 native_shared_libs: ["libfoo"],
3902 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003903 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003904 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003905 }
3906
3907 apex {
3908 name: "myapex_selfcontained",
3909 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00003910 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09003911 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003912 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003913 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003914 }
3915
3916 apex_key {
3917 name: "myapex.key",
3918 public_key: "testkey.avbpubkey",
3919 private_key: "testkey.pem",
3920 }
3921
3922 cc_library {
3923 name: "lib_nodep",
3924 srcs: ["mylib.cpp"],
3925 system_shared_libs: [],
3926 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003927 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003928 }
3929
3930 cc_library {
3931 name: "lib_dep",
3932 srcs: ["mylib.cpp"],
3933 shared_libs: ["libfoo"],
3934 system_shared_libs: [],
3935 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003936 apex_available: [
3937 "myapex_dep",
3938 "myapex_provider",
3939 "myapex_selfcontained",
3940 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003941 }
3942
3943 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00003944 name: "lib_dep_on_bar",
3945 srcs: ["mylib.cpp"],
3946 shared_libs: ["libbar"],
3947 system_shared_libs: [],
3948 stl: "none",
3949 apex_available: [
3950 "myapex_selfcontained",
3951 ],
3952 }
3953
3954
3955 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09003956 name: "libfoo",
3957 srcs: ["mytest.cpp"],
3958 stubs: {
3959 versions: ["1"],
3960 },
3961 system_shared_libs: [],
3962 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003963 apex_available: [
3964 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00003965 ],
3966 }
3967
3968 cc_library {
3969 name: "libbar",
3970 srcs: ["mytest.cpp"],
3971 stubs: {
3972 versions: ["1"],
3973 },
3974 system_shared_libs: [],
3975 stl: "none",
3976 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003977 "myapex_selfcontained",
3978 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003979 }
Spandan Das20fce2d2023-04-12 17:21:39 +00003980
Jooyung Hane1633032019-08-01 17:41:43 +09003981 `)
3982
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003983 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003984 var provideNativeLibs, requireNativeLibs []string
3985
Jooyung Hana0503a52023-08-23 13:12:50 +09003986 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003987 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3988 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003989 ensureListEmpty(t, provideNativeLibs)
3990 ensureListEmpty(t, requireNativeLibs)
3991
Jooyung Hana0503a52023-08-23 13:12:50 +09003992 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003993 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3994 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003995 ensureListEmpty(t, provideNativeLibs)
3996 ensureListContains(t, requireNativeLibs, "libfoo.so")
3997
Jooyung Hana0503a52023-08-23 13:12:50 +09003998 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003999 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4000 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004001 ensureListContains(t, provideNativeLibs, "libfoo.so")
4002 ensureListEmpty(t, requireNativeLibs)
4003
Jooyung Hana0503a52023-08-23 13:12:50 +09004004 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004005 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4006 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004007 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004008 ensureListEmpty(t, requireNativeLibs)
4009}
4010
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004011func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4012 ctx := testApex(t, `
4013 apex {
4014 name: "myapex",
4015 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004016 native_shared_libs: ["mylib"],
4017 updatable: false,
4018 }
4019
4020 apex_key {
4021 name: "myapex.key",
4022 public_key: "testkey.avbpubkey",
4023 private_key: "testkey.pem",
4024 }
4025
4026 cc_library {
4027 name: "mylib",
4028 srcs: ["mylib.cpp"],
4029 system_shared_libs: [],
4030 stl: "none",
4031 apex_available: [
4032 "//apex_available:platform",
4033 "myapex",
4034 ],
4035 }
4036 `, android.FixtureMergeEnv(map[string]string{
4037 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4038 }))
4039
Jooyung Hana0503a52023-08-23 13:12:50 +09004040 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004041 apexManifestRule := module.Rule("apexManifestRule")
4042 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4043}
4044
Vinh Tran8f5310f2022-10-07 18:16:47 -04004045func TestCompileMultilibProp(t *testing.T) {
4046 testCases := []struct {
4047 compileMultiLibProp string
4048 containedLibs []string
4049 notContainedLibs []string
4050 }{
4051 {
4052 containedLibs: []string{
4053 "image.apex/lib64/mylib.so",
4054 "image.apex/lib/mylib.so",
4055 },
4056 compileMultiLibProp: `compile_multilib: "both",`,
4057 },
4058 {
4059 containedLibs: []string{"image.apex/lib64/mylib.so"},
4060 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4061 compileMultiLibProp: `compile_multilib: "first",`,
4062 },
4063 {
4064 containedLibs: []string{"image.apex/lib64/mylib.so"},
4065 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4066 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4067 },
4068 {
4069 containedLibs: []string{"image.apex/lib64/mylib.so"},
4070 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4071 compileMultiLibProp: `compile_multilib: "64",`,
4072 },
4073 {
4074 containedLibs: []string{"image.apex/lib/mylib.so"},
4075 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4076 compileMultiLibProp: `compile_multilib: "32",`,
4077 },
4078 }
4079 for _, testCase := range testCases {
4080 ctx := testApex(t, fmt.Sprintf(`
4081 apex {
4082 name: "myapex",
4083 key: "myapex.key",
4084 %s
4085 native_shared_libs: ["mylib"],
4086 updatable: false,
4087 }
4088 apex_key {
4089 name: "myapex.key",
4090 public_key: "testkey.avbpubkey",
4091 private_key: "testkey.pem",
4092 }
4093 cc_library {
4094 name: "mylib",
4095 srcs: ["mylib.cpp"],
4096 apex_available: [
4097 "//apex_available:platform",
4098 "myapex",
4099 ],
4100 }
4101 `, testCase.compileMultiLibProp),
4102 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004103 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004104 apexRule := module.Rule("apexRule")
4105 copyCmds := apexRule.Args["copy_commands"]
4106 for _, containedLib := range testCase.containedLibs {
4107 ensureContains(t, copyCmds, containedLib)
4108 }
4109 for _, notContainedLib := range testCase.notContainedLibs {
4110 ensureNotContains(t, copyCmds, notContainedLib)
4111 }
4112 }
4113}
4114
Alex Light0851b882019-02-07 13:20:53 -08004115func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004116 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004117 apex {
4118 name: "myapex",
4119 key: "myapex.key",
4120 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004121 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004122 }
4123
4124 apex_key {
4125 name: "myapex.key",
4126 public_key: "testkey.avbpubkey",
4127 private_key: "testkey.pem",
4128 }
4129
4130 cc_library {
4131 name: "mylib_common",
4132 srcs: ["mylib.cpp"],
4133 system_shared_libs: [],
4134 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004135 apex_available: [
4136 "//apex_available:platform",
4137 "myapex",
4138 ],
Alex Light0851b882019-02-07 13:20:53 -08004139 }
4140 `)
4141
Jooyung Hana0503a52023-08-23 13:12:50 +09004142 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004143 apexRule := module.Rule("apexRule")
4144 copyCmds := apexRule.Args["copy_commands"]
4145
4146 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4147 t.Log("Apex was a test apex!")
4148 t.Fail()
4149 }
4150 // Ensure that main rule creates an output
4151 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4152
4153 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004154 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004155
4156 // Ensure that both direct and indirect deps are copied into apex
4157 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4158
Colin Cross7113d202019-11-20 16:39:12 -08004159 // Ensure that the platform variant ends with _shared
4160 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004161
Colin Cross56a83212020-09-15 18:30:11 -07004162 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004163 t.Log("Found mylib_common not in any apex!")
4164 t.Fail()
4165 }
4166}
4167
4168func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004169 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004170 apex_test {
4171 name: "myapex",
4172 key: "myapex.key",
4173 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004174 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004175 }
4176
4177 apex_key {
4178 name: "myapex.key",
4179 public_key: "testkey.avbpubkey",
4180 private_key: "testkey.pem",
4181 }
4182
4183 cc_library {
4184 name: "mylib_common_test",
4185 srcs: ["mylib.cpp"],
4186 system_shared_libs: [],
4187 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004188 // TODO: remove //apex_available:platform
4189 apex_available: [
4190 "//apex_available:platform",
4191 "myapex",
4192 ],
Alex Light0851b882019-02-07 13:20:53 -08004193 }
4194 `)
4195
Jooyung Hana0503a52023-08-23 13:12:50 +09004196 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004197 apexRule := module.Rule("apexRule")
4198 copyCmds := apexRule.Args["copy_commands"]
4199
4200 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4201 t.Log("Apex was not a test apex!")
4202 t.Fail()
4203 }
4204 // Ensure that main rule creates an output
4205 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4206
4207 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004208 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004209
4210 // Ensure that both direct and indirect deps are copied into apex
4211 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4212
Colin Cross7113d202019-11-20 16:39:12 -08004213 // Ensure that the platform variant ends with _shared
4214 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004215}
4216
Jooyung Han85707de2023-12-01 14:21:13 +09004217func TestLibzVendorIsntStable(t *testing.T) {
4218 ctx := testApex(t, `
4219 apex {
4220 name: "myapex",
4221 key: "myapex.key",
4222 updatable: false,
4223 binaries: ["mybin"],
4224 }
4225 apex {
4226 name: "myvendorapex",
4227 key: "myapex.key",
4228 file_contexts: "myvendorapex_file_contexts",
4229 vendor: true,
4230 updatable: false,
4231 binaries: ["mybin"],
4232 }
4233 apex_key {
4234 name: "myapex.key",
4235 public_key: "testkey.avbpubkey",
4236 private_key: "testkey.pem",
4237 }
4238 cc_binary {
4239 name: "mybin",
4240 vendor_available: true,
4241 system_shared_libs: [],
4242 stl: "none",
4243 shared_libs: ["libz"],
4244 apex_available: ["//apex_available:anyapex"],
4245 }
4246 cc_library {
4247 name: "libz",
4248 vendor_available: true,
4249 system_shared_libs: [],
4250 stl: "none",
4251 stubs: {
4252 versions: ["28", "30"],
4253 },
4254 target: {
4255 vendor: {
4256 no_stubs: true,
4257 },
4258 },
4259 }
4260 `, withFiles(map[string][]byte{
4261 "myvendorapex_file_contexts": nil,
4262 }))
4263
4264 // libz provides stubs for core variant.
4265 {
4266 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4267 "bin/mybin",
4268 })
4269 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4270 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4271 }
4272 // libz doesn't provide stubs for vendor variant.
4273 {
4274 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4275 "bin/mybin",
4276 "lib64/libz.so",
4277 })
4278 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4279 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4280 }
4281}
4282
Alex Light9670d332019-01-29 18:07:33 -08004283func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004284 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004285 apex {
4286 name: "myapex",
4287 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004288 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004289 multilib: {
4290 first: {
4291 native_shared_libs: ["mylib_common"],
4292 }
4293 },
4294 target: {
4295 android: {
4296 multilib: {
4297 first: {
4298 native_shared_libs: ["mylib"],
4299 }
4300 }
4301 },
4302 host: {
4303 multilib: {
4304 first: {
4305 native_shared_libs: ["mylib2"],
4306 }
4307 }
4308 }
4309 }
4310 }
4311
4312 apex_key {
4313 name: "myapex.key",
4314 public_key: "testkey.avbpubkey",
4315 private_key: "testkey.pem",
4316 }
4317
4318 cc_library {
4319 name: "mylib",
4320 srcs: ["mylib.cpp"],
4321 system_shared_libs: [],
4322 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004323 // TODO: remove //apex_available:platform
4324 apex_available: [
4325 "//apex_available:platform",
4326 "myapex",
4327 ],
Alex Light9670d332019-01-29 18:07:33 -08004328 }
4329
4330 cc_library {
4331 name: "mylib_common",
4332 srcs: ["mylib.cpp"],
4333 system_shared_libs: [],
4334 stl: "none",
4335 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004336 // TODO: remove //apex_available:platform
4337 apex_available: [
4338 "//apex_available:platform",
4339 "myapex",
4340 ],
Alex Light9670d332019-01-29 18:07:33 -08004341 }
4342
4343 cc_library {
4344 name: "mylib2",
4345 srcs: ["mylib.cpp"],
4346 system_shared_libs: [],
4347 stl: "none",
4348 compile_multilib: "first",
4349 }
4350 `)
4351
Jooyung Hana0503a52023-08-23 13:12:50 +09004352 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004353 copyCmds := apexRule.Args["copy_commands"]
4354
4355 // Ensure that main rule creates an output
4356 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4357
4358 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004359 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4360 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4361 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004362
4363 // Ensure that both direct and indirect deps are copied into apex
4364 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4365 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4366 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4367
Colin Cross7113d202019-11-20 16:39:12 -08004368 // Ensure that the platform variant ends with _shared
4369 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4370 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4371 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004372}
Jiyong Park04480cf2019-02-06 00:16:29 +09004373
Jiyong Park59140302020-12-14 18:44:04 +09004374func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004375 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004376 apex {
4377 name: "myapex",
4378 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004379 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004380 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004381 arch: {
4382 arm64: {
4383 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004384 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004385 },
4386 x86_64: {
4387 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004388 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004389 },
4390 }
4391 }
4392
4393 apex_key {
4394 name: "myapex.key",
4395 public_key: "testkey.avbpubkey",
4396 private_key: "testkey.pem",
4397 }
4398
4399 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004400 name: "mylib.generic",
4401 srcs: ["mylib.cpp"],
4402 system_shared_libs: [],
4403 stl: "none",
4404 // TODO: remove //apex_available:platform
4405 apex_available: [
4406 "//apex_available:platform",
4407 "myapex",
4408 ],
4409 }
4410
4411 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004412 name: "mylib.arm64",
4413 srcs: ["mylib.cpp"],
4414 system_shared_libs: [],
4415 stl: "none",
4416 // TODO: remove //apex_available:platform
4417 apex_available: [
4418 "//apex_available:platform",
4419 "myapex",
4420 ],
4421 }
4422
4423 cc_library {
4424 name: "mylib.x64",
4425 srcs: ["mylib.cpp"],
4426 system_shared_libs: [],
4427 stl: "none",
4428 // TODO: remove //apex_available:platform
4429 apex_available: [
4430 "//apex_available:platform",
4431 "myapex",
4432 ],
4433 }
4434 `)
4435
Jooyung Hana0503a52023-08-23 13:12:50 +09004436 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004437 copyCmds := apexRule.Args["copy_commands"]
4438
4439 // Ensure that apex variant is created for the direct dep
4440 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004441 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004442 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4443
4444 // Ensure that both direct and indirect deps are copied into apex
4445 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4446 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4447}
4448
Jiyong Park04480cf2019-02-06 00:16:29 +09004449func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004450 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004451 apex {
4452 name: "myapex",
4453 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004454 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004455 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004456 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004457 }
4458
4459 apex_key {
4460 name: "myapex.key",
4461 public_key: "testkey.avbpubkey",
4462 private_key: "testkey.pem",
4463 }
4464
4465 sh_binary {
4466 name: "myscript",
4467 src: "mylib.cpp",
4468 filename: "myscript.sh",
4469 sub_dir: "script",
4470 }
4471 `)
4472
Jooyung Hana0503a52023-08-23 13:12:50 +09004473 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004474 copyCmds := apexRule.Args["copy_commands"]
4475
4476 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4477}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004478
Jooyung Han91df2082019-11-20 01:49:42 +09004479func TestApexInVariousPartition(t *testing.T) {
4480 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004481 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004482 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004483 {"", "system"},
4484 {"product_specific: true", "product"},
4485 {"soc_specific: true", "vendor"},
4486 {"proprietary: true", "vendor"},
4487 {"vendor: true", "vendor"},
4488 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004489 }
4490 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004491 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004492 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004493 apex {
4494 name: "myapex",
4495 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004496 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004497 `+tc.propName+`
4498 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004499
Jooyung Han91df2082019-11-20 01:49:42 +09004500 apex_key {
4501 name: "myapex.key",
4502 public_key: "testkey.avbpubkey",
4503 private_key: "testkey.pem",
4504 }
4505 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004506
Jooyung Hana0503a52023-08-23 13:12:50 +09004507 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004508 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004509 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004510 if actual != expected {
4511 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4512 }
Jooyung Han91df2082019-11-20 01:49:42 +09004513 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004514 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004515}
Jiyong Park67882562019-03-21 01:11:21 +09004516
Jooyung Han580eb4f2020-06-24 19:33:06 +09004517func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004518 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004519 apex {
4520 name: "myapex",
4521 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004522 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004523 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004524
Jooyung Han580eb4f2020-06-24 19:33:06 +09004525 apex_key {
4526 name: "myapex.key",
4527 public_key: "testkey.avbpubkey",
4528 private_key: "testkey.pem",
4529 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004530 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004531 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004532 rule := module.Output("file_contexts")
4533 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4534}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004535
Jooyung Han580eb4f2020-06-24 19:33:06 +09004536func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004537 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004538 apex {
4539 name: "myapex",
4540 key: "myapex.key",
4541 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004542 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004543 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004544
Jooyung Han580eb4f2020-06-24 19:33:06 +09004545 apex_key {
4546 name: "myapex.key",
4547 public_key: "testkey.avbpubkey",
4548 private_key: "testkey.pem",
4549 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004550 `, withFiles(map[string][]byte{
4551 "my_own_file_contexts": nil,
4552 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004553}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004554
Jooyung Han580eb4f2020-06-24 19:33:06 +09004555func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004556 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004557 apex {
4558 name: "myapex",
4559 key: "myapex.key",
4560 product_specific: true,
4561 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004562 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004563 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004564
Jooyung Han580eb4f2020-06-24 19:33:06 +09004565 apex_key {
4566 name: "myapex.key",
4567 public_key: "testkey.avbpubkey",
4568 private_key: "testkey.pem",
4569 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004570 `)
4571
Colin Cross1c460562021-02-16 17:55:47 -08004572 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004573 apex {
4574 name: "myapex",
4575 key: "myapex.key",
4576 product_specific: true,
4577 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004578 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004579 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004580
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581 apex_key {
4582 name: "myapex.key",
4583 public_key: "testkey.avbpubkey",
4584 private_key: "testkey.pem",
4585 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004586 `, withFiles(map[string][]byte{
4587 "product_specific_file_contexts": nil,
4588 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004589 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004590 rule := module.Output("file_contexts")
4591 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4592}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004593
Jooyung Han580eb4f2020-06-24 19:33:06 +09004594func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004595 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004596 apex {
4597 name: "myapex",
4598 key: "myapex.key",
4599 product_specific: true,
4600 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004601 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004602 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004603
Jooyung Han580eb4f2020-06-24 19:33:06 +09004604 apex_key {
4605 name: "myapex.key",
4606 public_key: "testkey.avbpubkey",
4607 private_key: "testkey.pem",
4608 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004609
Jooyung Han580eb4f2020-06-24 19:33:06 +09004610 filegroup {
4611 name: "my-file-contexts",
4612 srcs: ["product_specific_file_contexts"],
4613 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004614 `, withFiles(map[string][]byte{
4615 "product_specific_file_contexts": nil,
4616 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004617 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004618 rule := module.Output("file_contexts")
4619 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004620}
4621
Jiyong Park67882562019-03-21 01:11:21 +09004622func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004623 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004624 apex_key {
4625 name: "myapex.key",
4626 public_key: ":my.avbpubkey",
4627 private_key: ":my.pem",
4628 product_specific: true,
4629 }
4630
4631 filegroup {
4632 name: "my.avbpubkey",
4633 srcs: ["testkey2.avbpubkey"],
4634 }
4635
4636 filegroup {
4637 name: "my.pem",
4638 srcs: ["testkey2.pem"],
4639 }
4640 `)
4641
4642 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4643 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004644 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004645 if actual_pubkey != expected_pubkey {
4646 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4647 }
4648 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004649 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004650 if actual_privkey != expected_privkey {
4651 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4652 }
4653}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004654
4655func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004656 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004657 prebuilt_apex {
4658 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004659 arch: {
4660 arm64: {
4661 src: "myapex-arm64.apex",
4662 },
4663 arm: {
4664 src: "myapex-arm.apex",
4665 },
4666 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004667 }
4668 `)
4669
Wei Li340ee8e2022-03-18 17:33:24 -07004670 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4671 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004672
Jiyong Parkc95714e2019-03-29 14:23:10 +09004673 expectedInput := "myapex-arm64.apex"
4674 if prebuilt.inputApex.String() != expectedInput {
4675 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4676 }
Wei Li340ee8e2022-03-18 17:33:24 -07004677 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4678 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4679 rule := testingModule.Rule("genProvenanceMetaData")
4680 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4681 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4682 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4683 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004684
4685 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4686 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004687}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004688
Paul Duffinc0609c62021-03-01 17:27:16 +00004689func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004690 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004691 prebuilt_apex {
4692 name: "myapex",
4693 }
4694 `)
4695}
4696
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004697func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004698 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004699 prebuilt_apex {
4700 name: "myapex",
4701 src: "myapex-arm.apex",
4702 filename: "notmyapex.apex",
4703 }
4704 `)
4705
Wei Li340ee8e2022-03-18 17:33:24 -07004706 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4707 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004708
4709 expected := "notmyapex.apex"
4710 if p.installFilename != expected {
4711 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4712 }
Wei Li340ee8e2022-03-18 17:33:24 -07004713 rule := testingModule.Rule("genProvenanceMetaData")
4714 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4715 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4716 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4717 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004718}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004719
Samiul Islam7c02e262021-09-08 17:48:28 +01004720func TestApexSetFilenameOverride(t *testing.T) {
4721 testApex(t, `
4722 apex_set {
4723 name: "com.company.android.myapex",
4724 apex_name: "com.android.myapex",
4725 set: "company-myapex.apks",
4726 filename: "com.company.android.myapex.apex"
4727 }
4728 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4729
4730 testApex(t, `
4731 apex_set {
4732 name: "com.company.android.myapex",
4733 apex_name: "com.android.myapex",
4734 set: "company-myapex.apks",
4735 filename: "com.company.android.myapex.capex"
4736 }
4737 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4738
4739 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4740 apex_set {
4741 name: "com.company.android.myapex",
4742 apex_name: "com.android.myapex",
4743 set: "company-myapex.apks",
4744 filename: "some-random-suffix"
4745 }
4746 `)
4747}
4748
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004749func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004750 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004751 prebuilt_apex {
4752 name: "myapex.prebuilt",
4753 src: "myapex-arm.apex",
4754 overrides: [
4755 "myapex",
4756 ],
4757 }
4758 `)
4759
Wei Li340ee8e2022-03-18 17:33:24 -07004760 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4761 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004762
4763 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004764 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004765 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004766 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004767 }
Wei Li340ee8e2022-03-18 17:33:24 -07004768 rule := testingModule.Rule("genProvenanceMetaData")
4769 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4770 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4771 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4772 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004773}
4774
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004775func TestPrebuiltApexName(t *testing.T) {
4776 testApex(t, `
4777 prebuilt_apex {
4778 name: "com.company.android.myapex",
4779 apex_name: "com.android.myapex",
4780 src: "company-myapex-arm.apex",
4781 }
4782 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4783
4784 testApex(t, `
4785 apex_set {
4786 name: "com.company.android.myapex",
4787 apex_name: "com.android.myapex",
4788 set: "company-myapex.apks",
4789 }
4790 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4791}
4792
4793func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4794 _ = android.GroupFixturePreparers(
4795 java.PrepareForTestWithJavaDefaultModules,
4796 PrepareForTestWithApexBuildComponents,
4797 android.FixtureWithRootAndroidBp(`
4798 platform_bootclasspath {
4799 name: "platform-bootclasspath",
4800 fragments: [
4801 {
4802 apex: "com.android.art",
4803 module: "art-bootclasspath-fragment",
4804 },
4805 ],
4806 }
4807
4808 prebuilt_apex {
4809 name: "com.company.android.art",
4810 apex_name: "com.android.art",
4811 src: "com.company.android.art-arm.apex",
4812 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4813 }
4814
4815 prebuilt_bootclasspath_fragment {
4816 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004817 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004818 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004819 hidden_api: {
4820 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4821 metadata: "my-bootclasspath-fragment/metadata.csv",
4822 index: "my-bootclasspath-fragment/index.csv",
4823 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4824 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4825 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004826 }
4827
4828 java_import {
4829 name: "core-oj",
4830 jars: ["prebuilt.jar"],
4831 }
4832 `),
4833 ).RunTest(t)
4834}
4835
Spandan Das59a4a2b2024-01-09 21:35:56 +00004836// A minimal context object for use with DexJarBuildPath
4837type moduleErrorfTestCtx struct {
4838}
4839
4840func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4841}
4842
Paul Duffin092153d2021-01-26 11:42:39 +00004843// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4844// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004845func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004846 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004847
Paul Duffin89886cb2021-02-05 16:44:03 +00004848 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004849 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004850 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004851 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00004852 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004853 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004854 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00004855 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09004856 android.NormalizePathForTesting(dexJarBuildPath))
4857 }
4858
4859 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004860 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004861 // Make sure the import has been given the correct path to the dex jar.
4862 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4863 dexJarBuildPath := p.DexJarInstallPath()
4864 stem := android.RemoveOptionalPrebuiltPrefix(name)
4865 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4866 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4867 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004868 }
4869
Paul Duffin39853512021-02-26 11:09:39 +00004870 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004871 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004872 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004873 android.AssertArrayString(t, "Check if there is no source variant",
4874 []string{"android_common"},
4875 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004876 }
4877
4878 t.Run("prebuilt only", func(t *testing.T) {
4879 bp := `
4880 prebuilt_apex {
4881 name: "myapex",
4882 arch: {
4883 arm64: {
4884 src: "myapex-arm64.apex",
4885 },
4886 arm: {
4887 src: "myapex-arm.apex",
4888 },
4889 },
Paul Duffin39853512021-02-26 11:09:39 +00004890 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004891 }
4892
4893 java_import {
4894 name: "libfoo",
4895 jars: ["libfoo.jar"],
4896 }
Paul Duffin39853512021-02-26 11:09:39 +00004897
4898 java_sdk_library_import {
4899 name: "libbar",
4900 public: {
4901 jars: ["libbar.jar"],
4902 },
4903 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004904 `
4905
4906 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4907 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4908
Spandan Das3576e762024-01-03 18:57:03 +00004909 deapexerName := deapexerModuleName("prebuilt_myapex")
4910 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01004911
Paul Duffinf6932af2021-02-26 18:21:56 +00004912 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004913 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004914 rule := deapexer.Rule("deapexer")
4915 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4916 t.Errorf("expected: %q, found: %q", expected, actual)
4917 }
4918
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004919 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004920 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004921 rule = prebuiltApex.Rule("android/soong/android.Cp")
4922 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4923 t.Errorf("expected: %q, found: %q", expected, actual)
4924 }
4925
Paul Duffin89886cb2021-02-05 16:44:03 +00004926 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004927 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004928
4929 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004930 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004931 })
4932
4933 t.Run("prebuilt with source preferred", func(t *testing.T) {
4934
4935 bp := `
4936 prebuilt_apex {
4937 name: "myapex",
4938 arch: {
4939 arm64: {
4940 src: "myapex-arm64.apex",
4941 },
4942 arm: {
4943 src: "myapex-arm.apex",
4944 },
4945 },
Paul Duffin39853512021-02-26 11:09:39 +00004946 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004947 }
4948
4949 java_import {
4950 name: "libfoo",
4951 jars: ["libfoo.jar"],
4952 }
4953
4954 java_library {
4955 name: "libfoo",
4956 }
Paul Duffin39853512021-02-26 11:09:39 +00004957
4958 java_sdk_library_import {
4959 name: "libbar",
4960 public: {
4961 jars: ["libbar.jar"],
4962 },
4963 }
4964
4965 java_sdk_library {
4966 name: "libbar",
4967 srcs: ["foo/bar/MyClass.java"],
4968 unsafe_ignore_missing_latest_api: true,
4969 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004970 `
4971
4972 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4973 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4974
Paul Duffin89886cb2021-02-05 16:44:03 +00004975 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004976 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Satish Yallab2b1ef62024-08-28 05:10:31 +00004977 ensureNoSourceVariant(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004978
4979 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004980 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Satish Yallab2b1ef62024-08-28 05:10:31 +00004981 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004982 })
4983
4984 t.Run("prebuilt preferred with source", func(t *testing.T) {
4985 bp := `
4986 prebuilt_apex {
4987 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004988 arch: {
4989 arm64: {
4990 src: "myapex-arm64.apex",
4991 },
4992 arm: {
4993 src: "myapex-arm.apex",
4994 },
4995 },
Paul Duffin39853512021-02-26 11:09:39 +00004996 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004997 }
4998
4999 java_import {
5000 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005001 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005002 jars: ["libfoo.jar"],
5003 }
5004
5005 java_library {
5006 name: "libfoo",
5007 }
Paul Duffin39853512021-02-26 11:09:39 +00005008
5009 java_sdk_library_import {
5010 name: "libbar",
5011 prefer: true,
5012 public: {
5013 jars: ["libbar.jar"],
5014 },
5015 }
5016
5017 java_sdk_library {
5018 name: "libbar",
5019 srcs: ["foo/bar/MyClass.java"],
5020 unsafe_ignore_missing_latest_api: true,
5021 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005022 `
5023
5024 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5025 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5026
Paul Duffin89886cb2021-02-05 16:44:03 +00005027 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005028 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005029 ensureNoSourceVariant(t, ctx, "libfoo")
5030
5031 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005032 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005033 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005034 })
5035}
5036
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005037func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005038 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005039 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005040 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5041 // is disabled.
5042 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005043
5044 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5045 // file creation.
5046 java.FixtureConfigureBootJars("platform:foo"),
5047 android.FixtureModifyMockFS(func(fs android.MockFS) {
5048 fs["platform/Android.bp"] = []byte(`
5049 java_library {
5050 name: "foo",
5051 srcs: ["Test.java"],
5052 compile_dex: true,
5053 }
5054 `)
5055 fs["platform/Test.java"] = nil
5056 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005057 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005058
Paul Duffin37856732021-02-26 14:24:15 +00005059 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5060 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005061 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005062 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005063 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005064 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005065 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005066 foundLibfooJar = true
5067 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005068 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005069 }
5070 }
5071 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005072 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 +00005073 }
5074 }
5075
Paul Duffin40a3f652021-07-19 13:11:24 +01005076 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005077 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005078 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005079 var rule android.TestingBuildParams
5080
5081 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5082 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005083 }
5084
Paul Duffin40a3f652021-07-19 13:11:24 +01005085 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5086 t.Helper()
5087 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5088 var rule android.TestingBuildParams
5089
5090 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5091 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5092 }
5093
Paul Duffin89f570a2021-06-16 01:42:33 +01005094 fragment := java.ApexVariantReference{
5095 Apex: proptools.StringPtr("myapex"),
5096 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5097 }
5098
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005099 t.Run("prebuilt only", func(t *testing.T) {
5100 bp := `
5101 prebuilt_apex {
5102 name: "myapex",
5103 arch: {
5104 arm64: {
5105 src: "myapex-arm64.apex",
5106 },
5107 arm: {
5108 src: "myapex-arm.apex",
5109 },
5110 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005111 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5112 }
5113
5114 prebuilt_bootclasspath_fragment {
5115 name: "my-bootclasspath-fragment",
5116 contents: ["libfoo", "libbar"],
5117 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005118 hidden_api: {
5119 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5120 metadata: "my-bootclasspath-fragment/metadata.csv",
5121 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005122 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5123 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5124 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005125 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005126 }
5127
5128 java_import {
5129 name: "libfoo",
5130 jars: ["libfoo.jar"],
5131 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005132 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005133 }
Paul Duffin37856732021-02-26 14:24:15 +00005134
5135 java_sdk_library_import {
5136 name: "libbar",
5137 public: {
5138 jars: ["libbar.jar"],
5139 },
5140 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005141 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005142 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005143 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005144 `
5145
Paul Duffin89f570a2021-06-16 01:42:33 +01005146 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005147 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5148 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005149
Paul Duffin537ea3d2021-05-14 10:38:00 +01005150 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005151 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005152 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005153 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005154 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005155 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 +01005156 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005157 })
5158
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005159 t.Run("apex_set only", func(t *testing.T) {
5160 bp := `
5161 apex_set {
5162 name: "myapex",
5163 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005164 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005165 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005166 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5167 }
5168
5169 java_import {
5170 name: "myjavalib",
5171 jars: ["myjavalib.jar"],
5172 apex_available: ["myapex"],
5173 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005174 }
5175
5176 prebuilt_bootclasspath_fragment {
5177 name: "my-bootclasspath-fragment",
5178 contents: ["libfoo", "libbar"],
5179 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005180 hidden_api: {
5181 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5182 metadata: "my-bootclasspath-fragment/metadata.csv",
5183 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005184 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5185 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5186 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005187 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005188 }
5189
Liz Kammer2dc72442023-04-20 10:10:48 -04005190 prebuilt_systemserverclasspath_fragment {
5191 name: "my-systemserverclasspath-fragment",
5192 contents: ["libbaz"],
5193 apex_available: ["myapex"],
5194 }
5195
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005196 java_import {
5197 name: "libfoo",
5198 jars: ["libfoo.jar"],
5199 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005200 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005201 }
5202
5203 java_sdk_library_import {
5204 name: "libbar",
5205 public: {
5206 jars: ["libbar.jar"],
5207 },
5208 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005209 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005210 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005211 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005212
5213 java_sdk_library_import {
5214 name: "libbaz",
5215 public: {
5216 jars: ["libbaz.jar"],
5217 },
5218 apex_available: ["myapex"],
5219 shared_library: false,
5220 permitted_packages: ["baz"],
5221 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005222 `
5223
Paul Duffin89f570a2021-06-16 01:42:33 +01005224 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005225 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5226 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005227
Paul Duffin537ea3d2021-05-14 10:38:00 +01005228 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005229 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005230 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005231 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005232 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005233 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 +01005234 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005235
5236 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5237
5238 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005239 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005240 "myjavalib.myapex",
5241 "libfoo.myapex",
5242 "libbar.myapex",
5243 "libbaz.myapex",
5244 }
5245 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5246 for i, e := range mkEntries {
5247 g := e.OverrideName
5248 if w := overrideNames[i]; w != g {
5249 t.Errorf("Expected override name %q, got %q", w, g)
5250 }
5251 }
5252
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005253 })
5254
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005255 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5256 bp := `
5257 prebuilt_apex {
5258 name: "myapex",
5259 arch: {
5260 arm64: {
5261 src: "myapex-arm64.apex",
5262 },
5263 arm: {
5264 src: "myapex-arm.apex",
5265 },
5266 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005267 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5268 }
5269
5270 prebuilt_bootclasspath_fragment {
5271 name: "my-bootclasspath-fragment",
5272 contents: ["libfoo", "libbar"],
5273 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005274 hidden_api: {
5275 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5276 metadata: "my-bootclasspath-fragment/metadata.csv",
5277 index: "my-bootclasspath-fragment/index.csv",
5278 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5279 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5280 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005281 }
5282
5283 java_import {
5284 name: "libfoo",
5285 jars: ["libfoo.jar"],
5286 apex_available: ["myapex"],
5287 }
5288
5289 java_library {
5290 name: "libfoo",
5291 srcs: ["foo/bar/MyClass.java"],
5292 apex_available: ["myapex"],
5293 }
Paul Duffin37856732021-02-26 14:24:15 +00005294
5295 java_sdk_library_import {
5296 name: "libbar",
5297 public: {
5298 jars: ["libbar.jar"],
5299 },
5300 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005301 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005302 }
5303
5304 java_sdk_library {
5305 name: "libbar",
5306 srcs: ["foo/bar/MyClass.java"],
5307 unsafe_ignore_missing_latest_api: true,
5308 apex_available: ["myapex"],
5309 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310 `
5311
5312 // In this test the source (java_library) libfoo is active since the
5313 // prebuilt (java_import) defaults to prefer:false. However the
5314 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5315 // find the dex boot jar in it. We either need to disable the source libfoo
5316 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005317 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005318 // dexbootjar check is skipped if AllowMissingDependencies is true
5319 preparerAllowMissingDeps := android.GroupFixturePreparers(
5320 preparer,
5321 android.PrepareForTestWithAllowMissingDependencies,
5322 )
5323 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005324 })
5325
5326 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5327 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005328 apex {
5329 name: "myapex",
5330 key: "myapex.key",
5331 updatable: false,
5332 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5333 }
5334
5335 apex_key {
5336 name: "myapex.key",
5337 public_key: "testkey.avbpubkey",
5338 private_key: "testkey.pem",
5339 }
5340
5341 bootclasspath_fragment {
5342 name: "my-bootclasspath-fragment",
5343 contents: ["libfoo", "libbar"],
5344 apex_available: ["myapex"],
5345 hidden_api: {
5346 split_packages: ["*"],
5347 },
5348 }
5349
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005350 prebuilt_apex {
5351 name: "myapex",
5352 arch: {
5353 arm64: {
5354 src: "myapex-arm64.apex",
5355 },
5356 arm: {
5357 src: "myapex-arm.apex",
5358 },
5359 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005360 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5361 }
5362
5363 prebuilt_bootclasspath_fragment {
5364 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005365 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005366 contents: ["libfoo", "libbar"],
5367 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005368 hidden_api: {
5369 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5370 metadata: "my-bootclasspath-fragment/metadata.csv",
5371 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005372 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5373 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5374 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005375 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005376 }
5377
5378 java_import {
5379 name: "libfoo",
5380 prefer: true,
5381 jars: ["libfoo.jar"],
5382 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005383 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005384 }
5385
5386 java_library {
5387 name: "libfoo",
5388 srcs: ["foo/bar/MyClass.java"],
5389 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005390 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005391 }
Paul Duffin37856732021-02-26 14:24:15 +00005392
5393 java_sdk_library_import {
5394 name: "libbar",
5395 prefer: true,
5396 public: {
5397 jars: ["libbar.jar"],
5398 },
5399 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005400 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005401 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005402 }
5403
5404 java_sdk_library {
5405 name: "libbar",
5406 srcs: ["foo/bar/MyClass.java"],
5407 unsafe_ignore_missing_latest_api: true,
5408 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005409 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005410 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005411 `
5412
Paul Duffin89f570a2021-06-16 01:42:33 +01005413 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005414 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5415 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005416
Paul Duffin537ea3d2021-05-14 10:38:00 +01005417 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005418 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005419 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005420 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005421 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005422 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 +01005423 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005424 })
5425
5426 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5427 bp := `
5428 apex {
5429 name: "myapex",
5430 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005431 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005432 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005433 }
5434
5435 apex_key {
5436 name: "myapex.key",
5437 public_key: "testkey.avbpubkey",
5438 private_key: "testkey.pem",
5439 }
5440
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005441 bootclasspath_fragment {
5442 name: "my-bootclasspath-fragment",
5443 contents: ["libfoo", "libbar"],
5444 apex_available: ["myapex"],
5445 hidden_api: {
5446 split_packages: ["*"],
5447 },
5448 }
5449
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005450 prebuilt_apex {
5451 name: "myapex",
5452 arch: {
5453 arm64: {
5454 src: "myapex-arm64.apex",
5455 },
5456 arm: {
5457 src: "myapex-arm.apex",
5458 },
5459 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005460 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5461 }
5462
5463 prebuilt_bootclasspath_fragment {
5464 name: "my-bootclasspath-fragment",
5465 contents: ["libfoo", "libbar"],
5466 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005467 hidden_api: {
5468 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5469 metadata: "my-bootclasspath-fragment/metadata.csv",
5470 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005471 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5472 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5473 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005474 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005475 }
5476
5477 java_import {
5478 name: "libfoo",
5479 jars: ["libfoo.jar"],
5480 apex_available: ["myapex"],
5481 }
5482
5483 java_library {
5484 name: "libfoo",
5485 srcs: ["foo/bar/MyClass.java"],
5486 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005487 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005488 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005489 }
Paul Duffin37856732021-02-26 14:24:15 +00005490
5491 java_sdk_library_import {
5492 name: "libbar",
5493 public: {
5494 jars: ["libbar.jar"],
5495 },
5496 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005497 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005498 }
5499
5500 java_sdk_library {
5501 name: "libbar",
5502 srcs: ["foo/bar/MyClass.java"],
5503 unsafe_ignore_missing_latest_api: true,
5504 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005505 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005506 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005507 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005508 `
5509
Paul Duffin89f570a2021-06-16 01:42:33 +01005510 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005511 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5512 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 +00005513
Paul Duffin537ea3d2021-05-14 10:38:00 +01005514 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005515 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005516 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5517 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005518 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5519 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 +01005520 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005521 })
5522
5523 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5524 bp := `
5525 apex {
5526 name: "myapex",
5527 enabled: false,
5528 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005529 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005530 }
5531
5532 apex_key {
5533 name: "myapex.key",
5534 public_key: "testkey.avbpubkey",
5535 private_key: "testkey.pem",
5536 }
5537
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005538 bootclasspath_fragment {
5539 name: "my-bootclasspath-fragment",
5540 enabled: false,
5541 contents: ["libfoo", "libbar"],
5542 apex_available: ["myapex"],
5543 hidden_api: {
5544 split_packages: ["*"],
5545 },
5546 }
5547
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005548 prebuilt_apex {
5549 name: "myapex",
5550 arch: {
5551 arm64: {
5552 src: "myapex-arm64.apex",
5553 },
5554 arm: {
5555 src: "myapex-arm.apex",
5556 },
5557 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005558 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5559 }
5560
5561 prebuilt_bootclasspath_fragment {
5562 name: "my-bootclasspath-fragment",
5563 contents: ["libfoo", "libbar"],
5564 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005565 hidden_api: {
5566 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5567 metadata: "my-bootclasspath-fragment/metadata.csv",
5568 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005569 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5570 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5571 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005572 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005573 }
5574
5575 java_import {
5576 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005577 jars: ["libfoo.jar"],
5578 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005579 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005580 }
5581
5582 java_library {
5583 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005584 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005585 srcs: ["foo/bar/MyClass.java"],
5586 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005587 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005588 }
Paul Duffin37856732021-02-26 14:24:15 +00005589
5590 java_sdk_library_import {
5591 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005592 public: {
5593 jars: ["libbar.jar"],
5594 },
5595 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005596 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005597 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005598 }
5599
5600 java_sdk_library {
5601 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005602 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005603 srcs: ["foo/bar/MyClass.java"],
5604 unsafe_ignore_missing_latest_api: true,
5605 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005606 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005607 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005608 `
Cole Fausta963b942024-04-11 17:43:00 -07005609 // This test disables libbar, which causes the ComponentDepsMutator to add
5610 // deps on libbar.stubs and other sub-modules that don't exist. We can
5611 // enable AllowMissingDependencies to work around that, but enabling that
5612 // causes extra checks for missing source files to dex_bootjars, so add those
5613 // to the mock fs as well.
5614 preparer2 := android.GroupFixturePreparers(
5615 preparer,
5616 android.PrepareForTestWithAllowMissingDependencies,
5617 android.FixtureMergeMockFs(map[string][]byte{
5618 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5619 "frameworks/base/config/boot-profile.txt": nil,
5620 }),
5621 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005622
Cole Fausta963b942024-04-11 17:43:00 -07005623 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005624 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5625 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005626
Paul Duffin537ea3d2021-05-14 10:38:00 +01005627 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005628 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005629 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005630 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005631 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005632 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 +01005633 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005634 })
Spandan Das3a392012024-01-17 18:26:27 +00005635
Spandan Dasf2c10572024-02-27 04:49:52 +00005636 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005637 bp := `
5638 // Source
5639 apex {
5640 name: "myapex",
5641 enabled: false,
5642 key: "myapex.key",
5643 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5644 }
5645
5646 apex_key {
5647 name: "myapex.key",
5648 public_key: "testkey.avbpubkey",
5649 private_key: "testkey.pem",
5650 }
5651
5652 // Prebuilt
5653 prebuilt_apex {
5654 name: "myapex.v1",
5655 source_apex_name: "myapex",
5656 arch: {
5657 arm64: {
5658 src: "myapex-arm64.apex",
5659 },
5660 arm: {
5661 src: "myapex-arm.apex",
5662 },
5663 },
5664 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5665 prefer: true,
5666 }
5667 prebuilt_apex {
5668 name: "myapex.v2",
5669 source_apex_name: "myapex",
5670 arch: {
5671 arm64: {
5672 src: "myapex-arm64.apex",
5673 },
5674 arm: {
5675 src: "myapex-arm.apex",
5676 },
5677 },
5678 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5679 prefer: true,
5680 }
5681
5682 prebuilt_bootclasspath_fragment {
5683 name: "my-bootclasspath-fragment",
5684 contents: ["libfoo", "libbar"],
5685 apex_available: ["myapex"],
5686 hidden_api: {
5687 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5688 metadata: "my-bootclasspath-fragment/metadata.csv",
5689 index: "my-bootclasspath-fragment/index.csv",
5690 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5691 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5692 },
5693 prefer: true,
5694 }
5695
5696 java_import {
5697 name: "libfoo",
5698 jars: ["libfoo.jar"],
5699 apex_available: ["myapex"],
5700 prefer: true,
5701 }
5702 java_import {
5703 name: "libbar",
5704 jars: ["libbar.jar"],
5705 apex_available: ["myapex"],
5706 prefer: true,
5707 }
5708 `
5709
Spandan Dasf2c10572024-02-27 04:49:52 +00005710 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 +00005711 })
5712
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005713}
5714
Roland Levillain630846d2019-06-26 12:48:34 +01005715func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005716 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005717 apex_test {
5718 name: "myapex",
5719 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005720 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005721 tests: [
5722 "mytest",
5723 ],
5724 }
5725
5726 apex_key {
5727 name: "myapex.key",
5728 public_key: "testkey.avbpubkey",
5729 private_key: "testkey.pem",
5730 }
5731
Liz Kammer1c14a212020-05-12 15:26:55 -07005732 filegroup {
5733 name: "fg",
5734 srcs: [
5735 "baz",
5736 "bar/baz"
5737 ],
5738 }
5739
Roland Levillain630846d2019-06-26 12:48:34 +01005740 cc_test {
5741 name: "mytest",
5742 gtest: false,
5743 srcs: ["mytest.cpp"],
5744 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005745 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005746 system_shared_libs: [],
5747 static_executable: true,
5748 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005749 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005750 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005751
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005752 cc_library {
5753 name: "mylib",
5754 srcs: ["mylib.cpp"],
5755 system_shared_libs: [],
5756 stl: "none",
5757 }
5758
Liz Kammer5bd365f2020-05-27 15:15:11 -07005759 filegroup {
5760 name: "fg2",
5761 srcs: [
5762 "testdata/baz"
5763 ],
5764 }
Roland Levillain630846d2019-06-26 12:48:34 +01005765 `)
5766
Jooyung Hana0503a52023-08-23 13:12:50 +09005767 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005768 copyCmds := apexRule.Args["copy_commands"]
5769
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005770 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005771 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005772 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005773
Liz Kammer1c14a212020-05-12 15:26:55 -07005774 //Ensure that test data are copied into apex.
5775 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5776 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5777
Roland Levillainf89cd092019-07-29 16:22:59 +01005778 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005779 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005780 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005781 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005782 prefix := "TARGET_"
5783 var builder strings.Builder
5784 data.Custom(&builder, name, prefix, "", data)
5785 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005786 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005787 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005788}
5789
Jooyung Hand48f3c32019-08-23 11:18:57 +09005790func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5791 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5792 apex {
5793 name: "myapex",
5794 key: "myapex.key",
5795 native_shared_libs: ["libfoo"],
5796 }
5797
5798 apex_key {
5799 name: "myapex.key",
5800 public_key: "testkey.avbpubkey",
5801 private_key: "testkey.pem",
5802 }
5803
5804 cc_library {
5805 name: "libfoo",
5806 stl: "none",
5807 system_shared_libs: [],
5808 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005809 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005810 }
5811 `)
5812 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5813 apex {
5814 name: "myapex",
5815 key: "myapex.key",
5816 java_libs: ["myjar"],
5817 }
5818
5819 apex_key {
5820 name: "myapex.key",
5821 public_key: "testkey.avbpubkey",
5822 private_key: "testkey.pem",
5823 }
5824
5825 java_library {
5826 name: "myjar",
5827 srcs: ["foo/bar/MyClass.java"],
5828 sdk_version: "none",
5829 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005830 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005831 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005832 }
5833 `)
5834}
5835
Bill Peckhama41a6962021-01-11 10:58:54 -08005836func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005837 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005838 apex {
5839 name: "myapex",
5840 key: "myapex.key",
5841 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005842 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005843 }
5844
5845 apex_key {
5846 name: "myapex.key",
5847 public_key: "testkey.avbpubkey",
5848 private_key: "testkey.pem",
5849 }
5850
5851 java_import {
5852 name: "myjavaimport",
5853 apex_available: ["myapex"],
5854 jars: ["my.jar"],
5855 compile_dex: true,
5856 }
5857 `)
5858
Jooyung Hana0503a52023-08-23 13:12:50 +09005859 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005860 apexRule := module.Rule("apexRule")
5861 copyCmds := apexRule.Args["copy_commands"]
5862 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5863}
5864
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005865func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005866 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005867 apex {
5868 name: "myapex",
5869 key: "myapex.key",
5870 apps: [
5871 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005872 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005873 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005874 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005875 }
5876
5877 apex_key {
5878 name: "myapex.key",
5879 public_key: "testkey.avbpubkey",
5880 private_key: "testkey.pem",
5881 }
5882
5883 android_app {
5884 name: "AppFoo",
5885 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005886 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005887 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005888 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005889 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005891 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005892 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005893
5894 android_app {
5895 name: "AppFooPriv",
5896 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005897 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005898 system_modules: "none",
5899 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005900 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005901 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005902 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005903 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005904
5905 cc_library_shared {
5906 name: "libjni",
5907 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005908 shared_libs: ["libfoo"],
5909 stl: "none",
5910 system_shared_libs: [],
5911 apex_available: [ "myapex" ],
5912 sdk_version: "current",
5913 }
5914
5915 cc_library_shared {
5916 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005917 stl: "none",
5918 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005919 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005920 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005921 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005922 `)
5923
Jooyung Hana0503a52023-08-23 13:12:50 +09005924 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005925 apexRule := module.Rule("apexRule")
5926 copyCmds := apexRule.Args["copy_commands"]
5927
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005928 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5929 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005930 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005931
Colin Crossaede88c2020-08-11 12:17:01 -07005932 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005933 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005934 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005935 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005936 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005937 // JNI libraries including transitive deps are
5938 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005939 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005940 // ... embedded inside APK (jnilibs.zip)
5941 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5942 // ... and not directly inside the APEX
5943 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5944 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005945
5946 apexBundle := module.Module().(*apexBundle)
5947 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5948 var builder strings.Builder
5949 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5950 androidMk := builder.String()
5951 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5952 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5953 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5954 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5955 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5956 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 +01005957}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005958
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005959func TestApexWithAppImportBuildId(t *testing.T) {
5960 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5961 for _, id := range invalidBuildIds {
5962 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5963 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5964 variables.BuildId = proptools.StringPtr(id)
5965 })
5966 testApexError(t, message, `apex {
5967 name: "myapex",
5968 key: "myapex.key",
5969 apps: ["AppFooPrebuilt"],
5970 updatable: false,
5971 }
5972
5973 apex_key {
5974 name: "myapex.key",
5975 public_key: "testkey.avbpubkey",
5976 private_key: "testkey.pem",
5977 }
5978
5979 android_app_import {
5980 name: "AppFooPrebuilt",
5981 apk: "PrebuiltAppFoo.apk",
5982 presigned: true,
5983 apex_available: ["myapex"],
5984 }
5985 `, fixture)
5986 }
5987}
5988
Dario Frenicde2a032019-10-27 00:29:22 +01005989func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005990 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005991 apex {
5992 name: "myapex",
5993 key: "myapex.key",
5994 apps: [
5995 "AppFooPrebuilt",
5996 "AppFooPrivPrebuilt",
5997 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005998 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005999 }
6000
6001 apex_key {
6002 name: "myapex.key",
6003 public_key: "testkey.avbpubkey",
6004 private_key: "testkey.pem",
6005 }
6006
6007 android_app_import {
6008 name: "AppFooPrebuilt",
6009 apk: "PrebuiltAppFoo.apk",
6010 presigned: true,
6011 dex_preopt: {
6012 enabled: false,
6013 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006014 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006015 }
6016
6017 android_app_import {
6018 name: "AppFooPrivPrebuilt",
6019 apk: "PrebuiltAppFooPriv.apk",
6020 privileged: true,
6021 presigned: true,
6022 dex_preopt: {
6023 enabled: false,
6024 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006025 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006026 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006027 }
6028 `)
6029
Jooyung Hana0503a52023-08-23 13:12:50 +09006030 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006031 apexRule := module.Rule("apexRule")
6032 copyCmds := apexRule.Args["copy_commands"]
6033
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006034 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6035 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006036}
6037
6038func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006039 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006040 apex {
6041 name: "myapex",
6042 key: "myapex.key",
6043 apps: [
6044 "AppFoo",
6045 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006046 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006047 }
6048
6049 apex_key {
6050 name: "myapex.key",
6051 public_key: "testkey.avbpubkey",
6052 private_key: "testkey.pem",
6053 }
6054
6055 android_app {
6056 name: "AppFoo",
6057 srcs: ["foo/bar/MyClass.java"],
6058 sdk_version: "none",
6059 system_modules: "none",
6060 apex_available: [ "myapex" ],
6061 }
6062
6063 android_app_import {
6064 name: "AppFoo",
6065 apk: "AppFooPrebuilt.apk",
6066 filename: "AppFooPrebuilt.apk",
6067 presigned: true,
6068 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006069 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006070 }
6071 `, withFiles(map[string][]byte{
6072 "AppFooPrebuilt.apk": nil,
6073 }))
6074
Jooyung Hana0503a52023-08-23 13:12:50 +09006075 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006076 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006077 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006078}
6079
Dario Freni6f3937c2019-12-20 22:58:03 +00006080func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006081 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006082 apex {
6083 name: "myapex",
6084 key: "myapex.key",
6085 apps: [
6086 "TesterHelpAppFoo",
6087 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006088 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006089 }
6090
6091 apex_key {
6092 name: "myapex.key",
6093 public_key: "testkey.avbpubkey",
6094 private_key: "testkey.pem",
6095 }
6096
6097 android_test_helper_app {
6098 name: "TesterHelpAppFoo",
6099 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006100 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006101 }
6102
6103 `)
6104
Jooyung Hana0503a52023-08-23 13:12:50 +09006105 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006106 apexRule := module.Rule("apexRule")
6107 copyCmds := apexRule.Args["copy_commands"]
6108
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006109 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006110}
6111
Jooyung Han18020ea2019-11-13 10:50:48 +09006112func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6113 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006114 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006115 apex {
6116 name: "myapex",
6117 key: "myapex.key",
6118 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006119 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006120 }
6121
6122 apex_key {
6123 name: "myapex.key",
6124 public_key: "testkey.avbpubkey",
6125 private_key: "testkey.pem",
6126 }
6127
6128 apex {
6129 name: "otherapex",
6130 key: "myapex.key",
6131 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006132 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006133 }
6134
6135 cc_defaults {
6136 name: "libfoo-defaults",
6137 apex_available: ["otherapex"],
6138 }
6139
6140 cc_library {
6141 name: "libfoo",
6142 defaults: ["libfoo-defaults"],
6143 stl: "none",
6144 system_shared_libs: [],
6145 }`)
6146}
6147
Paul Duffine52e66f2020-03-30 17:54:29 +01006148func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006149 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006150 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006151 apex {
6152 name: "myapex",
6153 key: "myapex.key",
6154 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006155 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006156 }
6157
6158 apex_key {
6159 name: "myapex.key",
6160 public_key: "testkey.avbpubkey",
6161 private_key: "testkey.pem",
6162 }
6163
6164 apex {
6165 name: "otherapex",
6166 key: "otherapex.key",
6167 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006168 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006169 }
6170
6171 apex_key {
6172 name: "otherapex.key",
6173 public_key: "testkey.avbpubkey",
6174 private_key: "testkey.pem",
6175 }
6176
6177 cc_library {
6178 name: "libfoo",
6179 stl: "none",
6180 system_shared_libs: [],
6181 apex_available: ["otherapex"],
6182 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006183}
Jiyong Park127b40b2019-09-30 16:04:35 +09006184
Paul Duffine52e66f2020-03-30 17:54:29 +01006185func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006186 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006187 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006188.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006189.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006190.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006191.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006192.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006193.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006194 apex {
6195 name: "myapex",
6196 key: "myapex.key",
6197 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006198 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006199 }
6200
6201 apex_key {
6202 name: "myapex.key",
6203 public_key: "testkey.avbpubkey",
6204 private_key: "testkey.pem",
6205 }
6206
Jiyong Park127b40b2019-09-30 16:04:35 +09006207 cc_library {
6208 name: "libfoo",
6209 stl: "none",
6210 shared_libs: ["libbar"],
6211 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006212 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006213 }
6214
6215 cc_library {
6216 name: "libbar",
6217 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006218 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006219 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006220 apex_available: ["myapex"],
6221 }
6222
6223 cc_library {
6224 name: "libbaz",
6225 stl: "none",
6226 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006227 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006228}
Jiyong Park127b40b2019-09-30 16:04:35 +09006229
Liz Kammer5f108fa2023-05-11 14:33:17 -04006230func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6231 testApex(t, `
6232 apex {
6233 name: "myapex",
6234 key: "myapex.key",
6235 native_shared_libs: ["libfoo"],
6236 updatable: false,
6237 }
6238
6239 apex_key {
6240 name: "myapex.key",
6241 public_key: "testkey.avbpubkey",
6242 private_key: "testkey.pem",
6243 }
6244
6245 cc_library {
6246 name: "libfoo",
6247 stl: "none",
6248 static_libs: ["libbar"],
6249 system_shared_libs: [],
6250 apex_available: ["myapex"],
6251 }
6252
6253 cc_library {
6254 name: "libbar",
6255 stl: "none",
6256 shared_libs: ["libbaz"],
6257 system_shared_libs: [],
6258 apex_available: ["myapex"],
6259 }
6260
6261 cc_library {
6262 name: "libbaz",
6263 stl: "none",
6264 system_shared_libs: [],
6265 }`)
6266
6267 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6268 apex {
6269 name: "myapex",
6270 key: "myapex.key",
6271 native_shared_libs: ["libfoo"],
6272 updatable: false,
6273 }
6274
6275 apex_key {
6276 name: "myapex.key",
6277 public_key: "testkey.avbpubkey",
6278 private_key: "testkey.pem",
6279 }
6280
6281 cc_library {
6282 name: "libfoo",
6283 stl: "none",
6284 static_libs: ["libbar"],
6285 system_shared_libs: [],
6286 apex_available: ["myapex"],
6287 }
6288
6289 cc_library {
6290 name: "libbar",
6291 stl: "none",
6292 system_shared_libs: [],
6293 }`)
6294}
6295
Paul Duffine52e66f2020-03-30 17:54:29 +01006296func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006297 testApexError(t, "\"otherapex\" is not a valid module name", `
6298 apex {
6299 name: "myapex",
6300 key: "myapex.key",
6301 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006302 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006303 }
6304
6305 apex_key {
6306 name: "myapex.key",
6307 public_key: "testkey.avbpubkey",
6308 private_key: "testkey.pem",
6309 }
6310
6311 cc_library {
6312 name: "libfoo",
6313 stl: "none",
6314 system_shared_libs: [],
6315 apex_available: ["otherapex"],
6316 }`)
6317
Paul Duffine52e66f2020-03-30 17:54:29 +01006318 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006319 apex {
6320 name: "myapex",
6321 key: "myapex.key",
6322 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006323 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006324 }
6325
6326 apex_key {
6327 name: "myapex.key",
6328 public_key: "testkey.avbpubkey",
6329 private_key: "testkey.pem",
6330 }
6331
6332 cc_library {
6333 name: "libfoo",
6334 stl: "none",
6335 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006336 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006337 apex_available: ["myapex"],
6338 }
6339
6340 cc_library {
6341 name: "libbar",
6342 stl: "none",
6343 system_shared_libs: [],
6344 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006345 }
6346
6347 cc_library {
6348 name: "libbaz",
6349 stl: "none",
6350 system_shared_libs: [],
6351 stubs: {
6352 versions: ["10", "20", "30"],
6353 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006354 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006355}
Jiyong Park127b40b2019-09-30 16:04:35 +09006356
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006357func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6358 t.Run("negative variant_version produces error", func(t *testing.T) {
6359 testApexError(t, "expected an integer between 0-9; got -1", `
6360 apex {
6361 name: "myapex",
6362 key: "myapex.key",
6363 apex_available_name: "com.android.foo",
6364 variant_version: "-1",
6365 updatable: false,
6366 }
6367 apex_key {
6368 name: "myapex.key",
6369 public_key: "testkey.avbpubkey",
6370 private_key: "testkey.pem",
6371 }
6372 `)
6373 })
6374
6375 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6376 testApexError(t, "expected an integer between 0-9; got 10", `
6377 apex {
6378 name: "myapex",
6379 key: "myapex.key",
6380 apex_available_name: "com.android.foo",
6381 variant_version: "10",
6382 updatable: false,
6383 }
6384 apex_key {
6385 name: "myapex.key",
6386 public_key: "testkey.avbpubkey",
6387 private_key: "testkey.pem",
6388 }
6389 `)
6390 })
6391}
6392
6393func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6394 context := android.GroupFixturePreparers(
6395 android.PrepareForIntegrationTestWithAndroid,
6396 PrepareForTestWithApexBuildComponents,
6397 android.FixtureMergeMockFs(android.MockFS{
6398 "system/sepolicy/apex/foo-file_contexts": nil,
6399 "system/sepolicy/apex/bar-file_contexts": nil,
6400 }),
6401 )
6402 result := context.RunTestWithBp(t, `
6403 apex {
6404 name: "foo",
6405 key: "myapex.key",
6406 apex_available_name: "com.android.foo",
6407 variant_version: "0",
6408 updatable: false,
6409 }
6410 apex {
6411 name: "bar",
6412 key: "myapex.key",
6413 apex_available_name: "com.android.foo",
6414 variant_version: "3",
6415 updatable: false,
6416 }
6417 apex_key {
6418 name: "myapex.key",
6419 public_key: "testkey.avbpubkey",
6420 private_key: "testkey.pem",
6421 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006422 override_apex {
6423 name: "myoverrideapex",
6424 base: "bar",
6425 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006426 `)
6427
Jooyung Hana0503a52023-08-23 13:12:50 +09006428 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006429 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6430 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6431 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6432 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6433 }
6434
Jooyung Hana0503a52023-08-23 13:12:50 +09006435 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006436 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6437 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6438 barActualDefaultVersion := barManifestRule.Args["default_version"]
6439 if barActualDefaultVersion != barExpectedDefaultVersion {
6440 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6441 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006442
Spandan Das50801e22024-05-13 18:29:45 +00006443 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006444 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6445 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6446 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6447 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006448}
6449
Sam Delmericoca816532023-06-02 14:09:50 -04006450func TestApexAvailable_ApexAvailableName(t *testing.T) {
6451 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6452 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6453 apex {
6454 name: "myapex_sminus",
6455 key: "myapex.key",
6456 apps: ["AppFoo"],
6457 apex_available_name: "myapex",
6458 updatable: false,
6459 }
6460 apex {
6461 name: "myapex",
6462 key: "myapex.key",
6463 apps: ["AppFoo"],
6464 updatable: false,
6465 }
6466 apex_key {
6467 name: "myapex.key",
6468 public_key: "testkey.avbpubkey",
6469 private_key: "testkey.pem",
6470 }
6471 android_app {
6472 name: "AppFoo",
6473 srcs: ["foo/bar/MyClass.java"],
6474 sdk_version: "none",
6475 system_modules: "none",
6476 apex_available: [ "myapex_sminus" ],
6477 }`,
6478 android.FixtureMergeMockFs(android.MockFS{
6479 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6480 }),
6481 )
6482 })
6483
6484 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6485 testApex(t, `
6486 apex {
6487 name: "myapex_sminus",
6488 key: "myapex.key",
6489 apps: ["AppFoo"],
6490 apex_available_name: "myapex",
6491 updatable: false,
6492 }
6493 apex {
6494 name: "myapex",
6495 key: "myapex.key",
6496 apps: ["AppFoo"],
6497 updatable: false,
6498 }
6499 apex_key {
6500 name: "myapex.key",
6501 public_key: "testkey.avbpubkey",
6502 private_key: "testkey.pem",
6503 }
6504 android_app {
6505 name: "AppFoo",
6506 srcs: ["foo/bar/MyClass.java"],
6507 sdk_version: "none",
6508 system_modules: "none",
6509 apex_available: [ "myapex" ],
6510 }`,
6511 android.FixtureMergeMockFs(android.MockFS{
6512 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6513 }),
6514 )
6515 })
6516
6517 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6518 testApex(t, `
6519 override_apex {
6520 name: "myoverrideapex_sminus",
6521 base: "myapex_sminus",
6522 key: "myapex.key",
6523 apps: ["AppFooOverride"],
6524 }
6525 override_apex {
6526 name: "myoverrideapex",
6527 base: "myapex",
6528 key: "myapex.key",
6529 apps: ["AppFooOverride"],
6530 }
6531 apex {
6532 name: "myapex_sminus",
6533 key: "myapex.key",
6534 apps: ["AppFoo"],
6535 apex_available_name: "myapex",
6536 updatable: false,
6537 }
6538 apex {
6539 name: "myapex",
6540 key: "myapex.key",
6541 apps: ["AppFoo"],
6542 updatable: false,
6543 }
6544 apex_key {
6545 name: "myapex.key",
6546 public_key: "testkey.avbpubkey",
6547 private_key: "testkey.pem",
6548 }
6549 android_app {
6550 name: "AppFooOverride",
6551 srcs: ["foo/bar/MyClass.java"],
6552 sdk_version: "none",
6553 system_modules: "none",
6554 apex_available: [ "myapex" ],
6555 }
6556 android_app {
6557 name: "AppFoo",
6558 srcs: ["foo/bar/MyClass.java"],
6559 sdk_version: "none",
6560 system_modules: "none",
6561 apex_available: [ "myapex" ],
6562 }`,
6563 android.FixtureMergeMockFs(android.MockFS{
6564 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6565 }),
6566 )
6567 })
6568}
6569
6570func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6571 context := android.GroupFixturePreparers(
6572 android.PrepareForIntegrationTestWithAndroid,
6573 PrepareForTestWithApexBuildComponents,
6574 java.PrepareForTestWithDexpreopt,
6575 android.FixtureMergeMockFs(android.MockFS{
6576 "system/sepolicy/apex/myapex-file_contexts": nil,
6577 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6578 }),
6579 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6580 variables.BuildId = proptools.StringPtr("buildid")
6581 }),
6582 )
6583 context.RunTestWithBp(t, `
6584 override_apex {
6585 name: "myoverrideapex_sminus",
6586 base: "myapex_sminus",
6587 }
6588 override_apex {
6589 name: "myoverrideapex",
6590 base: "myapex",
6591 }
6592 apex {
6593 name: "myapex",
6594 key: "myapex.key",
6595 apps: ["AppFoo"],
6596 updatable: false,
6597 }
6598 apex {
6599 name: "myapex_sminus",
6600 apex_available_name: "myapex",
6601 key: "myapex.key",
6602 apps: ["AppFoo_sminus"],
6603 updatable: false,
6604 }
6605 apex_key {
6606 name: "myapex.key",
6607 public_key: "testkey.avbpubkey",
6608 private_key: "testkey.pem",
6609 }
6610 android_app {
6611 name: "AppFoo",
6612 srcs: ["foo/bar/MyClass.java"],
6613 sdk_version: "none",
6614 system_modules: "none",
6615 apex_available: [ "myapex" ],
6616 }
6617 android_app {
6618 name: "AppFoo_sminus",
6619 srcs: ["foo/bar/MyClass.java"],
6620 sdk_version: "none",
6621 min_sdk_version: "29",
6622 system_modules: "none",
6623 apex_available: [ "myapex" ],
6624 }`)
6625}
6626
Jiyong Park89e850a2020-04-07 16:37:39 +09006627func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006628 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006629 apex {
6630 name: "myapex",
6631 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006632 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006633 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006634 }
6635
6636 apex_key {
6637 name: "myapex.key",
6638 public_key: "testkey.avbpubkey",
6639 private_key: "testkey.pem",
6640 }
6641
6642 cc_library {
6643 name: "libfoo",
6644 stl: "none",
6645 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006646 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006647 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006648 }
6649
6650 cc_library {
6651 name: "libfoo2",
6652 stl: "none",
6653 system_shared_libs: [],
6654 shared_libs: ["libbaz"],
6655 apex_available: ["//apex_available:platform"],
6656 }
6657
6658 cc_library {
6659 name: "libbar",
6660 stl: "none",
6661 system_shared_libs: [],
6662 apex_available: ["myapex"],
6663 }
6664
6665 cc_library {
6666 name: "libbaz",
6667 stl: "none",
6668 system_shared_libs: [],
6669 apex_available: ["myapex"],
6670 stubs: {
6671 versions: ["1"],
6672 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006673 }`)
6674
Jiyong Park89e850a2020-04-07 16:37:39 +09006675 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6676 // because it depends on libbar which isn't available to platform
6677 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6678 if libfoo.NotAvailableForPlatform() != true {
6679 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6680 }
6681
6682 // libfoo2 however can be available to platform because it depends on libbaz which provides
6683 // stubs
6684 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6685 if libfoo2.NotAvailableForPlatform() == true {
6686 t.Errorf("%q should be available to platform", libfoo2.String())
6687 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006688}
Jiyong Parka90ca002019-10-07 15:47:24 +09006689
Paul Duffine52e66f2020-03-30 17:54:29 +01006690func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006691 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006692 apex {
6693 name: "myapex",
6694 key: "myapex.key",
6695 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006696 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006697 }
6698
6699 apex_key {
6700 name: "myapex.key",
6701 public_key: "testkey.avbpubkey",
6702 private_key: "testkey.pem",
6703 }
6704
6705 cc_library {
6706 name: "libfoo",
6707 stl: "none",
6708 system_shared_libs: [],
6709 apex_available: ["myapex"],
6710 static: {
6711 apex_available: ["//apex_available:platform"],
6712 },
6713 }`)
6714
Jiyong Park89e850a2020-04-07 16:37:39 +09006715 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6716 if libfooShared.NotAvailableForPlatform() != true {
6717 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6718 }
6719 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6720 if libfooStatic.NotAvailableForPlatform() != false {
6721 t.Errorf("%q should be available to platform", libfooStatic.String())
6722 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006723}
6724
Jooyung Han9a419e22024-08-16 17:14:21 +09006725func TestApexAvailable_PrefixMatch(t *testing.T) {
6726
6727 for _, tc := range []struct {
6728 name string
6729 apexAvailable string
6730 expectedError string
6731 }{
6732 {
6733 name: "prefix matches correctly",
6734 apexAvailable: "com.foo.*",
6735 },
6736 {
6737 name: "prefix doesn't match",
6738 apexAvailable: "com.bar.*",
6739 expectedError: `Consider .* "com.foo\.\*"`,
6740 },
6741 {
6742 name: "short prefix",
6743 apexAvailable: "com.*",
6744 expectedError: "requires two or more components",
6745 },
6746 {
6747 name: "wildcard not in the end",
6748 apexAvailable: "com.*.foo",
6749 expectedError: "should end with .*",
6750 },
6751 {
6752 name: "wildcard in the middle",
6753 apexAvailable: "com.foo*.*",
6754 expectedError: "not allowed in the middle",
6755 },
6756 {
6757 name: "hint with prefix pattern",
6758 apexAvailable: "//apex_available:platform",
6759 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6760 },
6761 } {
6762 t.Run(tc.name, func(t *testing.T) {
6763 errorHandler := android.FixtureExpectsNoErrors
6764 if tc.expectedError != "" {
6765 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6766 }
6767 context := android.GroupFixturePreparers(
6768 prepareForApexTest,
6769 android.FixtureMergeMockFs(android.MockFS{
6770 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6771 }),
6772 ).ExtendWithErrorHandler(errorHandler)
6773
6774 context.RunTestWithBp(t, `
6775 apex {
6776 name: "com.foo.bar",
6777 key: "myapex.key",
6778 native_shared_libs: ["libfoo"],
6779 updatable: false,
6780 }
6781
6782 apex_key {
6783 name: "myapex.key",
6784 public_key: "testkey.avbpubkey",
6785 private_key: "testkey.pem",
6786 }
6787
6788 cc_library {
6789 name: "libfoo",
6790 stl: "none",
6791 system_shared_libs: [],
6792 apex_available: ["`+tc.apexAvailable+`"],
6793 }`)
6794 })
6795 }
6796 testApexError(t, `Consider adding "com.foo" to`, `
6797 apex {
6798 name: "com.foo", // too short for a partner apex
6799 key: "myapex.key",
6800 native_shared_libs: ["libfoo"],
6801 updatable: false,
6802 }
6803
6804 apex_key {
6805 name: "myapex.key",
6806 public_key: "testkey.avbpubkey",
6807 private_key: "testkey.pem",
6808 }
6809
6810 cc_library {
6811 name: "libfoo",
6812 stl: "none",
6813 system_shared_libs: [],
6814 }
6815 `)
6816}
6817
Jiyong Park5d790c32019-11-15 18:40:32 +09006818func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006819 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006820 apex {
6821 name: "myapex",
6822 key: "myapex.key",
6823 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006824 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006825 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006826 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006827 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006828 }
6829
6830 override_apex {
6831 name: "override_myapex",
6832 base: "myapex",
6833 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006834 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006835 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006836 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00006837 compile_multilib: "first",
6838 multilib: {
6839 lib32: {
6840 native_shared_libs: ["mylib32"],
6841 },
6842 lib64: {
6843 native_shared_libs: ["mylib64"],
6844 },
6845 },
Baligh Uddin004d7172020-02-19 21:29:28 -08006846 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006847 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006848 key: "mynewapex.key",
6849 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006850 }
6851
6852 apex_key {
6853 name: "myapex.key",
6854 public_key: "testkey.avbpubkey",
6855 private_key: "testkey.pem",
6856 }
6857
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006858 apex_key {
6859 name: "mynewapex.key",
6860 public_key: "testkey2.avbpubkey",
6861 private_key: "testkey2.pem",
6862 }
6863
6864 android_app_certificate {
6865 name: "myapex.certificate",
6866 certificate: "testkey",
6867 }
6868
Jiyong Park5d790c32019-11-15 18:40:32 +09006869 android_app {
6870 name: "app",
6871 srcs: ["foo/bar/MyClass.java"],
6872 package_name: "foo",
6873 sdk_version: "none",
6874 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006875 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006876 }
6877
6878 override_android_app {
6879 name: "override_app",
6880 base: "app",
6881 package_name: "bar",
6882 }
markchien7c803b82021-08-26 22:10:06 +08006883
6884 bpf {
6885 name: "bpf",
6886 srcs: ["bpf.c"],
6887 }
6888
6889 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006890 name: "overrideBpf",
6891 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006892 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006893
6894 prebuilt_etc {
6895 name: "myetc",
6896 src: "myprebuilt",
6897 }
6898
6899 prebuilt_etc {
6900 name: "override_myetc",
6901 src: "override_myprebuilt",
6902 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00006903
6904 cc_library {
6905 name: "mylib32",
6906 apex_available: [ "myapex" ],
6907 }
6908
6909 cc_library {
6910 name: "mylib64",
6911 apex_available: [ "myapex" ],
6912 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006913 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006914
Jooyung Hana0503a52023-08-23 13:12:50 +09006915 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00006916 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09006917 if originalVariant.GetOverriddenBy() != "" {
6918 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6919 }
6920 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6921 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6922 }
6923
Spandan Das50801e22024-05-13 18:29:45 +00006924 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006925 apexRule := module.Rule("apexRule")
6926 copyCmds := apexRule.Args["copy_commands"]
6927
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006928 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6929 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006930
markchien7c803b82021-08-26 22:10:06 +08006931 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006932 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006933
Daniel Norman5a3ce132021-08-26 15:44:43 -07006934 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6935 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6936
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006937 apexBundle := module.Module().(*apexBundle)
6938 name := apexBundle.Name()
6939 if name != "override_myapex" {
6940 t.Errorf("name should be \"override_myapex\", but was %q", name)
6941 }
6942
Baligh Uddin004d7172020-02-19 21:29:28 -08006943 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6944 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6945 }
6946
Jiyong Park20bacab2020-03-03 11:45:41 +09006947 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006948 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006949 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6950
6951 signApkRule := module.Rule("signapk")
6952 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006953
Colin Crossaa255532020-07-03 13:18:24 -07006954 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006955 var builder strings.Builder
6956 data.Custom(&builder, name, "TARGET_", "", data)
6957 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006958 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6959 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006960 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006961 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006962 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006963 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006964 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006965 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006966}
6967
Albert Martineefabcf2022-03-21 20:11:16 +00006968func TestMinSdkVersionOverride(t *testing.T) {
6969 // Override from 29 to 31
6970 minSdkOverride31 := "31"
6971 ctx := testApex(t, `
6972 apex {
6973 name: "myapex",
6974 key: "myapex.key",
6975 native_shared_libs: ["mylib"],
6976 updatable: true,
6977 min_sdk_version: "29"
6978 }
6979
6980 override_apex {
6981 name: "override_myapex",
6982 base: "myapex",
6983 logging_parent: "com.foo.bar",
6984 package_name: "test.overridden.package"
6985 }
6986
6987 apex_key {
6988 name: "myapex.key",
6989 public_key: "testkey.avbpubkey",
6990 private_key: "testkey.pem",
6991 }
6992
6993 cc_library {
6994 name: "mylib",
6995 srcs: ["mylib.cpp"],
6996 runtime_libs: ["libbar"],
6997 system_shared_libs: [],
6998 stl: "none",
6999 apex_available: [ "myapex" ],
7000 min_sdk_version: "apex_inherit"
7001 }
7002
7003 cc_library {
7004 name: "libbar",
7005 srcs: ["mylib.cpp"],
7006 system_shared_libs: [],
7007 stl: "none",
7008 apex_available: [ "myapex" ],
7009 min_sdk_version: "apex_inherit"
7010 }
7011
7012 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7013
Jooyung Hana0503a52023-08-23 13:12:50 +09007014 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007015 copyCmds := apexRule.Args["copy_commands"]
7016
7017 // Ensure that direct non-stubs dep is always included
7018 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7019
7020 // Ensure that runtime_libs dep in included
7021 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7022
7023 // Ensure libraries target overridden min_sdk_version value
7024 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7025}
7026
7027func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7028 // Attempt to override from 31 to 29, should be a NOOP
7029 minSdkOverride29 := "29"
7030 ctx := testApex(t, `
7031 apex {
7032 name: "myapex",
7033 key: "myapex.key",
7034 native_shared_libs: ["mylib"],
7035 updatable: true,
7036 min_sdk_version: "31"
7037 }
7038
7039 override_apex {
7040 name: "override_myapex",
7041 base: "myapex",
7042 logging_parent: "com.foo.bar",
7043 package_name: "test.overridden.package"
7044 }
7045
7046 apex_key {
7047 name: "myapex.key",
7048 public_key: "testkey.avbpubkey",
7049 private_key: "testkey.pem",
7050 }
7051
7052 cc_library {
7053 name: "mylib",
7054 srcs: ["mylib.cpp"],
7055 runtime_libs: ["libbar"],
7056 system_shared_libs: [],
7057 stl: "none",
7058 apex_available: [ "myapex" ],
7059 min_sdk_version: "apex_inherit"
7060 }
7061
7062 cc_library {
7063 name: "libbar",
7064 srcs: ["mylib.cpp"],
7065 system_shared_libs: [],
7066 stl: "none",
7067 apex_available: [ "myapex" ],
7068 min_sdk_version: "apex_inherit"
7069 }
7070
7071 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7072
Jooyung Hana0503a52023-08-23 13:12:50 +09007073 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007074 copyCmds := apexRule.Args["copy_commands"]
7075
7076 // Ensure that direct non-stubs dep is always included
7077 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7078
7079 // Ensure that runtime_libs dep in included
7080 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7081
7082 // Ensure libraries target the original min_sdk_version value rather than the overridden
7083 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7084}
7085
Jooyung Han214bf372019-11-12 13:03:50 +09007086func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007087 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007088 apex {
7089 name: "myapex",
7090 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007091 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007092 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007093 }
7094
7095 apex_key {
7096 name: "myapex.key",
7097 public_key: "testkey.avbpubkey",
7098 private_key: "testkey.pem",
7099 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007100
7101 cc_library {
7102 name: "mylib",
7103 srcs: ["mylib.cpp"],
7104 stl: "libc++",
7105 system_shared_libs: [],
7106 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007107 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007108 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007109 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007110
Jooyung Hana0503a52023-08-23 13:12:50 +09007111 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007112 args := module.Rule("apexRule").Args
7113 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007114 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007115
7116 // The copies of the libraries in the apex should have one more dependency than
7117 // the ones outside the apex, namely the unwinder. Ideally we should check
7118 // the dependency names directly here but for some reason the names are blank in
7119 // this test.
7120 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007121 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007122 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7123 if len(apexImplicits) != len(nonApexImplicits)+1 {
7124 t.Errorf("%q missing unwinder dep", lib)
7125 }
7126 }
Jooyung Han214bf372019-11-12 13:03:50 +09007127}
7128
Paul Duffine05480a2021-03-08 15:07:14 +00007129var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007130 "api/current.txt": nil,
7131 "api/removed.txt": nil,
7132 "api/system-current.txt": nil,
7133 "api/system-removed.txt": nil,
7134 "api/test-current.txt": nil,
7135 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007136
Anton Hanssondff2c782020-12-21 17:10:01 +00007137 "100/public/api/foo.txt": nil,
7138 "100/public/api/foo-removed.txt": nil,
7139 "100/system/api/foo.txt": nil,
7140 "100/system/api/foo-removed.txt": nil,
7141
Paul Duffineedc5d52020-06-12 17:46:39 +01007142 // For java_sdk_library_import
7143 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007144}
7145
Jooyung Han58f26ab2019-12-18 15:34:32 +09007146func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007147 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007148 apex {
7149 name: "myapex",
7150 key: "myapex.key",
7151 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007152 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007153 }
7154
7155 apex_key {
7156 name: "myapex.key",
7157 public_key: "testkey.avbpubkey",
7158 private_key: "testkey.pem",
7159 }
7160
7161 java_sdk_library {
7162 name: "foo",
7163 srcs: ["a.java"],
7164 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007165 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007166 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007167
7168 prebuilt_apis {
7169 name: "sdk",
7170 api_dirs: ["100"],
7171 }
Paul Duffin9b879592020-05-26 13:21:35 +01007172 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007173
7174 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007175 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007176 "javalib/foo.jar",
7177 "etc/permissions/foo.xml",
7178 })
7179 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007180 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7181 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7182 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007183}
7184
Spandan Das3ee19692024-06-19 04:47:40 +00007185func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7186 ctx := testApex(t, `
7187 override_apex {
7188 name: "mycompanyapex",
7189 base: "myapex",
7190 }
7191 apex {
7192 name: "myapex",
7193 key: "myapex.key",
7194 java_libs: ["foo"],
7195 updatable: false,
7196 }
7197
7198 apex_key {
7199 name: "myapex.key",
7200 public_key: "testkey.avbpubkey",
7201 private_key: "testkey.pem",
7202 }
7203
7204 java_sdk_library {
7205 name: "foo",
7206 srcs: ["a.java"],
7207 api_packages: ["foo"],
7208 apex_available: [ "myapex" ],
7209 }
7210
7211 prebuilt_apis {
7212 name: "sdk",
7213 api_dirs: ["100"],
7214 }
7215 `, withFiles(filesForSdkLibrary))
7216
7217 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7218 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7219 // (com.android.foo), the filepath should not contain override apex name.
7220 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7221 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7222 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7223}
7224
Paul Duffin9b879592020-05-26 13:21:35 +01007225func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007226 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007227 apex {
7228 name: "myapex",
7229 key: "myapex.key",
7230 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007231 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007232 }
7233
7234 apex_key {
7235 name: "myapex.key",
7236 public_key: "testkey.avbpubkey",
7237 private_key: "testkey.pem",
7238 }
7239
7240 java_sdk_library {
7241 name: "foo",
7242 srcs: ["a.java"],
7243 api_packages: ["foo"],
7244 apex_available: ["myapex"],
7245 sdk_version: "none",
7246 system_modules: "none",
7247 }
7248
7249 java_library {
7250 name: "bar",
7251 srcs: ["a.java"],
7252 libs: ["foo"],
7253 apex_available: ["myapex"],
7254 sdk_version: "none",
7255 system_modules: "none",
7256 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007257
7258 prebuilt_apis {
7259 name: "sdk",
7260 api_dirs: ["100"],
7261 }
Paul Duffin9b879592020-05-26 13:21:35 +01007262 `, withFiles(filesForSdkLibrary))
7263
7264 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007265 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007266 "javalib/bar.jar",
7267 "javalib/foo.jar",
7268 "etc/permissions/foo.xml",
7269 })
7270
7271 // The bar library should depend on the implementation jar.
7272 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007273 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007274 t.Errorf("expected %q, found %#q", expected, actual)
7275 }
7276}
7277
7278func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007279 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007280 apex {
7281 name: "myapex",
7282 key: "myapex.key",
7283 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007284 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007285 }
7286
7287 apex_key {
7288 name: "myapex.key",
7289 public_key: "testkey.avbpubkey",
7290 private_key: "testkey.pem",
7291 }
7292
7293 java_sdk_library {
7294 name: "foo",
7295 srcs: ["a.java"],
7296 api_packages: ["foo"],
7297 apex_available: ["myapex"],
7298 sdk_version: "none",
7299 system_modules: "none",
7300 }
7301
7302 java_library {
7303 name: "bar",
7304 srcs: ["a.java"],
7305 libs: ["foo"],
7306 sdk_version: "none",
7307 system_modules: "none",
7308 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007309
7310 prebuilt_apis {
7311 name: "sdk",
7312 api_dirs: ["100"],
7313 }
Paul Duffin9b879592020-05-26 13:21:35 +01007314 `, withFiles(filesForSdkLibrary))
7315
7316 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007317 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007318 "javalib/foo.jar",
7319 "etc/permissions/foo.xml",
7320 })
7321
7322 // The bar library should depend on the stubs jar.
7323 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007324 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007325 t.Errorf("expected %q, found %#q", expected, actual)
7326 }
7327}
7328
Paul Duffineedc5d52020-06-12 17:46:39 +01007329func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007330 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007331 prebuilt_apis {
7332 name: "sdk",
7333 api_dirs: ["100"],
7334 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007335 withFiles(map[string][]byte{
7336 "apex/a.java": nil,
7337 "apex/apex_manifest.json": nil,
7338 "apex/Android.bp": []byte(`
7339 package {
7340 default_visibility: ["//visibility:private"],
7341 }
7342
7343 apex {
7344 name: "myapex",
7345 key: "myapex.key",
7346 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007347 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007348 }
7349
7350 apex_key {
7351 name: "myapex.key",
7352 public_key: "testkey.avbpubkey",
7353 private_key: "testkey.pem",
7354 }
7355
7356 java_library {
7357 name: "bar",
7358 srcs: ["a.java"],
7359 libs: ["foo"],
7360 apex_available: ["myapex"],
7361 sdk_version: "none",
7362 system_modules: "none",
7363 }
7364`),
7365 "source/a.java": nil,
7366 "source/api/current.txt": nil,
7367 "source/api/removed.txt": nil,
7368 "source/Android.bp": []byte(`
7369 package {
7370 default_visibility: ["//visibility:private"],
7371 }
7372
7373 java_sdk_library {
7374 name: "foo",
7375 visibility: ["//apex"],
7376 srcs: ["a.java"],
7377 api_packages: ["foo"],
7378 apex_available: ["myapex"],
7379 sdk_version: "none",
7380 system_modules: "none",
7381 public: {
7382 enabled: true,
7383 },
7384 }
7385`),
7386 "prebuilt/a.jar": nil,
7387 "prebuilt/Android.bp": []byte(`
7388 package {
7389 default_visibility: ["//visibility:private"],
7390 }
7391
7392 java_sdk_library_import {
7393 name: "foo",
7394 visibility: ["//apex", "//source"],
7395 apex_available: ["myapex"],
7396 prefer: true,
7397 public: {
7398 jars: ["a.jar"],
7399 },
7400 }
7401`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007402 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007403 )
7404
7405 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007406 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007407 "javalib/bar.jar",
7408 "javalib/foo.jar",
7409 "etc/permissions/foo.xml",
7410 })
7411
7412 // The bar library should depend on the implementation jar.
7413 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007414 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007415 t.Errorf("expected %q, found %#q", expected, actual)
7416 }
7417}
7418
7419func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7420 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7421 apex {
7422 name: "myapex",
7423 key: "myapex.key",
7424 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007425 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007426 }
7427
7428 apex_key {
7429 name: "myapex.key",
7430 public_key: "testkey.avbpubkey",
7431 private_key: "testkey.pem",
7432 }
7433
7434 java_sdk_library_import {
7435 name: "foo",
7436 apex_available: ["myapex"],
7437 prefer: true,
7438 public: {
7439 jars: ["a.jar"],
7440 },
7441 }
7442
7443 `, withFiles(filesForSdkLibrary))
7444}
7445
atrost6e126252020-01-27 17:01:16 +00007446func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007447 result := android.GroupFixturePreparers(
7448 prepareForApexTest,
7449 java.PrepareForTestWithPlatformCompatConfig,
7450 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007451 apex {
7452 name: "myapex",
7453 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007454 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007455 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007456 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007457 }
7458
7459 apex_key {
7460 name: "myapex.key",
7461 public_key: "testkey.avbpubkey",
7462 private_key: "testkey.pem",
7463 }
7464
7465 platform_compat_config {
7466 name: "myjar-platform-compat-config",
7467 src: ":myjar",
7468 }
7469
7470 java_library {
7471 name: "myjar",
7472 srcs: ["foo/bar/MyClass.java"],
7473 sdk_version: "none",
7474 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007475 apex_available: [ "myapex" ],
7476 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007477
7478 // Make sure that a preferred prebuilt does not affect the apex contents.
7479 prebuilt_platform_compat_config {
7480 name: "myjar-platform-compat-config",
7481 metadata: "compat-config/metadata.xml",
7482 prefer: true,
7483 }
atrost6e126252020-01-27 17:01:16 +00007484 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007485 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007486 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007487 "etc/compatconfig/myjar-platform-compat-config.xml",
7488 "javalib/myjar.jar",
7489 })
7490}
7491
Jooyung Han862c0d62022-12-21 10:15:37 +09007492func TestNoDupeApexFiles(t *testing.T) {
7493 android.GroupFixturePreparers(
7494 android.PrepareForTestWithAndroidBuildComponents,
7495 PrepareForTestWithApexBuildComponents,
7496 prepareForTestWithMyapex,
7497 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7498 ).
7499 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7500 RunTestWithBp(t, `
7501 apex {
7502 name: "myapex",
7503 key: "myapex.key",
7504 prebuilts: ["foo", "bar"],
7505 updatable: false,
7506 }
7507
7508 apex_key {
7509 name: "myapex.key",
7510 public_key: "testkey.avbpubkey",
7511 private_key: "testkey.pem",
7512 }
7513
7514 prebuilt_etc {
7515 name: "foo",
7516 src: "myprebuilt",
7517 filename_from_src: true,
7518 }
7519
7520 prebuilt_etc {
7521 name: "bar",
7522 src: "myprebuilt",
7523 filename_from_src: true,
7524 }
7525 `)
7526}
7527
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007528func TestApexUnwantedTransitiveDeps(t *testing.T) {
7529 bp := `
7530 apex {
7531 name: "myapex",
7532 key: "myapex.key",
7533 native_shared_libs: ["libfoo"],
7534 updatable: false,
7535 unwanted_transitive_deps: ["libbar"],
7536 }
7537
7538 apex_key {
7539 name: "myapex.key",
7540 public_key: "testkey.avbpubkey",
7541 private_key: "testkey.pem",
7542 }
7543
7544 cc_library {
7545 name: "libfoo",
7546 srcs: ["foo.cpp"],
7547 shared_libs: ["libbar"],
7548 apex_available: ["myapex"],
7549 }
7550
7551 cc_library {
7552 name: "libbar",
7553 srcs: ["bar.cpp"],
7554 apex_available: ["myapex"],
7555 }`
7556 ctx := testApex(t, bp)
7557 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7558 "*/libc++.so",
7559 "*/libfoo.so",
7560 // not libbar.so
7561 })
7562}
7563
Jiyong Park479321d2019-12-16 11:47:12 +09007564func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7565 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7566 apex {
7567 name: "myapex",
7568 key: "myapex.key",
7569 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007570 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007571 }
7572
7573 apex_key {
7574 name: "myapex.key",
7575 public_key: "testkey.avbpubkey",
7576 private_key: "testkey.pem",
7577 }
7578
7579 java_library {
7580 name: "myjar",
7581 srcs: ["foo/bar/MyClass.java"],
7582 sdk_version: "none",
7583 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007584 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007585 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007586 }
7587 `)
7588}
7589
Jiyong Park7afd1072019-12-30 16:56:33 +09007590func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007591 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007592 apex {
7593 name: "myapex",
7594 key: "myapex.key",
7595 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007596 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007597 }
7598
7599 apex_key {
7600 name: "myapex.key",
7601 public_key: "testkey.avbpubkey",
7602 private_key: "testkey.pem",
7603 }
7604
7605 cc_library {
7606 name: "mylib",
7607 srcs: ["mylib.cpp"],
7608 system_shared_libs: [],
7609 stl: "none",
7610 required: ["a", "b"],
7611 host_required: ["c", "d"],
7612 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007613 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007614 }
7615 `)
7616
Jooyung Hana0503a52023-08-23 13:12:50 +09007617 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007618 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007619 name := apexBundle.BaseModuleName()
7620 prefix := "TARGET_"
7621 var builder strings.Builder
7622 data.Custom(&builder, name, prefix, "", data)
7623 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007624 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007625 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7626 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007627}
7628
Jiyong Park7cd10e32020-01-14 09:22:18 +09007629func TestSymlinksFromApexToSystem(t *testing.T) {
7630 bp := `
7631 apex {
7632 name: "myapex",
7633 key: "myapex.key",
7634 native_shared_libs: ["mylib"],
7635 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007636 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007637 }
7638
Jiyong Park9d677202020-02-19 16:29:35 +09007639 apex {
7640 name: "myapex.updatable",
7641 key: "myapex.key",
7642 native_shared_libs: ["mylib"],
7643 java_libs: ["myjar"],
7644 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007645 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007646 }
7647
Jiyong Park7cd10e32020-01-14 09:22:18 +09007648 apex_key {
7649 name: "myapex.key",
7650 public_key: "testkey.avbpubkey",
7651 private_key: "testkey.pem",
7652 }
7653
7654 cc_library {
7655 name: "mylib",
7656 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007657 shared_libs: [
7658 "myotherlib",
7659 "myotherlib_ext",
7660 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007661 system_shared_libs: [],
7662 stl: "none",
7663 apex_available: [
7664 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007665 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007666 "//apex_available:platform",
7667 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007668 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007669 }
7670
7671 cc_library {
7672 name: "myotherlib",
7673 srcs: ["mylib.cpp"],
7674 system_shared_libs: [],
7675 stl: "none",
7676 apex_available: [
7677 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007678 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007679 "//apex_available:platform",
7680 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007681 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007682 }
7683
Jiyong Parkce243632023-02-17 18:22:25 +09007684 cc_library {
7685 name: "myotherlib_ext",
7686 srcs: ["mylib.cpp"],
7687 system_shared_libs: [],
7688 system_ext_specific: true,
7689 stl: "none",
7690 apex_available: [
7691 "myapex",
7692 "myapex.updatable",
7693 "//apex_available:platform",
7694 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007695 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007696 }
7697
Jiyong Park7cd10e32020-01-14 09:22:18 +09007698 java_library {
7699 name: "myjar",
7700 srcs: ["foo/bar/MyClass.java"],
7701 sdk_version: "none",
7702 system_modules: "none",
Satish Yallab2b1ef62024-08-28 05:10:31 +00007703 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007704 apex_available: [
7705 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007706 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007707 "//apex_available:platform",
7708 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007709 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007710 }
7711
7712 java_library {
7713 name: "myotherjar",
7714 srcs: ["foo/bar/MyClass.java"],
7715 sdk_version: "none",
7716 system_modules: "none",
7717 apex_available: [
7718 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007719 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007720 "//apex_available:platform",
7721 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007722 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007723 }
7724 `
7725
7726 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7727 for _, f := range files {
7728 if f.path == file {
7729 if f.isLink {
7730 t.Errorf("%q is not a real file", file)
7731 }
7732 return
7733 }
7734 }
7735 t.Errorf("%q is not found", file)
7736 }
7737
Jiyong Parkce243632023-02-17 18:22:25 +09007738 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007739 for _, f := range files {
7740 if f.path == file {
7741 if !f.isLink {
7742 t.Errorf("%q is not a symlink", file)
7743 }
Jiyong Parkce243632023-02-17 18:22:25 +09007744 if f.src != target {
7745 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7746 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007747 return
7748 }
7749 }
7750 t.Errorf("%q is not found", file)
7751 }
7752
Jiyong Park9d677202020-02-19 16:29:35 +09007753 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7754 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007755 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007756 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007757 ensureRealfileExists(t, files, "javalib/myjar.jar")
7758 ensureRealfileExists(t, files, "lib64/mylib.so")
7759 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007760 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007761
Jooyung Hana0503a52023-08-23 13:12:50 +09007762 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007763 ensureRealfileExists(t, files, "javalib/myjar.jar")
7764 ensureRealfileExists(t, files, "lib64/mylib.so")
7765 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007766 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007767
7768 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007769 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007770 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007771 ensureRealfileExists(t, files, "javalib/myjar.jar")
7772 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007773 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7774 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007775
Jooyung Hana0503a52023-08-23 13:12:50 +09007776 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007777 ensureRealfileExists(t, files, "javalib/myjar.jar")
7778 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007779 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7780 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007781}
7782
Yo Chiange8128052020-07-23 20:09:18 +08007783func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007784 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007785 apex {
7786 name: "myapex",
7787 key: "myapex.key",
7788 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007789 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007790 }
7791
7792 apex_key {
7793 name: "myapex.key",
7794 public_key: "testkey.avbpubkey",
7795 private_key: "testkey.pem",
7796 }
7797
7798 cc_library_shared {
7799 name: "mylib",
7800 srcs: ["mylib.cpp"],
7801 shared_libs: ["myotherlib"],
7802 system_shared_libs: [],
7803 stl: "none",
7804 apex_available: [
7805 "myapex",
7806 "//apex_available:platform",
7807 ],
7808 }
7809
7810 cc_prebuilt_library_shared {
7811 name: "myotherlib",
7812 srcs: ["prebuilt.so"],
7813 system_shared_libs: [],
7814 stl: "none",
7815 apex_available: [
7816 "myapex",
7817 "//apex_available:platform",
7818 ],
7819 }
7820 `)
7821
Jooyung Hana0503a52023-08-23 13:12:50 +09007822 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007823 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007824 var builder strings.Builder
7825 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7826 androidMk := builder.String()
7827 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007828 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007829 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7830 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7831 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007832 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007833}
7834
Jooyung Han643adc42020-02-27 13:50:06 +09007835func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007836 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007837 apex {
7838 name: "myapex",
7839 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007840 binaries: ["mybin"],
7841 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007842 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007843 }
7844
7845 apex_key {
7846 name: "myapex.key",
7847 public_key: "testkey.avbpubkey",
7848 private_key: "testkey.pem",
7849 }
7850
7851 cc_library {
7852 name: "mylib",
7853 srcs: ["mylib.cpp"],
7854 shared_libs: ["mylib2"],
7855 system_shared_libs: [],
7856 stl: "none",
7857 apex_available: [ "myapex" ],
7858 }
7859
7860 cc_library {
7861 name: "mylib2",
7862 srcs: ["mylib.cpp"],
7863 system_shared_libs: [],
7864 stl: "none",
7865 apex_available: [ "myapex" ],
7866 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007867
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007868 // Used as both a JNI library and a regular shared library.
7869 cc_library {
7870 name: "mylib3",
7871 srcs: ["mylib.cpp"],
7872 system_shared_libs: [],
7873 stl: "none",
7874 apex_available: [ "myapex" ],
7875 }
7876
7877 cc_binary {
7878 name: "mybin",
7879 srcs: ["mybin.cpp"],
7880 shared_libs: ["mylib3"],
7881 system_shared_libs: [],
7882 stl: "none",
7883 apex_available: [ "myapex" ],
7884 }
7885
Jiyong Park34d5c332022-02-24 18:02:44 +09007886 rust_ffi_shared {
7887 name: "libfoo.rust",
7888 crate_name: "foo",
7889 srcs: ["foo.rs"],
7890 shared_libs: ["libfoo.shared_from_rust"],
7891 prefer_rlib: true,
7892 apex_available: ["myapex"],
7893 }
7894
7895 cc_library_shared {
7896 name: "libfoo.shared_from_rust",
7897 srcs: ["mylib.cpp"],
7898 system_shared_libs: [],
7899 stl: "none",
7900 stubs: {
7901 versions: ["10", "11", "12"],
7902 },
7903 }
7904
Jooyung Han643adc42020-02-27 13:50:06 +09007905 `)
7906
Jooyung Hana0503a52023-08-23 13:12:50 +09007907 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007908 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007909 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007910 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007911 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007912 "lib64/mylib.so",
7913 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007914 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007915 "lib64/libfoo.rust.so",
7916 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7917 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007918 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007919
7920 // b/220397949
7921 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007922}
7923
Jooyung Han49f67012020-04-17 13:43:10 +09007924func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007925 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007926 apex {
7927 name: "myapex",
7928 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007929 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007930 }
7931 apex_key {
7932 name: "myapex.key",
7933 public_key: "testkey.avbpubkey",
7934 private_key: "testkey.pem",
7935 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007936 `,
7937 android.FixtureModifyConfig(func(config android.Config) {
7938 delete(config.Targets, android.Android)
7939 config.AndroidCommonTarget = android.Target{}
7940 }),
7941 )
Jooyung Han49f67012020-04-17 13:43:10 +09007942
7943 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7944 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7945 }
7946}
7947
Jiyong Parkbd159612020-02-28 15:22:21 +09007948func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007949 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007950 apex {
7951 name: "myapex",
7952 key: "myapex.key",
7953 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007954 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007955 }
7956
7957 apex_key {
7958 name: "myapex.key",
7959 public_key: "testkey.avbpubkey",
7960 private_key: "testkey.pem",
7961 }
7962
7963 android_app {
7964 name: "AppFoo",
7965 srcs: ["foo/bar/MyClass.java"],
7966 sdk_version: "none",
7967 system_modules: "none",
7968 apex_available: [ "myapex" ],
7969 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007970 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007971
Jooyung Hana0503a52023-08-23 13:12:50 +09007972 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07007973 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09007974
7975 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007976 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 +09007977}
7978
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007979func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007980 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007981 apex {
7982 name: "myapex",
7983 key: "myapex.key",
7984 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007985 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007986 }
7987
7988 apex_key {
7989 name: "myapex.key",
7990 public_key: "testkey.avbpubkey",
7991 private_key: "testkey.pem",
7992 }
7993
7994 android_app_set {
7995 name: "AppSet",
7996 set: "AppSet.apks",
7997 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09007998 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08007999 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008000 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008001 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8002 s := mod.Rule("apexRule").Args["copy_commands"]
8003 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008004 if len(copyCmds) != 4 {
8005 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008006 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008007 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8008 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008009 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8010 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008011
8012 // Ensure that canned_fs_config has an entry for the app set zip file
8013 generateFsRule := mod.Rule("generateFsConfig")
8014 cmd := generateFsRule.RuleParams.Command
8015 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008016}
8017
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008018func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008019 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008020 apex_set {
8021 name: "myapex",
8022 filename: "foo_v2.apex",
8023 sanitized: {
8024 none: { set: "myapex.apks", },
8025 hwaddress: { set: "myapex.hwasan.apks", },
8026 },
Paul Duffin24704672021-04-06 16:09:30 +01008027 }
8028 `
8029 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008030
Paul Duffin24704672021-04-06 16:09:30 +01008031 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008032 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008033
Spandan Das3576e762024-01-03 18:57:03 +00008034 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008035 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008036
Paul Duffin24704672021-04-06 16:09:30 +01008037 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8038
8039 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008040 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8041 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008042
8043 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008044}
8045
Pranav Guptaeba03b02022-09-27 00:27:08 +00008046func TestApexSetApksModuleAssignment(t *testing.T) {
8047 ctx := testApex(t, `
8048 apex_set {
8049 name: "myapex",
8050 set: ":myapex_apks_file",
8051 }
8052
8053 filegroup {
8054 name: "myapex_apks_file",
8055 srcs: ["myapex.apks"],
8056 }
8057 `)
8058
Spandan Das3576e762024-01-03 18:57:03 +00008059 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008060
8061 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008062 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008063 extractedApex := m.Output(extractorOutput)
8064
8065 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8066}
8067
Paul Duffin89f570a2021-06-16 01:42:33 +01008068func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008069 t.Helper()
8070
Paul Duffin55607122021-03-30 23:32:51 +01008071 fs := android.MockFS{
8072 "a.java": nil,
8073 "a.jar": nil,
8074 "apex_manifest.json": nil,
8075 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008076 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008077 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8078 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8079 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008080 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008081 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008082
Paul Duffin55607122021-03-30 23:32:51 +01008083 errorHandler := android.FixtureExpectsNoErrors
8084 if errmsg != "" {
8085 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008086 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008087
Paul Duffin55607122021-03-30 23:32:51 +01008088 result := android.GroupFixturePreparers(
8089 cc.PrepareForTestWithCcDefaultModules,
8090 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008091 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008092 java.PrepareForTestWithJavaSdkLibraryFiles,
8093 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008094 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008095 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008096 android.FixtureModifyMockFS(func(fs android.MockFS) {
8097 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8098 insert := ""
8099 for _, fragment := range fragments {
8100 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8101 }
8102 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8103 platform_bootclasspath {
8104 name: "platform-bootclasspath",
8105 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008106 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008107 %s
8108 ],
8109 }
8110 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008111 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008112 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008113 // Dexpreopt for boot jars requires the ART boot image profile.
8114 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8115 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008116 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008117 ).
8118 ExtendWithErrorHandler(errorHandler).
8119 RunTestWithBp(t, bp)
8120
8121 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008122}
8123
Paul Duffin5556c5f2022-06-09 17:32:21 +00008124func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008125 preparers := android.GroupFixturePreparers(
8126 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008127 prepareForTestWithBootclasspathFragment,
8128 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008129 PrepareForTestWithApexBuildComponents,
8130 ).
8131 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008132 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008133
8134 bpBase := `
8135 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008136 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008137 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008138 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008139 set: "myapex.apks",
8140 }
8141
8142 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008143 name: "com.mycompany.android.art",
8144 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008145 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008146 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008147 set: "company-myapex.apks",
8148 }
8149
8150 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008151 name: "art-bootclasspath-fragment",
8152 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008153 hidden_api: {
8154 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8155 metadata: "my-bootclasspath-fragment/metadata.csv",
8156 index: "my-bootclasspath-fragment/index.csv",
8157 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8158 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8159 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008160 %s
8161 }
8162 `
8163
8164 t.Run("java_import", func(t *testing.T) {
8165 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8166 java_import {
8167 name: "libfoo",
8168 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008169 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008170 }
8171 `)
8172 })
8173
8174 t.Run("java_sdk_library_import", func(t *testing.T) {
8175 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8176 java_sdk_library_import {
8177 name: "libfoo",
8178 public: {
8179 jars: ["libbar.jar"],
8180 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008181 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008182 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008183 }
8184 `)
8185 })
8186
8187 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8188 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8189 image_name: "art",
8190 contents: ["libfoo"],
8191 `)+`
8192 java_sdk_library_import {
8193 name: "libfoo",
8194 public: {
8195 jars: ["libbar.jar"],
8196 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008197 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008198 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008199 }
8200 `)
8201 })
8202}
8203
Paul Duffin5556c5f2022-06-09 17:32:21 +00008204func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8205 preparers := android.GroupFixturePreparers(
8206 java.PrepareForTestWithJavaDefaultModules,
8207 PrepareForTestWithApexBuildComponents,
8208 )
8209
Spandan Das59a4a2b2024-01-09 21:35:56 +00008210 errCtx := moduleErrorfTestCtx{}
8211
Paul Duffin5556c5f2022-06-09 17:32:21 +00008212 bpBase := `
8213 apex_set {
8214 name: "com.android.myapex",
8215 installable: true,
8216 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8217 set: "myapex.apks",
8218 }
8219
8220 apex_set {
8221 name: "com.android.myapex_compressed",
8222 apex_name: "com.android.myapex",
8223 installable: true,
8224 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8225 set: "myapex_compressed.apks",
8226 }
8227
8228 prebuilt_bootclasspath_fragment {
8229 name: "my-bootclasspath-fragment",
8230 apex_available: [
8231 "com.android.myapex",
8232 "com.android.myapex_compressed",
8233 ],
8234 hidden_api: {
8235 annotation_flags: "annotation-flags.csv",
8236 metadata: "metadata.csv",
8237 index: "index.csv",
8238 signature_patterns: "signature_patterns.csv",
8239 },
8240 %s
8241 }
8242 `
8243
8244 t.Run("java_import", func(t *testing.T) {
8245 result := preparers.RunTestWithBp(t,
8246 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8247 java_import {
8248 name: "libfoo",
8249 jars: ["libfoo.jar"],
8250 apex_available: [
8251 "com.android.myapex",
8252 "com.android.myapex_compressed",
8253 ],
8254 }
8255 `)
8256
8257 module := result.Module("libfoo", "android_common_com.android.myapex")
8258 usesLibraryDep := module.(java.UsesLibraryDependency)
8259 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008260 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008261 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008262 })
8263
8264 t.Run("java_sdk_library_import", func(t *testing.T) {
8265 result := preparers.RunTestWithBp(t,
8266 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8267 java_sdk_library_import {
8268 name: "libfoo",
8269 public: {
8270 jars: ["libbar.jar"],
8271 },
8272 apex_available: [
8273 "com.android.myapex",
8274 "com.android.myapex_compressed",
8275 ],
8276 compile_dex: true,
8277 }
8278 `)
8279
8280 module := result.Module("libfoo", "android_common_com.android.myapex")
8281 usesLibraryDep := module.(java.UsesLibraryDependency)
8282 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008283 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008284 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008285 })
8286
8287 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8288 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8289 image_name: "art",
8290 contents: ["libfoo"],
8291 `)+`
8292 java_sdk_library_import {
8293 name: "libfoo",
8294 public: {
8295 jars: ["libbar.jar"],
8296 },
8297 apex_available: [
8298 "com.android.myapex",
8299 "com.android.myapex_compressed",
8300 ],
8301 compile_dex: true,
8302 }
8303 `)
8304 })
8305}
8306
Jooyung Han548640b2020-04-27 12:10:30 +09008307func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8308 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8309 apex {
8310 name: "myapex",
8311 key: "myapex.key",
8312 updatable: true,
8313 }
8314
8315 apex_key {
8316 name: "myapex.key",
8317 public_key: "testkey.avbpubkey",
8318 private_key: "testkey.pem",
8319 }
8320 `)
8321}
8322
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008323func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8324 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8325 apex {
8326 name: "myapex",
8327 key: "myapex.key",
8328 }
8329
8330 apex_key {
8331 name: "myapex.key",
8332 public_key: "testkey.avbpubkey",
8333 private_key: "testkey.pem",
8334 }
8335 `)
8336}
8337
satayevb98371c2021-06-15 16:49:50 +01008338func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8339 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8340 apex {
8341 name: "myapex",
8342 key: "myapex.key",
8343 systemserverclasspath_fragments: [
8344 "mysystemserverclasspathfragment",
8345 ],
8346 min_sdk_version: "29",
8347 updatable: true,
8348 }
8349
8350 apex_key {
8351 name: "myapex.key",
8352 public_key: "testkey.avbpubkey",
8353 private_key: "testkey.pem",
8354 }
8355
8356 java_library {
8357 name: "foo",
8358 srcs: ["b.java"],
8359 min_sdk_version: "29",
8360 installable: true,
8361 apex_available: [
8362 "myapex",
8363 ],
8364 }
8365
8366 systemserverclasspath_fragment {
8367 name: "mysystemserverclasspathfragment",
8368 generate_classpaths_proto: false,
8369 contents: [
8370 "foo",
8371 ],
8372 apex_available: [
8373 "myapex",
8374 ],
8375 }
satayevabcd5972021-08-06 17:49:46 +01008376 `,
8377 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8378 )
satayevb98371c2021-06-15 16:49:50 +01008379}
8380
Paul Duffin064b70c2020-11-02 17:32:38 +00008381func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008382 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008383 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008384 fragment := java.ApexVariantReference{
8385 Apex: proptools.StringPtr("myapex"),
8386 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8387 }
8388
Paul Duffin064b70c2020-11-02 17:32:38 +00008389 testDexpreoptWithApexes(t, `
8390 prebuilt_apex {
8391 name: "myapex" ,
8392 arch: {
8393 arm64: {
8394 src: "myapex-arm64.apex",
8395 },
8396 arm: {
8397 src: "myapex-arm.apex",
8398 },
8399 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008400 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8401 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008402
Paul Duffin89f570a2021-06-16 01:42:33 +01008403 prebuilt_bootclasspath_fragment {
8404 name: "my-bootclasspath-fragment",
8405 contents: ["libfoo"],
8406 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008407 hidden_api: {
8408 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8409 metadata: "my-bootclasspath-fragment/metadata.csv",
8410 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008411 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8412 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8413 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008414 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008415 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008416
Paul Duffin89f570a2021-06-16 01:42:33 +01008417 java_import {
8418 name: "libfoo",
8419 jars: ["libfoo.jar"],
8420 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008421 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008422 }
8423 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008424 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008425}
8426
Spandan Dasf14e2542021-11-12 00:01:37 +00008427func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008428 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008429 bp += `
8430 apex_key {
8431 name: "myapex.key",
8432 public_key: "testkey.avbpubkey",
8433 private_key: "testkey.pem",
8434 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008435 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008436 "lib1/src/A.java": nil,
8437 "lib2/src/B.java": nil,
8438 "system/sepolicy/apex/myapex-file_contexts": nil,
8439 }
8440
Paul Duffin45338f02021-03-30 23:07:52 +01008441 errorHandler := android.FixtureExpectsNoErrors
8442 if errmsg != "" {
8443 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008444 }
Colin Crossae8600b2020-10-29 17:09:13 -07008445
Paul Duffin45338f02021-03-30 23:07:52 +01008446 android.GroupFixturePreparers(
8447 android.PrepareForTestWithAndroidBuildComponents,
8448 java.PrepareForTestWithJavaBuildComponents,
8449 PrepareForTestWithApexBuildComponents,
8450 android.PrepareForTestWithNeverallowRules(rules),
8451 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008452 apexBootJars := make([]string, 0, len(bootJars))
8453 for _, apexBootJar := range bootJars {
8454 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008455 }
satayevd604b212021-07-21 14:23:52 +01008456 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008457 }),
8458 fs.AddToFixture(),
8459 ).
8460 ExtendWithErrorHandler(errorHandler).
8461 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008462}
8463
8464func TestApexPermittedPackagesRules(t *testing.T) {
8465 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008466 name string
8467 expectedError string
8468 bp string
8469 bootJars []string
8470 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008471 }{
8472
8473 {
8474 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8475 expectedError: "",
8476 bp: `
8477 java_library {
8478 name: "bcp_lib1",
8479 srcs: ["lib1/src/*.java"],
8480 permitted_packages: ["foo.bar"],
8481 apex_available: ["myapex"],
8482 sdk_version: "none",
8483 system_modules: "none",
8484 }
8485 java_library {
8486 name: "nonbcp_lib2",
8487 srcs: ["lib2/src/*.java"],
8488 apex_available: ["myapex"],
8489 permitted_packages: ["a.b"],
8490 sdk_version: "none",
8491 system_modules: "none",
8492 }
8493 apex {
8494 name: "myapex",
8495 key: "myapex.key",
8496 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008497 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008498 }`,
8499 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008500 bcpPermittedPackages: map[string][]string{
8501 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008502 "foo.bar",
8503 },
8504 },
8505 },
8506 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008507 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008508 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 +01008509 bp: `
8510 java_library {
8511 name: "bcp_lib1",
8512 srcs: ["lib1/src/*.java"],
8513 apex_available: ["myapex"],
8514 permitted_packages: ["foo.bar"],
8515 sdk_version: "none",
8516 system_modules: "none",
8517 }
8518 java_library {
8519 name: "bcp_lib2",
8520 srcs: ["lib2/src/*.java"],
8521 apex_available: ["myapex"],
8522 permitted_packages: ["foo.bar", "bar.baz"],
8523 sdk_version: "none",
8524 system_modules: "none",
8525 }
8526 apex {
8527 name: "myapex",
8528 key: "myapex.key",
8529 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008530 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008531 }
8532 `,
8533 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008534 bcpPermittedPackages: map[string][]string{
8535 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008536 "foo.bar",
8537 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008538 "bcp_lib2": []string{
8539 "foo.bar",
8540 },
8541 },
8542 },
8543 {
8544 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8545 expectedError: "",
8546 bp: `
8547 java_library {
8548 name: "bcp_lib_restricted",
8549 srcs: ["lib1/src/*.java"],
8550 apex_available: ["myapex"],
8551 permitted_packages: ["foo.bar"],
8552 sdk_version: "none",
8553 min_sdk_version: "29",
8554 system_modules: "none",
8555 }
8556 java_library {
8557 name: "bcp_lib_unrestricted",
8558 srcs: ["lib2/src/*.java"],
8559 apex_available: ["myapex"],
8560 permitted_packages: ["foo.bar", "bar.baz"],
8561 sdk_version: "none",
8562 min_sdk_version: "29",
8563 system_modules: "none",
8564 }
8565 apex {
8566 name: "myapex",
8567 key: "myapex.key",
8568 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8569 updatable: true,
8570 min_sdk_version: "29",
8571 }
8572 `,
8573 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8574 bcpPermittedPackages: map[string][]string{
8575 "bcp_lib1_non_updateable": []string{
8576 "foo.bar",
8577 },
8578 // 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 +01008579 },
8580 },
8581 }
8582 for _, tc := range testcases {
8583 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008584 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8585 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008586 })
8587 }
8588}
8589
Jiyong Park62304bb2020-04-13 16:19:48 +09008590func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008591 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008592 apex {
8593 name: "myapex",
8594 key: "myapex.key",
8595 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008596 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008597 }
8598
8599 apex_key {
8600 name: "myapex.key",
8601 public_key: "testkey.avbpubkey",
8602 private_key: "testkey.pem",
8603 }
8604
8605 cc_library {
8606 name: "mylib",
8607 srcs: ["mylib.cpp"],
8608 system_shared_libs: [],
8609 stl: "none",
8610 stubs: {
8611 versions: ["1"],
8612 },
8613 apex_available: ["myapex"],
8614 }
8615
8616 cc_library {
8617 name: "myprivlib",
8618 srcs: ["mylib.cpp"],
8619 system_shared_libs: [],
8620 stl: "none",
8621 apex_available: ["myapex"],
8622 }
8623
8624
8625 cc_test {
8626 name: "mytest",
8627 gtest: false,
8628 srcs: ["mylib.cpp"],
8629 system_shared_libs: [],
8630 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008631 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008632 test_for: ["myapex"]
8633 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008634
8635 cc_library {
8636 name: "mytestlib",
8637 srcs: ["mylib.cpp"],
8638 system_shared_libs: [],
8639 shared_libs: ["mylib", "myprivlib"],
8640 stl: "none",
8641 test_for: ["myapex"],
8642 }
8643
8644 cc_benchmark {
8645 name: "mybench",
8646 srcs: ["mylib.cpp"],
8647 system_shared_libs: [],
8648 shared_libs: ["mylib", "myprivlib"],
8649 stl: "none",
8650 test_for: ["myapex"],
8651 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008652 `)
8653
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008654 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008655 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008656 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8657 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8658 }
8659
8660 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008661 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008662 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8663 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8664 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8665}
Jiyong Park46a512f2020-12-04 18:02:13 +09008666
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008667func TestIndirectTestFor(t *testing.T) {
8668 ctx := testApex(t, `
8669 apex {
8670 name: "myapex",
8671 key: "myapex.key",
8672 native_shared_libs: ["mylib", "myprivlib"],
8673 updatable: false,
8674 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008675
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008676 apex_key {
8677 name: "myapex.key",
8678 public_key: "testkey.avbpubkey",
8679 private_key: "testkey.pem",
8680 }
8681
8682 cc_library {
8683 name: "mylib",
8684 srcs: ["mylib.cpp"],
8685 system_shared_libs: [],
8686 stl: "none",
8687 stubs: {
8688 versions: ["1"],
8689 },
8690 apex_available: ["myapex"],
8691 }
8692
8693 cc_library {
8694 name: "myprivlib",
8695 srcs: ["mylib.cpp"],
8696 system_shared_libs: [],
8697 stl: "none",
8698 shared_libs: ["mylib"],
8699 apex_available: ["myapex"],
8700 }
8701
8702 cc_library {
8703 name: "mytestlib",
8704 srcs: ["mylib.cpp"],
8705 system_shared_libs: [],
8706 shared_libs: ["myprivlib"],
8707 stl: "none",
8708 test_for: ["myapex"],
8709 }
8710 `)
8711
8712 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008713 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008714 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8715 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8716 }
8717
8718 // The platform variant of mytestlib links to the platform variant of the
8719 // internal myprivlib.
8720 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8721
8722 // The platform variant of myprivlib links to the platform variant of mylib
8723 // and bypasses its stubs.
8724 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 +09008725}
8726
Martin Stjernholmec009002021-03-27 15:18:31 +00008727func TestTestForForLibInOtherApex(t *testing.T) {
8728 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8729 _ = testApex(t, `
8730 apex {
8731 name: "com.android.art",
8732 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008733 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008734 updatable: false,
8735 }
8736
8737 apex {
8738 name: "com.android.art.debug",
8739 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008740 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008741 updatable: false,
8742 }
8743
8744 apex_key {
8745 name: "myapex.key",
8746 public_key: "testkey.avbpubkey",
8747 private_key: "testkey.pem",
8748 }
8749
8750 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008751 name: "libnativebridge",
8752 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008753 system_shared_libs: [],
8754 stl: "none",
8755 stubs: {
8756 versions: ["1"],
8757 },
8758 apex_available: ["com.android.art", "com.android.art.debug"],
8759 }
8760
8761 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008762 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008763 srcs: ["mylib.cpp"],
8764 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008765 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008766 stl: "none",
8767 apex_available: ["com.android.art.debug"],
8768 test_for: ["com.android.art"],
8769 }
8770 `,
8771 android.MockFS{
8772 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8773 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8774 }.AddToFixture())
8775}
8776
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008777// TODO(jungjw): Move this to proptools
8778func intPtr(i int) *int {
8779 return &i
8780}
8781
8782func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008783 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008784 apex_set {
8785 name: "myapex",
8786 set: "myapex.apks",
8787 filename: "foo_v2.apex",
8788 overrides: ["foo"],
8789 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008790 `,
8791 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8792 variables.Platform_sdk_version = intPtr(30)
8793 }),
8794 android.FixtureModifyConfig(func(config android.Config) {
8795 config.Targets[android.Android] = []android.Target{
8796 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8797 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8798 }
8799 }),
8800 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008801
Spandan Das3576e762024-01-03 18:57:03 +00008802 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008803
8804 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008805 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008806 actual := extractedApex.Args["abis"]
8807 expected := "ARMEABI_V7A,ARM64_V8A"
8808 if actual != expected {
8809 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8810 }
8811 actual = extractedApex.Args["sdk-version"]
8812 expected = "30"
8813 if actual != expected {
8814 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8815 }
8816
Paul Duffin6717d882021-06-15 19:09:41 +01008817 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008818 a := m.Module().(*ApexSet)
8819 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008820 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008821 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8822 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8823 }
8824}
8825
Anton Hansson805e0a52022-11-25 14:06:46 +00008826func TestApexSet_NativeBridge(t *testing.T) {
8827 ctx := testApex(t, `
8828 apex_set {
8829 name: "myapex",
8830 set: "myapex.apks",
8831 filename: "foo_v2.apex",
8832 overrides: ["foo"],
8833 }
8834 `,
8835 android.FixtureModifyConfig(func(config android.Config) {
8836 config.Targets[android.Android] = []android.Target{
8837 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8838 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8839 }
8840 }),
8841 )
8842
Spandan Das3576e762024-01-03 18:57:03 +00008843 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008844
8845 // Check extract_apks tool parameters. No native bridge arch expected
8846 extractedApex := m.Output("extracted/myapex.apks")
8847 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8848}
8849
Jiyong Park7d95a512020-05-10 15:16:24 +09008850func TestNoStaticLinkingToStubsLib(t *testing.T) {
8851 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8852 apex {
8853 name: "myapex",
8854 key: "myapex.key",
8855 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008856 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008857 }
8858
8859 apex_key {
8860 name: "myapex.key",
8861 public_key: "testkey.avbpubkey",
8862 private_key: "testkey.pem",
8863 }
8864
8865 cc_library {
8866 name: "mylib",
8867 srcs: ["mylib.cpp"],
8868 static_libs: ["otherlib"],
8869 system_shared_libs: [],
8870 stl: "none",
8871 apex_available: [ "myapex" ],
8872 }
8873
8874 cc_library {
8875 name: "otherlib",
8876 srcs: ["mylib.cpp"],
8877 system_shared_libs: [],
8878 stl: "none",
8879 stubs: {
8880 versions: ["1", "2", "3"],
8881 },
8882 apex_available: [ "myapex" ],
8883 }
8884 `)
8885}
8886
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008887func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008888 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008889 apex {
8890 name: "myapex",
8891 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008892 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008893 custom_sign_tool: "sign_myapex",
8894 }
8895
8896 apex_key {
8897 name: "myapex.key",
8898 public_key: "testkey.avbpubkey",
8899 private_key: "testkey.pem",
8900 }
8901 `)
8902
Jooyung Han286957d2023-10-30 16:17:56 +09008903 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008904 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008905 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 +09008906}
8907
8908func TestApexKeysTxtOverrides(t *testing.T) {
8909 ctx := testApex(t, `
8910 apex {
8911 name: "myapex",
8912 key: "myapex.key",
8913 updatable: false,
8914 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008915 }
8916
8917 apex_key {
8918 name: "myapex.key",
8919 public_key: "testkey.avbpubkey",
8920 private_key: "testkey.pem",
8921 }
8922
8923 prebuilt_apex {
8924 name: "myapex",
8925 prefer: true,
8926 arch: {
8927 arm64: {
8928 src: "myapex-arm64.apex",
8929 },
8930 arm: {
8931 src: "myapex-arm.apex",
8932 },
8933 },
8934 }
8935
8936 apex_set {
8937 name: "myapex_set",
8938 set: "myapex.apks",
8939 filename: "myapex_set.apex",
8940 overrides: ["myapex"],
8941 }
8942 `)
8943
Colin Crossf61d03d2023-11-02 16:56:39 -07008944 content := android.ContentFromFileRuleForTests(t, ctx,
8945 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008946 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 -07008947 content = android.ContentFromFileRuleForTests(t, ctx,
8948 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008949 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 +09008950}
8951
Jooyung Han938b5932020-06-20 12:47:47 +09008952func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008953 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008954 apex {
8955 name: "myapex",
8956 key: "myapex.key",
8957 apps: ["app"],
8958 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008959 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008960 }
8961
8962 apex_key {
8963 name: "myapex.key",
8964 public_key: "testkey.avbpubkey",
8965 private_key: "testkey.pem",
8966 }
8967
8968 android_app {
8969 name: "app",
8970 srcs: ["foo/bar/MyClass.java"],
8971 package_name: "foo",
8972 sdk_version: "none",
8973 system_modules: "none",
8974 apex_available: [ "myapex" ],
8975 }
8976 `, withFiles(map[string][]byte{
8977 "sub/Android.bp": []byte(`
8978 override_apex {
8979 name: "override_myapex",
8980 base: "myapex",
8981 apps: ["override_app"],
8982 allowed_files: ":allowed",
8983 }
8984 // Overridable "path" property should be referenced indirectly
8985 filegroup {
8986 name: "allowed",
8987 srcs: ["allowed.txt"],
8988 }
8989 override_android_app {
8990 name: "override_app",
8991 base: "app",
8992 package_name: "bar",
8993 }
8994 `),
8995 }))
8996
Jooyung Hana0503a52023-08-23 13:12:50 +09008997 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008998 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8999 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9000 }
9001
Spandan Das50801e22024-05-13 18:29:45 +00009002 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009003 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9004 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9005 }
9006}
9007
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009008func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009009 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009010 apex {
9011 name: "myapex",
9012 key: "myapex.key",
9013 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009014 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009015 }
9016
9017 apex_key {
9018 name: "myapex.key",
9019 public_key: "testkey.avbpubkey",
9020 private_key: "testkey.pem",
9021 }
9022
9023 cc_library {
9024 name: "mylib",
9025 srcs: ["mylib.cpp"],
9026 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009027 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009028 },
9029 apex_available: ["myapex"],
9030 }
9031
9032 cc_prebuilt_library_shared {
9033 name: "mylib",
9034 prefer: false,
9035 srcs: ["prebuilt.so"],
9036 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009037 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009038 },
9039 apex_available: ["myapex"],
9040 }
9041 `)
9042}
9043
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009044func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009045 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009046 apex {
9047 name: "myapex",
9048 key: "myapex.key",
9049 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009050 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009051 }
9052 apex_key {
9053 name: "myapex.key",
9054 public_key: "testkey.avbpubkey",
9055 private_key: "testkey.pem",
9056 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009057 `,
9058 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9059 variables.CompressedApex = proptools.BoolPtr(true)
9060 }),
9061 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009062
Jooyung Hana0503a52023-08-23 13:12:50 +09009063 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009064 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9065
Jooyung Hana0503a52023-08-23 13:12:50 +09009066 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009067 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9068
9069 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009070 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009071 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9072
9073 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009074 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009075 var builder strings.Builder
9076 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9077 androidMk := builder.String()
9078 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9079}
9080
Jooyung Han26ec8482024-07-31 15:04:05 +09009081func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
9082 for _, compressionEnabled := range []bool{true, false} {
9083 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
9084 ctx := testApex(t, `
9085 apex_set {
9086 name: "com.company.android.myapex",
9087 apex_name: "com.android.myapex",
9088 set: "company-myapex.apks",
9089 }
9090 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9091 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9092 }),
9093 )
9094
9095 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9096 if compressionEnabled {
9097 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9098 } else {
9099 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9100 }
9101 })
9102 }
9103}
9104
Martin Stjernholm2856c662020-12-02 15:03:42 +00009105func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009106 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009107 apex {
9108 name: "myapex",
9109 key: "myapex.key",
9110 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009111 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009112 }
9113
9114 apex_key {
9115 name: "myapex.key",
9116 public_key: "testkey.avbpubkey",
9117 private_key: "testkey.pem",
9118 }
9119
9120 cc_library {
9121 name: "mylib",
9122 srcs: ["mylib.cpp"],
9123 apex_available: ["myapex"],
9124 shared_libs: ["otherlib"],
9125 system_shared_libs: [],
9126 }
9127
9128 cc_library {
9129 name: "otherlib",
9130 srcs: ["mylib.cpp"],
9131 stubs: {
9132 versions: ["current"],
9133 },
9134 }
9135
9136 cc_prebuilt_library_shared {
9137 name: "otherlib",
9138 prefer: true,
9139 srcs: ["prebuilt.so"],
9140 stubs: {
9141 versions: ["current"],
9142 },
9143 }
9144 `)
9145
Jooyung Hana0503a52023-08-23 13:12:50 +09009146 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009147 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009148 var builder strings.Builder
9149 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9150 androidMk := builder.String()
9151
9152 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9153 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009154 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009155}
9156
Jiyong Parke3867542020-12-03 17:28:25 +09009157func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009158 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009159 apex {
9160 name: "myapex",
9161 key: "myapex.key",
9162 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009163 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009164 }
9165
9166 apex_key {
9167 name: "myapex.key",
9168 public_key: "testkey.avbpubkey",
9169 private_key: "testkey.pem",
9170 }
9171
9172 cc_library {
9173 name: "mylib",
9174 srcs: ["mylib.cpp"],
9175 system_shared_libs: [],
9176 stl: "none",
9177 apex_available: ["myapex"],
9178 shared_libs: ["mylib2"],
9179 target: {
9180 apex: {
9181 exclude_shared_libs: ["mylib2"],
9182 },
9183 },
9184 }
9185
9186 cc_library {
9187 name: "mylib2",
9188 srcs: ["mylib.cpp"],
9189 system_shared_libs: [],
9190 stl: "none",
9191 }
9192 `)
9193
9194 // Check if mylib is linked to mylib2 for the non-apex target
9195 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9196 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9197
9198 // Make sure that the link doesn't occur for the apex target
9199 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9200 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9201
9202 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009203 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009204 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9205}
9206
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009207func TestPrebuiltStubLibDep(t *testing.T) {
9208 bpBase := `
9209 apex {
9210 name: "myapex",
9211 key: "myapex.key",
9212 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009213 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009214 }
9215 apex_key {
9216 name: "myapex.key",
9217 public_key: "testkey.avbpubkey",
9218 private_key: "testkey.pem",
9219 }
9220 cc_library {
9221 name: "mylib",
9222 srcs: ["mylib.cpp"],
9223 apex_available: ["myapex"],
9224 shared_libs: ["stublib"],
9225 system_shared_libs: [],
9226 }
9227 apex {
9228 name: "otherapex",
9229 enabled: %s,
9230 key: "myapex.key",
9231 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009232 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009233 }
9234 `
9235
9236 stublibSourceBp := `
9237 cc_library {
9238 name: "stublib",
9239 srcs: ["mylib.cpp"],
9240 apex_available: ["otherapex"],
9241 system_shared_libs: [],
9242 stl: "none",
9243 stubs: {
9244 versions: ["1"],
9245 },
9246 }
9247 `
9248
9249 stublibPrebuiltBp := `
9250 cc_prebuilt_library_shared {
9251 name: "stublib",
9252 srcs: ["prebuilt.so"],
9253 apex_available: ["otherapex"],
9254 stubs: {
9255 versions: ["1"],
9256 },
9257 %s
9258 }
9259 `
9260
9261 tests := []struct {
9262 name string
9263 stublibBp string
9264 usePrebuilt bool
9265 modNames []string // Modules to collect AndroidMkEntries for
9266 otherApexEnabled []string
9267 }{
9268 {
9269 name: "only_source",
9270 stublibBp: stublibSourceBp,
9271 usePrebuilt: false,
9272 modNames: []string{"stublib"},
9273 otherApexEnabled: []string{"true", "false"},
9274 },
9275 {
9276 name: "source_preferred",
9277 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9278 usePrebuilt: false,
9279 modNames: []string{"stublib", "prebuilt_stublib"},
9280 otherApexEnabled: []string{"true", "false"},
9281 },
9282 {
9283 name: "prebuilt_preferred",
9284 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9285 usePrebuilt: true,
9286 modNames: []string{"stublib", "prebuilt_stublib"},
9287 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9288 },
9289 {
9290 name: "only_prebuilt",
9291 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9292 usePrebuilt: true,
9293 modNames: []string{"stublib"},
9294 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9295 },
9296 }
9297
9298 for _, test := range tests {
9299 t.Run(test.name, func(t *testing.T) {
9300 for _, otherApexEnabled := range test.otherApexEnabled {
9301 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009302 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009303
9304 type modAndMkEntries struct {
9305 mod *cc.Module
9306 mkEntries android.AndroidMkEntries
9307 }
9308 entries := []*modAndMkEntries{}
9309
9310 // Gather shared lib modules that are installable
9311 for _, modName := range test.modNames {
9312 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9313 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9314 continue
9315 }
9316 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009317 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009318 continue
9319 }
Colin Crossaa255532020-07-03 13:18:24 -07009320 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009321 if ent.Disabled {
9322 continue
9323 }
9324 entries = append(entries, &modAndMkEntries{
9325 mod: mod,
9326 mkEntries: ent,
9327 })
9328 }
9329 }
9330 }
9331
9332 var entry *modAndMkEntries = nil
9333 for _, ent := range entries {
9334 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9335 if entry != nil {
9336 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9337 } else {
9338 entry = ent
9339 }
9340 }
9341 }
9342
9343 if entry == nil {
9344 t.Errorf("AndroidMk entry for \"stublib\" missing")
9345 } else {
9346 isPrebuilt := entry.mod.Prebuilt() != nil
9347 if isPrebuilt != test.usePrebuilt {
9348 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9349 }
9350 if !entry.mod.IsStubs() {
9351 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9352 }
9353 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9354 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9355 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009356 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009357 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009358 if !android.InList(expected, cflags) {
9359 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9360 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009361 }
9362 })
9363 }
9364 })
9365 }
9366}
9367
Colin Crossc33e5212021-05-25 18:16:02 -07009368func TestApexJavaCoverage(t *testing.T) {
9369 bp := `
9370 apex {
9371 name: "myapex",
9372 key: "myapex.key",
9373 java_libs: ["mylib"],
9374 bootclasspath_fragments: ["mybootclasspathfragment"],
9375 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9376 updatable: false,
9377 }
9378
9379 apex_key {
9380 name: "myapex.key",
9381 public_key: "testkey.avbpubkey",
9382 private_key: "testkey.pem",
9383 }
9384
9385 java_library {
9386 name: "mylib",
9387 srcs: ["mylib.java"],
9388 apex_available: ["myapex"],
9389 compile_dex: true,
9390 }
9391
9392 bootclasspath_fragment {
9393 name: "mybootclasspathfragment",
9394 contents: ["mybootclasspathlib"],
9395 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009396 hidden_api: {
9397 split_packages: ["*"],
9398 },
Colin Crossc33e5212021-05-25 18:16:02 -07009399 }
9400
9401 java_library {
9402 name: "mybootclasspathlib",
9403 srcs: ["mybootclasspathlib.java"],
9404 apex_available: ["myapex"],
9405 compile_dex: true,
9406 }
9407
9408 systemserverclasspath_fragment {
9409 name: "mysystemserverclasspathfragment",
9410 contents: ["mysystemserverclasspathlib"],
9411 apex_available: ["myapex"],
9412 }
9413
9414 java_library {
9415 name: "mysystemserverclasspathlib",
9416 srcs: ["mysystemserverclasspathlib.java"],
9417 apex_available: ["myapex"],
9418 compile_dex: true,
9419 }
9420 `
9421
9422 result := android.GroupFixturePreparers(
9423 PrepareForTestWithApexBuildComponents,
9424 prepareForTestWithMyapex,
9425 java.PrepareForTestWithJavaDefaultModules,
9426 android.PrepareForTestWithAndroidBuildComponents,
9427 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009428 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9429 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009430 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009431 ).RunTest(t)
9432
9433 // Make sure jacoco ran on both mylib and mybootclasspathlib
9434 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9435 t.Errorf("Failed to find jacoco rule for mylib")
9436 }
9437 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9438 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9439 }
9440 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9441 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9442 }
9443}
9444
Jiyong Park192600a2021-08-03 07:52:17 +00009445func TestProhibitStaticExecutable(t *testing.T) {
9446 testApexError(t, `executable mybin is static`, `
9447 apex {
9448 name: "myapex",
9449 key: "myapex.key",
9450 binaries: ["mybin"],
9451 min_sdk_version: "29",
9452 }
9453
9454 apex_key {
9455 name: "myapex.key",
9456 public_key: "testkey.avbpubkey",
9457 private_key: "testkey.pem",
9458 }
9459
9460 cc_binary {
9461 name: "mybin",
9462 srcs: ["mylib.cpp"],
9463 relative_install_path: "foo/bar",
9464 static_executable: true,
9465 system_shared_libs: [],
9466 stl: "none",
9467 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009468 min_sdk_version: "29",
9469 }
9470 `)
9471
9472 testApexError(t, `executable mybin.rust is static`, `
9473 apex {
9474 name: "myapex",
9475 key: "myapex.key",
9476 binaries: ["mybin.rust"],
9477 min_sdk_version: "29",
9478 }
9479
9480 apex_key {
9481 name: "myapex.key",
9482 public_key: "testkey.avbpubkey",
9483 private_key: "testkey.pem",
9484 }
9485
9486 rust_binary {
9487 name: "mybin.rust",
9488 srcs: ["foo.rs"],
9489 static_executable: true,
9490 apex_available: ["myapex"],
9491 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009492 }
9493 `)
9494}
9495
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009496func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9497 ctx := testApex(t, `
9498 apex {
9499 name: "myapex",
9500 key: "myapex.key",
9501 updatable: false,
9502 java_libs: ["foo"],
9503 }
9504
9505 apex_key {
9506 name: "myapex.key",
9507 public_key: "testkey.avbpubkey",
9508 private_key: "testkey.pem",
9509 }
9510
9511 java_library {
9512 name: "foo",
9513 srcs: ["foo.java"],
9514 apex_available: ["myapex"],
9515 installable: true,
9516 }
9517 `,
9518 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9519 )
9520
Jooyung Hana0503a52023-08-23 13:12:50 +09009521 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009522 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9523 var builder strings.Builder
9524 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9525 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009526 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 +00009527}
9528
9529func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9530 ctx := testApex(t, `
9531 prebuilt_apex {
9532 name: "myapex",
9533 arch: {
9534 arm64: {
9535 src: "myapex-arm64.apex",
9536 },
9537 arm: {
9538 src: "myapex-arm.apex",
9539 },
9540 },
9541 exported_java_libs: ["foo"],
9542 }
9543
9544 java_import {
9545 name: "foo",
9546 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009547 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009548 }
9549 `,
9550 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9551 )
9552
9553 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9554 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9555 mainModuleEntries := entriesList[0]
9556 android.AssertArrayString(t,
9557 "LOCAL_REQUIRED_MODULES",
9558 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9559 []string{
9560 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9561 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9562 })
9563}
9564
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009565func TestAndroidMk_RequiredModules(t *testing.T) {
9566 ctx := testApex(t, `
9567 apex {
9568 name: "myapex",
9569 key: "myapex.key",
9570 updatable: false,
9571 java_libs: ["foo"],
9572 required: ["otherapex"],
9573 }
9574
9575 apex {
9576 name: "otherapex",
9577 key: "myapex.key",
9578 updatable: false,
9579 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009580 }
9581
9582 apex_key {
9583 name: "myapex.key",
9584 public_key: "testkey.avbpubkey",
9585 private_key: "testkey.pem",
9586 }
9587
9588 java_library {
9589 name: "foo",
9590 srcs: ["foo.java"],
9591 apex_available: ["myapex", "otherapex"],
9592 installable: true,
9593 }
9594 `)
9595
Jooyung Hana0503a52023-08-23 13:12:50 +09009596 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009597 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9598 var builder strings.Builder
9599 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9600 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009601 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009602}
9603
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009604func TestAndroidMk_RequiredDeps(t *testing.T) {
9605 ctx := testApex(t, `
9606 apex {
9607 name: "myapex",
9608 key: "myapex.key",
9609 updatable: false,
9610 }
9611
9612 apex_key {
9613 name: "myapex.key",
9614 public_key: "testkey.avbpubkey",
9615 private_key: "testkey.pem",
9616 }
9617 `)
9618
Jooyung Hana0503a52023-08-23 13:12:50 +09009619 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009620 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009621 data := android.AndroidMkDataForTest(t, ctx, bundle)
9622 var builder strings.Builder
9623 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9624 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009625 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009626}
9627
Jooyung Hana6d36672022-02-24 13:58:07 +09009628func TestApexOutputFileProducer(t *testing.T) {
9629 for _, tc := range []struct {
9630 name string
9631 ref string
9632 expected_data []string
9633 }{
9634 {
9635 name: "test_using_output",
9636 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009637 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009638 },
9639 {
9640 name: "test_using_apex",
9641 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009642 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009643 },
9644 } {
9645 t.Run(tc.name, func(t *testing.T) {
9646 ctx := testApex(t, `
9647 apex {
9648 name: "myapex",
9649 key: "myapex.key",
9650 compressible: true,
9651 updatable: false,
9652 }
9653
9654 apex_key {
9655 name: "myapex.key",
9656 public_key: "testkey.avbpubkey",
9657 private_key: "testkey.pem",
9658 }
9659
9660 java_test {
9661 name: "`+tc.name+`",
9662 srcs: ["a.java"],
9663 data: ["`+tc.ref+`"],
9664 }
9665 `,
9666 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9667 variables.CompressedApex = proptools.BoolPtr(true)
9668 }))
9669 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9670 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9671 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9672 })
9673 }
9674}
9675
satayev758968a2021-12-06 11:42:40 +00009676func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9677 preparer := android.GroupFixturePreparers(
9678 PrepareForTestWithApexBuildComponents,
9679 prepareForTestWithMyapex,
9680 java.PrepareForTestWithJavaSdkLibraryFiles,
9681 java.PrepareForTestWithJavaDefaultModules,
9682 android.PrepareForTestWithAndroidBuildComponents,
9683 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9684 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9685 )
9686
9687 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9688 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9689 preparer.RunTestWithBp(t, `
9690 apex {
9691 name: "myapex",
9692 key: "myapex.key",
9693 bootclasspath_fragments: ["mybootclasspathfragment"],
9694 min_sdk_version: "30",
9695 updatable: false,
9696 }
9697
9698 apex_key {
9699 name: "myapex.key",
9700 public_key: "testkey.avbpubkey",
9701 private_key: "testkey.pem",
9702 }
9703
9704 bootclasspath_fragment {
9705 name: "mybootclasspathfragment",
9706 contents: ["mybootclasspathlib"],
9707 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009708 hidden_api: {
9709 split_packages: ["*"],
9710 },
satayev758968a2021-12-06 11:42:40 +00009711 }
9712
9713 java_sdk_library {
9714 name: "mybootclasspathlib",
9715 srcs: ["mybootclasspathlib.java"],
9716 apex_available: ["myapex"],
9717 compile_dex: true,
9718 unsafe_ignore_missing_latest_api: true,
9719 min_sdk_version: "31",
9720 static_libs: ["util"],
9721 }
9722
9723 java_library {
9724 name: "util",
9725 srcs: ["a.java"],
9726 apex_available: ["myapex"],
9727 min_sdk_version: "31",
9728 static_libs: ["another_util"],
9729 }
9730
9731 java_library {
9732 name: "another_util",
9733 srcs: ["a.java"],
9734 min_sdk_version: "31",
9735 apex_available: ["myapex"],
9736 }
9737 `)
9738 })
9739
9740 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9741 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9742 preparer.RunTestWithBp(t, `
9743 apex {
9744 name: "myapex",
9745 key: "myapex.key",
9746 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9747 min_sdk_version: "30",
9748 updatable: false,
9749 }
9750
9751 apex_key {
9752 name: "myapex.key",
9753 public_key: "testkey.avbpubkey",
9754 private_key: "testkey.pem",
9755 }
9756
9757 systemserverclasspath_fragment {
9758 name: "mysystemserverclasspathfragment",
9759 contents: ["mysystemserverclasspathlib"],
9760 apex_available: ["myapex"],
9761 }
9762
9763 java_sdk_library {
9764 name: "mysystemserverclasspathlib",
9765 srcs: ["mysystemserverclasspathlib.java"],
9766 apex_available: ["myapex"],
9767 compile_dex: true,
9768 min_sdk_version: "32",
9769 unsafe_ignore_missing_latest_api: true,
9770 static_libs: ["util"],
9771 }
9772
9773 java_library {
9774 name: "util",
9775 srcs: ["a.java"],
9776 apex_available: ["myapex"],
9777 min_sdk_version: "31",
9778 static_libs: ["another_util"],
9779 }
9780
9781 java_library {
9782 name: "another_util",
9783 srcs: ["a.java"],
9784 min_sdk_version: "31",
9785 apex_available: ["myapex"],
9786 }
9787 `)
9788 })
9789
9790 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Satish Yallab2b1ef62024-08-28 05:10:31 +00009791 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
satayev758968a2021-12-06 11:42:40 +00009792 RunTestWithBp(t, `
9793 apex {
9794 name: "myapex",
9795 key: "myapex.key",
9796 bootclasspath_fragments: ["mybootclasspathfragment"],
9797 min_sdk_version: "30",
9798 updatable: false,
9799 }
9800
9801 apex_key {
9802 name: "myapex.key",
9803 public_key: "testkey.avbpubkey",
9804 private_key: "testkey.pem",
9805 }
9806
9807 bootclasspath_fragment {
9808 name: "mybootclasspathfragment",
9809 contents: ["mybootclasspathlib"],
9810 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009811 hidden_api: {
9812 split_packages: ["*"],
9813 },
satayev758968a2021-12-06 11:42:40 +00009814 }
9815
9816 java_sdk_library {
9817 name: "mybootclasspathlib",
9818 srcs: ["mybootclasspathlib.java"],
9819 apex_available: ["myapex"],
9820 compile_dex: true,
9821 unsafe_ignore_missing_latest_api: true,
9822 }
9823 `)
9824 })
9825
9826 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9827 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9828 RunTestWithBp(t, `
9829 apex {
9830 name: "myapex",
9831 key: "myapex.key",
9832 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9833 min_sdk_version: "30",
9834 updatable: false,
9835 }
9836
9837 apex_key {
9838 name: "myapex.key",
9839 public_key: "testkey.avbpubkey",
9840 private_key: "testkey.pem",
9841 }
9842
9843 systemserverclasspath_fragment {
9844 name: "mysystemserverclasspathfragment",
9845 contents: ["mysystemserverclasspathlib"],
9846 apex_available: ["myapex"],
9847 }
9848
9849 java_sdk_library {
9850 name: "mysystemserverclasspathlib",
9851 srcs: ["mysystemserverclasspathlib.java"],
9852 apex_available: ["myapex"],
9853 compile_dex: true,
9854 unsafe_ignore_missing_latest_api: true,
9855 }
9856 `)
9857 })
9858}
9859
Jiakai Zhang6decef92022-01-12 17:56:19 +00009860// Verifies that the APEX depends on all the Make modules in the list.
9861func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9862 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9863 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009864 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009865 }
9866}
9867
9868// Verifies that the APEX does not depend on any of the Make modules in the list.
9869func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9870 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9871 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009872 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009873 }
9874}
9875
Cole Faust24e25c02024-01-19 14:12:17 -08009876func TestApexStrictUpdtabilityLint(t *testing.T) {
9877 bpTemplate := `
9878 apex {
9879 name: "myapex",
9880 key: "myapex.key",
9881 java_libs: ["myjavalib"],
9882 updatable: %v,
9883 min_sdk_version: "29",
9884 }
9885 apex_key {
9886 name: "myapex.key",
9887 }
9888 java_library {
9889 name: "myjavalib",
9890 srcs: ["MyClass.java"],
9891 apex_available: [ "myapex" ],
9892 lint: {
9893 strict_updatability_linting: %v,
9894 %s
9895 },
9896 sdk_version: "current",
9897 min_sdk_version: "29",
9898 }
9899 `
9900 fs := android.MockFS{
9901 "lint-baseline.xml": nil,
9902 }
9903
9904 testCases := []struct {
9905 testCaseName string
9906 apexUpdatable bool
9907 javaStrictUpdtabilityLint bool
9908 lintFileExists bool
9909 disallowedFlagExpected bool
9910 }{
9911 {
9912 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9913 apexUpdatable: true,
9914 javaStrictUpdtabilityLint: true,
9915 lintFileExists: false,
9916 disallowedFlagExpected: false,
9917 },
9918 {
9919 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9920 apexUpdatable: false,
9921 javaStrictUpdtabilityLint: false,
9922 lintFileExists: true,
9923 disallowedFlagExpected: false,
9924 },
9925 {
9926 testCaseName: "non-updatable apex respects strict updatability of javalib",
9927 apexUpdatable: false,
9928 javaStrictUpdtabilityLint: true,
9929 lintFileExists: true,
9930 disallowedFlagExpected: true,
9931 },
9932 {
9933 testCaseName: "updatable apex sets strict updatability of javalib to true",
9934 apexUpdatable: true,
9935 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9936 lintFileExists: true,
9937 disallowedFlagExpected: true,
9938 },
9939 }
9940
9941 for _, testCase := range testCases {
9942 fixtures := []android.FixturePreparer{}
9943 baselineProperty := ""
9944 if testCase.lintFileExists {
9945 fixtures = append(fixtures, fs.AddToFixture())
9946 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9947 }
9948 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
9949
9950 result := testApex(t, bp, fixtures...)
9951 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9952 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
9953 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9954
9955 if disallowedFlagActual != testCase.disallowedFlagExpected {
9956 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9957 }
9958 }
9959}
9960
9961func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9962 bp := `
9963 apex {
9964 name: "myapex",
9965 key: "myapex.key",
9966 java_libs: ["myjavalib"],
9967 updatable: true,
9968 min_sdk_version: "29",
9969 }
9970 apex_key {
9971 name: "myapex.key",
9972 }
9973 java_library {
9974 name: "myjavalib",
9975 srcs: ["MyClass.java"],
9976 apex_available: [ "myapex" ],
9977 sdk_version: "current",
9978 min_sdk_version: "29",
9979 lint: {
9980 baseline_filename: "lint-baseline.xml",
9981 }
9982 }
9983 `
9984
9985 testCases := []struct {
9986 testCaseName string
9987 moduleDirectory string
9988 disallowedFlagExpected bool
9989 }{
9990 {
9991 testCaseName: "lintable module defined outside libcore",
9992 moduleDirectory: "",
9993 disallowedFlagExpected: true,
9994 },
9995 {
9996 testCaseName: "lintable module defined in libcore root directory",
9997 moduleDirectory: "libcore/",
9998 disallowedFlagExpected: false,
9999 },
10000 {
10001 testCaseName: "lintable module defined in libcore child directory",
10002 moduleDirectory: "libcore/childdir/",
10003 disallowedFlagExpected: true,
10004 },
10005 }
10006
10007 for _, testCase := range testCases {
10008 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10009 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10010 result := testApex(t, "", lintFileCreator, bpFileCreator)
10011 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10012 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10013 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10014 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10015
10016 if disallowedFlagActual != testCase.disallowedFlagExpected {
10017 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10018 }
10019 }
10020}
10021
10022// checks transtive deps of an apex coming from bootclasspath_fragment
10023func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10024 bp := `
10025 apex {
10026 name: "myapex",
10027 key: "myapex.key",
10028 bootclasspath_fragments: ["mybootclasspathfragment"],
10029 updatable: true,
10030 min_sdk_version: "29",
10031 }
10032 apex_key {
10033 name: "myapex.key",
10034 }
10035 bootclasspath_fragment {
10036 name: "mybootclasspathfragment",
10037 contents: ["myjavalib"],
10038 apex_available: ["myapex"],
10039 hidden_api: {
10040 split_packages: ["*"],
10041 },
10042 }
10043 java_library {
10044 name: "myjavalib",
10045 srcs: ["MyClass.java"],
10046 apex_available: [ "myapex" ],
10047 sdk_version: "current",
10048 min_sdk_version: "29",
10049 compile_dex: true,
10050 lint: {
10051 baseline_filename: "lint-baseline.xml",
10052 }
10053 }
10054 `
10055 fs := android.MockFS{
10056 "lint-baseline.xml": nil,
10057 }
10058
10059 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10060 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10061 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10062 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10063 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10064 }
10065}
Spandan Das66773252022-01-15 00:23:18 +000010066
Jihoon Kang784c0052024-06-25 22:15:39 +000010067func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
10068 bp := `
10069 apex {
10070 name: "myapex",
10071 key: "myapex.key",
10072 bootclasspath_fragments: ["mybootclasspathfragment"],
10073 min_sdk_version: "29",
10074 }
10075 apex_key {
10076 name: "myapex.key",
10077 }
10078 bootclasspath_fragment {
10079 name: "mybootclasspathfragment",
10080 contents: ["foo"],
10081 apex_available: ["myapex"],
10082 hidden_api: {
10083 split_packages: ["*"],
10084 },
10085 }
10086 java_sdk_library {
10087 name: "foo",
10088 srcs: ["MyClass.java"],
10089 apex_available: [ "myapex" ],
10090 sdk_version: "current",
10091 min_sdk_version: "29",
10092 compile_dex: true,
10093 }
10094 `
10095 fs := android.MockFS{
10096 "lint-baseline.xml": nil,
10097 }
10098
10099 result := android.GroupFixturePreparers(
10100 prepareForApexTest,
10101 java.PrepareForTestWithJavaSdkLibraryFiles,
10102 java.PrepareForTestWithJacocoInstrumentation,
10103 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010104 android.FixtureMergeMockFs(fs),
10105 ).RunTestWithBp(t, bp)
10106
10107 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10108 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10109 android.AssertStringDoesContain(t,
10110 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10111 lintReportInputs, "foo.impl")
10112}
10113
Spandan Das42e89502022-05-06 22:12:55 +000010114// updatable apexes should propagate updatable=true to its apps
10115func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10116 bp := `
10117 apex {
10118 name: "myapex",
10119 key: "myapex.key",
10120 updatable: %v,
10121 apps: [
10122 "myapp",
10123 ],
10124 min_sdk_version: "30",
10125 }
10126 apex_key {
10127 name: "myapex.key",
10128 }
10129 android_app {
10130 name: "myapp",
10131 updatable: %v,
10132 apex_available: [
10133 "myapex",
10134 ],
10135 sdk_version: "current",
10136 min_sdk_version: "30",
10137 }
10138 `
10139 testCases := []struct {
10140 name string
10141 apex_is_updatable_bp bool
10142 app_is_updatable_bp bool
10143 app_is_updatable_expected bool
10144 }{
10145 {
10146 name: "Non-updatable apex respects updatable property of non-updatable app",
10147 apex_is_updatable_bp: false,
10148 app_is_updatable_bp: false,
10149 app_is_updatable_expected: false,
10150 },
10151 {
10152 name: "Non-updatable apex respects updatable property of updatable app",
10153 apex_is_updatable_bp: false,
10154 app_is_updatable_bp: true,
10155 app_is_updatable_expected: true,
10156 },
10157 {
10158 name: "Updatable apex respects updatable property of updatable app",
10159 apex_is_updatable_bp: true,
10160 app_is_updatable_bp: true,
10161 app_is_updatable_expected: true,
10162 },
10163 {
10164 name: "Updatable apex sets updatable=true on non-updatable app",
10165 apex_is_updatable_bp: true,
10166 app_is_updatable_bp: false,
10167 app_is_updatable_expected: true,
10168 },
10169 }
10170 for _, testCase := range testCases {
10171 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10172 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10173 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10174 }
10175}
10176
Kiyoung Kim487689e2022-07-26 09:48:22 +090010177func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10178 bp := `
10179 apex {
10180 name: "myapex",
10181 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010182 native_shared_libs: ["libbaz"],
10183 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010184 min_sdk_version: "29",
10185 }
10186 apex_key {
10187 name: "myapex.key",
10188 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010189 cc_binary {
10190 name: "binfoo",
10191 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010192 apex_available: ["myapex"],
10193 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010194 recovery_available: false,
10195 }
10196 cc_library {
10197 name: "libbar",
10198 srcs: ["libbar.cc"],
10199 stubs: {
10200 symbol_file: "libbar.map.txt",
10201 versions: [
10202 "29",
10203 ],
10204 },
10205 }
10206 cc_library {
10207 name: "libbaz",
10208 srcs: ["libbaz.cc"],
10209 apex_available: ["myapex"],
10210 min_sdk_version: "29",
10211 stubs: {
10212 symbol_file: "libbaz.map.txt",
10213 versions: [
10214 "29",
10215 ],
10216 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010217 }
10218 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010219 name: "libbar",
10220 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010221 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010222 variants: ["apex.29"],
10223 }
10224 cc_api_variant {
10225 name: "libbar",
10226 variant: "apex",
10227 version: "29",
10228 src: "libbar_apex_29.so",
10229 }
10230 cc_api_library {
10231 name: "libbaz",
10232 src: "libbaz_stub.so",
10233 min_sdk_version: "29",
10234 variants: ["apex.29"],
10235 }
10236 cc_api_variant {
10237 name: "libbaz",
10238 variant: "apex",
10239 version: "29",
10240 src: "libbaz_apex_29.so",
10241 }
10242 cc_api_library {
10243 name: "libqux",
10244 src: "libqux_stub.so",
10245 min_sdk_version: "29",
10246 variants: ["apex.29"],
10247 }
10248 cc_api_variant {
10249 name: "libqux",
10250 variant: "apex",
10251 version: "29",
10252 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010253 }
10254 api_imports {
10255 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010256 apex_shared_libs: [
10257 "libbar",
10258 "libbaz",
10259 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010260 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010261 }
10262 `
10263 result := testApex(t, bp)
10264
10265 hasDep := func(m android.Module, wantDep android.Module) bool {
10266 t.Helper()
10267 var found bool
10268 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10269 if dep == wantDep {
10270 found = true
10271 }
10272 })
10273 return found
10274 }
10275
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010276 // Library defines stubs and cc_api_library should be used with cc_api_library
10277 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10278 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10279 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010280
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010281 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10282 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010283
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010284 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10285 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10286 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10287 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10288
10289 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10290 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10291 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10292 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10293 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10294
10295 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10296 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10297 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10298
10299 // cc_api_library defined without original library should be linked with cc_api_library
10300 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10301 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10302 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10303}
10304
10305func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10306 bp := `
10307 apex {
10308 name: "myapex",
10309 key: "myapex.key",
10310 native_shared_libs: ["libbar"],
10311 min_sdk_version: "29",
10312 }
10313 apex_key {
10314 name: "myapex.key",
10315 }
10316 cc_binary {
10317 name: "binfoo",
10318 shared_libs: ["libbar"],
10319 recovery_available: false,
10320 }
10321 cc_library {
10322 name: "libbar",
10323 srcs: ["libbar.cc"],
10324 apex_available: ["myapex"],
10325 min_sdk_version: "29",
10326 stubs: {
10327 symbol_file: "libbar.map.txt",
10328 versions: [
10329 "29",
10330 ],
10331 },
10332 }
10333 cc_api_library {
10334 name: "libbar",
10335 src: "libbar_stub.so",
10336 variants: ["apex.29"],
10337 }
10338 cc_api_variant {
10339 name: "libbar",
10340 variant: "apex",
10341 version: "29",
10342 src: "libbar_apex_29.so",
10343 }
10344 api_imports {
10345 name: "api_imports",
10346 apex_shared_libs: [
10347 "libbar",
10348 ],
10349 }
10350 `
10351
10352 result := testApex(t, bp)
10353
10354 hasDep := func(m android.Module, wantDep android.Module) bool {
10355 t.Helper()
10356 var found bool
10357 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10358 if dep == wantDep {
10359 found = true
10360 }
10361 })
10362 return found
10363 }
10364
10365 // Library defines stubs and cc_api_library should be used with cc_api_library
10366 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10367 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10368 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10369
10370 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10371 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10372
10373 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10374 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10375 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10376 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010377}
Dennis Shend4f5d932023-01-31 20:27:21 +000010378
10379func TestTrimmedApex(t *testing.T) {
10380 bp := `
10381 apex {
10382 name: "myapex",
10383 key: "myapex.key",
10384 native_shared_libs: ["libfoo","libbaz"],
10385 min_sdk_version: "29",
10386 trim_against: "mydcla",
10387 }
10388 apex {
10389 name: "mydcla",
10390 key: "myapex.key",
10391 native_shared_libs: ["libfoo","libbar"],
10392 min_sdk_version: "29",
10393 file_contexts: ":myapex-file_contexts",
10394 dynamic_common_lib_apex: true,
10395 }
10396 apex_key {
10397 name: "myapex.key",
10398 }
10399 cc_library {
10400 name: "libfoo",
10401 shared_libs: ["libc"],
10402 apex_available: ["myapex","mydcla"],
10403 min_sdk_version: "29",
10404 }
10405 cc_library {
10406 name: "libbar",
10407 shared_libs: ["libc"],
10408 apex_available: ["myapex","mydcla"],
10409 min_sdk_version: "29",
10410 }
10411 cc_library {
10412 name: "libbaz",
10413 shared_libs: ["libc"],
10414 apex_available: ["myapex","mydcla"],
10415 min_sdk_version: "29",
10416 }
10417 cc_api_library {
10418 name: "libc",
10419 src: "libc.so",
10420 min_sdk_version: "29",
10421 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010422 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010423 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010424 }
10425 api_imports {
10426 name: "api_imports",
10427 shared_libs: [
10428 "libc",
10429 ],
10430 header_libs: [],
10431 }
10432 `
10433 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010434 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010435 apexRule := module.MaybeRule("apexRule")
10436 if apexRule.Rule == nil {
10437 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10438 }
10439
10440 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010441 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010442 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10443 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10444 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10445 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10446}
Jingwen Chendea7a642023-03-28 11:30:50 +000010447
10448func TestCannedFsConfig(t *testing.T) {
10449 ctx := testApex(t, `
10450 apex {
10451 name: "myapex",
10452 key: "myapex.key",
10453 updatable: false,
10454 }
10455
10456 apex_key {
10457 name: "myapex.key",
10458 public_key: "testkey.avbpubkey",
10459 private_key: "testkey.pem",
10460 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010461 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010462 generateFsRule := mod.Rule("generateFsConfig")
10463 cmd := generateFsRule.RuleParams.Command
10464
10465 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10466}
10467
10468func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10469 ctx := testApex(t, `
10470 apex {
10471 name: "myapex",
10472 key: "myapex.key",
10473 canned_fs_config: "my_config",
10474 updatable: false,
10475 }
10476
10477 apex_key {
10478 name: "myapex.key",
10479 public_key: "testkey.avbpubkey",
10480 private_key: "testkey.pem",
10481 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010482 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010483 generateFsRule := mod.Rule("generateFsConfig")
10484 cmd := generateFsRule.RuleParams.Command
10485
10486 // Ensure that canned_fs_config has "cat my_config" at the end
10487 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10488}
Spandan Das20fce2d2023-04-12 17:21:39 +000010489
10490func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10491 testCases := []struct {
10492 desc string
10493 hasStubs bool
10494 apexAvailable string
10495 expectedError string
10496 }{
10497 {
10498 desc: "non-stub library can have multiple apex_available",
10499 hasStubs: false,
10500 apexAvailable: `["myapex", "otherapex"]`,
10501 },
10502 {
10503 desc: "stub library should not be available to anyapex",
10504 hasStubs: true,
10505 apexAvailable: `["//apex_available:anyapex"]`,
10506 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10507 },
10508 {
10509 desc: "stub library should not be available to multiple apexes",
10510 hasStubs: true,
10511 apexAvailable: `["myapex", "otherapex"]`,
10512 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10513 },
10514 {
10515 desc: "stub library can be available to a core apex and a test apex",
10516 hasStubs: true,
10517 apexAvailable: `["myapex", "test_myapex"]`,
10518 },
10519 }
10520 bpTemplate := `
10521 cc_library {
10522 name: "libfoo",
10523 %v
10524 apex_available: %v,
10525 }
10526 apex {
10527 name: "myapex",
10528 key: "apex.key",
10529 updatable: false,
10530 native_shared_libs: ["libfoo"],
10531 }
10532 apex {
10533 name: "otherapex",
10534 key: "apex.key",
10535 updatable: false,
10536 }
10537 apex_test {
10538 name: "test_myapex",
10539 key: "apex.key",
10540 updatable: false,
10541 native_shared_libs: ["libfoo"],
10542 }
10543 apex_key {
10544 name: "apex.key",
10545 }
10546 `
10547 for _, tc := range testCases {
10548 stubs := ""
10549 if tc.hasStubs {
10550 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10551 }
10552 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10553 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10554 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10555 })
10556 if tc.expectedError == "" {
10557 testApex(t, bp, mockFsFixturePreparer)
10558 } else {
10559 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10560 }
10561 }
10562}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010563
10564func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10565 context := android.GroupFixturePreparers(
10566 android.PrepareForIntegrationTestWithAndroid,
10567 cc.PrepareForIntegrationTestWithCc,
10568 PrepareForTestWithApexBuildComponents,
10569 prepareForTestWithMyapex,
10570 filesystem.PrepareForTestWithFilesystemBuildComponents,
10571 )
10572 result := context.RunTestWithBp(t, `
10573 android_system_image {
10574 name: "myfilesystem",
10575 deps: [
10576 "libfoo",
10577 ],
10578 linker_config_src: "linker.config.json",
10579 }
10580
10581 cc_library {
10582 name: "libfoo",
10583 shared_libs: [
10584 "libbar",
10585 ],
10586 stl: "none",
10587 }
10588
10589 cc_library {
10590 name: "libbar",
10591 stl: "none",
10592 apex_available: ["myapex"],
10593 }
10594
10595 apex {
10596 name: "myapex",
10597 native_shared_libs: ["libbar"],
10598 key: "myapex.key",
10599 updatable: false,
10600 }
10601
10602 apex_key {
10603 name: "myapex.key",
10604 public_key: "testkey.avbpubkey",
10605 private_key: "testkey.pem",
10606 }
10607 `)
10608
Cole Faust3b806d32024-03-11 15:15:03 -070010609 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010610 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10611 inputs.Strings(),
10612 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10613}
Yu Liueae7b362023-11-16 17:05:47 -080010614
10615var apex_default_bp = `
10616 apex_key {
10617 name: "myapex.key",
10618 public_key: "testkey.avbpubkey",
10619 private_key: "testkey.pem",
10620 }
10621
10622 filegroup {
10623 name: "myapex.manifest",
10624 srcs: ["apex_manifest.json"],
10625 }
10626
10627 filegroup {
10628 name: "myapex.androidmanifest",
10629 srcs: ["AndroidManifest.xml"],
10630 }
10631`
10632
10633func TestAconfigFilesJavaDeps(t *testing.T) {
10634 ctx := testApex(t, apex_default_bp+`
10635 apex {
10636 name: "myapex",
10637 manifest: ":myapex.manifest",
10638 androidManifest: ":myapex.androidmanifest",
10639 key: "myapex.key",
10640 java_libs: [
10641 "my_java_library_foo",
10642 "my_java_library_bar",
10643 ],
10644 updatable: false,
10645 }
10646
10647 java_library {
10648 name: "my_java_library_foo",
10649 srcs: ["foo/bar/MyClass.java"],
10650 sdk_version: "none",
10651 system_modules: "none",
10652 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010653 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010654 "myapex",
10655 ],
10656 }
10657
10658 java_library {
10659 name: "my_java_library_bar",
10660 srcs: ["foo/bar/MyClass.java"],
10661 sdk_version: "none",
10662 system_modules: "none",
10663 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010664 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010665 "myapex",
10666 ],
10667 }
10668
10669 aconfig_declarations {
10670 name: "my_aconfig_declarations_foo",
10671 package: "com.example.package",
10672 container: "myapex",
10673 srcs: ["foo.aconfig"],
10674 }
10675
10676 java_aconfig_library {
10677 name: "my_java_aconfig_library_foo",
10678 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010679 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010680 "myapex",
10681 ],
10682 }
10683
10684 aconfig_declarations {
10685 name: "my_aconfig_declarations_bar",
10686 package: "com.example.package",
10687 container: "myapex",
10688 srcs: ["bar.aconfig"],
10689 }
10690
10691 java_aconfig_library {
10692 name: "my_java_aconfig_library_bar",
10693 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010694 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010695 "myapex",
10696 ],
10697 }
10698 `)
10699
10700 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10701 s := mod.Rule("apexRule").Args["copy_commands"]
10702 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010703 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080010704 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10705 }
10706
Yu Liuab31c822024-02-28 22:21:31 +000010707 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10708 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
10709 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
10710 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010711
Yu Liubba555e2024-02-17 00:36:42 +000010712 inputs := []string{
10713 "my_aconfig_declarations_foo/intermediate.pb",
10714 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010715 }
Yu Liubba555e2024-02-17 00:36:42 +000010716 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10717 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10718 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10719 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010720}
10721
10722func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10723 ctx := testApex(t, apex_default_bp+`
10724 apex {
10725 name: "myapex",
10726 manifest: ":myapex.manifest",
10727 androidManifest: ":myapex.androidmanifest",
10728 key: "myapex.key",
10729 java_libs: [
10730 "my_java_library_foo",
10731 ],
10732 native_shared_libs: [
10733 "my_cc_library_bar",
10734 ],
10735 binaries: [
10736 "my_cc_binary_baz",
10737 ],
10738 updatable: false,
10739 }
10740
10741 java_library {
10742 name: "my_java_library_foo",
10743 srcs: ["foo/bar/MyClass.java"],
10744 sdk_version: "none",
10745 system_modules: "none",
10746 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010747 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010748 "myapex",
10749 ],
10750 }
10751
10752 cc_library {
10753 name: "my_cc_library_bar",
10754 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010755 static_libs: [
10756 "my_cc_aconfig_library_bar",
10757 "my_cc_aconfig_library_baz",
10758 ],
Yu Liueae7b362023-11-16 17:05:47 -080010759 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010760 "myapex",
10761 ],
10762 }
10763
10764 cc_binary {
10765 name: "my_cc_binary_baz",
10766 srcs: ["foo/bar/MyClass.cc"],
10767 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010768 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010769 "myapex",
10770 ],
10771 }
10772
10773 aconfig_declarations {
10774 name: "my_aconfig_declarations_foo",
10775 package: "com.example.package",
10776 container: "myapex",
10777 srcs: ["foo.aconfig"],
10778 }
10779
10780 java_aconfig_library {
10781 name: "my_java_aconfig_library_foo",
10782 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010783 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010784 "myapex",
10785 ],
10786 }
10787
10788 aconfig_declarations {
10789 name: "my_aconfig_declarations_bar",
10790 package: "com.example.package",
10791 container: "myapex",
10792 srcs: ["bar.aconfig"],
10793 }
10794
10795 cc_aconfig_library {
10796 name: "my_cc_aconfig_library_bar",
10797 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010798 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010799 "myapex",
10800 ],
10801 }
10802
10803 aconfig_declarations {
10804 name: "my_aconfig_declarations_baz",
10805 package: "com.example.package",
10806 container: "myapex",
10807 srcs: ["baz.aconfig"],
10808 }
10809
10810 cc_aconfig_library {
10811 name: "my_cc_aconfig_library_baz",
10812 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010813 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010814 "myapex",
10815 ],
10816 }
10817
10818 cc_library {
10819 name: "server_configurable_flags",
10820 srcs: ["server_configurable_flags.cc"],
10821 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010822 cc_library {
10823 name: "libbase",
10824 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010825 apex_available: [
10826 "myapex",
10827 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010828 }
10829 cc_library {
10830 name: "libaconfig_storage_read_api_cc",
10831 srcs: ["libaconfig_storage_read_api_cc.cc"],
10832 }
Yu Liueae7b362023-11-16 17:05:47 -080010833 `)
10834
10835 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10836 s := mod.Rule("apexRule").Args["copy_commands"]
10837 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010838 if len(copyCmds) != 12 {
10839 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010840 }
10841
Yu Liuab31c822024-02-28 22:21:31 +000010842 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10843 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
10844 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
10845 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010846
Yu Liubba555e2024-02-17 00:36:42 +000010847 inputs := []string{
10848 "my_aconfig_declarations_foo/intermediate.pb",
10849 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10850 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010851 }
Yu Liubba555e2024-02-17 00:36:42 +000010852 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10853 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10854 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10855 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010856}
10857
Yu Liucec0e412023-11-30 16:45:50 -080010858func TestAconfigFilesRustDeps(t *testing.T) {
10859 ctx := testApex(t, apex_default_bp+`
10860 apex {
10861 name: "myapex",
10862 manifest: ":myapex.manifest",
10863 androidManifest: ":myapex.androidmanifest",
10864 key: "myapex.key",
10865 native_shared_libs: [
10866 "libmy_rust_library",
10867 ],
10868 binaries: [
10869 "my_rust_binary",
10870 ],
10871 rust_dyn_libs: [
10872 "libmy_rust_dylib",
10873 ],
10874 updatable: false,
10875 }
10876
10877 rust_library {
10878 name: "libflags_rust", // test mock
10879 crate_name: "flags_rust",
10880 srcs: ["lib.rs"],
10881 apex_available: [
10882 "myapex",
10883 ],
10884 }
10885
10886 rust_library {
10887 name: "liblazy_static", // test mock
10888 crate_name: "lazy_static",
10889 srcs: ["src/lib.rs"],
10890 apex_available: [
10891 "myapex",
10892 ],
10893 }
10894
Ted Bauer02d475c2024-03-27 20:56:26 +000010895 rust_library {
10896 name: "libaconfig_storage_read_api", // test mock
10897 crate_name: "aconfig_storage_read_api",
10898 srcs: ["src/lib.rs"],
10899 apex_available: [
10900 "myapex",
10901 ],
10902 }
10903
Ted Bauer6ef40db2024-03-29 14:04:10 +000010904 rust_library {
10905 name: "liblogger", // test mock
10906 crate_name: "logger",
10907 srcs: ["src/lib.rs"],
10908 apex_available: [
10909 "myapex",
10910 ],
10911 }
10912
10913 rust_library {
10914 name: "liblog_rust", // test mock
10915 crate_name: "log_rust",
10916 srcs: ["src/lib.rs"],
10917 apex_available: [
10918 "myapex",
10919 ],
10920 }
10921
Yu Liucec0e412023-11-30 16:45:50 -080010922 rust_ffi_shared {
10923 name: "libmy_rust_library",
10924 srcs: ["src/lib.rs"],
10925 rustlibs: ["libmy_rust_aconfig_library_foo"],
10926 crate_name: "my_rust_library",
10927 apex_available: [
10928 "myapex",
10929 ],
10930 }
10931
10932 rust_library_dylib {
10933 name: "libmy_rust_dylib",
10934 srcs: ["foo/bar/MyClass.rs"],
10935 rustlibs: ["libmy_rust_aconfig_library_bar"],
10936 crate_name: "my_rust_dylib",
10937 apex_available: [
10938 "myapex",
10939 ],
10940 }
10941
10942 rust_binary {
10943 name: "my_rust_binary",
10944 srcs: ["foo/bar/MyClass.rs"],
10945 rustlibs: [
10946 "libmy_rust_aconfig_library_baz",
10947 "libmy_rust_dylib",
10948 ],
10949 apex_available: [
10950 "myapex",
10951 ],
10952 }
10953
10954 aconfig_declarations {
10955 name: "my_aconfig_declarations_foo",
10956 package: "com.example.package",
10957 container: "myapex",
10958 srcs: ["foo.aconfig"],
10959 }
10960
10961 aconfig_declarations {
10962 name: "my_aconfig_declarations_bar",
10963 package: "com.example.package",
10964 container: "myapex",
10965 srcs: ["bar.aconfig"],
10966 }
10967
10968 aconfig_declarations {
10969 name: "my_aconfig_declarations_baz",
10970 package: "com.example.package",
10971 container: "myapex",
10972 srcs: ["baz.aconfig"],
10973 }
10974
10975 rust_aconfig_library {
10976 name: "libmy_rust_aconfig_library_foo",
10977 aconfig_declarations: "my_aconfig_declarations_foo",
10978 crate_name: "my_rust_aconfig_library_foo",
10979 apex_available: [
10980 "myapex",
10981 ],
10982 }
10983
10984 rust_aconfig_library {
10985 name: "libmy_rust_aconfig_library_bar",
10986 aconfig_declarations: "my_aconfig_declarations_bar",
10987 crate_name: "my_rust_aconfig_library_bar",
10988 apex_available: [
10989 "myapex",
10990 ],
10991 }
10992
10993 rust_aconfig_library {
10994 name: "libmy_rust_aconfig_library_baz",
10995 aconfig_declarations: "my_aconfig_declarations_baz",
10996 crate_name: "my_rust_aconfig_library_baz",
10997 apex_available: [
10998 "myapex",
10999 ],
11000 }
11001 `)
11002
11003 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11004 s := mod.Rule("apexRule").Args["copy_commands"]
11005 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ted Bauer6ef40db2024-03-29 14:04:10 +000011006 if len(copyCmds) != 32 {
Ted Bauer02d475c2024-03-27 20:56:26 +000011007 t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080011008 }
11009
Ted Bauer6ef40db2024-03-29 14:04:10 +000011010 ensureMatches(t, copyCmds[28], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11011 ensureMatches(t, copyCmds[29], "^cp -f .*/package.map .*/image.apex/etc$")
11012 ensureMatches(t, copyCmds[30], "^cp -f .*/flag.map .*/image.apex/etc$")
11013 ensureMatches(t, copyCmds[31], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080011014
Yu Liubba555e2024-02-17 00:36:42 +000011015 inputs := []string{
11016 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011017 "my_aconfig_declarations_bar/intermediate.pb",
11018 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011019 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11020 }
11021 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11022 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11023 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11024 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
11025}
11026
11027func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11028 aconfigRule := mod.Description(desc)
11029 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011030 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011031 if len(aconfigArgs) != len(inputs) {
11032 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011033 }
Yu Liucec0e412023-11-30 16:45:50 -080011034
Yu Liubba555e2024-02-17 00:36:42 +000011035 ensureEquals(t, container, aconfigRule.Args["container"])
11036 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11037
11038 buildParams := aconfigRule.BuildParams
11039 for _, input := range inputs {
11040 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11041 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011042 }
Yu Liubba555e2024-02-17 00:36:42 +000011043
11044 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011045}
11046
Yu Liueae7b362023-11-16 17:05:47 -080011047func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11048 ctx := testApex(t, apex_default_bp+`
11049 apex {
11050 name: "myapex",
11051 manifest: ":myapex.manifest",
11052 androidManifest: ":myapex.androidmanifest",
11053 key: "myapex.key",
11054 java_libs: [
11055 "my_java_library_foo",
11056 "other_java_library_bar",
11057 ],
11058 updatable: false,
11059 }
11060
11061 java_library {
11062 name: "my_java_library_foo",
11063 srcs: ["foo/bar/MyClass.java"],
11064 sdk_version: "none",
11065 system_modules: "none",
11066 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011067 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011068 "myapex",
11069 ],
11070 }
11071
11072 java_library {
11073 name: "other_java_library_bar",
11074 srcs: ["foo/bar/MyClass.java"],
11075 sdk_version: "none",
11076 system_modules: "none",
11077 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011078 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011079 "myapex",
11080 ],
11081 }
11082
11083 aconfig_declarations {
11084 name: "my_aconfig_declarations_foo",
11085 package: "com.example.package",
11086 container: "myapex",
11087 srcs: ["foo.aconfig"],
11088 }
11089
11090 java_aconfig_library {
11091 name: "my_java_aconfig_library_foo",
11092 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011093 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011094 "myapex",
11095 ],
11096 }
11097
11098 aconfig_declarations {
11099 name: "other_aconfig_declarations_bar",
11100 package: "com.example.package",
11101 container: "otherapex",
11102 srcs: ["bar.aconfig"],
11103 }
11104
11105 java_aconfig_library {
11106 name: "other_java_aconfig_library_bar",
11107 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011108 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011109 "myapex",
11110 ],
11111 }
11112 `)
11113
11114 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11115 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11116 s := " " + combineAconfigRule.Args["cache_files"]
11117 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11118 if len(aconfigArgs) != 1 {
11119 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11120 }
11121 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11122
11123 buildParams := combineAconfigRule.BuildParams
11124 if len(buildParams.Inputs) != 1 {
11125 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11126 }
11127 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11128 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11129}
11130
11131func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11132 ctx := testApex(t, apex_default_bp+`
11133 apex {
11134 name: "myapex",
11135 manifest: ":myapex.manifest",
11136 androidManifest: ":myapex.androidmanifest",
11137 key: "myapex.key",
11138 java_libs: [
11139 "my_java_library_foo",
11140 "my_java_library_bar",
11141 ],
11142 updatable: false,
11143 }
11144
11145 java_library {
11146 name: "my_java_library_foo",
11147 srcs: ["foo/bar/MyClass.java"],
11148 sdk_version: "none",
11149 system_modules: "none",
11150 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011151 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011152 "myapex",
11153 ],
11154 }
11155
11156 java_library {
11157 name: "my_java_library_bar",
11158 srcs: ["foo/bar/MyClass.java"],
11159 sdk_version: "none",
11160 system_modules: "none",
11161 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011162 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011163 "myapex",
11164 ],
11165 }
11166
11167 aconfig_declarations {
11168 name: "my_aconfig_declarations_foo",
11169 package: "com.example.package",
11170 container: "myapex",
11171 srcs: ["foo.aconfig"],
11172 }
11173
11174 java_aconfig_library {
11175 name: "my_java_aconfig_library_foo",
11176 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011177 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011178 "myapex",
11179 ],
11180 }
11181
11182 java_aconfig_library {
11183 name: "my_java_aconfig_library_bar",
11184 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011185 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011186 "myapex",
11187 ],
11188 }
11189 `)
11190
11191 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11192 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11193 s := " " + combineAconfigRule.Args["cache_files"]
11194 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11195 if len(aconfigArgs) != 1 {
11196 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11197 }
11198 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11199
11200 buildParams := combineAconfigRule.BuildParams
11201 if len(buildParams.Inputs) != 1 {
11202 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11203 }
11204 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11205 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11206}
Spandan Das5be63332023-12-13 00:06:32 +000011207
11208// Test that the boot jars come from the _selected_ apex prebuilt
11209// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11210func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11211 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11212 t.Helper()
11213 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11214 foundLibfooJar := false
11215 base := stem + ".jar"
11216 for _, output := range s.AllOutputs() {
11217 if filepath.Base(output) == base {
11218 foundLibfooJar = true
11219 buildRule := s.Output(output)
11220 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11221 }
11222 }
11223 if !foundLibfooJar {
11224 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11225 }
11226 }
11227
Spandan Das64c9e0c2023-12-20 20:13:34 +000011228 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11229 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11230 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11231 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11232 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11233 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)
11234 }
11235
11236 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11237 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11238 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11239 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11240 }
11241
Spandan Das5be63332023-12-13 00:06:32 +000011242 bp := `
11243 // Source APEX.
11244
11245 java_library {
11246 name: "framework-foo",
11247 srcs: ["foo.java"],
11248 installable: true,
11249 apex_available: [
11250 "com.android.foo",
11251 ],
11252 }
11253
11254 bootclasspath_fragment {
11255 name: "foo-bootclasspath-fragment",
11256 contents: ["framework-foo"],
11257 apex_available: [
11258 "com.android.foo",
11259 ],
11260 hidden_api: {
11261 split_packages: ["*"],
11262 },
11263 }
11264
11265 apex_key {
11266 name: "com.android.foo.key",
11267 public_key: "com.android.foo.avbpubkey",
11268 private_key: "com.android.foo.pem",
11269 }
11270
11271 apex {
11272 name: "com.android.foo",
11273 key: "com.android.foo.key",
11274 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11275 updatable: false,
11276 }
11277
11278 // Prebuilt APEX.
11279
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011280 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011281 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011282 public: {
11283 jars: ["foo.jar"],
11284 },
Spandan Das5be63332023-12-13 00:06:32 +000011285 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011286 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011287 }
11288
11289 prebuilt_bootclasspath_fragment {
11290 name: "foo-bootclasspath-fragment",
11291 contents: ["framework-foo"],
11292 hidden_api: {
11293 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11294 metadata: "my-bootclasspath-fragment/metadata.csv",
11295 index: "my-bootclasspath-fragment/index.csv",
11296 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11297 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11298 },
11299 apex_available: [
11300 "com.android.foo",
11301 ],
11302 }
11303
11304 prebuilt_apex {
11305 name: "com.android.foo",
11306 apex_name: "com.android.foo",
11307 src: "com.android.foo-arm.apex",
11308 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11309 }
11310
11311 // Another Prebuilt ART APEX
11312 prebuilt_apex {
11313 name: "com.android.foo.v2",
11314 apex_name: "com.android.foo", // Used to determine the API domain
11315 src: "com.android.foo-arm.apex",
11316 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11317 }
11318
11319 // APEX contribution modules
11320
11321 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011322 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011323 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011324 contents: ["com.android.foo"],
11325 }
11326
11327 apex_contributions {
11328 name: "foo.prebuilt.contributions",
11329 api_domain: "com.android.foo",
11330 contents: ["prebuilt_com.android.foo"],
11331 }
11332
11333 apex_contributions {
11334 name: "foo.prebuilt.v2.contributions",
11335 api_domain: "com.android.foo",
11336 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011337 }
11338 `
11339
11340 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011341 desc string
11342 selectedApexContributions string
11343 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011344 }{
11345 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011346 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11347 selectedApexContributions: "foo.source.contributions",
11348 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011349 },
11350 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011351 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11352 selectedApexContributions: "foo.prebuilt.contributions",
11353 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011354 },
11355 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011356 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11357 selectedApexContributions: "foo.prebuilt.v2.contributions",
11358 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011359 },
11360 }
11361
11362 fragment := java.ApexVariantReference{
11363 Apex: proptools.StringPtr("com.android.foo"),
11364 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11365 }
11366
11367 for _, tc := range testCases {
11368 preparer := android.GroupFixturePreparers(
11369 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11370 android.FixtureMergeMockFs(map[string][]byte{
11371 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11372 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011373 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11374 // file creation.
11375 java.FixtureConfigureBootJars("platform:foo"),
11376 android.FixtureModifyMockFS(func(fs android.MockFS) {
11377 fs["platform/Android.bp"] = []byte(`
11378 java_library {
11379 name: "foo",
11380 srcs: ["Test.java"],
11381 compile_dex: true,
11382 }
11383 `)
11384 fs["platform/Test.java"] = nil
11385 }),
11386
Colin Crossa66b4632024-08-08 15:50:47 -070011387 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011388 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011389 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011390 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011391 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11392 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011393 }
11394}
Spandan Das3576e762024-01-03 18:57:03 +000011395
11396// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11397// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11398func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000011399 // for a mainline module family, check that only the flagged soong module is visible to make
11400 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11401 variation := func(moduleName string) string {
11402 ret := "android_common_com.android.foo"
11403 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011404 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011405 }
11406 return ret
11407 }
11408
11409 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11410 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11411
11412 for _, hiddenModuleName := range hiddenModuleNames {
11413 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11414 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11415
11416 }
11417 }
11418
11419 bp := `
11420 apex_key {
11421 name: "com.android.foo.key",
11422 public_key: "com.android.foo.avbpubkey",
11423 private_key: "com.android.foo.pem",
11424 }
11425
11426 // AOSP source apex
11427 apex {
11428 name: "com.android.foo",
11429 key: "com.android.foo.key",
11430 updatable: false,
11431 }
11432
11433 // Google source apex
11434 override_apex {
11435 name: "com.google.android.foo",
11436 base: "com.android.foo",
11437 key: "com.android.foo.key",
11438 }
11439
11440 // Prebuilt Google APEX.
11441
11442 prebuilt_apex {
11443 name: "com.google.android.foo",
11444 apex_name: "com.android.foo",
11445 src: "com.android.foo-arm.apex",
11446 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11447 }
11448
11449 // Another Prebuilt Google APEX
11450 prebuilt_apex {
11451 name: "com.google.android.foo.v2",
11452 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011453 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011454 src: "com.android.foo-arm.apex",
11455 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11456 }
11457
11458 // APEX contribution modules
11459
11460 apex_contributions {
11461 name: "foo.source.contributions",
11462 api_domain: "com.android.foo",
11463 contents: ["com.google.android.foo"],
11464 }
11465
11466 apex_contributions {
11467 name: "foo.prebuilt.contributions",
11468 api_domain: "com.android.foo",
11469 contents: ["prebuilt_com.google.android.foo"],
11470 }
11471
11472 apex_contributions {
11473 name: "foo.prebuilt.v2.contributions",
11474 api_domain: "com.android.foo",
11475 contents: ["prebuilt_com.google.android.foo.v2"],
11476 }
11477
11478 // This is an incompatible module because it selects multiple versions of the same mainline module
11479 apex_contributions {
11480 name: "foo.prebuilt.duplicate.contributions",
11481 api_domain: "com.android.foo",
11482 contents: [
11483 "prebuilt_com.google.android.foo",
11484 "prebuilt_com.google.android.foo.v2",
11485 ],
11486 }
11487 `
11488
11489 testCases := []struct {
11490 desc string
11491 selectedApexContributions string
11492 expectedVisibleModuleName string
11493 expectedHiddenModuleNames []string
11494 expectedError string
11495 }{
11496 {
11497 desc: "Source apex is selected, prebuilts should be hidden from make",
11498 selectedApexContributions: "foo.source.contributions",
11499 expectedVisibleModuleName: "com.google.android.foo",
11500 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11501 },
11502 {
11503 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11504 selectedApexContributions: "foo.prebuilt.contributions",
11505 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11506 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11507 },
11508 {
11509 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11510 selectedApexContributions: "foo.prebuilt.v2.contributions",
11511 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11512 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11513 },
11514 {
11515 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11516 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11517 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11518 },
11519 }
11520
11521 for _, tc := range testCases {
11522 preparer := android.GroupFixturePreparers(
11523 android.FixtureMergeMockFs(map[string][]byte{
11524 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11525 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011526 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011527 )
11528 if tc.expectedError != "" {
11529 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11530 testApex(t, bp, preparer)
11531 return
11532 }
11533 ctx := testApex(t, bp, preparer)
11534
Spandan Das3576e762024-01-03 18:57:03 +000011535 // Check that
11536 // 1. The contents of the selected apex_contributions are visible to make
11537 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11538 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11539 }
11540}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011541
Spandan Das85bd4622024-08-01 00:51:20 +000011542// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11543func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
11544 // for a mainline module family, check that only the flagged soong module is visible to make
11545 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11546 variation := func(moduleName string) string {
11547 ret := "android_common_com.android.adservices"
11548 if moduleName == "com.google.android.foo" {
11549 ret = "android_common_com.google.android.foo_com.google.android.foo"
11550 }
11551 return ret
11552 }
11553
11554 for _, visibleModuleName := range visibleModuleNames {
11555 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11556 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11557 }
11558
11559 for _, hiddenModuleName := range hiddenModuleNames {
11560 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11561 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11562
11563 }
11564 }
11565
11566 bp := `
11567 apex_key {
11568 name: "com.android.adservices.key",
11569 public_key: "com.android.adservices.avbpubkey",
11570 private_key: "com.android.adservices.pem",
11571 }
11572
11573 // AOSP source apex
11574 apex {
11575 name: "com.android.adservices",
11576 key: "com.android.adservices.key",
11577 updatable: false,
11578 }
11579
11580 // Prebuilt Google APEX.
11581
11582 prebuilt_apex {
11583 name: "com.google.android.adservices",
11584 apex_name: "com.android.adservices",
11585 src: "com.android.foo-arm.apex",
11586 }
11587
11588 // Another Prebuilt Google APEX
11589 prebuilt_apex {
11590 name: "com.google.android.adservices.v2",
11591 apex_name: "com.android.adservices",
11592 src: "com.android.foo-arm.apex",
11593 }
11594
11595 // APEX contribution modules
11596
11597
11598 apex_contributions {
11599 name: "adservices.prebuilt.contributions",
11600 api_domain: "com.android.adservices",
11601 contents: ["prebuilt_com.google.android.adservices"],
11602 }
11603
11604 apex_contributions {
11605 name: "adservices.prebuilt.v2.contributions",
11606 api_domain: "com.android.adservices",
11607 contents: ["prebuilt_com.google.android.adservices.v2"],
11608 }
11609 `
11610
11611 testCases := []struct {
11612 desc string
11613 selectedApexContributions string
11614 expectedVisibleModuleNames []string
11615 expectedHiddenModuleNames []string
11616 }{
11617 {
11618 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11619 selectedApexContributions: "",
11620 expectedVisibleModuleNames: []string{"com.android.adservices"},
11621 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11622 },
11623 {
11624 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11625 selectedApexContributions: "adservices.prebuilt.contributions",
11626 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11627 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11628 },
11629 {
11630 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11631 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11632 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11633 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11634 },
11635 }
11636
11637 for _, tc := range testCases {
11638 preparer := android.GroupFixturePreparers(
11639 android.FixtureMergeMockFs(map[string][]byte{
11640 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11641 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011642 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011643 )
11644 ctx := testApex(t, bp, preparer)
11645
11646 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11647 }
11648}
11649
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011650func TestAconfifDeclarationsValidation(t *testing.T) {
11651 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11652 for _, moduleName := range moduleNames {
11653 ret += fmt.Sprintf(`
11654 aconfig_declarations {
11655 name: "%[1]s",
11656 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011657 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011658 srcs: [
11659 "%[1]s.aconfig",
11660 ],
11661 }
11662 java_aconfig_library {
11663 name: "%[1]s-lib",
11664 aconfig_declarations: "%[1]s",
11665 }
11666 `, moduleName)
11667 }
11668 return ret
11669 }
11670
11671 result := android.GroupFixturePreparers(
11672 prepareForApexTest,
11673 java.PrepareForTestWithJavaSdkLibraryFiles,
11674 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011675 ).RunTestWithBp(t, `
11676 java_library {
11677 name: "baz-java-lib",
11678 static_libs: [
11679 "baz-lib",
11680 ],
11681 }
11682 filegroup {
11683 name: "qux-filegroup",
11684 srcs: [
11685 ":qux-lib{.generated_srcjars}",
11686 ],
11687 }
11688 filegroup {
11689 name: "qux-another-filegroup",
11690 srcs: [
11691 ":qux-filegroup",
11692 ],
11693 }
11694 java_library {
11695 name: "quux-java-lib",
11696 srcs: [
11697 "a.java",
11698 ],
11699 libs: [
11700 "quux-lib",
11701 ],
11702 }
11703 java_sdk_library {
11704 name: "foo",
11705 srcs: [
11706 ":qux-another-filegroup",
11707 ],
11708 api_packages: ["foo"],
11709 system: {
11710 enabled: true,
11711 },
11712 module_lib: {
11713 enabled: true,
11714 },
11715 test: {
11716 enabled: true,
11717 },
11718 static_libs: [
11719 "bar-lib",
11720 ],
11721 libs: [
11722 "baz-java-lib",
11723 "quux-java-lib",
11724 ],
11725 aconfig_declarations: [
11726 "bar",
11727 ],
11728 }
11729 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11730
11731 m := result.ModuleForTests("foo.stubs.source", "android_common")
11732 outDir := "out/soong/.intermediates"
11733
11734 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11735 // textproto files
11736 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11737
11738 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11739 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11740 // to aconfig.
11741 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11742 "passed as an input",
11743 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11744
11745 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11746 // to metalava as classpath. Thus the cache file provided by the associated
11747 // aconfig_declarations module "baz" should be passed to aconfig.
11748 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11749 "java_aconfig_library passed as an input",
11750 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11751
11752 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11753 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11754 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11755 "input",
11756 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11757
11758 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11759 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11760 // aconfig_declarations module "quux" should not be passed to aconfig.
11761 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11762 "depend on java_aconfig_library not passed as an input",
11763 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11764}
Cole Faust7c991b42024-05-15 11:17:55 -070011765
11766func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11767 ctx := testApex(t, `
11768 apex {
11769 name: "myapex",
11770 key: "myapex.key",
11771 prebuilts: ["myetc", "myetc2"],
11772 min_sdk_version: "29",
11773 }
11774 apex_key {
11775 name: "myapex.key",
11776 public_key: "testkey.avbpubkey",
11777 private_key: "testkey.pem",
11778 }
11779
11780 prebuilt_etc {
11781 name: "myetc",
11782 src: "myprebuilt",
11783 filename: "myfilename",
11784 }
11785 prebuilt_etc {
11786 name: "myetc2",
11787 sub_dir: "mysubdir",
11788 src: "myprebuilt",
11789 filename: "myfilename",
11790 }
11791 `, withFiles(android.MockFS{
11792 "packages/modules/common/build/allowed_deps.txt": nil,
11793 }))
11794
11795 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11796 data := android.AndroidMkDataForTest(t, ctx, ab)
11797 var builder strings.Builder
11798 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11799 androidMk := builder.String()
11800
11801 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11802 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11803}
Spandan Das50801e22024-05-13 18:29:45 +000011804
11805func TestApexMinSdkVersionOverride(t *testing.T) {
11806 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11807 args := module.Rule("apexRule").Args
11808 optFlags := args["opt_flags"]
11809 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11810 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11811 }
11812 }
11813
11814 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11815 t.Helper()
11816 found := false
11817 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11818 if dep == wantDep {
11819 found = true
11820 }
11821 })
11822 if !found {
11823 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11824 }
11825 }
11826
11827 ctx := testApex(t, `
11828 apex {
11829 name: "com.android.apex30",
11830 min_sdk_version: "30",
11831 key: "apex30.key",
11832 java_libs: ["javalib"],
11833 }
11834
11835 java_library {
11836 name: "javalib",
11837 srcs: ["A.java"],
11838 apex_available: ["com.android.apex30"],
11839 min_sdk_version: "30",
11840 sdk_version: "current",
11841 }
11842
11843 override_apex {
11844 name: "com.mycompany.android.apex30",
11845 base: "com.android.apex30",
11846 }
11847
11848 override_apex {
11849 name: "com.mycompany.android.apex31",
11850 base: "com.android.apex30",
11851 min_sdk_version: "31",
11852 }
11853
11854 apex_key {
11855 name: "apex30.key",
11856 public_key: "testkey.avbpubkey",
11857 private_key: "testkey.pem",
11858 }
11859
11860 `, android.FixtureMergeMockFs(android.MockFS{
11861 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11862 }),
11863 )
11864
11865 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11866 checkMinSdkVersion(t, baseModule, "30")
11867
11868 // Override module, but uses same min_sdk_version
11869 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11870 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11871 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11872 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11873
11874 // Override module, uses different min_sdk_version
11875 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11876 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11877 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11878 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11879}
Spandan Das0b28fa02024-05-28 23:40:17 +000011880
11881func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
11882 context := android.GroupFixturePreparers(
11883 android.PrepareForIntegrationTestWithAndroid,
11884 PrepareForTestWithApexBuildComponents,
11885 android.FixtureMergeMockFs(android.MockFS{
11886 "system/sepolicy/apex/foo-file_contexts": nil,
11887 }),
11888 )
11889 res := context.RunTestWithBp(t, `
11890 apex {
11891 name: "foo",
11892 key: "myapex.key",
11893 apex_available_name: "com.android.foo",
11894 variant_version: "0",
11895 updatable: false,
11896 }
11897 apex_key {
11898 name: "myapex.key",
11899 public_key: "testkey.avbpubkey",
11900 private_key: "testkey.pem",
11901 }
11902 prebuilt_apex {
11903 name: "foo",
11904 src: "foo.apex",
11905 prefer: true,
11906 }
11907 override_apex {
11908 name: "myoverrideapex",
11909 base: "foo",
11910 }
11911 `)
11912
11913 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11914}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011915
11916func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
11917 testApexError(t, `"myapex" .*: updatable: updatable APEXes should not set min_sdk_version to current. Please use a finalized API level or a recognized in-development codename`, `
11918 apex {
11919 name: "myapex",
11920 key: "myapex.key",
11921 updatable: true,
11922 min_sdk_version: "current",
11923 }
11924
11925 apex_key {
11926 name: "myapex.key",
11927 public_key: "testkey.avbpubkey",
11928 private_key: "testkey.pem",
11929 }
11930 `)
11931}
Spandan Das2f68f192024-07-22 19:25:50 +000011932
11933func TestPrebuiltStubNoinstall(t *testing.T) {
11934 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11935 result := android.GroupFixturePreparers(
11936 prepareForApexTest,
11937 android.PrepareForTestWithAndroidMk,
11938 android.PrepareForTestWithMakevars,
11939 android.FixtureMergeMockFs(fs),
11940 ).RunTest(t)
11941
11942 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
11943 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared/libfoo.so")
11944
11945 installRules := result.InstallMakeRulesForTesting(t)
11946
11947 var installedlibRule *android.InstallMakeRule
11948 for i, rule := range installRules {
11949 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11950 if installedlibRule != nil {
11951 t.Errorf("Duplicate install rules for %s", rule.Target)
11952 }
11953 installedlibRule = &installRules[i]
11954 }
11955 }
11956 if installedlibRule == nil {
11957 t.Errorf("No install rule found for installedlib")
11958 return
11959 }
11960
11961 if expectLibfooOnSystemLib {
11962 android.AssertStringListContains(t,
11963 "installedlib doesn't have install dependency on libfoo impl",
11964 installedlibRule.OrderOnlyDeps,
11965 "out/target/product/test_device/system/lib/libfoo.so")
11966 } else {
11967 android.AssertStringListDoesNotContain(t,
11968 "installedlib has install dependency on libfoo stub",
11969 installedlibRule.Deps,
11970 "out/target/product/test_device/system/lib/libfoo.so")
11971 android.AssertStringListDoesNotContain(t,
11972 "installedlib has order-only install dependency on libfoo stub",
11973 installedlibRule.OrderOnlyDeps,
11974 "out/target/product/test_device/system/lib/libfoo.so")
11975 }
11976 }
11977
11978 prebuiltLibfooBp := []byte(`
11979 cc_prebuilt_library {
11980 name: "libfoo",
11981 prefer: true,
11982 srcs: ["libfoo.so"],
11983 stubs: {
11984 versions: ["1"],
11985 },
11986 apex_available: ["apexfoo"],
11987 }
11988 `)
11989
11990 apexfooBp := []byte(`
11991 apex {
11992 name: "apexfoo",
11993 key: "apexfoo.key",
11994 native_shared_libs: ["libfoo"],
11995 updatable: false,
11996 compile_multilib: "both",
11997 }
11998 apex_key {
11999 name: "apexfoo.key",
12000 public_key: "testkey.avbpubkey",
12001 private_key: "testkey.pem",
12002 }
12003 `)
12004
12005 installedlibBp := []byte(`
12006 cc_library {
12007 name: "installedlib",
12008 shared_libs: ["libfoo"],
12009 }
12010 `)
12011
12012 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
12013 testFunc(
12014 t,
12015 /*expectLibfooOnSystemLib=*/ false,
12016 android.MockFS{
12017 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12018 "apexfoo/Android.bp": apexfooBp,
12019 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12020 "Android.bp": installedlibBp,
12021 },
12022 )
12023 })
12024
12025 disabledSourceLibfooBp := []byte(`
12026 cc_library {
12027 name: "libfoo",
12028 enabled: false,
12029 stubs: {
12030 versions: ["1"],
12031 },
12032 apex_available: ["apexfoo"],
12033 }
12034 `)
12035
12036 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
12037 testFunc(
12038 t,
12039 /*expectLibfooOnSystemLib=*/ false,
12040 android.MockFS{
12041 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12042 "impl/Android.bp": disabledSourceLibfooBp,
12043 "apexfoo/Android.bp": apexfooBp,
12044 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12045 "Android.bp": installedlibBp,
12046 },
12047 )
12048 })
12049}