Fix some tests for Gradle 5.0 and update some dependency versions

* Introduce GradleVersionRequired.InRange and thus prevent older
tests (e.g. Android 2.3.0) from running with newer Gradle versions

* Add a task outputs pattern suitable for Gradle 5.0

* Run some of the Android tests with AGP 3.1.0 (and Gradle 4.4) instead
of 3.0.0 to ensure compatibility with Gradle 5.0

* Update test projects according to Gradle 5.0 dropped deprecated
features: classesDir, left-shift operator, default org.gradle.util.*
imports

* Fix a Gradle test after Gradle 5.0 changed `publishing` behavior to
run the closure eagerly rather than after evaluation
This commit is contained in:
Sergey Igushkin
2018-12-07 18:47:49 +03:00
parent 5f21ced26b
commit d7522e2283
15 changed files with 34 additions and 22 deletions
@@ -14,7 +14,7 @@ import kotlin.test.assertTrue
class KotlinAndroidGradleIT : AbstractKotlinAndroidGradleTests(androidGradlePluginVersion = "2.3.0") { class KotlinAndroidGradleIT : AbstractKotlinAndroidGradleTests(androidGradlePluginVersion = "2.3.0") {
override val defaultGradleVersion: GradleVersionRequired override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("3.4") get() = GradleVersionRequired.InRange("3.4", "4.10.2")
} }
// TODO If we there is a way to fetch the latest Android plugin version, test against the latest version // TODO If we there is a way to fetch the latest Android plugin version, test against the latest version
@@ -138,7 +138,7 @@ class KotlinAndroid32GradleIT : KotlinAndroid3GradleIT(androidGradlePluginVersio
class KotlinAndroid30GradleIT : KotlinAndroid3GradleIT(androidGradlePluginVersion = "3.0.0") { class KotlinAndroid30GradleIT : KotlinAndroid3GradleIT(androidGradlePluginVersion = "3.0.0") {
override val defaultGradleVersion: GradleVersionRequired override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("4.1") get() = GradleVersionRequired.InRange("4.1", "4.10.2")
} }
abstract class KotlinAndroid3GradleIT(androidGradlePluginVersion: String) : AbstractKotlinAndroidGradleTests(androidGradlePluginVersion) { abstract class KotlinAndroid3GradleIT(androidGradlePluginVersion: String) : AbstractKotlinAndroidGradleTests(androidGradlePluginVersion) {
@@ -170,7 +170,7 @@ abstract class KotlinAndroid3GradleIT(androidGradlePluginVersion: String) : Abst
} }
} }
abstract class AbstractKotlinAndroidGradleTests(private val androidGradlePluginVersion: String) : BaseGradleIT() { abstract class AbstractKotlinAndroidGradleTests(val androidGradlePluginVersion: String) : BaseGradleIT() {
override fun defaultBuildOptions() = override fun defaultBuildOptions() =
super.defaultBuildOptions().copy( super.defaultBuildOptions().copy(
@@ -461,9 +461,11 @@ abstract class BaseGradleIT {
} }
fun CompiledProject.getOutputForTask(taskName: String): String { fun CompiledProject.getOutputForTask(taskName: String): String {
val taskOutputRegex = ("\\[LIFECYCLE] \\[class org\\.gradle(?:\\.internal\\.buildevents)?\\.TaskExecutionLogger] :$taskName" + val taskOutputRegex = ("(?:\\[LIFECYCLE] \\[class org\\.gradle(?:\\.internal\\.buildevents)?\\.TaskExecutionLogger] :$taskName|" +
"\\[org\\.gradle\\.execution\\.plan\\.DefaultPlanExecutor\\] :$taskName.*?started)" +
"([\\s\\S]+?)" + "([\\s\\S]+?)" +
"Finished executing task ':$taskName'").toRegex() "(?:Finished executing task ':$taskName'|" +
"\\[org\\.gradle\\.execution\\.plan\\.DefaultPlanExecutor\\] :$taskName.*?completed)").toRegex()
return taskOutputRegex.find(output)?.run { groupValues[1] } ?: error("Cannot find output for task $taskName") return taskOutputRegex.find(output)?.run { groupValues[1] } ?: error("Cannot find output for task $taskName")
} }
@@ -30,7 +30,7 @@ class BuildCacheRelocationIT : BaseGradleIT() {
override fun defaultBuildOptions(): BuildOptions = override fun defaultBuildOptions(): BuildOptions =
super.defaultBuildOptions().copy( super.defaultBuildOptions().copy(
withBuildCache = true, withBuildCache = true,
androidGradlePluginVersion = "3.0.0", androidGradlePluginVersion = "3.1.0",
androidHome = KotlinTestUtils.findAndroidSdk() androidHome = KotlinTestUtils.findAndroidSdk()
) )
@@ -47,7 +47,7 @@ class BuildCacheRelocationIT : BaseGradleIT() {
val (firstProject, secondProject) = (0..1).map { id -> val (firstProject, secondProject) = (0..1).map { id ->
workingDir = workingDirs[id] workingDir = workingDirs[id]
Project(projectName, GradleVersionRequired.AtLeast("4.3"), projectDirectoryPrefix).apply { Project(projectName, GradleVersionRequired.AtLeast("4.4"), projectDirectoryPrefix).apply {
setupWorkingDir() setupWorkingDir()
initProject() initProject()
prepareLocalBuildCache(localBuildCacheDirectory) prepareLocalBuildCache(localBuildCacheDirectory)
@@ -31,6 +31,8 @@ sealed class GradleVersionRequired(val minVersion: String, val maxVersion: Strin
class AtLeast(version: String) : GradleVersionRequired(version, null) class AtLeast(version: String) : GradleVersionRequired(version, null)
class InRange(minVersion: String, maxVersion: String) : GradleVersionRequired(minVersion, maxVersion)
object None : GradleVersionRequired(GradleVersionRequired.OLDEST_SUPPORTED, null) object None : GradleVersionRequired(GradleVersionRequired.OLDEST_SUPPORTED, null)
} }
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.gradle package org.jetbrains.kotlin.gradle
import org.jetbrains.kotlin.gradle.util.isLegacyAndroidGradleVersion
import org.jetbrains.kotlin.gradle.util.getFileByName import org.jetbrains.kotlin.gradle.util.getFileByName
import org.jetbrains.kotlin.gradle.util.isLegacyAndroidGradleVersion
import org.jetbrains.kotlin.gradle.util.modify import org.jetbrains.kotlin.gradle.util.modify
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.junit.Test import org.junit.Test
@@ -24,7 +24,7 @@ open class Kapt3AndroidIT : Kapt3BaseIT() {
get() = "2.3.0" get() = "2.3.0"
override val defaultGradleVersion: GradleVersionRequired override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("4.1") get() = GradleVersionRequired.InRange("4.1", "4.10.2")
override fun defaultBuildOptions() = override fun defaultBuildOptions() =
super.defaultBuildOptions().copy( super.defaultBuildOptions().copy(
@@ -142,7 +142,7 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() {
@Test @Test
fun testJsCustomSourceSet() { fun testJsCustomSourceSet() {
val project = Project("kotlin2JsProjectWithCustomSourceset") val project = Project("kotlin2JsProjectWithCustomSourceset", GradleVersionRequired.AtLeast("4.0"))
project.build("build") { project.build("build") {
assertSuccessful() assertSuccessful()
@@ -84,7 +84,7 @@ class SimpleKotlinGradleIT : BaseGradleIT() {
@Test @Test
fun testDestinationDirReferencedDuringEvaluation() { fun testDestinationDirReferencedDuringEvaluation() {
Project("destinationDirReferencedDuringEvaluation").build("build") { Project("destinationDirReferencedDuringEvaluation", GradleVersionRequired.AtLeast("4.0")).build("build") {
assertSuccessful() assertSuccessful()
assertContains("GreeterTest PASSED") assertContains("GreeterTest PASSED")
} }
@@ -190,9 +190,11 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
group 'com.example.oldmpp' group 'com.example.oldmpp'
version '1.0' version '1.0'
apply plugin: 'maven-publish' apply plugin: 'maven-publish'
publishing { afterEvaluate {
repositories { maven { url "file://${'$'}{rootDir.absolutePath.replace('\\', '/')}/repo" } } publishing {
publications { kotlin(MavenPublication) { from(components.java) } } repositories { maven { url "file://${'$'}{rootDir.absolutePath.replace('\\', '/')}/repo" } }
publications { kotlin(MavenPublication) { from(components.java) } }
}
} }
} }
""".trimIndent() """.trimIndent()
@@ -16,11 +16,11 @@ import kotlin.test.assertTrue
class KotlinAndroidExtensionIT : BaseGradleIT() { class KotlinAndroidExtensionIT : BaseGradleIT() {
override val defaultGradleVersion: GradleVersionRequired override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("4.1") get() = GradleVersionRequired.AtLeast("4.4")
override fun defaultBuildOptions(): BuildOptions { override fun defaultBuildOptions(): BuildOptions {
return super.defaultBuildOptions().copy( return super.defaultBuildOptions().copy(
androidGradlePluginVersion = "3.0.0", androidGradlePluginVersion = "3.1.0",
androidHome = KotlinTestUtils.findAndroidSdk() androidHome = KotlinTestUtils.findAndroidSdk()
) )
} }
@@ -16,11 +16,11 @@ import kotlin.test.assertTrue
class KotlinProjectIT : BaseGradleIT() { class KotlinProjectIT : BaseGradleIT() {
override val defaultGradleVersion: GradleVersionRequired override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("4.1") get() = GradleVersionRequired.AtLeast("4.4")
override fun defaultBuildOptions(): BuildOptions { override fun defaultBuildOptions(): BuildOptions {
return super.defaultBuildOptions().copy( return super.defaultBuildOptions().copy(
androidGradlePluginVersion = "3.0.0", androidGradlePluginVersion = "3.1.0",
androidHome = KotlinTestUtils.findAndroidSdk() androidHome = KotlinTestUtils.findAndroidSdk()
) )
} }
@@ -1,3 +1,5 @@
import org.gradle.util.VersionNumber
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
@@ -1,3 +1,5 @@
import org.gradle.util.VersionNumber
apply plugin: 'com.android.test' apply plugin: 'com.android.test'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
@@ -22,4 +22,4 @@ dependencies {
} }
// important to test that destinationDir is configured before evaluation // important to test that destinationDir is configured before evaluation
test.testClassesDir = project.tasks.compileTestKotlin.destinationDir test.testClassesDirs = files(project.tasks.compileTestKotlin.destinationDir)
@@ -19,6 +19,8 @@ dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
} }
task exit << { task('exit') {
System.exit(0) doFirst {
System.exit(0)
}
} }
@@ -20,7 +20,7 @@ sourceSets {
} }
task integrationTest(type: Test) { task integrationTest(type: Test) {
testClassesDir = sourceSets.integrationTest.output.classesDir testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath classpath = sourceSets.integrationTest.runtimeClasspath
} }