Fix JVM test running in MPP projects (KT-30814)

This commit is contained in:
Yan Zhulanow
2019-05-30 19:57:16 +09:00
parent 6d3a7102d5
commit bc6f01805e
7 changed files with 81 additions and 10 deletions
@@ -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
@@ -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<String> {
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<String> {
@@ -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<String> {
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()
@@ -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')
}
}
@@ -0,0 +1 @@
include ':common', ':jvm', ':js'