diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/Readme.md b/libraries/tools/kotlin-gradle-plugin-integration-tests/Readme.md index 3674b1e5cad..4d7a882c4a2 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/Readme.md +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/Readme.md @@ -12,6 +12,7 @@ More fine-grained test tasks exist covering different parts of Gradle plugins: - `kgpJsTests` - runs all tests for Kotlin Gradle Plugin/Js platform (parallel execution) - `kgpAndroidTests` - runs all tests for Kotlin Gradle Plugin/Android platform (parallel execution) - `kgpMppTests` - run all tests for Kotlin Gradle Multiplatform plugin (parallel execution) +- `kgpNativeTests` - run all tests for Kotlin Gradle Plugin with K/N (parallel execution) - `kgpDaemonTests` - runs all tests for Gradle and Kotlin daemons (sequential execution) - `kgpOtherTests` - run all tests for support Gradle plugins, such as kapt, allopen, etc (parallel execution) - `kgpAllParallelTests` - run all tests for all platforms except daemons tests (parallel execution) @@ -30,7 +31,7 @@ also require the Gradle plugin marker artifacts to be installed: If you want to run only one test class, you need to append `--tests` flag with value of test class, which you want to run ```shell -./gradlew :kotlin-gradle-plugin-integration-tests:kgpAllTests --tests +./gradlew :kotlin-gradle-plugin-integration-tests:kgpAllParallelTests --tests ``` #### How to work with the tests diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts index ba8e13f7f81..8e49ba5ae6f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts @@ -1,6 +1,7 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.jvm.toolchain.internal.NoToolchainAvailableException import org.jetbrains.kotlin.pill.PillExtension +import java.nio.file.Paths plugins { kotlin("jvm") @@ -128,6 +129,16 @@ val cleanTestKitCacheTask = tasks.register("cleanTestKitCache") { delete(project.buildDir.resolve("testKitCache")) } +tasks.register("cleanUserHomeKonanDir") { + group = KGP_TEST_TASKS_GROUP + description = "Deletes ~/.konan dir before tests. This step is necessary to ensure that no test inadvertently creates this directory during execution." + + val userHomeKonanDir = Paths.get("${System.getProperty("user.home")}/.konan") + delete(userHomeKonanDir) + + println("Default .konan directory user's home has been deleted: $userHomeKonanDir") +} + fun Test.includeMppAndAndroid(include: Boolean) = includeTestsWithPattern(include) { addAll(listOf("*Multiplatform*", "*Mpp*", "*Android*")) } @@ -329,6 +340,9 @@ tasks.withType { dependsOn(":gradle:kotlin-compiler-args-properties:install") dependsOn(":examples:annotation-processor-example:install") dependsOn(":kotlin-dom-api-compat:install") + if (project.kotlinBuildProperties.isTeamcityBuild) { + dependsOn(":kotlin-gradle-plugin-integration-tests:cleanUserHomeKonanDir") + } systemProperty("kotlinVersion", rootProject.extra["kotlinVersion"] as String) systemProperty("runnerGradleVersion", gradle.gradleVersion) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt index 9f574990ed8..28a45c5530b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt @@ -331,6 +331,7 @@ class BuildCacheRelocationIT : KGPBaseTest() { } } + @JvmGradlePluginTests @DisplayName("Kotlin incremental compilation with `kotlin.incremental.classpath.snapshot.enabled` feature should work correctly") @GradleTest fun testKotlinIncrementalCompilation_withICClasspathSnapshot(gradleVersion: GradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsXcodeIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsXcodeIT.kt index 6912f948528..0e5a784d0f3 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsXcodeIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsXcodeIT.kt @@ -19,7 +19,6 @@ import kotlin.io.path.exists import kotlin.io.path.name import kotlin.test.assertEquals import kotlin.test.assertTrue -import kotlin.test.fail @OsCondition(supportedOn = [OS.MAC], enabledOnCI = [OS.MAC]) @DisplayName("K/N tests cocoapods with xcodebuild") @@ -201,6 +200,9 @@ class CocoaPodsXcodeIT : KGPBaseTest() { ?.let { it.append("kotlin_version=${defaultBuildOptions.kotlinVersion}") it.append("test_fixes_version=${defaultBuildOptions.kotlinVersion}") + defaultBuildOptions.konanDataDir?.let { konanDataDir -> + it.append("konan.data.dir=${konanDataDir.toAbsolutePath().normalize()}") + } } for ((subproject, frameworkName) in subprojectsToFrameworkNamesMap) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeDownloadAndPlatformLibsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeDownloadAndPlatformLibsIT.kt index ee470cc1f02..304501ec3a3 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeDownloadAndPlatformLibsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeDownloadAndPlatformLibsIT.kt @@ -14,8 +14,8 @@ import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.presetName -import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assumptions +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.condition.OS import org.junit.jupiter.api.io.TempDir @@ -51,36 +51,6 @@ class NativeDownloadAndPlatformLibsIT : KGPBaseTest() { .apply { mkdirs() }.toPath() ) - @AfterEach - fun checkThatUserKonanDirIsEmptyAfterTest() { - val userHomeDir = System.getProperty("user.home") - assertFileNotExists(Paths.get("$userHomeDir/.konan/kotlin-native-prebuilt-$platformName-$currentCompilerVersion")) - } - - @DisplayName("Downloading K/N distribution in default .konan dir") - @GradleTest - fun testLibrariesGenerationInDefaultKonanDir(gradleVersion: GradleVersion) { - - checkThatUserKonanDirIsEmptyAfterTest() - - val userHomeDir = System.getProperty("user.home") - platformLibrariesProject("linuxX64", gradleVersion = gradleVersion) { - build("assemble", buildOptions = defaultBuildOptions.copy(konanDataDir = null)) { - assertOutputContains("Kotlin/Native distribution: .*kotlin-native-prebuilt-$platformName".toRegex()) - assertOutputDoesNotContain("Generate platform libraries for ") - - // checking that konan was downloaded and native dependencies were not downloaded into ~/.konan dir - assertDirectoryExists(Paths.get("$userHomeDir/.konan/dependencies")) - assertDirectoryExists(Paths.get("$userHomeDir/.konan/kotlin-native-prebuilt-$platformName-$currentCompilerVersion")) - } - } - - // clean ~/.konan after test it should not be with all inheritors of KGPBaseTest - Paths.get("$userHomeDir/.konan/dependencies").deleteRecursively() - Paths.get("$userHomeDir/.konan/kotlin-native-prebuilt-$platformName-$currentCompilerVersion").deleteRecursively() - - } - @OptIn(EnvironmentalVariablesOverride::class) @DisplayName("K/N Gradle project build (on Linux or Mac) with a dependency from a Maven") @GradleTest diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeDownloadAndPlatformLibsNonParallelIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeDownloadAndPlatformLibsNonParallelIT.kt new file mode 100644 index 00000000000..0b012364024 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/NativeDownloadAndPlatformLibsNonParallelIT.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2023 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.native + +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader +import org.jetbrains.kotlin.konan.target.HostManager +import org.junit.jupiter.api.DisplayName +import java.nio.file.Paths +import kotlin.io.path.appendText +import kotlin.io.path.deleteRecursively + +class NativeDownloadAndPlatformLibsNonParallelIT : KGPDaemonsBaseTest() { + + private val platformName: String = HostManager.platformName() + private val currentCompilerVersion = NativeCompilerDownloader.DEFAULT_KONAN_VERSION + + + @DisplayName("Downloading K/N distribution in default .konan dir") + @GradleTest + fun testLibrariesGenerationInDefaultKonanDir(gradleVersion: GradleVersion) { + + checkThatDefaultKonanHasNotBeenCreated() + + val userHomeDir = System.getProperty("user.home") + platformLibrariesProject("linuxX64", gradleVersion = gradleVersion) { + build("assemble", buildOptions = defaultBuildOptions.copy(konanDataDir = null)) { + assertOutputContains("Kotlin/Native distribution: .*kotlin-native-prebuilt-$platformName".toRegex()) + assertOutputDoesNotContain("Generate platform libraries for ") + + // checking that konan was downloaded and native dependencies were not downloaded into ~/.konan dir + assertDirectoryExists(Paths.get("$userHomeDir/.konan/dependencies")) + assertDirectoryExists(Paths.get("$userHomeDir/.konan/kotlin-native-prebuilt-$platformName-$currentCompilerVersion")) + } + } + + // clean ~/.konan after test it should not be with all inheritors of KGPBaseTest + Paths.get("$userHomeDir/.konan").deleteRecursively() + + } + + private fun platformLibrariesProject( + vararg targets: String, + gradleVersion: GradleVersion, + test: TestProject.() -> Unit = {}, + ) { + nativeProject("native-platform-libraries", gradleVersion) { + buildGradleKts.appendText( + targets.joinToString(prefix = "\n", separator = "\n") { + "kotlin.$it()" + } + ) + test() + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/KGPBaseTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/KGPBaseTest.kt index 5fbd856c7f1..bf175c70dbd 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/KGPBaseTest.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/KGPBaseTest.kt @@ -7,10 +7,12 @@ package org.jetbrains.kotlin.gradle.testbase import com.intellij.testFramework.TestDataPath import org.jetbrains.kotlin.test.WithMuteInDatabase +import org.junit.jupiter.api.AfterAll import org.junit.jupiter.api.Tag import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.io.TempDir import java.nio.file.Path +import java.nio.file.Paths /** * Base class for all Kotlin Gradle plugin integration tests. @@ -37,4 +39,12 @@ abstract class KGPBaseTest { lateinit var workingDir: Path internal open fun TestProject.customizeProject() {} + + @AfterAll + fun checkThatDefaultKonanHasNotBeenCreated() { + if (System.getenv("TEAMCITY_VERSION") != null) { + val userHomeDir = System.getProperty("user.home") + assertDirectoryDoesNotExist(Paths.get("$userHomeDir/.konan")) + } + } }