blob: 8ffe99a770616752f3550400a163ef1b7b700131 [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 },
124 }
125
126 java_library {
127 name: "mybootlib",
128 srcs: ["Test.java"],
129 system_modules: "none",
130 sdk_version: "none",
131 compile_dex: true,
132 }
133
134 java_library {
135 name: "coveragelib",
136 srcs: ["Test.java"],
137 system_modules: "none",
138 sdk_version: "none",
139 compile_dex: true,
140 }
Paul Duffin895c7142021-04-25 13:40:15 +0100141
142 java_sdk_library {
143 name: "mysdklibrary",
144 srcs: ["Test.java"],
145 compile_dex: true,
146 public: {enabled: true},
147 system: {enabled: true},
148 }
149
150 java_sdk_library {
151 name: "mycoveragestubs",
152 srcs: ["Test.java"],
153 compile_dex: true,
154 public: {enabled: true},
155 }
Paul Duffinc7d16442021-04-23 13:55:49 +0100156 `)
157
158 checkContents := func(t *testing.T, result *android.TestResult, expected ...string) {
159 module := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
160 android.AssertArrayString(t, "contents property", expected, module.properties.Contents)
161 }
162
Paul Duffin895c7142021-04-25 13:40:15 +0100163 preparer := android.GroupFixturePreparers(
164 prepareForTestWithBootclasspathFragment,
165 PrepareForTestWithJavaSdkLibraryFiles,
166 FixtureWithLastReleaseApis("mysdklibrary", "mycoveragestubs"),
satayevabcd5972021-08-06 17:49:46 +0100167 FixtureConfigureApexBootJars("someapex:mybootlib"),
Paul Duffin895c7142021-04-25 13:40:15 +0100168 prepareWithBp,
169 )
170
Paul Duffinc7d16442021-04-23 13:55:49 +0100171 t.Run("without coverage", func(t *testing.T) {
Paul Duffin895c7142021-04-25 13:40:15 +0100172 result := preparer.RunTest(t)
Paul Duffinc7d16442021-04-23 13:55:49 +0100173 checkContents(t, result, "mybootlib")
174 })
175
176 t.Run("with coverage", func(t *testing.T) {
177 result := android.GroupFixturePreparers(
Paul Duffinc7d16442021-04-23 13:55:49 +0100178 prepareForTestWithFrameworkCoverage,
Paul Duffin895c7142021-04-25 13:40:15 +0100179 preparer,
Paul Duffinc7d16442021-04-23 13:55:49 +0100180 ).RunTest(t)
181 checkContents(t, result, "mybootlib", "coveragelib")
182 })
183}
Paul Duffin10931582021-04-25 10:13:54 +0100184
185func TestBootclasspathFragment_StubLibs(t *testing.T) {
186 result := android.GroupFixturePreparers(
187 prepareForTestWithBootclasspathFragment,
188 PrepareForTestWithJavaSdkLibraryFiles,
Paul Duffin34827d42021-05-13 21:25:05 +0100189 FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
satayevabcd5972021-08-06 17:49:46 +0100190 FixtureConfigureApexBootJars("someapex:mysdklibrary"),
Paul Duffin10931582021-04-25 10:13:54 +0100191 ).RunTestWithBp(t, `
192 bootclasspath_fragment {
193 name: "myfragment",
194 contents: ["mysdklibrary"],
195 api: {
196 stub_libs: [
197 "mystublib",
Paul Duffin34827d42021-05-13 21:25:05 +0100198 "myothersdklibrary",
Paul Duffin10931582021-04-25 10:13:54 +0100199 ],
200 },
201 core_platform_api: {
Paul Duffin3f0290e2021-06-30 18:25:36 +0100202 stub_libs: ["mycoreplatform.stubs"],
Paul Duffin10931582021-04-25 10:13:54 +0100203 },
204 }
205
206 java_library {
207 name: "mystublib",
208 srcs: ["Test.java"],
209 system_modules: "none",
210 sdk_version: "none",
211 compile_dex: true,
212 }
213
214 java_sdk_library {
215 name: "mysdklibrary",
216 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100217 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100218 public: {enabled: true},
219 system: {enabled: true},
220 }
221
222 java_sdk_library {
Paul Duffin34827d42021-05-13 21:25:05 +0100223 name: "myothersdklibrary",
224 srcs: ["a.java"],
225 shared_library: false,
226 public: {enabled: true},
227 }
228
229 java_sdk_library {
Paul Duffin10931582021-04-25 10:13:54 +0100230 name: "mycoreplatform",
231 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100232 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100233 public: {enabled: true},
234 }
235 `)
236
237 fragment := result.Module("myfragment", "android_common")
Paul Duffin18cf1972021-05-21 22:46:59 +0100238 info := result.ModuleProvider(fragment, HiddenAPIInfoProvider).(HiddenAPIInfo)
Paul Duffin10931582021-04-25 10:13:54 +0100239
240 stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar"
241
Paul Duffin34827d42021-05-13 21:25:05 +0100242 // Stubs jars for mysdklibrary
Paul Duffin10931582021-04-25 10:13:54 +0100243 publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs/android_common/dex/mysdklibrary.stubs.jar"
Paul Duffin10931582021-04-25 10:13:54 +0100244 systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.system/android_common/dex/mysdklibrary.stubs.system.jar"
Paul Duffin10931582021-04-25 10:13:54 +0100245
Paul Duffin34827d42021-05-13 21:25:05 +0100246 // Stubs jars for myothersdklibrary
247 otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs/android_common/dex/myothersdklibrary.stubs.jar"
248
249 // Check that SdkPublic uses public stubs for all sdk libraries.
Paul Duffin280a31a2021-06-27 20:28:29 +0100250 android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(PublicHiddenAPIScope))
Paul Duffin34827d42021-05-13 21:25:05 +0100251
252 // Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary
253 // as it does not provide system stubs.
Paul Duffin280a31a2021-06-27 20:28:29 +0100254 android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(SystemHiddenAPIScope))
Paul Duffin34827d42021-05-13 21:25:05 +0100255
256 // Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs
257 // and public stubs for myothersdklibrary as it does not provide test stubs either.
Paul Duffin280a31a2021-06-27 20:28:29 +0100258 android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(TestHiddenAPIScope))
Paul Duffin10931582021-04-25 10:13:54 +0100259
260 // Check that SdkCorePlatform uses public stubs from the mycoreplatform library.
261 corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar"
Paul Duffin280a31a2021-06-27 20:28:29 +0100262 android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(CorePlatformHiddenAPIScope))
Paul Duffind2b1e0c2021-06-27 20:53:39 +0100263
Paul Duffin280a31a2021-06-27 20:28:29 +0100264 // Check the widest stubs.. The list contains the widest stub dex jar provided by each module.
265 expectedWidestPaths := []string{
266 // mycoreplatform's widest API is core platform.
267 corePlatformStubsJar,
268
269 // myothersdklibrary's widest API is public.
270 otherPublicStubsJar,
271
272 // sdklibrary's widest API is system.
273 systemStubsJar,
274
275 // mystublib's only provides one API and so it must be the widest.
276 stubsJar,
277 }
278
279 android.AssertPathsRelativeToTopEquals(t, "widest dex stubs jar", expectedWidestPaths, info.TransitiveStubDexJarsByScope.StubDexJarsForWidestAPIScope())
Paul Duffin10931582021-04-25 10:13:54 +0100280}
Paul Duffinc15b9e92022-03-31 15:42:30 +0100281
282func TestBootclasspathFragment_Test(t *testing.T) {
283 result := android.GroupFixturePreparers(
284 prepareForTestWithBootclasspathFragment,
285 PrepareForTestWithJavaSdkLibraryFiles,
286 FixtureWithLastReleaseApis("mysdklibrary"),
287 ).RunTestWithBp(t, `
288 bootclasspath_fragment {
289 name: "myfragment",
290 contents: ["mysdklibrary"],
291 hidden_api: {
292 split_packages: [],
293 },
294 }
295
Paul Duffinff9b6fa2022-04-12 18:20:14 +0100296 bootclasspath_fragment {
297 name: "test_fragment",
298 contents: ["mysdklibrary"],
299 hidden_api: {
300 split_packages: [],
301 },
302 }
303
304 bootclasspath_fragment {
305 name: "apex.apexd_test_bootclasspath-fragment",
306 contents: ["mysdklibrary"],
307 hidden_api: {
308 split_packages: [],
309 },
310 }
311
Paul Duffinc15b9e92022-03-31 15:42:30 +0100312 bootclasspath_fragment_test {
313 name: "a_test_fragment",
314 contents: ["mysdklibrary"],
315 hidden_api: {
316 split_packages: [],
317 },
318 }
319
320
321 java_sdk_library {
322 name: "mysdklibrary",
323 srcs: ["a.java"],
324 shared_library: false,
325 public: {enabled: true},
326 system: {enabled: true},
327 }
328 `)
329
330 fragment := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
331 android.AssertBoolEquals(t, "not a test fragment", false, fragment.isTestFragment())
332
Paul Duffinff9b6fa2022-04-12 18:20:14 +0100333 fragment = result.Module("test_fragment", "android_common").(*BootclasspathFragmentModule)
334 android.AssertBoolEquals(t, "is a test fragment by prefix", true, fragment.isTestFragment())
335
Paul Duffinc15b9e92022-03-31 15:42:30 +0100336 fragment = result.Module("a_test_fragment", "android_common").(*BootclasspathFragmentModule)
337 android.AssertBoolEquals(t, "is a test fragment by type", true, fragment.isTestFragment())
Paul Duffinff9b6fa2022-04-12 18:20:14 +0100338
339 fragment = result.Module("apex.apexd_test_bootclasspath-fragment", "android_common").(*BootclasspathFragmentModule)
340 android.AssertBoolEquals(t, "is a test fragment by name", true, fragment.isTestFragment())
Paul Duffinc15b9e92022-03-31 15:42:30 +0100341}