From 5bbce3fb0aeb23bd69a0fc5e8c2d05a68cd54803 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Mon, 21 Jan 2019 10:44:21 +0300 Subject: [PATCH] IDEA-204753 Gradle: multi-module project creation is broken (IDEA-205334) --- .../manage/ProjectDataManagerImpl.java | 24 +- .../service/ui/ExternalToolWindowManager.java | 7 +- .../ui/SelectExternalSystemNodeDialog.java | 16 +- .../test/ExternalSystemTestCase.java | 40 +--- .../project/wizard/GradleModuleBuilder.java | 9 + .../wizard/GradleModuleWizardStep.java | 6 + .../wizard/GradleParentProjectForm.java | 15 +- .../testSources/GradleProjectWizardTest.java | 89 -------- .../importing/GradleProjectWizardTest.java | 214 ++++++++++++++++++ .../importing/GradleImportingTestCase.java | 29 ++- 10 files changed, 298 insertions(+), 151 deletions(-) delete mode 100644 plugins/gradle/java/testSources/GradleProjectWizardTest.java create mode 100644 plugins/gradle/java/testSources/importing/GradleProjectWizardTest.java diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataManagerImpl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataManagerImpl.java index 66842881d214..a5a0a6b4699b 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataManagerImpl.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataManagerImpl.java @@ -181,17 +181,25 @@ public class ProjectDataManagerImpl implements ProjectDataManager { trace.logPerformance("Data import total", System.currentTimeMillis() - allStartTime); } catch (Throwable t) { - runFinalTasks(synchronous, onFailureImportTasks); - dispose(modelsProvider, project, synchronous); - ExceptionUtil.rethrowAllAsUnchecked(t); + try { + runFinalTasks(project, synchronous, onFailureImportTasks); + dispose(modelsProvider, project, synchronous); + } + finally { + //noinspection ConstantConditions + ExceptionUtil.rethrowAllAsUnchecked(t); + } } - runFinalTasks(synchronous, onSuccessImportTasks); + runFinalTasks(project, synchronous, onSuccessImportTasks); } - private static void runFinalTasks(boolean synchronous, List tasks) { - Runnable runnable = () -> { - for (Runnable task : ContainerUtil.reverse(tasks)) { - task.run(); + private static void runFinalTasks(@NotNull Project project, boolean synchronous, List tasks) { + Runnable runnable = new DisposeAwareProjectChange(project) { + @Override + public void execute() { + for (Runnable task : ContainerUtil.reverse(tasks)) { + task.run(); + } } }; if (synchronous) { diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalToolWindowManager.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalToolWindowManager.java index b4442daaf2dc..f32591cf1cc8 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalToolWindowManager.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalToolWindowManager.java @@ -1,5 +1,6 @@ package com.intellij.openapi.externalSystem.service.ui; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.externalSystem.ExternalSystemManager; import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings; @@ -11,6 +12,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowManager; +import com.intellij.openapi.wm.impl.ToolWindowHeadlessManagerImpl; import com.intellij.openapi.wm.impl.ToolWindowImpl; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -71,7 +73,7 @@ public class ExternalToolWindowManager { } @Nullable - private static ToolWindow getToolWindow(@NotNull Project project, @NotNull ProjectSystemId externalSystemId) { + public static ToolWindow getToolWindow(@NotNull Project project, @NotNull ProjectSystemId externalSystemId) { final ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project); if (toolWindowManager == null) { return null; @@ -80,6 +82,9 @@ public class ExternalToolWindowManager { if (result instanceof ToolWindowImpl) { ((ToolWindowImpl)result).ensureContentInitialized(); } + if (result == null && ApplicationManager.getApplication().isUnitTestMode()) { + result = new ToolWindowHeadlessManagerImpl.MockToolWindow(project); + } return result; } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/SelectExternalSystemNodeDialog.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/SelectExternalSystemNodeDialog.java index 0d650f0f9157..d0fd3041ec2e 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/SelectExternalSystemNodeDialog.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/SelectExternalSystemNodeDialog.java @@ -21,13 +21,12 @@ import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.model.project.ProjectData; import com.intellij.openapi.externalSystem.service.project.ProjectDataManager; import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManagerImpl; -import com.intellij.openapi.externalSystem.view.ExternalProjectsStructure; -import com.intellij.openapi.externalSystem.view.ExternalProjectsView; -import com.intellij.openapi.externalSystem.view.ExternalProjectsViewAdapter; -import com.intellij.openapi.externalSystem.view.ExternalSystemNode; +import com.intellij.openapi.externalSystem.view.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ex.ToolWindowEx; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.treeStructure.SimpleNode; import com.intellij.ui.treeStructure.SimpleNodeVisitor; @@ -79,7 +78,14 @@ public class SelectExternalSystemNodeDialog extends DialogWrapper { myTree = new SimpleTree(); myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - final ExternalProjectsView projectsView = ExternalProjectsManagerImpl.getInstance(project).getExternalProjectsView(systemId); + ExternalProjectsView projectsView = ExternalProjectsManagerImpl.getInstance(project).getExternalProjectsView(systemId); + if (projectsView == null) { + ToolWindow toolWindow = ExternalToolWindowManager.getToolWindow(project, systemId); + if (toolWindow instanceof ToolWindowEx) { + projectsView = new ExternalProjectsViewImpl(project, (ToolWindowEx)toolWindow, systemId); + Disposer.register(getDisposable(), (ExternalProjectsViewImpl)projectsView); + } + } if(projectsView != null) { final ExternalProjectsStructure treeStructure = new ExternalProjectsStructure(project, myTree) { @Override diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemTestCase.java b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemTestCase.java index 911ae6f68a59..ddbaf9e1741a 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemTestCase.java +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemTestCase.java @@ -15,6 +15,7 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.module.StdModuleTypes; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectUtil; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl; import com.intellij.openapi.roots.ModuleRootModificationUtil; @@ -155,37 +156,14 @@ public abstract class ExternalSystemTestCase extends UsefulTestCase { @After @Override public void tearDown() throws Exception { - try { - EdtTestUtil.runInEdtAndWait(() -> { - tearDownFixtures(); - }); - myProject = null; - if (!FileUtil.delete(myTestDir) && myTestDir.exists()) { - System.err.println("Cannot delete " + myTestDir); - //printDirectoryContent(myDir); - myTestDir.deleteOnExit(); - } - } - catch (Throwable e) { - addSuppressedException(e); - } - finally { - super.tearDown(); - resetClassFields(getClass()); - } - } - - private static void printDirectoryContent(File dir) { - File[] files = dir.listFiles(); - if (files == null) return; - - for (File file : files) { - System.out.println(file.getAbsolutePath()); - - if (file.isDirectory()) { - printDirectoryContent(file); - } - } + new RunAll( + () -> EdtTestUtil.runInEdtAndWait(() -> tearDownFixtures()), + () -> myProject = null, + () -> PathKt.delete(myTestDir.toPath()), + () -> PathKt.delete(ProjectUtil.getExternalConfigurationDir(myProject)), + () -> super.tearDown(), + () -> resetClassFields(getClass()) + ).run(); } protected void tearDownFixtures() { diff --git a/plugins/gradle/java/src/service/project/wizard/GradleModuleBuilder.java b/plugins/gradle/java/src/service/project/wizard/GradleModuleBuilder.java index 3e27c11c3818..939184b4cde7 100644 --- a/plugins/gradle/java/src/service/project/wizard/GradleModuleBuilder.java +++ b/plugins/gradle/java/src/service/project/wizard/GradleModuleBuilder.java @@ -16,7 +16,10 @@ import com.intellij.openapi.externalSystem.ExternalStateComponent; import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager; import com.intellij.openapi.externalSystem.importing.ImportSpec; import com.intellij.openapi.externalSystem.importing.ImportSpecBuilder; +import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.ExternalSystemDataKeys; +import com.intellij.openapi.externalSystem.model.ProjectKeys; +import com.intellij.openapi.externalSystem.model.internal.InternalExternalProjectInfo; import com.intellij.openapi.externalSystem.model.project.ProjectData; import com.intellij.openapi.externalSystem.model.project.ProjectId; import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode; @@ -234,6 +237,12 @@ public class GradleModuleBuilder extends AbstractExternalModuleBuilder projectDataNode = new DataNode<>(ProjectKeys.PROJECT, projectData, null); + ExternalProjectsManagerImpl.getInstance(project).updateExternalProjectData( + new InternalExternalProjectInfo(GradleConstants.SYSTEM_ID, getExternalProjectSettings().getExternalProjectPath(), projectDataNode)); } else { FileDocumentManager.getInstance().saveAllDocuments(); diff --git a/plugins/gradle/java/src/service/project/wizard/GradleModuleWizardStep.java b/plugins/gradle/java/src/service/project/wizard/GradleModuleWizardStep.java index 17d37bd7d644..c369a7d01a6e 100644 --- a/plugins/gradle/java/src/service/project/wizard/GradleModuleWizardStep.java +++ b/plugins/gradle/java/src/service/project/wizard/GradleModuleWizardStep.java @@ -17,6 +17,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import org.jetbrains.plugins.gradle.util.GradleConstants; import javax.swing.*; @@ -243,5 +244,10 @@ public class GradleModuleWizardStep extends ModuleWizardStep { public void disposeUIResources() { Disposer.dispose(myParentProjectForm); } + + @TestOnly + public void setArtifactId(@NotNull String artifactId) { + myArtifactIdField.setText(artifactId); + } } diff --git a/plugins/gradle/java/src/service/project/wizard/GradleParentProjectForm.java b/plugins/gradle/java/src/service/project/wizard/GradleParentProjectForm.java index e71a5ed1bf89..a5257a5bc4df 100644 --- a/plugins/gradle/java/src/service/project/wizard/GradleParentProjectForm.java +++ b/plugins/gradle/java/src/service/project/wizard/GradleParentProjectForm.java @@ -19,6 +19,7 @@ import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.EditorTextField; import com.intellij.util.ArrayUtil; @@ -130,8 +131,18 @@ public class GradleParentProjectForm implements Disposable { private ProjectData findPotentialParentProject(@Nullable Project project) { if (project == null) return null; - ExternalProjectSettings linkedProjectSettings = - ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID).getLinkedProjectSettings(myContext.getProjectFileDirectory()); + String contextProjectFileDirectory = myContext.getProjectFileDirectory(); + ExternalProjectSettings linkedProjectSettings = null; + for (Object settings : ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID).getLinkedProjectsSettings()) { + if (settings instanceof ExternalProjectSettings) { + String projectPath = ((ExternalProjectSettings)settings).getExternalProjectPath(); + if (FileUtil.isAncestor(projectPath, contextProjectFileDirectory, false)) { + linkedProjectSettings = (ExternalProjectSettings)settings; + break; + } + } + } + if(linkedProjectSettings == null) return null; final ExternalProjectInfo projectInfo = diff --git a/plugins/gradle/java/testSources/GradleProjectWizardTest.java b/plugins/gradle/java/testSources/GradleProjectWizardTest.java deleted file mode 100644 index fbf4a6ecdd67..000000000000 --- a/plugins/gradle/java/testSources/GradleProjectWizardTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.gradle; - -import com.intellij.ide.projectWizard.NewProjectWizardTestCase; -import com.intellij.ide.projectWizard.ProjectTypeStep; -import com.intellij.ide.util.projectWizard.ModuleWizardStep; -import com.intellij.ide.util.projectWizard.ProjectBuilder; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VfsUtilCore; -import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.plugins.gradle.service.project.wizard.GradleModuleBuilder; - -import java.util.List; - -/** - * @author Dmitry Avdeev - */ -public class GradleProjectWizardTest extends NewProjectWizardTestCase { - - public void testGradleProject() throws Exception { - final String projectName = "testProject"; - Project project = createProject(step -> { - if (step instanceof ProjectTypeStep) { - assertTrue(((ProjectTypeStep)step).setSelectedTemplate("Gradle", null)); - List steps = myWizard.getSequence().getSelectedSteps(); - assertEquals(5, steps.size()); - final ProjectBuilder projectBuilder = myWizard.getProjectBuilder(); - assertInstanceOf(projectBuilder, GradleModuleBuilder.class); - ((GradleModuleBuilder)projectBuilder).setName(projectName); - } - }); - - assertEquals(projectName, project.getName()); - Module[] modules = ModuleManager.getInstance(project).getModules(); - assertEquals(1, modules.length); - final Module module = modules[0]; - assertTrue(ModuleRootManager.getInstance(module).isSdkInherited()); - assertEquals(projectName, module.getName()); - - VirtualFile root = ProjectRootManager.getInstance(project).getContentRoots()[0]; - VirtualFile settingsScript = VfsUtilCore.findRelativeFile("settings.gradle", root); - assertNotNull(settingsScript); - assertEquals(String.format("rootProject.name = '%s'\n\n", projectName), - StringUtil.convertLineSeparators(VfsUtilCore.loadText(settingsScript))); - - VirtualFile buildScript = VfsUtilCore.findRelativeFile("build.gradle", root); - assertNotNull(buildScript); - assertEquals("plugins {\n" + - " id 'java'\n" + - "}\n\n" + - "version '1.0-SNAPSHOT'\n" + - "\n" + - "sourceCompatibility = 1.8\n" + - "\n" + - "repositories {\n" + - " mavenCentral()\n" + - "}\n" + - "\n" + - "dependencies {\n" + - " testCompile group: 'junit', name: 'junit', version: '4.12'\n" + - "}\n", - StringUtil.convertLineSeparators(VfsUtilCore.loadText(buildScript))); - } - - @Override - protected void setUp() throws Exception { - super.setUp(); - configureJdk(); - } -} diff --git a/plugins/gradle/java/testSources/importing/GradleProjectWizardTest.java b/plugins/gradle/java/testSources/importing/GradleProjectWizardTest.java new file mode 100644 index 000000000000..99f9460f7d5e --- /dev/null +++ b/plugins/gradle/java/testSources/importing/GradleProjectWizardTest.java @@ -0,0 +1,214 @@ +// 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.ide.projectWizard.NewProjectWizardTestCase; +import com.intellij.ide.projectWizard.ProjectTypeStep; +import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.ide.util.projectWizard.ProjectBuilder; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.externalSystem.service.project.ProjectDataManager; +import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsDataStorage; +import com.intellij.openapi.externalSystem.service.ui.SelectExternalProjectDialog; +import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.externalSystem.view.ProjectNode; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.project.ProjectManagerListener; +import com.intellij.openapi.project.ProjectUtil; +import com.intellij.openapi.projectRoots.ProjectJdkTable; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.SimpleJavaSdkType; +import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.ProjectRootManager; +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.openapi.vfs.newvfs.impl.VfsRootAccess; +import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.RunAll; +import com.intellij.ui.treeStructure.SimpleTree; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Consumer; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.service.project.wizard.GradleModuleBuilder; +import org.jetbrains.plugins.gradle.service.project.wizard.GradleModuleWizardStep; +import org.jetbrains.plugins.gradle.util.GradleConstants; + +import javax.swing.*; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.intellij.openapi.externalSystem.test.ExternalSystemTestCase.collectRootsInside; + +/** + * @author Dmitry Avdeev + */ +public class GradleProjectWizardTest extends NewProjectWizardTestCase { + + protected static final String GRADLE_JDK_NAME = "Gradle JDK"; + private String myJdkHome; + + public void testGradleProject() throws Exception { + final String projectName = "testProject"; + ApplicationManager.getApplication().getMessageBus().connect().subscribe(ProjectManager.TOPIC, new ProjectManagerListener() { + @Override + public void projectOpened(@NotNull Project project) { + assertNotEmpty(ProjectDataManager.getInstance().getExternalProjectsData(project, GradleConstants.SYSTEM_ID)); + try { + // project save is not called in unit mode, see com.intellij.ide.impl.NewProjectUtil.doCreate + ExternalProjectsDataStorage.getInstance(project).saveAndWait(); + } + catch (Exception e) { + fail(e.getMessage()); + } + } + }); + + Project project = createProject(step -> { + if (step instanceof ProjectTypeStep) { + assertTrue(((ProjectTypeStep)step).setSelectedTemplate("Gradle", null)); + List steps = myWizard.getSequence().getSelectedSteps(); + assertEquals(5, steps.size()); + final ProjectBuilder projectBuilder = myWizard.getProjectBuilder(); + assertInstanceOf(projectBuilder, GradleModuleBuilder.class); + ((GradleModuleBuilder)projectBuilder).setName(projectName); + } + }); + + assertEquals(projectName, project.getName()); + Module[] modules = ModuleManager.getInstance(project).getModules(); + assertEquals(1, modules.length); + final Module module = modules[0]; + assertTrue(ModuleRootManager.getInstance(module).isSdkInherited()); + assertEquals(projectName, module.getName()); + + VirtualFile root = ProjectRootManager.getInstance(project).getContentRoots()[0]; + VirtualFile settingsScript = VfsUtilCore.findRelativeFile("settings.gradle", root); + assertNotNull(settingsScript); + assertEquals(String.format("rootProject.name = '%s'\n\n", projectName), + StringUtil.convertLineSeparators(VfsUtilCore.loadText(settingsScript))); + + VirtualFile buildScript = VfsUtilCore.findRelativeFile("build.gradle", root); + assertNotNull(buildScript); + assertEquals("plugins {\n" + + " id 'java'\n" + + "}\n\n" + + "version '1.0-SNAPSHOT'\n" + + "\n" + + "sourceCompatibility = 1.8\n" + + "\n" + + "repositories {\n" + + " mavenCentral()\n" + + "}\n" + + "\n" + + "dependencies {\n" + + " testCompile group: 'junit', name: 'junit', version: '4.12'\n" + + "}\n", + StringUtil.convertLineSeparators(VfsUtilCore.loadText(buildScript))); + + Module childModule = createModuleFromTemplate("Gradle", null, project, step -> { + if (step instanceof ProjectTypeStep) { + List steps = myWizard.getSequence().getSelectedSteps(); + assertEquals(5, steps.size()); + } + else if (step instanceof GradleModuleWizardStep) { + SelectExternalProjectDialog projectDialog = new SelectExternalProjectDialog(GradleConstants.SYSTEM_ID, project, null); + JComponent component = projectDialog.getPreferredFocusedComponent(); + ProjectNode projectNode = (ProjectNode)((SimpleTree)component).getNodeFor(0); + assertEquals(projectName, projectNode.getName()); + ((GradleModuleWizardStep)step).setArtifactId("childModule"); + } + }); + + modules = ModuleManager.getInstance(project).getModules(); + assertEquals(2, modules.length); + + assertEquals("childModule", childModule.getName()); + assertEquals(String.format("rootProject.name = '%s'\n" + + "include '%s'\n\n", projectName, childModule.getName()), + StringUtil.convertLineSeparators(VfsUtilCore.loadText(settingsScript))); + } + + @Override + protected Project createProject(Consumer adjuster) throws IOException { + @SuppressWarnings("unchecked") Project project = super.createProject(adjuster); + myFilesToDelete.add(ProjectUtil.getExternalConfigurationDir(project).toFile()); + return project; + } + + @Override + protected void createWizard(@Nullable Project project) throws IOException { + Collection linkedProjectsSettings = project == null + ? ContainerUtil.emptyList() + : ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID).getLinkedProjectsSettings(); + assertTrue(linkedProjectsSettings.size() <= 1); + File directory; + Object settings = ContainerUtil.getFirstItem(linkedProjectsSettings); + if (settings instanceof ExternalProjectSettings) { + directory = + FileUtil.createTempDirectory(new File(((ExternalProjectSettings)settings).getExternalProjectPath()), getName(), "new", false); + } + else { + directory = FileUtil.createTempDirectory(getName(), "new", false); + } + myFilesToDelete.add(directory); + myWizard = createWizard(project, directory); + UIUtil.dispatchAllInvocationEvents(); // to make default selection applied + } + + protected void collectAllowedRoots(final List roots) { + roots.add(myJdkHome); + roots.addAll(collectRootsInside(myJdkHome)); + roots.add(PathManager.getConfigPath()); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + myJdkHome = IdeaTestUtil.requireRealJdkHome(); + List allowedRoots = new ArrayList<>(); + collectAllowedRoots(allowedRoots); + if (!allowedRoots.isEmpty()) { + VfsRootAccess.allowRootAccess(getTestRootDisposable(), ArrayUtil.toStringArray(allowedRoots)); + } + WriteAction.runAndWait(() -> { + Sdk oldJdk = ProjectJdkTable.getInstance().findJdk(GRADLE_JDK_NAME); + if (oldJdk != null) { + ProjectJdkTable.getInstance().removeJdk(oldJdk); + } + VirtualFile jdkHomeDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(myJdkHome)); + Sdk jdk = SdkConfigurationUtil.setupSdk(new Sdk[0], jdkHomeDir, SimpleJavaSdkType.getInstance(), true, null, GRADLE_JDK_NAME); + assertNotNull("Cannot create JDK for " + myJdkHome, jdk); + ProjectJdkTable.getInstance().addJdk(jdk); + }); + } + + @Override + public void tearDown() { + new RunAll( + () -> { + if (myJdkHome != null) { + Sdk jdk = ProjectJdkTable.getInstance().findJdk(GRADLE_JDK_NAME); + if (jdk != null) { + WriteAction.runAndWait(() -> ProjectJdkTable.getInstance().removeJdk(jdk)); + } + } + }, + () -> super.tearDown() + ).run(); + } +} diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java index 0ac719df231d..6d2d3cbf8383 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java @@ -18,6 +18,7 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.RunAll; import com.intellij.util.ArrayUtil; import com.intellij.util.PathUtil; import com.intellij.util.containers.ContainerUtil; @@ -105,21 +106,19 @@ public abstract class GradleImportingTestCase extends ExternalSystemImportingTes //super.setUp() wasn't called return; } - Sdk jdk = ProjectJdkTable.getInstance().findJdk(GRADLE_JDK_NAME); - if (jdk != null) { - WriteAction.runAndWait(() -> ProjectJdkTable.getInstance().removeJdk(jdk)); - } - - try { - Messages.setTestDialog(TestDialog.DEFAULT); - deleteBuildSystemDirectory(); - } - catch (Throwable e) { - addSuppressedException(e); - } - finally { - super.tearDown(); - } + new RunAll( + () -> { + Sdk jdk = ProjectJdkTable.getInstance().findJdk(GRADLE_JDK_NAME); + if (jdk != null) { + WriteAction.runAndWait(() -> ProjectJdkTable.getInstance().removeJdk(jdk)); + } + }, + () -> { + Messages.setTestDialog(TestDialog.DEFAULT); + deleteBuildSystemDirectory(); + }, + () -> super.tearDown() + ).run(); } @Override