blob: 7cfa33a803e1e0ab3d4d3ea2fa458fc929a647e6 [file]
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.gradle.importing
import com.intellij.openapi.application.invokeAndWaitIfNeeded
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.externalSystem.action.AttachExternalProjectAction
import com.intellij.openapi.externalSystem.importing.ExternalSystemSetupProjectTest
import com.intellij.openapi.externalSystem.importing.ExternalSystemSetupProjectTestCase
import com.intellij.openapi.externalSystem.model.ProjectSystemId
import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.ProjectJdkTable
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.testFramework.PlatformTestUtil
import org.jetbrains.plugins.gradle.action.ImportProjectFromScriptAction
import org.jetbrains.plugins.gradle.settings.GradleSettings
import org.jetbrains.plugins.gradle.util.GradleConstants.SYSTEM_ID
import org.junit.runners.Parameterized
class GradleSetupProjectTest : ExternalSystemSetupProjectTest, GradleImportingTestCase() {
override fun getSystemId(): ProjectSystemId = SYSTEM_ID
override fun generateProject(id: String): ExternalSystemSetupProjectTestCase.ProjectInfo {
val name = "${System.currentTimeMillis()}-$id"
createProjectSubFile("$name-composite/settings.gradle", "rootProject.name = '$name-composite'")
createProjectSubFile("$name-project/settings.gradle", """
rootProject.name = '$name-project'
include 'module'
includeBuild '../$name-composite'
includeFlat '$name-module'
""".trimIndent())
val buildScript = GradleBuildScriptBuilderEx().withJavaPlugin().generate()
createProjectSubFile("$name-composite/build.gradle", buildScript)
createProjectSubFile("$name-module/build.gradle", buildScript)
createProjectSubFile("$name-project/module/build.gradle", buildScript)
val projectFile = createProjectSubFile("$name-project/build.gradle", buildScript)
return ExternalSystemSetupProjectTestCase.ProjectInfo(projectFile,
"$name-project", "$name-project.main", "$name-project.test",
"$name-project.module", "$name-project.module.main", "$name-project.module.test",
"$name-project.$name-module", "$name-project.$name-module.main",
"$name-project.$name-module.test",
"$name-composite", "$name-composite.main", "$name-composite.test")
}
override fun assertDefaultProjectSettings(project: Project) {
val externalProjectPath = project.basePath!!
val settings = ExternalSystemApiUtil.getSettings(project, SYSTEM_ID) as GradleSettings
val projectSettings = settings.getLinkedProjectSettings(externalProjectPath)!!
assertEquals(projectSettings.externalProjectPath, externalProjectPath)
assertEquals(projectSettings.isUseQualifiedModuleNames, true)
assertEquals(settings.storeProjectFilesExternally, true)
}
override fun doAttachProject(project: Project, projectFile: VirtualFile) {
AttachExternalProjectAction().perform(project, selectedFile = projectFile)
}
override fun doAttachProjectFromScript(project: Project, projectFile: VirtualFile) {
ImportProjectFromScriptAction().perform(project, selectedFile = projectFile)
}
override fun waitForImportCompletion(project: Project) {
invokeAndWaitIfNeeded { PlatformTestUtil.dispatchAllEventsInIdeEventQueue() }
}
override fun cleanupProjectTestResources(project: Project) {
super.cleanupProjectTestResources(project)
removeGradleJvmSdk(project)
}
companion object {
/**
* It's sufficient to run the test against one gradle version
*/
@Parameterized.Parameters(name = "with Gradle-{0}")
@JvmStatic
fun tests(): Collection<Array<out String>> = arrayListOf(arrayOf(BASE_GRADLE_VERSION))
fun removeGradleJvmSdk(project: Project) {
invokeAndWaitIfNeeded {
runWriteAction {
val projectJdkTable = ProjectJdkTable.getInstance()
val settings = GradleSettings.getInstance(project)
for (projectSettings in settings.linkedProjectsSettings) {
val gradleJvm = projectSettings.gradleJvm
val sdk = ExternalSystemJdkUtil.getJdk(project, gradleJvm)
if (sdk != null) projectJdkTable.removeJdk(sdk)
}
}
}
}
}
}