From 6f4a2e6bf6a3ed023d3d680b556c7891587e2a7a Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Fri, 12 Feb 2016 13:49:53 +0300 Subject: [PATCH] gradle: rerun failed tests --- ...ExternalSystemExecutionConsoleManager.java | 2 +- ...ExternalSystemExecutionConsoleManager.java | 2 +- .../ExternalSystemRunConfiguration.java | 4 +- .../action/GradleRerunFailedTestsAction.java | 118 ++++++++++++++++++ .../test/runner/GradleSMTestProxy.java | 5 + .../GradleTestRunConfigurationProducer.java | 2 +- .../GradleTestsExecutionConsoleManager.java | 16 ++- 7 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRerunFailedTestsAction.java diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/execution/ExternalSystemExecutionConsoleManager.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/execution/ExternalSystemExecutionConsoleManager.java index 8e5d6f99cefa..67e6671b170e 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/execution/ExternalSystemExecutionConsoleManager.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/execution/ExternalSystemExecutionConsoleManager.java @@ -58,5 +58,5 @@ public interface ExternalSystemExecutionConsoleManager< boolean isApplicableFor(@NotNull ExternalSystemTask task); - AnAction[] getRestartActions(); + AnAction[] getRestartActions(@NotNull ExternalSystemExecutionConsole consoleView); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/DefaultExternalSystemExecutionConsoleManager.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/DefaultExternalSystemExecutionConsoleManager.java index 6a5f673d9dd5..025d77312a59 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/DefaultExternalSystemExecutionConsoleManager.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/DefaultExternalSystemExecutionConsoleManager.java @@ -70,7 +70,7 @@ public class DefaultExternalSystemExecutionConsoleManager } @Override - public AnAction[] getRestartActions() { + public AnAction[] getRestartActions(@NotNull ExecutionConsole consoleView) { return new AnAction[0]; } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java index 2b316c68f42f..60005ba6924c 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/execution/ExternalSystemRunConfiguration.java @@ -68,7 +68,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase { } @Override - public RunConfiguration clone() { + public ExternalSystemRunConfiguration clone() { ExternalSystemRunConfiguration result = (ExternalSystemRunConfiguration)super.clone(); result.mySettings = mySettings.clone(); return result; @@ -234,7 +234,7 @@ public class ExternalSystemRunConfiguration extends LocatableConfigurationBase { } }); DefaultExecutionResult result = new DefaultExecutionResult(consoleView, processHandler); - result.setRestartActions(consoleManager.getRestartActions()); + result.setRestartActions(consoleManager.getRestartActions(consoleView)); return result; } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRerunFailedTestsAction.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRerunFailedTestsAction.java new file mode 100644 index 000000000000..d1c894d73b04 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/action/GradleRerunFailedTestsAction.java @@ -0,0 +1,118 @@ +/* + * Copyright 2000-2016 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.action; + +import com.intellij.execution.ExecutionException; +import com.intellij.execution.Executor; +import com.intellij.execution.actions.JavaRerunFailedTestsAction; +import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.testframework.AbstractTestProxy; +import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunConfiguration; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.execution.test.runner.GradleSMTestProxy; +import org.jetbrains.plugins.gradle.execution.test.runner.GradleTestRunConfigurationProducer; +import org.jetbrains.plugins.gradle.execution.test.runner.GradleTestsExecutionConsole; +import org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer; + +import java.util.List; +import java.util.Set; + +/** + * @author Vladislav.Soroka + * @since 2/10/2016 + */ +public class GradleRerunFailedTestsAction extends JavaRerunFailedTestsAction { + public GradleRerunFailedTestsAction(GradleTestsExecutionConsole consoleView) { + super(consoleView.getConsole(), consoleView.getProperties()); + } + + @Nullable + @Override + protected MyRunProfile getRunProfile(@NotNull ExecutionEnvironment environment) { + ExternalSystemRunConfiguration configuration = (ExternalSystemRunConfiguration)myConsoleProperties.getConfiguration(); + final List failedTests = getFailedTests(configuration.getProject()); + return new MyRunProfile(configuration) { + @NotNull + @Override + public Module[] getModules() { + return new Module[0]; + } + + @Nullable + @Override + public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment environment) + throws ExecutionException { + ExternalSystemRunConfiguration runProfile = ((ExternalSystemRunConfiguration)getPeer()).clone(); + Project project = runProfile.getProject(); + + Set scriptParameters = ContainerUtil.newLinkedHashSet(); + Set tasksToRun = ContainerUtil.newLinkedHashSet(); + boolean useResolvedTasks = true; + for (AbstractTestProxy test : failedTests) { + if (test instanceof GradleSMTestProxy) { + String testName = test.getName(); + String className = ((GradleSMTestProxy)test).getClassName(); + scriptParameters.add(TestMethodGradleConfigurationProducer.createTestFilter(className, testName)); + + if(!useResolvedTasks) continue; + + if(className == null) { + useResolvedTasks = false; + continue; + } + + final PsiClass psiClass = + JavaPsiFacade.getInstance(project).findClass(className, GlobalSearchScope.projectScope(project)); + + if (psiClass == null) { + useResolvedTasks = false; + continue; + } + final PsiFile psiFile = psiClass.getContainingFile(); + if (psiFile == null) { + useResolvedTasks = false; + continue; + } + + final Module moduleForFile = ProjectFileIndex.SERVICE.getInstance(project).getModuleForFile(psiFile.getVirtualFile()); + if(moduleForFile == null){ + useResolvedTasks = false; + continue; + } + ContainerUtil.addAllNotNull(tasksToRun, GradleTestRunConfigurationProducer.getTasksToRun(moduleForFile)); + } + } + runProfile.getSettings().setScriptParameters(StringUtil.join(scriptParameters, " ")); + + if(useResolvedTasks && !tasksToRun.isEmpty()) { + runProfile.getSettings().setTaskNames(ContainerUtil.newArrayList(tasksToRun)); + } + return runProfile.getState(executor, environment); + } + }; + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleSMTestProxy.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleSMTestProxy.java index 8f37b19729d4..978610068c01 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleSMTestProxy.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleSMTestProxy.java @@ -88,6 +88,11 @@ public class GradleSMTestProxy extends SMTestProxy { myParentId = parentId; } + @Nullable + public String getClassName() { + return myClassName; + } + private void setStacktraceIfNotSet(@Nullable String stacktrace) { if (myStacktrace == null) myStacktrace = stacktrace; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestRunConfigurationProducer.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestRunConfigurationProducer.java index d9158c602218..0afa3e077218 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestRunConfigurationProducer.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestRunConfigurationProducer.java @@ -130,7 +130,7 @@ public abstract class GradleTestRunConfigurationProducer extends RunConfiguratio } @NotNull - static List getTasksToRun(@NotNull Module module) { + public static List getTasksToRun(@NotNull Module module) { for (GradleTestTasksProvider provider : GradleTestTasksProvider.EP_NAME.getExtensions()) { final List tasks = provider.getTasks(module); if(!ContainerUtil.isEmpty(tasks)) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestsExecutionConsoleManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestsExecutionConsoleManager.java index 234e43848250..267cc65790ac 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestsExecutionConsoleManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestsExecutionConsoleManager.java @@ -17,8 +17,10 @@ package org.jetbrains.plugins.gradle.execution.test.runner; import com.intellij.execution.ExecutionException; import com.intellij.execution.Executor; +import com.intellij.execution.actions.JavaRerunFailedTestsAction; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.testframework.TestFrameworkRunningModel; import com.intellij.execution.testframework.TestTreeView; import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil; import com.intellij.execution.testframework.sm.runner.SMTestProxy; @@ -40,12 +42,14 @@ import com.intellij.openapi.externalSystem.service.internal.ExternalSystemExecut import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.action.GradleRerunFailedTestsAction; import org.jetbrains.plugins.gradle.execution.test.runner.events.*; import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil; import org.jetbrains.plugins.gradle.service.resolve.GradleCommonClassNames; @@ -207,7 +211,15 @@ public class GradleTestsExecutionConsoleManager } @Override - public AnAction[] getRestartActions() { - return new AnAction[0]; + public AnAction[] getRestartActions(@NotNull final GradleTestsExecutionConsole consoleView) { + JavaRerunFailedTestsAction rerunFailedTestsAction = + new GradleRerunFailedTestsAction(consoleView); + rerunFailedTestsAction.setModelProvider(new Getter() { + @Override + public TestFrameworkRunningModel get() { + return consoleView.getResultsViewer(); + } + }); + return new AnAction[]{rerunFailedTestsAction}; } }