Skip to content

Commit 63c0fd1

Browse files
demiurg906Space Team
authored andcommitted
[Build] Add utilities for creating test tasks from project-tests-convention
1 parent 94c5b28 commit 63c0fd1

File tree

3 files changed

+113
-24
lines changed

3 files changed

+113
-24
lines changed

repo/gradle-build-conventions/project-tests-convention/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ dependencies {
3333
compileOnly(kotlin("stdlib", embeddedKotlinVersion))
3434
implementation(libs.develocity.gradlePlugin)
3535
implementation("org.jetbrains.kotlin:kotlin-build-gradle-plugin:${kotlinBuildProperties.buildGradlePluginVersion}")
36+
api(project(":utilities"))
3637
}

repo/gradle-build-conventions/project-tests-convention/src/main/kotlin/ProjectTestsExtension.kt

Lines changed: 92 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
import org.gradle.api.Project
7+
import org.gradle.api.Task
78
import org.gradle.api.artifacts.Configuration
89
import org.gradle.api.artifacts.ProjectDependency
910
import org.gradle.api.artifacts.dsl.DependencyHandler
@@ -13,13 +14,19 @@ import org.gradle.api.file.RegularFileProperty
1314
import org.gradle.api.project.IsolatedProject
1415
import org.gradle.api.provider.ListProperty
1516
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
1621
import org.gradle.kotlin.dsl.dependencies
1722
import org.gradle.kotlin.dsl.project
1823
import java.io.File
1924

2025
abstract class ProjectTestsExtension(private val project: Project) {
2126
abstract val allowFlaky: Property<Boolean>
2227

28+
// -------------------- dependencies for runtime of tests --------------------
29+
2330
val stdlibRuntimeForTests: Configuration = project.configurations.create("stdlibRuntimeForTests") {
2431
isTransitive = false
2532
}
@@ -58,18 +65,6 @@ abstract class ProjectTestsExtension(private val project: Project) {
5865
}
5966
}
6067

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-
7368
fun withJvmStdlibAndReflect() {
7469
add(stdlibRuntimeForTests) { project(":kotlin-stdlib") }
7570
add(stdlibMinimalRuntimeForTests) { project(":kotlin-stdlib-jvm-minimal-for-test") }
@@ -148,4 +143,89 @@ abstract class ProjectTestsExtension(private val project: Project) {
148143
fun withThirdPartyJsr305() {
149144
thirdPartyJsr305.set(File(project.rootDir, "third-party/jsr305"))
150145
}
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+
}
151231
}

repo/gradle-build-conventions/utilities/src/main/kotlin/generators.kt

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,24 @@ fun Project.generator(
1414
fqName: String,
1515
sourceSet: SourceSet? = null,
1616
configure: JavaExec.() -> Unit = {}
17-
) = PropertyDelegateProvider<Any?, TaskProvider<JavaExec>> { _, property ->
18-
smartJavaExec(
19-
name = property.name,
20-
classpath = (sourceSet ?: testSourceSet).runtimeClasspath,
21-
mainClass = fqName
22-
) {
23-
group = "Generate"
24-
workingDir = rootDir
25-
systemProperty("line.separator", "\n")
26-
systemProperty("idea.ignore.disabled.plugins", "true")
27-
configure()
28-
}
17+
): PropertyDelegateProvider<Any?, TaskProvider<JavaExec>> = PropertyDelegateProvider { _, property ->
18+
generator(property.name, fqName, sourceSet, configure)
2919
}
20+
21+
fun Project.generator(
22+
taskName: String,
23+
fqName: String,
24+
sourceSet: SourceSet? = null,
25+
configure: JavaExec.() -> Unit = {}
26+
): TaskProvider<JavaExec> = smartJavaExec(
27+
name = taskName,
28+
classpath = (sourceSet ?: testSourceSet).runtimeClasspath,
29+
mainClass = fqName
30+
) {
31+
group = "Generate"
32+
workingDir = rootDir
33+
systemProperty("line.separator", "\n")
34+
systemProperty("idea.ignore.disabled.plugins", "true")
35+
configure()
36+
}
37+

0 commit comments

Comments
 (0)