blob: 83beb6d231f95def0b6e14fc4a7d25aab377bcb5 [file] [log] [blame]
Paul Duffin3451e162021-01-20 15:16:56 +00001// Copyright (C) 2021 The Android Open Source Project
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 java
16
17import (
18 "testing"
Paul Duffin837486d2021-03-23 23:13:53 +000019
20 "android/soong/android"
21 "android/soong/dexpreopt"
Paul Duffin3451e162021-01-20 15:16:56 +000022)
23
Paul Duffin7771eba2021-04-23 14:25:28 +010024// Contains some simple tests for bootclasspath_fragment logic, additional tests can be found in
25// apex/bootclasspath_fragment_test.go as the ART boot image requires modules from the ART apex.
Paul Duffin3451e162021-01-20 15:16:56 +000026
Paul Duffin7771eba2021-04-23 14:25:28 +010027var prepareForTestWithBootclasspathFragment = android.GroupFixturePreparers(
Paul Duffin837486d2021-03-23 23:13:53 +000028 PrepareForTestWithJavaDefaultModules,
29 dexpreopt.PrepareForTestByEnablingDexpreopt,
30)
31
Paul Duffin8018e502021-05-21 19:28:09 +010032func TestBootclasspathFragment_UnknownImageName(t *testing.T) {
Paul Duffin7771eba2021-04-23 14:25:28 +010033 prepareForTestWithBootclasspathFragment.
Paul Duffin837486d2021-03-23 23:13:53 +000034 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Paul Duffin8018e502021-05-21 19:28:09 +010035 `\Qimage_name: unknown image name "unknown", expected "art"\E`)).
Paul Duffin837486d2021-03-23 23:13:53 +000036 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010037 bootclasspath_fragment {
38 name: "unknown-bootclasspath-fragment",
Paul Duffin837486d2021-03-23 23:13:53 +000039 image_name: "unknown",
Paul Duffin8018e502021-05-21 19:28:09 +010040 contents: ["foo"],
Paul Duffin837486d2021-03-23 23:13:53 +000041 }
42 `)
Paul Duffin3451e162021-01-20 15:16:56 +000043}
Paul Duffinf7f65da2021-03-10 15:00:46 +000044
Paul Duffin8018e502021-05-21 19:28:09 +010045func TestPrebuiltBootclasspathFragment_UnknownImageName(t *testing.T) {
Paul Duffin7771eba2021-04-23 14:25:28 +010046 prepareForTestWithBootclasspathFragment.
Paul Duffin4b64ba02021-03-29 11:02:53 +010047 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Paul Duffin8018e502021-05-21 19:28:09 +010048 `\Qimage_name: unknown image name "unknown", expected "art"\E`)).
Paul Duffin837486d2021-03-23 23:13:53 +000049 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010050 prebuilt_bootclasspath_fragment {
51 name: "unknown-bootclasspath-fragment",
Paul Duffin837486d2021-03-23 23:13:53 +000052 image_name: "unknown",
Paul Duffin8018e502021-05-21 19:28:09 +010053 contents: ["foo"],
Paul Duffin837486d2021-03-23 23:13:53 +000054 }
55 `)
Paul Duffinf7f65da2021-03-10 15:00:46 +000056}
Paul Duffinc7ef9892021-03-23 23:21:59 +000057
Paul Duffin7771eba2021-04-23 14:25:28 +010058func TestBootclasspathFragmentInconsistentArtConfiguration_Platform(t *testing.T) {
Paul Duffinc7ef9892021-03-23 23:21:59 +000059 android.GroupFixturePreparers(
Paul Duffin7771eba2021-04-23 14:25:28 +010060 prepareForTestWithBootclasspathFragment,
Paul Duffinc7ef9892021-03-23 23:21:59 +000061 dexpreopt.FixtureSetArtBootJars("platform:foo", "apex:bar"),
62 ).
63 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
64 `\QArtApexJars is invalid as it requests a platform variant of "foo"\E`)).
65 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010066 bootclasspath_fragment {
67 name: "bootclasspath-fragment",
Paul Duffinc7ef9892021-03-23 23:21:59 +000068 image_name: "art",
Paul Duffin8018e502021-05-21 19:28:09 +010069 contents: ["foo", "bar"],
Paul Duffinc7ef9892021-03-23 23:21:59 +000070 apex_available: [
71 "apex",
72 ],
73 }
74 `)
75}
76
Paul Duffin7771eba2021-04-23 14:25:28 +010077func TestBootclasspathFragmentInconsistentArtConfiguration_ApexMixture(t *testing.T) {
Paul Duffinc7ef9892021-03-23 23:21:59 +000078 android.GroupFixturePreparers(
Paul Duffin7771eba2021-04-23 14:25:28 +010079 prepareForTestWithBootclasspathFragment,
Paul Duffinc7ef9892021-03-23 23:21:59 +000080 dexpreopt.FixtureSetArtBootJars("apex1:foo", "apex2:bar"),
81 ).
82 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
83 `\QArtApexJars configuration is inconsistent, expected all jars to be in the same apex but it specifies apex "apex1" and "apex2"\E`)).
84 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010085 bootclasspath_fragment {
86 name: "bootclasspath-fragment",
Paul Duffinc7ef9892021-03-23 23:21:59 +000087 image_name: "art",
Paul Duffin8018e502021-05-21 19:28:09 +010088 contents: ["foo", "bar"],
Paul Duffinc7ef9892021-03-23 23:21:59 +000089 apex_available: [
90 "apex1",
91 "apex2",
92 ],
93 }
94 `)
95}
Paul Duffin82886d62021-03-24 01:34:57 +000096
Paul Duffinc7d16442021-04-23 13:55:49 +010097func TestBootclasspathFragment_Coverage(t *testing.T) {
98 prepareForTestWithFrameworkCoverage := android.FixtureMergeEnv(map[string]string{
99 "EMMA_INSTRUMENT": "true",
100 "EMMA_INSTRUMENT_FRAMEWORK": "true",
101 })
102
103 prepareWithBp := android.FixtureWithRootAndroidBp(`
104 bootclasspath_fragment {
105 name: "myfragment",
106 contents: [
107 "mybootlib",
108 ],
Paul Duffin895c7142021-04-25 13:40:15 +0100109 api: {
110 stub_libs: [
111 "mysdklibrary",
112 ],
113 },
Paul Duffinc7d16442021-04-23 13:55:49 +0100114 coverage: {
115 contents: [
116 "coveragelib",
117 ],
Paul Duffin895c7142021-04-25 13:40:15 +0100118 api: {
119 stub_libs: [
120 "mycoveragestubs",
121 ],
122 },
Paul Duffinc7d16442021-04-23 13:55:49 +0100123 },
Paul Duffin9fd56472022-03-31 15:42:30 +0100124 hidden_api: {
125 split_packages: ["*"],
126 },
Paul Duffinc7d16442021-04-23 13:55:49 +0100127 }
128
129 java_library {
130 name: "mybootlib",
131 srcs: ["Test.java"],
132 system_modules: "none",
133 sdk_version: "none",
134 compile_dex: true,
135 }
136
137 java_library {
138 name: "coveragelib",
139 srcs: ["Test.java"],
140 system_modules: "none",
141 sdk_version: "none",
142 compile_dex: true,
143 }
Paul Duffin895c7142021-04-25 13:40:15 +0100144
145 java_sdk_library {
146 name: "mysdklibrary",
147 srcs: ["Test.java"],
148 compile_dex: true,
149 public: {enabled: true},
150 system: {enabled: true},
151 }
152
153 java_sdk_library {
154 name: "mycoveragestubs",
155 srcs: ["Test.java"],
156 compile_dex: true,
157 public: {enabled: true},
158 }
Paul Duffinc7d16442021-04-23 13:55:49 +0100159 `)
160
161 checkContents := func(t *testing.T, result *android.TestResult, expected ...string) {
162 module := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
163 android.AssertArrayString(t, "contents property", expected, module.properties.Contents)
164 }
165
Paul Duffin895c7142021-04-25 13:40:15 +0100166 preparer := android.GroupFixturePreparers(
167 prepareForTestWithBootclasspathFragment,
168 PrepareForTestWithJavaSdkLibraryFiles,
169 FixtureWithLastReleaseApis("mysdklibrary", "mycoveragestubs"),
satayevabcd5972021-08-06 17:49:46 +0100170 FixtureConfigureApexBootJars("someapex:mybootlib"),
Paul Duffin895c7142021-04-25 13:40:15 +0100171 prepareWithBp,
172 )
173
Paul Duffinc7d16442021-04-23 13:55:49 +0100174 t.Run("without coverage", func(t *testing.T) {
Paul Duffin895c7142021-04-25 13:40:15 +0100175 result := preparer.RunTest(t)
Paul Duffinc7d16442021-04-23 13:55:49 +0100176 checkContents(t, result, "mybootlib")
177 })
178
179 t.Run("with coverage", func(t *testing.T) {
180 result := android.GroupFixturePreparers(
Paul Duffinc7d16442021-04-23 13:55:49 +0100181 prepareForTestWithFrameworkCoverage,
Paul Duffin895c7142021-04-25 13:40:15 +0100182 preparer,
Paul Duffinc7d16442021-04-23 13:55:49 +0100183 ).RunTest(t)
184 checkContents(t, result, "mybootlib", "coveragelib")
185 })
186}
Paul Duffin10931582021-04-25 10:13:54 +0100187
188func TestBootclasspathFragment_StubLibs(t *testing.T) {
189 result := android.GroupFixturePreparers(
190 prepareForTestWithBootclasspathFragment,
191 PrepareForTestWithJavaSdkLibraryFiles,
Paul Duffin34827d42021-05-13 21:25:05 +0100192 FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
satayevabcd5972021-08-06 17:49:46 +0100193 FixtureConfigureApexBootJars("someapex:mysdklibrary"),
Paul Duffin10931582021-04-25 10:13:54 +0100194 ).RunTestWithBp(t, `
195 bootclasspath_fragment {
196 name: "myfragment",
197 contents: ["mysdklibrary"],
198 api: {
199 stub_libs: [
200 "mystublib",
Paul Duffin34827d42021-05-13 21:25:05 +0100201 "myothersdklibrary",
Paul Duffin10931582021-04-25 10:13:54 +0100202 ],
203 },
204 core_platform_api: {
Paul Duffin3f0290e2021-06-30 18:25:36 +0100205 stub_libs: ["mycoreplatform.stubs"],
Paul Duffin10931582021-04-25 10:13:54 +0100206 },
Paul Duffin9fd56472022-03-31 15:42:30 +0100207 hidden_api: {
208 split_packages: ["*"],
209 },
Paul Duffin10931582021-04-25 10:13:54 +0100210 }
211
212 java_library {
213 name: "mystublib",
214 srcs: ["Test.java"],
215 system_modules: "none",
216 sdk_version: "none",
217 compile_dex: true,
218 }
219
220 java_sdk_library {
221 name: "mysdklibrary",
222 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100223 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100224 public: {enabled: true},
225 system: {enabled: true},
226 }
227
228 java_sdk_library {
Paul Duffin34827d42021-05-13 21:25:05 +0100229 name: "myothersdklibrary",
230 srcs: ["a.java"],
231 shared_library: false,
232 public: {enabled: true},
233 }
234
235 java_sdk_library {
Paul Duffin10931582021-04-25 10:13:54 +0100236 name: "mycoreplatform",
237 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100238 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100239 public: {enabled: true},
240 }
241 `)
242
243 fragment := result.Module("myfragment", "android_common")
Paul Duffin18cf1972021-05-21 22:46:59 +0100244 info := result.ModuleProvider(fragment, HiddenAPIInfoProvider).(HiddenAPIInfo)
Paul Duffin10931582021-04-25 10:13:54 +0100245
246 stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar"
247
Paul Duffin34827d42021-05-13 21:25:05 +0100248 // Stubs jars for mysdklibrary
Paul Duffin10931582021-04-25 10:13:54 +0100249 publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs/android_common/dex/mysdklibrary.stubs.jar"
Paul Duffin10931582021-04-25 10:13:54 +0100250 systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.system/android_common/dex/mysdklibrary.stubs.system.jar"
Paul Duffin10931582021-04-25 10:13:54 +0100251
Paul Duffin34827d42021-05-13 21:25:05 +0100252 // Stubs jars for myothersdklibrary
253 otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs/android_common/dex/myothersdklibrary.stubs.jar"
254
255 // Check that SdkPublic uses public stubs for all sdk libraries.
Paul Duffin280a31a2021-06-27 20:28:29 +0100256 android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(PublicHiddenAPIScope))
Paul Duffin34827d42021-05-13 21:25:05 +0100257
258 // Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary
259 // as it does not provide system stubs.
Paul Duffin280a31a2021-06-27 20:28:29 +0100260 android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(SystemHiddenAPIScope))
Paul Duffin34827d42021-05-13 21:25:05 +0100261
262 // Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs
263 // and public stubs for myothersdklibrary as it does not provide test stubs either.
Paul Duffin280a31a2021-06-27 20:28:29 +0100264 android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(TestHiddenAPIScope))
Paul Duffin10931582021-04-25 10:13:54 +0100265
266 // Check that SdkCorePlatform uses public stubs from the mycoreplatform library.
267 corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar"
Paul Duffin280a31a2021-06-27 20:28:29 +0100268 android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(CorePlatformHiddenAPIScope))
Paul Duffind2b1e0c2021-06-27 20:53:39 +0100269
Paul Duffin280a31a2021-06-27 20:28:29 +0100270 // Check the widest stubs.. The list contains the widest stub dex jar provided by each module.
271 expectedWidestPaths := []string{
272 // mycoreplatform's widest API is core platform.
273 corePlatformStubsJar,
274
275 // myothersdklibrary's widest API is public.
276 otherPublicStubsJar,
277
278 // sdklibrary's widest API is system.
279 systemStubsJar,
280
281 // mystublib's only provides one API and so it must be the widest.
282 stubsJar,
283 }
284
285 android.AssertPathsRelativeToTopEquals(t, "widest dex stubs jar", expectedWidestPaths, info.TransitiveStubDexJarsByScope.StubDexJarsForWidestAPIScope())
Paul Duffin10931582021-04-25 10:13:54 +0100286}
Paul Duffinc15b9e92022-03-31 15:42:30 +0100287
288func TestBootclasspathFragment_Test(t *testing.T) {
289 result := android.GroupFixturePreparers(
290 prepareForTestWithBootclasspathFragment,
291 PrepareForTestWithJavaSdkLibraryFiles,
292 FixtureWithLastReleaseApis("mysdklibrary"),
293 ).RunTestWithBp(t, `
294 bootclasspath_fragment {
295 name: "myfragment",
296 contents: ["mysdklibrary"],
297 hidden_api: {
298 split_packages: [],
299 },
300 }
301
Paul Duffinff9b6fa2022-04-12 18:20:14 +0100302 bootclasspath_fragment {
303 name: "test_fragment",
304 contents: ["mysdklibrary"],
305 hidden_api: {
306 split_packages: [],
307 },
308 }
309
310 bootclasspath_fragment {
311 name: "apex.apexd_test_bootclasspath-fragment",
312 contents: ["mysdklibrary"],
313 hidden_api: {
314 split_packages: [],
315 },
316 }
317
Paul Duffinc15b9e92022-03-31 15:42:30 +0100318 bootclasspath_fragment_test {
319 name: "a_test_fragment",
320 contents: ["mysdklibrary"],
321 hidden_api: {
322 split_packages: [],
323 },
324 }
325
326
327 java_sdk_library {
328 name: "mysdklibrary",
329 srcs: ["a.java"],
330 shared_library: false,
331 public: {enabled: true},
332 system: {enabled: true},
333 }
334 `)
335
336 fragment := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
337 android.AssertBoolEquals(t, "not a test fragment", false, fragment.isTestFragment())
338
Paul Duffinff9b6fa2022-04-12 18:20:14 +0100339 fragment = result.Module("test_fragment", "android_common").(*BootclasspathFragmentModule)
340 android.AssertBoolEquals(t, "is a test fragment by prefix", true, fragment.isTestFragment())
341
Paul Duffinc15b9e92022-03-31 15:42:30 +0100342 fragment = result.Module("a_test_fragment", "android_common").(*BootclasspathFragmentModule)
343 android.AssertBoolEquals(t, "is a test fragment by type", true, fragment.isTestFragment())
Paul Duffinff9b6fa2022-04-12 18:20:14 +0100344
345 fragment = result.Module("apex.apexd_test_bootclasspath-fragment", "android_common").(*BootclasspathFragmentModule)
346 android.AssertBoolEquals(t, "is a test fragment by name", true, fragment.isTestFragment())
Paul Duffinc15b9e92022-03-31 15:42:30 +0100347}