diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/GradleMultiplatformWizardTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/GradleMultiplatformWizardTest.kt index 3791ac68a83..73a6c00a846 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/GradleMultiplatformWizardTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/GradleMultiplatformWizardTest.kt @@ -9,29 +9,74 @@ import com.intellij.ide.projectWizard.NewProjectWizard import com.intellij.ide.projectWizard.ProjectTypeStep import com.intellij.ide.projectWizard.ProjectWizardTestCase import com.intellij.ide.util.newProjectWizard.AbstractProjectWizard +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.Result +import com.intellij.openapi.application.WriteAction +import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.externalSystem.importing.ImportSpecBuilder +import com.intellij.openapi.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.project.ProjectData +import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode +import com.intellij.openapi.externalSystem.service.project.ExternalProjectRefreshCallback +import com.intellij.openapi.externalSystem.service.project.ProjectDataManager +import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings +import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsListenerAdapter +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil +import com.intellij.openapi.externalSystem.util.ExternalSystemUtil import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.ProjectJdkTable +import com.intellij.openapi.projectRoots.SimpleJavaSdkType import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.roots.ui.configuration.ModulesProvider +import com.intellij.openapi.util.Couple +import com.intellij.openapi.util.Ref +import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil +import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtilCore +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.testFramework.IdeaTestUtil import com.intellij.testFramework.UsefulTestCase +import com.intellij.util.containers.ContainerUtil +import com.intellij.util.containers.ContainerUtilRt import junit.framework.TestCase import org.jetbrains.kotlin.ide.konan.gradle.KotlinGradleNativeMultiplatformModuleBuilder +import org.jetbrains.kotlin.idea.codeInsight.gradle.GradleImportingTestCase import org.jetbrains.kotlin.idea.configuration.* import org.jetbrains.kotlin.utils.PrintingLogger -import org.jetbrains.plugins.gradle.service.project.wizard.GradleModuleBuilder +import org.jetbrains.plugins.gradle.settings.DistributionType +import org.jetbrains.plugins.gradle.settings.GradleProjectSettings +import org.jetbrains.plugins.gradle.settings.GradleSettings +import org.jetbrains.plugins.gradle.util.GradleConstants import org.junit.Test import java.io.File +import java.io.IOException +import java.util.* class GradleMultiplatformWizardTest : ProjectWizardTestCase() { + private val pluginVersion = "1.3.0-rc-146" + override fun createWizard(project: Project?, directory: File): AbstractProjectWizard { return NewProjectWizard(project, ModulesProvider.EMPTY_MODULES_PROVIDER, directory.path) } + private fun Project.reconfigureGradleSettings(f: GradleProjectSettings.() -> Unit) { + val systemSettings = ExternalSystemApiUtil.getSettings( + this, + externalSystemId + ) + val projectSettings = GradleProjectSettings() + projectSettings.f() + val projects = ContainerUtilRt.newHashSet(systemSettings.getLinkedProjectsSettings()) + projects.remove(projectSettings) + projects.add(projectSettings) + systemSettings.setLinkedProjectsSettings(projects) + } + private fun testImportFromBuilder( builder: KotlinGradleAbstractMultiplatformModuleBuilder, nameRoot: String, metadataInside: Boolean = false ) { @@ -52,7 +97,14 @@ class GradleMultiplatformWizardTest : ProjectWizardTestCase Unit) { + object : WriteAction() { + override fun run(result: Result) { + f() + } + }.execute() } + private fun doImportProject(project: Project) { + ExternalSystemApiUtil.subscribe( + project, + GradleConstants.SYSTEM_ID, + object : ExternalSystemSettingsListenerAdapter() { + override fun onProjectsLinked(settings: Collection) { + val item = ContainerUtil.getFirstItem(settings) + if (item is GradleProjectSettings) { + item.gradleJvm = DEFAULT_SDK + } + } + }) + + GradleSettings.getInstance(project).gradleVmOptions = "-Xmx128m -XX:MaxPermSize=64m" + val wrapperJarFrom = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(GradleImportingTestCase.wrapperJar())!! + val wrapperJarFromTo = project.createProjectSubFile("gradle/wrapper/gradle-wrapper.jar") + runWrite { + wrapperJarFromTo.setBinaryContent(wrapperJarFrom.contentsToByteArray()) + } + + project.reconfigureGradleSettings { + distributionType = DistributionType.DEFAULT_WRAPPED + externalProjectPath = project.basePath!! + gradleJvm = DEFAULT_SDK + } + + val error = Ref.create>() + ExternalSystemUtil.refreshProjects( + ImportSpecBuilder(project, externalSystemId) + .use(ProgressExecutionMode.MODAL_SYNC) + .callback(object : ExternalProjectRefreshCallback { + override fun onSuccess(externalProject: DataNode?) { + if (externalProject == null) { + val errorMessage = "Got null External project after import" + System.err.println(errorMessage) + error.set(Couple.of(errorMessage, null)) + return + } + ServiceManager.getService(ProjectDataManager::class.java).importData(externalProject, project, true) + println("External project was successfully imported") + } + + override fun onFailure(errorMessage: String, errorDetails: String?) { + error.set(Couple.of(errorMessage, errorDetails)) + } + }) + .forceWhenUptodate() + ) + + if (!error.isNull) { + var failureMsg = "Import failed: " + error.get().first + if (StringUtil.isNotEmpty(error.get().second)) { + failureMsg += "\nError details: \n" + error.get().second + } + TestCase.fail(failureMsg) + } + } + + // TODO: add testMobile when we will be able to locate Android SDK automatically + @Test fun testMobileShared() { testImportFromBuilder(KotlinGradleMobileSharedMultiplatformModuleBuilder(), "MobileShared", metadataInside = true) @@ -106,4 +231,20 @@ class GradleMultiplatformWizardTest : ProjectWizardTestCase