blob: dbdf6c413d95f80e0fc213846444fe5c372d75b8 [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 ],
128 coverage: {
129 contents: [
130 "coveragelib",
131 ],
132 },
133 }
134
135 java_library {
136 name: "mybootlib",
137 srcs: ["Test.java"],
138 system_modules: "none",
139 sdk_version: "none",
140 compile_dex: true,
141 }
142
143 java_library {
144 name: "coveragelib",
145 srcs: ["Test.java"],
146 system_modules: "none",
147 sdk_version: "none",
148 compile_dex: true,
149 }
150 `)
151
152 checkContents := func(t *testing.T, result *android.TestResult, expected ...string) {
153 module := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
154 android.AssertArrayString(t, "contents property", expected, module.properties.Contents)
155 }
156
157 t.Run("without coverage", func(t *testing.T) {
158 result := android.GroupFixturePreparers(
159 prepareForTestWithBootclasspathFragment,
160 prepareWithBp,
161 ).RunTest(t)
162 checkContents(t, result, "mybootlib")
163 })
164
165 t.Run("with coverage", func(t *testing.T) {
166 result := android.GroupFixturePreparers(
167 prepareForTestWithBootclasspathFragment,
168 prepareForTestWithFrameworkCoverage,
169 prepareWithBp,
170 ).RunTest(t)
171 checkContents(t, result, "mybootlib", "coveragelib")
172 })
173}
Paul Duffin10931582021-04-25 10:13:54 +0100174
175func TestBootclasspathFragment_StubLibs(t *testing.T) {
176 result := android.GroupFixturePreparers(
177 prepareForTestWithBootclasspathFragment,
178 PrepareForTestWithJavaSdkLibraryFiles,
179 FixtureWithLastReleaseApis("mysdklibrary", "mycoreplatform"),
180 ).RunTestWithBp(t, `
181 bootclasspath_fragment {
182 name: "myfragment",
183 contents: ["mysdklibrary"],
184 api: {
185 stub_libs: [
186 "mystublib",
187 "mysdklibrary",
188 ],
189 },
190 core_platform_api: {
191 stub_libs: ["mycoreplatform"],
192 },
193 }
194
195 java_library {
196 name: "mystublib",
197 srcs: ["Test.java"],
198 system_modules: "none",
199 sdk_version: "none",
200 compile_dex: true,
201 }
202
203 java_sdk_library {
204 name: "mysdklibrary",
205 srcs: ["a.java"],
206 compile_dex: true,
207 public: {enabled: true},
208 system: {enabled: true},
209 }
210
211 java_sdk_library {
212 name: "mycoreplatform",
213 srcs: ["a.java"],
214 compile_dex: true,
215 public: {enabled: true},
216 }
217 `)
218
219 fragment := result.Module("myfragment", "android_common")
220 info := result.ModuleProvider(fragment, bootclasspathApiInfoProvider).(bootclasspathApiInfo)
221
222 stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar"
223
224 // Check that SdkPublic uses public stubs.
225 publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs/android_common/dex/mysdklibrary.stubs.jar"
226 android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{stubsJar, publicStubsJar}, info.stubJarsByKind[android.SdkPublic])
227
228 // Check that SdkSystem uses system stubs.
229 systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.system/android_common/dex/mysdklibrary.stubs.system.jar"
230 android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{stubsJar, systemStubsJar}, info.stubJarsByKind[android.SdkSystem])
231
232 // Check that SdkTest also uses system stubs as the mysdklibrary does not provide test stubs.
233 android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{stubsJar, systemStubsJar}, info.stubJarsByKind[android.SdkTest])
234
235 // Check that SdkCorePlatform uses public stubs from the mycoreplatform library.
236 corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar"
237 android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.stubJarsByKind[android.SdkCorePlatform])
238}