blob: 78e37df8777e86753632e18c1acfaa76161fd38b [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"),
167 prepareWithBp,
168 )
169
Paul Duffinc7d16442021-04-23 13:55:49 +0100170 t.Run("without coverage", func(t *testing.T) {
Paul Duffin895c7142021-04-25 13:40:15 +0100171 result := preparer.RunTest(t)
Paul Duffinc7d16442021-04-23 13:55:49 +0100172 checkContents(t, result, "mybootlib")
173 })
174
175 t.Run("with coverage", func(t *testing.T) {
176 result := android.GroupFixturePreparers(
Paul Duffinc7d16442021-04-23 13:55:49 +0100177 prepareForTestWithFrameworkCoverage,
Paul Duffin895c7142021-04-25 13:40:15 +0100178 preparer,
Paul Duffinc7d16442021-04-23 13:55:49 +0100179 ).RunTest(t)
180 checkContents(t, result, "mybootlib", "coveragelib")
181 })
182}
Paul Duffin10931582021-04-25 10:13:54 +0100183
184func TestBootclasspathFragment_StubLibs(t *testing.T) {
185 result := android.GroupFixturePreparers(
186 prepareForTestWithBootclasspathFragment,
187 PrepareForTestWithJavaSdkLibraryFiles,
Paul Duffin34827d42021-05-13 21:25:05 +0100188 FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
Paul Duffin10931582021-04-25 10:13:54 +0100189 ).RunTestWithBp(t, `
190 bootclasspath_fragment {
191 name: "myfragment",
192 contents: ["mysdklibrary"],
193 api: {
194 stub_libs: [
195 "mystublib",
Paul Duffin34827d42021-05-13 21:25:05 +0100196 "myothersdklibrary",
Paul Duffin10931582021-04-25 10:13:54 +0100197 ],
198 },
199 core_platform_api: {
200 stub_libs: ["mycoreplatform"],
201 },
202 }
203
204 java_library {
205 name: "mystublib",
206 srcs: ["Test.java"],
207 system_modules: "none",
208 sdk_version: "none",
209 compile_dex: true,
210 }
211
212 java_sdk_library {
213 name: "mysdklibrary",
214 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100215 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100216 public: {enabled: true},
217 system: {enabled: true},
218 }
219
220 java_sdk_library {
Paul Duffin34827d42021-05-13 21:25:05 +0100221 name: "myothersdklibrary",
222 srcs: ["a.java"],
223 shared_library: false,
224 public: {enabled: true},
225 }
226
227 java_sdk_library {
Paul Duffin10931582021-04-25 10:13:54 +0100228 name: "mycoreplatform",
229 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100230 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100231 public: {enabled: true},
232 }
233 `)
234
235 fragment := result.Module("myfragment", "android_common")
Paul Duffin18cf1972021-05-21 22:46:59 +0100236 info := result.ModuleProvider(fragment, HiddenAPIInfoProvider).(HiddenAPIInfo)
Paul Duffin10931582021-04-25 10:13:54 +0100237
238 stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar"
239
Paul Duffin34827d42021-05-13 21:25:05 +0100240 // Stubs jars for mysdklibrary
Paul Duffin10931582021-04-25 10:13:54 +0100241 publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs/android_common/dex/mysdklibrary.stubs.jar"
Paul Duffin10931582021-04-25 10:13:54 +0100242 systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.system/android_common/dex/mysdklibrary.stubs.system.jar"
Paul Duffin10931582021-04-25 10:13:54 +0100243
Paul Duffin34827d42021-05-13 21:25:05 +0100244 // Stubs jars for myothersdklibrary
245 otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs/android_common/dex/myothersdklibrary.stubs.jar"
246
247 // Check that SdkPublic uses public stubs for all sdk libraries.
Paul Duffin31fad802021-06-18 18:14:25 +0100248 android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[PublicHiddenAPIScope])
Paul Duffin34827d42021-05-13 21:25:05 +0100249
250 // Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary
251 // as it does not provide system stubs.
Paul Duffin31fad802021-06-18 18:14:25 +0100252 android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[SystemHiddenAPIScope])
Paul Duffin34827d42021-05-13 21:25:05 +0100253
254 // Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs
255 // and public stubs for myothersdklibrary as it does not provide test stubs either.
Paul Duffin31fad802021-06-18 18:14:25 +0100256 android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope[TestHiddenAPIScope])
Paul Duffin10931582021-04-25 10:13:54 +0100257
258 // Check that SdkCorePlatform uses public stubs from the mycoreplatform library.
259 corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar"
Paul Duffin31fad802021-06-18 18:14:25 +0100260 android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope[CorePlatformHiddenAPIScope])
Paul Duffind2b1e0c2021-06-27 20:53:39 +0100261
262 // Check the widest stubs. This should list the widest stub dex jar provided by each module.
263 // TODO(b/179354495): Fix this.
264 android.AssertPathsRelativeToTopEquals(t, "widest dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForWidestAPIScope())
Paul Duffin10931582021-04-25 10:13:54 +0100265}