4
4
*/
5
5
6
6
import org.gradle.api.Project
7
+ import org.gradle.api.Task
7
8
import org.gradle.api.artifacts.Configuration
8
9
import org.gradle.api.artifacts.ProjectDependency
9
10
import org.gradle.api.artifacts.dsl.DependencyHandler
@@ -13,13 +14,19 @@ import org.gradle.api.file.RegularFileProperty
13
14
import org.gradle.api.project.IsolatedProject
14
15
import org.gradle.api.provider.ListProperty
15
16
import org.gradle.api.provider.Property
17
+ import org.gradle.api.tasks.JavaExec
18
+ import org.gradle.api.tasks.SourceSet
19
+ import org.gradle.api.tasks.TaskProvider
20
+ import org.gradle.api.tasks.testing.Test
16
21
import org.gradle.kotlin.dsl.dependencies
17
22
import org.gradle.kotlin.dsl.project
18
23
import java.io.File
19
24
20
25
abstract class ProjectTestsExtension (private val project : Project ) {
21
26
abstract val allowFlaky: Property <Boolean >
22
27
28
+ // -------------------- dependencies for runtime of tests --------------------
29
+
23
30
val stdlibRuntimeForTests: Configuration = project.configurations.create(" stdlibRuntimeForTests" ) {
24
31
isTransitive = false
25
32
}
@@ -58,18 +65,6 @@ abstract class ProjectTestsExtension(private val project: Project) {
58
65
}
59
66
}
60
67
61
- internal abstract val testDataFiles: ListProperty <Directory >
62
- internal val testDataMap: MutableMap <String , String > = mutableMapOf<String , String >()
63
-
64
- fun testData (isolatedProject : IsolatedProject , relativePath : String ) {
65
- val testDataDirectory = isolatedProject.projectDirectory.dir(relativePath)
66
- testDataFiles.add(testDataDirectory)
67
- testDataMap.put(
68
- testDataDirectory.asFile.relativeTo(project.rootDir).path.replace(" \\ " , " /" ),
69
- testDataDirectory.asFile.canonicalPath.replace(" \\ " , " /" )
70
- )
71
- }
72
-
73
68
fun withJvmStdlibAndReflect () {
74
69
add(stdlibRuntimeForTests) { project(" :kotlin-stdlib" ) }
75
70
add(stdlibMinimalRuntimeForTests) { project(" :kotlin-stdlib-jvm-minimal-for-test" ) }
@@ -148,4 +143,89 @@ abstract class ProjectTestsExtension(private val project: Project) {
148
143
fun withThirdPartyJsr305 () {
149
144
thirdPartyJsr305.set(File (project.rootDir, " third-party/jsr305" ))
150
145
}
146
+
147
+ // -------------------- testData configuration --------------------
148
+
149
+ internal abstract val testDataFiles: ListProperty <Directory >
150
+ internal val testDataMap: MutableMap <String , String > = mutableMapOf<String , String >()
151
+
152
+ fun testData (isolatedProject : IsolatedProject , relativePath : String ) {
153
+ val testDataDirectory = isolatedProject.projectDirectory.dir(relativePath)
154
+ testDataFiles.add(testDataDirectory)
155
+ testDataMap.put(
156
+ testDataDirectory.asFile.relativeTo(project.rootDir).path.replace(" \\ " , " /" ),
157
+ testDataDirectory.asFile.canonicalPath.replace(" \\ " , " /" )
158
+ )
159
+ }
160
+
161
+ // -------------------- test task definitions --------------------
162
+
163
+ fun testTask (
164
+ parallel : Boolean? = null,
165
+ jUnitMode : JUnitMode ,
166
+ maxHeapSizeMb : Int? = null,
167
+ minHeapSizeMb : Int? = null,
168
+ maxMetaspaceSizeMb : Int = 512,
169
+ reservedCodeCacheSizeMb : Int = 256,
170
+ defineJDKEnvVariables : List <JdkMajorVersion > = emptyList(),
171
+ body : Test .() -> Unit = {},
172
+ ): TaskProvider <Test > {
173
+ @Suppress(" UNCHECKED_CAST" )
174
+ return testTask(
175
+ taskName = " test" ,
176
+ parallel,
177
+ jUnitMode,
178
+ maxHeapSizeMb,
179
+ minHeapSizeMb,
180
+ maxMetaspaceSizeMb,
181
+ reservedCodeCacheSizeMb,
182
+ defineJDKEnvVariables,
183
+ skipInLocalBuild = false ,
184
+ body
185
+ ) as TaskProvider <Test >
186
+ }
187
+
188
+ fun testTask (
189
+ taskName : String ,
190
+ parallel : Boolean? = null,
191
+ jUnitMode : JUnitMode ,
192
+ maxHeapSizeMb : Int? = null,
193
+ minHeapSizeMb : Int? = null,
194
+ maxMetaspaceSizeMb : Int = 512,
195
+ reservedCodeCacheSizeMb : Int = 256,
196
+ defineJDKEnvVariables : List <JdkMajorVersion > = emptyList(),
197
+ skipInLocalBuild : Boolean ,
198
+ body : Test .() -> Unit = {},
199
+ ): TaskProvider <out Task > {
200
+ if (skipInLocalBuild && ! project.kotlinBuildProperties.isTeamcityBuild) {
201
+ return project.tasks.register(taskName)
202
+ }
203
+ if (jUnitMode == JUnitMode .JUnit5 && parallel != null ) {
204
+ project.logger.error(" JUnit5 tests are parallel by default and its configured with `junit-platform.properties`, please remove `parallel=$parallel ` argument" )
205
+ }
206
+ return project.projectTest(
207
+ taskName,
208
+ parallel ? : false ,
209
+ jUnitMode,
210
+ maxHeapSizeMb,
211
+ minHeapSizeMb,
212
+ maxMetaspaceSizeMb,
213
+ reservedCodeCacheSizeMb,
214
+ defineJDKEnvVariables,
215
+ ) {
216
+ if (jUnitMode == JUnitMode .JUnit5 ) {
217
+ useJUnitPlatform()
218
+ }
219
+ body()
220
+ }
221
+ }
222
+
223
+ fun testGenerator (
224
+ fqName : String ,
225
+ taskName : String = "generateTests",
226
+ sourceSet : SourceSet ? = null,
227
+ configure : JavaExec .() -> Unit = {}
228
+ ) {
229
+ project.generator(taskName, fqName, sourceSet, configure)
230
+ }
151
231
}
0 commit comments