Setup running tests against different Gradle versions.

^KT-45744 In Progress
This commit is contained in:
Yahor Berdnikau
2021-03-22 16:46:05 +01:00
committed by TeamCityServer
parent 4583cd3634
commit 0ca4254cba
5 changed files with 89 additions and 7 deletions
@@ -41,7 +41,7 @@ dependencies {
testImplementation(gradleApi()) testImplementation(gradleApi())
testImplementation(gradleTestKit()) testImplementation(gradleTestKit())
testImplementation("com.google.code.gson:gson:${rootProject.extra["versions.jar.gson"]}") testImplementation("com.google.code.gson:gson:${rootProject.extra["versions.jar.gson"]}")
testApiJUnit5(vintageEngine = true) testApiJUnit5(vintageEngine = true, jupiterParams = true)
testRuntimeOnly(projectRuntimeJar(":kotlin-android-extensions")) testRuntimeOnly(projectRuntimeJar(":kotlin-android-extensions"))
testRuntimeOnly(project(":compiler:tests-mutes")) testRuntimeOnly(project(":compiler:tests-mutes"))
@@ -181,6 +181,7 @@ tasks.withType<Test> {
useAndroidSdk() useAndroidSdk()
maxHeapSize = "512m" maxHeapSize = "512m"
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 4).coerceAtLeast(1)
useJUnitPlatform() useJUnitPlatform()
testLogging { testLogging {
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.testbase;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// Has to be java annotation
// Workaround for https://youtrack.jetbrains.com/issue/IDEA-265284
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@KGPBaseTest.GradleTestVersions
@ParameterizedTest(name = "{0}: {displayName}")
@ArgumentsSource(KGPBaseTest.GradleArgumentsProvider.class)
public @interface GradleTest {
}
@@ -7,9 +7,21 @@ package org.jetbrains.kotlin.gradle.testbase
import org.gradle.api.logging.LogLevel import org.gradle.api.logging.LogLevel
import org.gradle.api.logging.configuration.WarningMode import org.gradle.api.logging.configuration.WarningMode
import org.gradle.internal.impldep.org.junit.platform.commons.support.AnnotationSupport.findAnnotation
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.KOTLIN_VERSION import org.jetbrains.kotlin.gradle.KOTLIN_VERSION
import org.jetbrains.kotlin.gradle.utils.minSupportedGradleVersion
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtensionContext
import org.junit.jupiter.api.io.TempDir import org.junit.jupiter.api.io.TempDir
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.Arguments
import org.junit.jupiter.params.provider.ArgumentsProvider
import org.junit.jupiter.params.provider.ArgumentsSource
import java.nio.file.Path import java.nio.file.Path
import java.util.stream.Stream
import kotlin.streams.asStream
/** /**
* Base class for all Kotlin Gradle plugin integration tests. * Base class for all Kotlin Gradle plugin integration tests.
@@ -48,4 +60,37 @@ abstract class KGPBaseTest {
return arguments.toList() return arguments.toList()
} }
} }
class GradleArgumentsProvider : ArgumentsProvider {
override fun provideArguments(
context: ExtensionContext
): Stream<out Arguments> {
val versionsAnnotation = findAnnotation(context.testMethod, GradleTestVersions::class.java).orElseThrow {
IllegalStateException("Define allowed Gradle versions via '@GradleTestVersions'.")
}
val minGradleVersion = GradleVersion.version(versionsAnnotation.minVersion)
val maxGradleVersion = GradleVersion.version(versionsAnnotation.maxVersion)
val additionalGradleVersions = versionsAnnotation
.additionalVersions
.map(GradleVersion::version)
additionalGradleVersions.forEach {
assert(it in minGradleVersion..maxGradleVersion) {
"Additional Gradle version ${it.version} should be between ${minGradleVersion.version} and ${maxGradleVersion.version}"
}
}
return sequenceOf(minGradleVersion, *additionalGradleVersions.toTypedArray(), maxGradleVersion)
.map { Arguments.of(it) }
.asStream()
}
}
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.ANNOTATION_CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class GradleTestVersions(
val minVersion: String = minSupportedGradleVersion,
val maxVersion: String = "7.0-milestone-3",
val additionalVersions: Array<String> = []
)
} }
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.testbase
import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.BuildResult
import org.gradle.testkit.runner.GradleRunner import org.gradle.testkit.runner.GradleRunner
import org.gradle.util.GradleVersion
import kotlin.test.assertTrue import kotlin.test.assertTrue
import java.nio.file.* import java.nio.file.*
import java.nio.file.Files.copy import java.nio.file.Files.copy
@@ -22,22 +23,29 @@ import java.nio.file.attribute.BasicFileAttributes
*/ */
fun KGPBaseTest.project( fun KGPBaseTest.project(
projectName: String, projectName: String,
gradleVersion: GradleVersion,
buildOptions: KGPBaseTest.BuildOptions = defaultBuildOptions, buildOptions: KGPBaseTest.BuildOptions = defaultBuildOptions,
test: TestProject.() -> Unit test: TestProject.() -> Unit
): TestProject { ): TestProject {
val projectPath = setupProjectFromTestResources(projectName, KGPBaseTest.workingDir) val projectPath = setupProjectFromTestResources(
projectName,
gradleVersion,
KGPBaseTest.workingDir
)
projectPath.addDefaultBuildFiles() projectPath.addDefaultBuildFiles()
val gradleRunner = GradleRunner val gradleRunner = GradleRunner
.create() .create()
.withProjectDir(projectPath.toFile()) .withProjectDir(projectPath.toFile())
.withTestKitDir(KGPBaseTest.workingDir.testKitDir.toFile()) .withTestKitDir(Paths.get(".").testKitDir.toAbsolutePath().toFile())
.withGradleVersion(gradleVersion.version)
val testProject = TestProject( val testProject = TestProject(
gradleRunner, gradleRunner,
projectName, projectName,
buildOptions, buildOptions,
projectPath projectPath,
gradleVersion
) )
testProject.test() testProject.test()
return testProject return testProject
@@ -75,7 +83,8 @@ class TestProject(
val gradleRunner: GradleRunner, val gradleRunner: GradleRunner,
val projectName: String, val projectName: String,
val buildOptions: KGPBaseTest.BuildOptions, val buildOptions: KGPBaseTest.BuildOptions,
val projectPath: Path val projectPath: Path,
val gradleVersion: GradleVersion
) )
private fun TestProject.commonBuildSetup( private fun TestProject.commonBuildSetup(
@@ -85,15 +94,17 @@ private fun TestProject.commonBuildSetup(
val allBuildArguments = buildOptionsArguments + buildArguments + "--full-stacktrace" val allBuildArguments = buildOptionsArguments + buildArguments + "--full-stacktrace"
println("<=== Test build: ${this.projectName} ===>") println("<=== Test build: ${this.projectName} ===>")
println("<=== Using Gradle version: ${gradleVersion.version} ===>")
println("<=== Run arguments: ${allBuildArguments.joinToString()} ===>") println("<=== Run arguments: ${allBuildArguments.joinToString()} ===>")
return allBuildArguments return allBuildArguments
} }
private val Path.testKitDir get() = resolve("testKitDir") private val Path.testKitDir get() = resolve(".testKitDir")
private fun setupProjectFromTestResources( private fun setupProjectFromTestResources(
projectName: String, projectName: String,
gradleVersion: GradleVersion,
tempDir: Path tempDir: Path
): Path { ): Path {
val testProjectPath = Paths.get("src", "test", "resources", "testProject", projectName) val testProjectPath = Paths.get("src", "test", "resources", "testProject", projectName)
@@ -102,6 +113,7 @@ private fun setupProjectFromTestResources(
return tempDir return tempDir
.resolve(projectName) .resolve(projectName)
.resolve(gradleVersion.version)
.also { .also {
testProjectPath.copyRecursively(it) testProjectPath.copyRecursively(it)
} }
@@ -34,7 +34,7 @@ import org.gradle.util.GradleVersion
import java.io.File import java.io.File
import java.io.Serializable import java.io.Serializable
const val minSupportedGradleVersion = "6.1" const val minSupportedGradleVersion = "6.1.1"
internal val Task.inputsCompatible: TaskInputs get() = inputs internal val Task.inputsCompatible: TaskInputs get() = inputs