blob: a47e12748d46ba2e49cfadc8310b535025c2f0fe [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 Duffin7771eba2021-04-23 14:25:28 +010032func TestUnknownBootclasspathFragment(t *testing.T) {
33 prepareForTestWithBootclasspathFragment.
Paul Duffin837486d2021-03-23 23:13:53 +000034 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
35 `\Qimage_name: Unknown image name "unknown", expected one of art, boot\E`)).
36 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",
40 }
41 `)
Paul Duffin3451e162021-01-20 15:16:56 +000042}
Paul Duffinf7f65da2021-03-10 15:00:46 +000043
Paul Duffin4b64ba02021-03-29 11:02:53 +010044func TestUnknownBootclasspathFragmentImageName(t *testing.T) {
Paul Duffin7771eba2021-04-23 14:25:28 +010045 prepareForTestWithBootclasspathFragment.
Paul Duffin4b64ba02021-03-29 11:02:53 +010046 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
47 `\Qimage_name: Unknown image name "unknown", expected one of art, boot\E`)).
48 RunTestWithBp(t, `
49 bootclasspath_fragment {
Paul Duffin7771eba2021-04-23 14:25:28 +010050 name: "unknown-bootclasspath-fragment",
Paul Duffin4b64ba02021-03-29 11:02:53 +010051 image_name: "unknown",
52 }
53 `)
54}
55
Paul Duffin7771eba2021-04-23 14:25:28 +010056func TestUnknownPrebuiltBootclasspathFragment(t *testing.T) {
57 prepareForTestWithBootclasspathFragment.
Paul Duffin837486d2021-03-23 23:13:53 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
59 `\Qimage_name: Unknown image name "unknown", expected one of art, boot\E`)).
60 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010061 prebuilt_bootclasspath_fragment {
62 name: "unknown-bootclasspath-fragment",
Paul Duffin837486d2021-03-23 23:13:53 +000063 image_name: "unknown",
64 }
65 `)
Paul Duffinf7f65da2021-03-10 15:00:46 +000066}
Paul Duffinc7ef9892021-03-23 23:21:59 +000067
Paul Duffin7771eba2021-04-23 14:25:28 +010068func TestBootclasspathFragmentInconsistentArtConfiguration_Platform(t *testing.T) {
Paul Duffinc7ef9892021-03-23 23:21:59 +000069 android.GroupFixturePreparers(
Paul Duffin7771eba2021-04-23 14:25:28 +010070 prepareForTestWithBootclasspathFragment,
Paul Duffinc7ef9892021-03-23 23:21:59 +000071 dexpreopt.FixtureSetArtBootJars("platform:foo", "apex:bar"),
72 ).
73 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
74 `\QArtApexJars is invalid as it requests a platform variant of "foo"\E`)).
75 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010076 bootclasspath_fragment {
77 name: "bootclasspath-fragment",
Paul Duffinc7ef9892021-03-23 23:21:59 +000078 image_name: "art",
79 apex_available: [
80 "apex",
81 ],
82 }
83 `)
84}
85
Paul Duffin7771eba2021-04-23 14:25:28 +010086func TestBootclasspathFragmentInconsistentArtConfiguration_ApexMixture(t *testing.T) {
Paul Duffinc7ef9892021-03-23 23:21:59 +000087 android.GroupFixturePreparers(
Paul Duffin7771eba2021-04-23 14:25:28 +010088 prepareForTestWithBootclasspathFragment,
Paul Duffinc7ef9892021-03-23 23:21:59 +000089 dexpreopt.FixtureSetArtBootJars("apex1:foo", "apex2:bar"),
90 ).
91 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
92 `\QArtApexJars configuration is inconsistent, expected all jars to be in the same apex but it specifies apex "apex1" and "apex2"\E`)).
93 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010094 bootclasspath_fragment {
95 name: "bootclasspath-fragment",
Paul Duffinc7ef9892021-03-23 23:21:59 +000096 image_name: "art",
97 apex_available: [
98 "apex1",
99 "apex2",
100 ],
101 }
102 `)
103}
Paul Duffin82886d62021-03-24 01:34:57 +0000104
Paul Duffin7771eba2021-04-23 14:25:28 +0100105func TestBootclasspathFragmentWithoutImageNameOrContents(t *testing.T) {
106 prepareForTestWithBootclasspathFragment.
Paul Duffin82886d62021-03-24 01:34:57 +0000107 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
108 `\Qneither of the "image_name" and "contents" properties\E`)).
109 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +0100110 bootclasspath_fragment {
111 name: "bootclasspath-fragment",
Paul Duffin82886d62021-03-24 01:34:57 +0000112 }
113 `)
114}
115
Paul Duffinc7d16442021-04-23 13:55:49 +0100116func TestBootclasspathFragment_Coverage(t *testing.T) {
117 prepareForTestWithFrameworkCoverage := android.FixtureMergeEnv(map[string]string{
118 "EMMA_INSTRUMENT": "true",
119 "EMMA_INSTRUMENT_FRAMEWORK": "true",
120 })
121
122 prepareWithBp := android.FixtureWithRootAndroidBp(`
123 bootclasspath_fragment {
124 name: "myfragment",
125 contents: [
126 "mybootlib",
127 ],
Paul Duffin895c7142021-04-25 13:40:15 +0100128 api: {
129 stub_libs: [
130 "mysdklibrary",
131 ],
132 },
Paul Duffinc7d16442021-04-23 13:55:49 +0100133 coverage: {
134 contents: [
135 "coveragelib",
136 ],
Paul Duffin895c7142021-04-25 13:40:15 +0100137 api: {
138 stub_libs: [
139 "mycoveragestubs",
140 ],
141 },
Paul Duffinc7d16442021-04-23 13:55:49 +0100142 },
143 }
144
145 java_library {
146 name: "mybootlib",
147 srcs: ["Test.java"],
148 system_modules: "none",
149 sdk_version: "none",
150 compile_dex: true,
151 }
152
153 java_library {
154 name: "coveragelib",
155 srcs: ["Test.java"],
156 system_modules: "none",
157 sdk_version: "none",
158 compile_dex: true,
159 }
Paul Duffin895c7142021-04-25 13:40:15 +0100160
161 java_sdk_library {
162 name: "mysdklibrary",
163 srcs: ["Test.java"],
164 compile_dex: true,
165 public: {enabled: true},
166 system: {enabled: true},
167 }
168
169 java_sdk_library {
170 name: "mycoveragestubs",
171 srcs: ["Test.java"],
172 compile_dex: true,
173 public: {enabled: true},
174 }
Paul Duffinc7d16442021-04-23 13:55:49 +0100175 `)
176
177 checkContents := func(t *testing.T, result *android.TestResult, expected ...string) {
178 module := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
179 android.AssertArrayString(t, "contents property", expected, module.properties.Contents)
180 }
181
Paul Duffin895c7142021-04-25 13:40:15 +0100182 preparer := android.GroupFixturePreparers(
183 prepareForTestWithBootclasspathFragment,
184 PrepareForTestWithJavaSdkLibraryFiles,
185 FixtureWithLastReleaseApis("mysdklibrary", "mycoveragestubs"),
186 prepareWithBp,
187 )
188
Paul Duffinc7d16442021-04-23 13:55:49 +0100189 t.Run("without coverage", func(t *testing.T) {
Paul Duffin895c7142021-04-25 13:40:15 +0100190 result := preparer.RunTest(t)
Paul Duffinc7d16442021-04-23 13:55:49 +0100191 checkContents(t, result, "mybootlib")
192 })
193
194 t.Run("with coverage", func(t *testing.T) {
195 result := android.GroupFixturePreparers(
Paul Duffinc7d16442021-04-23 13:55:49 +0100196 prepareForTestWithFrameworkCoverage,
Paul Duffin895c7142021-04-25 13:40:15 +0100197 preparer,
Paul Duffinc7d16442021-04-23 13:55:49 +0100198 ).RunTest(t)
199 checkContents(t, result, "mybootlib", "coveragelib")
200 })
201}
Paul Duffin10931582021-04-25 10:13:54 +0100202
203func TestBootclasspathFragment_StubLibs(t *testing.T) {
204 result := android.GroupFixturePreparers(
205 prepareForTestWithBootclasspathFragment,
206 PrepareForTestWithJavaSdkLibraryFiles,
207 FixtureWithLastReleaseApis("mysdklibrary", "mycoreplatform"),
208 ).RunTestWithBp(t, `
209 bootclasspath_fragment {
210 name: "myfragment",
211 contents: ["mysdklibrary"],
212 api: {
213 stub_libs: [
214 "mystublib",
215 "mysdklibrary",
216 ],
217 },
218 core_platform_api: {
219 stub_libs: ["mycoreplatform"],
220 },
221 }
222
223 java_library {
224 name: "mystublib",
225 srcs: ["Test.java"],
226 system_modules: "none",
227 sdk_version: "none",
228 compile_dex: true,
229 }
230
231 java_sdk_library {
232 name: "mysdklibrary",
233 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100234 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100235 public: {enabled: true},
236 system: {enabled: true},
237 }
238
239 java_sdk_library {
240 name: "mycoreplatform",
241 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100242 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100243 public: {enabled: true},
244 }
245 `)
246
247 fragment := result.Module("myfragment", "android_common")
248 info := result.ModuleProvider(fragment, bootclasspathApiInfoProvider).(bootclasspathApiInfo)
249
250 stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar"
251
252 // Check that SdkPublic uses public stubs.
253 publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs/android_common/dex/mysdklibrary.stubs.jar"
254 android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{stubsJar, publicStubsJar}, info.stubJarsByKind[android.SdkPublic])
255
256 // Check that SdkSystem uses system stubs.
257 systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.system/android_common/dex/mysdklibrary.stubs.system.jar"
258 android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{stubsJar, systemStubsJar}, info.stubJarsByKind[android.SdkSystem])
259
260 // Check that SdkTest also uses system stubs as the mysdklibrary does not provide test stubs.
261 android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{stubsJar, systemStubsJar}, info.stubJarsByKind[android.SdkTest])
262
263 // Check that SdkCorePlatform uses public stubs from the mycoreplatform library.
264 corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar"
265 android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.stubJarsByKind[android.SdkCorePlatform])
266}