From bc6f01805e853e79f8b179ed81c68a62aec99370 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 30 May 2019 19:57:16 +0900 Subject: [PATCH] Fix JVM test running in MPP projects (KT-30814) --- .../idea/caches/project/multiplatformUtil.kt | 11 +++-- .../run/KotlinMPPGradleTestTasksProvider.kt | 8 ++-- .../NewMultiplatformProjectImportingTest.kt | 45 +++++++++++++++++++ .../testTasks/build.gradle | 26 +++++++++++ .../testTasks/settings.gradle | 1 + .../testTasks/src/commonTest/kotlin/test.kt | 0 .../testTasks/src/jvmTest/kotlin/test.kt | 0 7 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 idea/testData/gradle/newMultiplatformImport/testTasks/build.gradle create mode 100644 idea/testData/gradle/newMultiplatformImport/testTasks/settings.gradle create mode 100644 idea/testData/gradle/newMultiplatformImport/testTasks/src/commonTest/kotlin/test.kt create mode 100644 idea/testData/gradle/newMultiplatformImport/testTasks/src/jvmTest/kotlin/test.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/multiplatformUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/multiplatformUtil.kt index 13070a962aa..0a26110ca2d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/multiplatformUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/multiplatformUtil.kt @@ -15,6 +15,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.util.CachedValueProvider import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.caches.resolve.KotlinCacheService +import org.jetbrains.kotlin.config.KotlinFacetSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.idea.caches.project.SourceType.PRODUCTION import org.jetbrains.kotlin.idea.caches.project.SourceType.TEST @@ -36,12 +37,10 @@ val Module.sourceType: SourceType? get() = facetSettings?.isTestModule?.let { isTest -> if (isTest) SourceType.TEST else PRODUCTION } val Module.isMPPModule: Boolean - get() { - val settings = facetSettings ?: return false - return settings.targetPlatform.isCommon() || - settings.implementedModuleNames.isNotEmpty() || - settings.kind.isNewMPP - } + get() = facetSettings?.isMPPModule ?: false + +val KotlinFacetSettings.isMPPModule: Boolean + get() = targetPlatform.isCommon() || implementedModuleNames.isNotEmpty() || kind.isNewMPP private val Module.facetSettings get() = KotlinFacet.get(this)?.configuration?.settings diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/KotlinMPPGradleTestTasksProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/KotlinMPPGradleTestTasksProvider.kt index 9e34b8ec296..b176a0b99b3 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/KotlinMPPGradleTestTasksProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/run/KotlinMPPGradleTestTasksProvider.kt @@ -11,8 +11,8 @@ import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil import com.intellij.openapi.externalSystem.util.ExternalSystemUtil import com.intellij.openapi.module.Module import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider +import org.jetbrains.kotlin.idea.caches.project.isMPPModule import org.jetbrains.kotlin.idea.configuration.KotlinTargetData -import org.jetbrains.kotlin.platform.isCommon import org.jetbrains.plugins.gradle.execution.test.runner.GradleTestTasksProvider import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil import org.jetbrains.plugins.gradle.util.GradleConstants @@ -26,7 +26,7 @@ class KotlinMPPGradleTestTasksProvider : GradleTestTasksProvider { } override fun getTasks(module: Module): List { - if (!isTestCommonModule(module)) { + if (!isMultiplatformTestModule(module)) { return emptyList() } @@ -49,9 +49,9 @@ class KotlinMPPGradleTestTasksProvider : GradleTestTasksProvider { .flatMap { getTaskNames(it.data, taskNamePrefix) } } - private fun isTestCommonModule(module: Module): Boolean { + private fun isMultiplatformTestModule(module: Module): Boolean { val settings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module) - return settings.targetPlatform.isCommon() && settings.isTestModule + return settings.isMPPModule && settings.isTestModule } private fun getTaskNames(task: TaskData, namePrefix: String): List { diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt index 0b0b7dfab16..edd8e1277d8 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/NewMultiplatformProjectImportingTest.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.gradle import com.intellij.openapi.roots.* +import com.intellij.openapi.vfs.VirtualFile +import junit.framework.TestCase import org.jetbrains.jps.model.java.JavaResourceRootType import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.kotlin.config.* @@ -15,6 +17,7 @@ import org.jetbrains.kotlin.platform.CommonPlatforms import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.plugins.gradle.execution.test.runner.GradleTestRunConfigurationProducer import org.junit.After import org.junit.Before import org.junit.Test @@ -353,6 +356,48 @@ class NewMultiplatformProjectImportingTest : MultiplePluginVersionGradleImportin } } + @Test + fun testTestTasks() { + val files = configureByFiles() + importProject() + + checkProjectStructure(exhaustiveSourceSourceRootList = false) { + module("project") + module("common") + module("jvm") + module("js") + + module("project_commonMain") + module("project_commonTest") { + moduleDependency("project_commonMain", DependencyScope.TEST) + } + + module("project_jvmMain") { + moduleDependency("project_commonMain", DependencyScope.COMPILE) + } + + module("project_jvmTest") { + moduleDependency("project_commonMain", DependencyScope.TEST) + moduleDependency("project_commonTest", DependencyScope.TEST) + moduleDependency("project_jvmMain", DependencyScope.TEST) + } + } + + fun findTasksToRun(file: VirtualFile): List { + return GradleTestRunConfigurationProducer.findAllTestsTaskToRun(file, myProject) + .flatMap { it.tasks } + .sorted() + } + + val commonTestFile = files.find { it.path.contains("commonTest") }!! + val commonTasks = findTasksToRun(commonTestFile) + assertEquals(listOf(":cleanJvmTest", ":jvmTest"), commonTasks) + + val jvmTestFile = files.find { it.path.contains("jvmTest") }!! + val jvmTasks = findTasksToRun(jvmTestFile) + assertEquals(listOf(":cleanJvmTest", ":jvmTest"), jvmTasks) + } + @Test fun testDependencyOnRoot() { configureByFiles() diff --git a/idea/testData/gradle/newMultiplatformImport/testTasks/build.gradle b/idea/testData/gradle/newMultiplatformImport/testTasks/build.gradle new file mode 100644 index 00000000000..dc9fa5666a4 --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/testTasks/build.gradle @@ -0,0 +1,26 @@ +buildscript { + repositories { + mavenCentral() + maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } + } + + dependencies { + apply from: "include.gradle" + def kotlinVersion = gradleKotlinPluginVersion('1.3.20') + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + } +} + +apply plugin: 'kotlin-multiplatform' + + +repositories { + mavenCentral() + maven { url 'https://dl.bintray.com/kotlin/kotlin-dev' } +} + +kotlin { + targets { + fromPreset(presets.jvm, 'jvm') + } +} \ No newline at end of file diff --git a/idea/testData/gradle/newMultiplatformImport/testTasks/settings.gradle b/idea/testData/gradle/newMultiplatformImport/testTasks/settings.gradle new file mode 100644 index 00000000000..c84217fae11 --- /dev/null +++ b/idea/testData/gradle/newMultiplatformImport/testTasks/settings.gradle @@ -0,0 +1 @@ +include ':common', ':jvm', ':js' \ No newline at end of file diff --git a/idea/testData/gradle/newMultiplatformImport/testTasks/src/commonTest/kotlin/test.kt b/idea/testData/gradle/newMultiplatformImport/testTasks/src/commonTest/kotlin/test.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/newMultiplatformImport/testTasks/src/jvmTest/kotlin/test.kt b/idea/testData/gradle/newMultiplatformImport/testTasks/src/jvmTest/kotlin/test.kt new file mode 100644 index 00000000000..e69de29bb2d