Setup running tests against different Gradle versions.
^KT-45744 In Progress
This commit is contained in:
committed by
TeamCityServer
parent
4583cd3634
commit
0ca4254cba
@@ -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 {
|
||||||
|
|||||||
+24
@@ -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 {
|
||||||
|
}
|
||||||
+45
@@ -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> = []
|
||||||
|
)
|
||||||
}
|
}
|
||||||
+17
-5
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user