From e619ef5cef0a62f28ba9333b74f3503c51495642 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Sun, 5 Apr 2015 16:29:55 +0200 Subject: [PATCH] unite junit and testng runnable state; extract SM runner --- java/execution/impl/execution-impl.iml | 4 +- .../JavaTestFrameworkRunnableState.java | 78 +++++++++ .../testframework/SearchForTestsTask.java | 9 +- .../configurations/JavaCommandLineState.java | 2 +- .../intellij/execution/junit/TestClass.java | 13 +- .../intellij/execution/junit/TestMethod.java | 18 +- .../intellij/execution/junit/TestMethods.java | 12 +- .../intellij/execution/junit/TestObject.java | 165 ++++++------------ .../intellij/execution/junit/TestPackage.java | 21 ++- .../execution/junit/TestsPattern.java | 11 +- .../configuration/SearchingForTestsTask.java | 3 +- .../configuration/TestNGRunnableState.java | 85 +++++---- 12 files changed, 219 insertions(+), 202 deletions(-) create mode 100644 java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java diff --git a/java/execution/impl/execution-impl.iml b/java/execution/impl/execution-impl.iml index 602b82583a84..d98f98ac7bfe 100644 --- a/java/execution/impl/execution-impl.iml +++ b/java/execution/impl/execution-impl.iml @@ -16,11 +16,11 @@ + - - + \ No newline at end of file diff --git a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java new file mode 100644 index 000000000000..cb92598c7570 --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java @@ -0,0 +1,78 @@ +/* + * Copyright 2000-2015 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 com.intellij.execution; + +import com.intellij.execution.*; +import com.intellij.execution.configurations.JavaCommandLineState; +import com.intellij.execution.configurations.RunConfigurationBase; +import com.intellij.execution.configurations.RunnerSettings; +import com.intellij.execution.process.OSProcessHandler; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.testframework.TestConsoleProperties; +import com.intellij.execution.testframework.TestFrameworkRunningModel; +import com.intellij.execution.testframework.actions.AbstractRerunFailedTestsAction; +import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil; +import com.intellij.execution.testframework.sm.runner.SMTRunnerConsoleProperties; +import com.intellij.execution.testframework.sm.runner.ui.SMTRunnerConsoleView; +import com.intellij.execution.ui.ConsoleView; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Getter; +import com.intellij.util.PathUtil; +import jetbrains.buildServer.messages.serviceMessages.ServiceMessageTypes; +import org.jetbrains.annotations.NotNull; + +public abstract class JavaTestFrameworkRunnableState extends JavaCommandLineState { + public JavaTestFrameworkRunnableState(ExecutionEnvironment environment) { + super(environment); + } + + @NotNull protected abstract String getFrameworkName(); + + @NotNull protected abstract String getVMParameter(); + + @NotNull protected abstract AbstractRerunFailedTestsAction createRerunFailedTestsAction(TestConsoleProperties testConsoleProperties, ConsoleView consoleView); + + protected ExecutionResult startSMRunner(Executor executor, + OSProcessHandler handler, + RunConfigurationBase configuration, + ExecutionEnvironment environment) throws ExecutionException { + getJavaParameters().getVMParametersList().add(getVMParameter()); + getJavaParameters().getClassPath().add(PathUtil.getJarPathForClass(ServiceMessageTypes.class)); + + final RunnerSettings runnerSettings = getRunnerSettings(); + + TestConsoleProperties testConsoleProperties = new SMTRunnerConsoleProperties(configuration, getFrameworkName(), executor); + testConsoleProperties.setIfUndefined(TestConsoleProperties.HIDE_PASSED_TESTS, false); + + final ConsoleView consoleView = SMTestRunnerConnectionUtil.createConsoleWithCustomLocator(getFrameworkName(), testConsoleProperties, environment, null); + Disposer.register(configuration.getProject(), consoleView); + consoleView.attachToProcess(handler); + + AbstractRerunFailedTestsAction rerunFailedTestsAction = createRerunFailedTestsAction(testConsoleProperties, consoleView); + rerunFailedTestsAction.setModelProvider(new Getter() { + @Override + public TestFrameworkRunningModel get() { + return ((SMTRunnerConsoleView)consoleView).getResultsViewer(); + } + }); + + final DefaultExecutionResult result = new DefaultExecutionResult(consoleView, handler); + result.setRestartActions(rerunFailedTestsAction); + + JavaRunConfigurationExtensionManager.getInstance().attachExtensionsToProcess(configuration, handler, runnerSettings); + return result; + } +} diff --git a/java/execution/impl/src/com/intellij/execution/testframework/SearchForTestsTask.java b/java/execution/impl/src/com/intellij/execution/testframework/SearchForTestsTask.java index 80bb3c4785e8..166dd7830d5c 100644 --- a/java/execution/impl/src/com/intellij/execution/testframework/SearchForTestsTask.java +++ b/java/execution/impl/src/com/intellij/execution/testframework/SearchForTestsTask.java @@ -17,6 +17,7 @@ package com.intellij.execution.testframework; import com.intellij.execution.CantRunException; import com.intellij.execution.ExecutionBundle; +import com.intellij.execution.ExecutionException; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; @@ -48,7 +49,7 @@ public abstract class SearchForTestsTask extends Task.Backgroundable { } - protected abstract void search() throws CantRunException; + protected abstract void search() throws ExecutionException; protected abstract void onFound(); public void ensureFinished() { @@ -77,14 +78,14 @@ public abstract class SearchForTestsTask extends Task.Backgroundable { public void run(@NotNull ProgressIndicator indicator) { try { mySocket = myServerSocket.accept(); - final CantRunException[] ex = new CantRunException[1]; + final ExecutionException[] ex = new ExecutionException[1]; DumbService.getInstance(getProject()).repeatUntilPassesInSmartMode(new Runnable() { @Override public void run() { try { search(); } - catch (CantRunException e) { + catch (ExecutionException e) { ex[0] = e; } } @@ -104,7 +105,7 @@ public abstract class SearchForTestsTask extends Task.Backgroundable { } } - protected void logCantRunException(CantRunException e) throws CantRunException { + protected void logCantRunException(ExecutionException e) throws ExecutionException { throw e; } diff --git a/java/execution/openapi/src/com/intellij/execution/configurations/JavaCommandLineState.java b/java/execution/openapi/src/com/intellij/execution/configurations/JavaCommandLineState.java index f6163fed0066..7e477ba92818 100644 --- a/java/execution/openapi/src/com/intellij/execution/configurations/JavaCommandLineState.java +++ b/java/execution/openapi/src/com/intellij/execution/configurations/JavaCommandLineState.java @@ -51,7 +51,7 @@ public abstract class JavaCommandLineState extends CommandLineState implements J protected abstract JavaParameters createJavaParameters() throws ExecutionException; protected GeneralCommandLine createCommandLine() throws ExecutionException { - @SuppressWarnings("deprecation") Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext()); + final Project project = getEnvironment().getProject(); return CommandLineBuilder.createFromJavaParameters(getJavaParameters(), project, true); } diff --git a/plugins/junit/src/com/intellij/execution/junit/TestClass.java b/plugins/junit/src/com/intellij/execution/junit/TestClass.java index e3ab54aa6adc..a6de55eaad68 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestClass.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestClass.java @@ -19,10 +19,7 @@ package com.intellij.execution.junit; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.ExecutionException; import com.intellij.execution.JavaExecutionUtil; -import com.intellij.execution.configurations.JavaRunConfigurationModule; -import com.intellij.execution.configurations.RunConfigurationModule; -import com.intellij.execution.configurations.RuntimeConfigurationException; -import com.intellij.execution.configurations.RuntimeConfigurationWarning; +import com.intellij.execution.configurations.*; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.openapi.util.Comparing; import com.intellij.psi.*; @@ -34,12 +31,12 @@ class TestClass extends TestObject { } @Override - protected void initialize() throws ExecutionException { - super.initialize(); + protected void initialize(JavaParameters javaParameters) throws ExecutionException { + super.initialize(javaParameters); final JUnitConfiguration.Data data = myConfiguration.getPersistentData(); RunConfigurationModule module = myConfiguration.getConfigurationModule(); - configureModule(myJavaParameters, module, data.getMainClassName()); - myJavaParameters.getProgramParametersList().add(data.getMainClassName()); + configureModule(javaParameters, module, data.getMainClassName()); + javaParameters.getProgramParametersList().add(data.getMainClassName()); } @Override diff --git a/plugins/junit/src/com/intellij/execution/junit/TestMethod.java b/plugins/junit/src/com/intellij/execution/junit/TestMethod.java index 21817210e4d8..ab467fe3e80c 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestMethod.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestMethod.java @@ -36,20 +36,20 @@ class TestMethod extends TestObject { } @Override - protected void initialize() throws ExecutionException { - defaultInitialize(); + protected void initialize(JavaParameters javaParameters) throws ExecutionException { + defaultInitialize(javaParameters); final JUnitConfiguration.Data data = myConfiguration.getPersistentData(); RunConfigurationModule module = myConfiguration.getConfigurationModule(); - configureModule(getJavaParameters(), module, data.getMainClassName()); - addJUnit3Parameter(data, module.getProject()); - getJavaParameters().getProgramParametersList().add(data.getMainClassName() + "," + data.getMethodName()); + configureModule(javaParameters, module, data.getMainClassName()); + addJUnit3Parameter(javaParameters, data, module.getProject()); + javaParameters.getProgramParametersList().add(data.getMainClassName() + "," + data.getMethodName()); } - protected void defaultInitialize() throws ExecutionException { - super.initialize(); + protected void defaultInitialize(JavaParameters javaParameters) throws ExecutionException { + super.initialize(javaParameters); } - protected void addJUnit3Parameter(final JUnitConfiguration.Data data, Project project) { + protected void addJUnit3Parameter(JavaParameters javaParameters, final JUnitConfiguration.Data data, Project project) throws ExecutionException { final PsiClass psiClass = JavaExecutionUtil.findMainClass(project, data.getMainClassName(), GlobalSearchScope.allScope(project)); LOG.assertTrue(psiClass != null); if (JUnitUtil.isJUnit4TestClass(psiClass)) { @@ -62,7 +62,7 @@ class TestMethod extends TestObject { return; } } - myJavaParameters.getProgramParametersList().add(JUnitStarter.JUNIT3_PARAMETER); + javaParameters.getProgramParametersList().add(JUnitStarter.JUNIT3_PARAMETER); } @Override diff --git a/plugins/junit/src/com/intellij/execution/junit/TestMethods.java b/plugins/junit/src/com/intellij/execution/junit/TestMethods.java index d814cb7c1a18..25a5827c52d5 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestMethods.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestMethods.java @@ -16,10 +16,10 @@ package com.intellij.execution.junit; -import com.intellij.execution.CantRunException; import com.intellij.execution.ExecutionException; import com.intellij.execution.JavaExecutionUtil; import com.intellij.execution.Location; +import com.intellij.execution.configurations.JavaParameters; import com.intellij.execution.configurations.RunConfigurationModule; import com.intellij.execution.junit2.PsiMemberParameterizedLocation; import com.intellij.execution.junit2.TestProxy; @@ -54,8 +54,8 @@ public class TestMethods extends TestMethod { } @Override - protected void initialize() throws ExecutionException { - defaultInitialize(); + protected void initialize(final JavaParameters javaParameters) throws ExecutionException { + defaultInitialize(javaParameters); final JUnitConfiguration.Data data = myConfiguration.getPersistentData(); RunConfigurationModule module = myConfiguration.getConfigurationModule(); final Project project = module.getProject(); @@ -64,9 +64,9 @@ public class TestMethods extends TestMethod { @Override public void run() { try { - myConfiguration.configureClasspath(myJavaParameters); + myConfiguration.configureClasspath(javaParameters); } - catch (CantRunException e) { + catch (ExecutionException e) { exception[0] = e; } } @@ -98,7 +98,7 @@ public class TestMethods extends TestMethod { } return null; } - }, data.getPackageName(), true); + }, data.getPackageName(), true, javaParameters); } diff --git a/plugins/junit/src/com/intellij/execution/junit/TestObject.java b/plugins/junit/src/com/intellij/execution/junit/TestObject.java index 6ee5e893b4ad..82007fa04637 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestObject.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestObject.java @@ -36,9 +36,7 @@ import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.testframework.*; -import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil; -import com.intellij.execution.testframework.sm.runner.SMTRunnerConsoleProperties; -import com.intellij.execution.testframework.sm.runner.ui.SMTRunnerConsoleView; +import com.intellij.execution.testframework.actions.AbstractRerunFailedTestsAction; import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.execution.util.JavaParametersUtil; @@ -75,7 +73,6 @@ import com.intellij.rt.execution.junit.RepeatCount; import com.intellij.util.Function; import com.intellij.util.PathUtil; import com.intellij.util.ui.UIUtil; -import jetbrains.buildServer.messages.serviceMessages.ServiceMessageTypes; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.serialization.PathMacroUtil; @@ -85,13 +82,12 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.*; -public abstract class TestObject implements JavaCommandLine { +public abstract class TestObject extends JavaTestFrameworkRunnableState { protected static final Logger LOG = Logger.getInstance(TestObject.class); private static final String MESSAGE = ExecutionBundle.message("configuration.not.speficied.message"); @NonNls private static final String JUNIT_TEST_FRAMEWORK_NAME = "JUnit"; - protected JavaParameters myJavaParameters; protected final JUnitConfiguration myConfiguration; protected final ExecutionEnvironment myEnvironment; protected File myTempFile = null; @@ -119,7 +115,8 @@ public abstract class TestObject implements JavaCommandLine { if (JUnitConfiguration.TEST_PATTERN.equals(id)) { return new TestsPattern(configuration, environment); } - return NOT_CONFIGURED; + assert false : MESSAGE + id; + return null; } public Module[] getModulesToCompile() { @@ -128,6 +125,7 @@ public abstract class TestObject implements JavaCommandLine { } protected TestObject(JUnitConfiguration configuration, ExecutionEnvironment environment) { + super(environment); myConfiguration = configuration; myEnvironment = environment; } @@ -153,42 +151,6 @@ public abstract class TestObject implements JavaCommandLine { myConfiguration.isAlternativeJrePathEnabled() ? myConfiguration.getAlternativeJrePath() : null); } - private static final TestObject NOT_CONFIGURED = new TestObject(null, null) { - @Override - public RefactoringElementListener getListener(final PsiElement element, final JUnitConfiguration configuration) { - return null; - } - - @Override - public String suggestActionName() { - throw new RuntimeException(String.valueOf(myConfiguration)); - } - - @Override - public boolean isConfiguredByElement(final JUnitConfiguration configuration, - PsiClass testClass, - PsiMethod testMethod, - PsiPackage testPackage, - PsiDirectory testDir) { - return false; - } - - @Override - public void checkConfiguration() throws RuntimeConfigurationException { - throw new RuntimeConfigurationError(MESSAGE); - } - - @Override - public JavaParameters getJavaParameters() throws ExecutionException { - throw new ExecutionException(MESSAGE); - } - - @Override - protected void initialize() throws ExecutionException { - throw new ExecutionException(MESSAGE); - } - }; - public void checkConfiguration() throws RuntimeConfigurationException{ JavaParametersUtil.checkAlternativeJRE(myConfiguration); ProgramParametersUtil.checkWorkingDirectoryExist(myConfiguration, myConfiguration.getProject(), myConfiguration.getConfigurationModule().getModule()); @@ -198,30 +160,30 @@ public abstract class TestObject implements JavaCommandLine { return SourceScope.modulesWithDependencies(myConfiguration.getModules()); } - protected void initialize() throws ExecutionException { + protected void initialize(JavaParameters javaParameters) throws ExecutionException { String parameters = myConfiguration.getProgramParameters(); myConfiguration.getPersistentData().setProgramParameters(null); try { - JavaParametersUtil.configureConfiguration(myJavaParameters, myConfiguration); + JavaParametersUtil.configureConfiguration(javaParameters, myConfiguration); } finally { myConfiguration.getPersistentData().setProgramParameters(parameters); } - myJavaParameters.setMainClass(JUnitConfiguration.JUNIT_START_CLASS); + javaParameters.setMainClass(JUnitConfiguration.JUNIT_START_CLASS); final Module module = myConfiguration.getConfigurationModule().getModule(); - if (myJavaParameters.getJdk() == null){ - myJavaParameters.setJdk(module != null - ? ModuleRootManager.getInstance(module).getSdk() - : ProjectRootManager.getInstance(myEnvironment.getProject()).getProjectSdk()); + if (javaParameters.getJdk() == null){ + javaParameters.setJdk(module != null + ? ModuleRootManager.getInstance(module).getSdk() + : ProjectRootManager.getInstance(myEnvironment.getProject()).getProjectSdk()); } - configureAdditionalClasspath(myJavaParameters); - myJavaParameters.getProgramParametersList().add(JUnitStarter.IDE_VERSION + JUnitStarter.VERSION); + configureAdditionalClasspath(javaParameters); + javaParameters.getProgramParametersList().add(JUnitStarter.IDE_VERSION + JUnitStarter.VERSION); if (!StringUtil.isEmptyOrSpaces(parameters)) { - myJavaParameters.getProgramParametersList().add("@name" + parameters); + javaParameters.getProgramParametersList().add("@name" + parameters); } for (RunConfigurationExtension ext : Extensions.getExtensions(RunConfigurationExtension.EP_NAME)) { - ext.updateJavaParameters(myConfiguration, myJavaParameters, getRunnerSettings()); + ext.updateJavaParameters(myConfiguration, javaParameters, getRunnerSettings()); } final Object[] listeners = Extensions.getExtensions(IDEAJUnitListener.EP_NAME); @@ -237,14 +199,14 @@ public abstract class TestObject implements JavaCommandLine { if (enabled) { final Class classListener = listener.getClass(); buf.append(classListener.getName()).append("\n"); - myJavaParameters.getClassPath().add(PathUtil.getJarPathForClass(classListener)); + javaParameters.getClassPath().add(PathUtil.getJarPathForClass(classListener)); } } if (buf.length() > 0) { try { myListenersFile = FileUtil.createTempFile("junit_listeners_", ""); myListenersFile.deleteOnExit(); - myJavaParameters.getProgramParametersList().add("@@" + myListenersFile.getPath()); + javaParameters.getProgramParametersList().add("@@" + myListenersFile.getPath()); FileUtil.writeToFile(myListenersFile, buf.toString().getBytes(CharsetToolkit.UTF8_CHARSET)); } catch (IOException e) { @@ -253,40 +215,33 @@ public abstract class TestObject implements JavaCommandLine { } } - private void configureAdditionalClasspath(JavaParameters javaParameters) { + private static void configureAdditionalClasspath(JavaParameters javaParameters) { javaParameters.getClassPath().add(JavaSdkUtil.getIdeaRtJarPath()); javaParameters.getClassPath().add(PathUtil.getJarPathForClass(JUnitStarter.class)); - if (Registry.is("junit_sm_runner")) { - javaParameters.getClassPath().add(PathUtil.getJarPathForClass(ServiceMessageTypes.class)); - } } @Override - public JavaParameters getJavaParameters() throws ExecutionException { - if (myJavaParameters == null) { - myJavaParameters = new JavaParameters(); - initialize(); - final Module module = myConfiguration.getConfigurationModule().getModule(); - final Object[] patchers = Extensions.getExtensions(ExtensionPoints.JUNIT_PATCHER); - for (Object patcher : patchers) { - ((JUnitPatcher)patcher).patchJavaParameters(module, myJavaParameters); - } + protected JavaParameters createJavaParameters() throws ExecutionException { + JavaParameters javaParameters = new JavaParameters(); + initialize(javaParameters); + final Module module = myConfiguration.getConfigurationModule().getModule(); + final Object[] patchers = Extensions.getExtensions(ExtensionPoints.JUNIT_PATCHER); + for (Object patcher : patchers) { + ((JUnitPatcher)patcher).patchJavaParameters(module, javaParameters); } - return myJavaParameters; + return javaParameters; } + @NotNull @Override - public ExecutionResult execute(final Executor executor, @NotNull final ProgramRunner runner) throws ExecutionException { + public ExecutionResult execute(@NotNull final Executor executor, @NotNull final ProgramRunner runner) throws ExecutionException { final boolean smRunner = Registry.is("junit_sm_runner"); if (smRunner) { - myJavaParameters.getVMParametersList().add("-Didea.junit.sm_runner"); + return startSMRunner(executor, createHandler(executor), myConfiguration, getEnvironment()); } final JUnitProcessHandler handler = createHandler(executor); final RunnerSettings runnerSettings = getRunnerSettings(); JavaRunConfigurationExtensionManager.getInstance().attachExtensionsToProcess(myConfiguration, handler, runnerSettings); - if (smRunner) { - return useSmRunner(executor, handler); - } final TestProxy unboundOutputRoot = new TestProxy(new RootTestInfo()); final JUnitConsoleProperties consoleProperties = new JUnitConsoleProperties(myConfiguration, executor); final JUnitTreeConsoleView consoleView = new JUnitTreeConsoleView(consoleProperties, myEnvironment, unboundOutputRoot); @@ -325,6 +280,7 @@ public abstract class TestObject implements JavaCommandLine { handler.addProcessListener(new ProcessAdapter() { private boolean myStarted = false; + @Override public void startNotified(ProcessEvent event) { myStarted = true; @@ -386,30 +342,6 @@ public abstract class TestObject implements JavaCommandLine { return result; } - private ExecutionResult useSmRunner(Executor executor, JUnitProcessHandler handler) { - TestConsoleProperties testConsoleProperties = new SMTRunnerConsoleProperties(myConfiguration, JUNIT_TEST_FRAMEWORK_NAME, executor); - testConsoleProperties.setIfUndefined(TestConsoleProperties.HIDE_PASSED_TESTS, false); - - final ConsoleView consoleView = SMTestRunnerConnectionUtil.createConsoleWithCustomLocator( - JUNIT_TEST_FRAMEWORK_NAME, - testConsoleProperties, - myEnvironment, null); - Disposer.register(myConfiguration.getProject(), consoleView); - consoleView.attachToProcess(handler); - - RerunFailedTestsAction rerunFailedTestsAction = new RerunFailedTestsAction(consoleView, testConsoleProperties); - rerunFailedTestsAction.setModelProvider(new Getter() { - @Override - public TestFrameworkRunningModel get() { - return ((SMTRunnerConsoleView)consoleView).getResultsViewer(); - } - }); - - final DefaultExecutionResult result = new DefaultExecutionResult(consoleView, handler); - result.setRestartActions(rerunFailedTestsAction); - return result; - } - protected void notifyByBalloon(JUnitRunningModel model, boolean started, JUnitConsoleProperties consoleProperties) { String comment; if (model != null) { @@ -430,9 +362,9 @@ public abstract class TestObject implements JavaCommandLine { final String countString = RepeatCount.N.equals(repeatMode) && repeatCount > 0 ? RepeatCount.getCountString(repeatCount) : repeatMode; - myJavaParameters.getProgramParametersList().add(countString); + getJavaParameters().getProgramParametersList().add(countString); } - return JUnitProcessHandler.runCommandLine(CommandLineBuilder.createFromJavaParameters(myJavaParameters, myEnvironment.getProject(), true)); + return JUnitProcessHandler.runCommandLine(createCommandLine()); } private boolean forkPerModule() { @@ -512,7 +444,7 @@ public abstract class TestObject implements JavaCommandLine { writer.close(); } - myJavaParameters.getProgramParametersList().add("@@@" + forkMode + ',' + tempFile.getAbsolutePath()); + getJavaParameters().getProgramParametersList().add("@@@" + forkMode + ',' + tempFile.getAbsolutePath()); } catch (Exception e) { LOG.error(e); @@ -520,10 +452,10 @@ public abstract class TestObject implements JavaCommandLine { } protected void addClassesListToJavaParameters(Collection elements, Function nameFunction, String packageName, - boolean createTempFile) throws CantRunException { + boolean createTempFile, JavaParameters javaParameters) throws CantRunException { try { if (createTempFile) { - createTempFiles(); + createTempFiles(javaParameters); } final Map> perModule = forkPerModule() ? new TreeMap>(new Comparator() { @@ -573,7 +505,7 @@ public abstract class TestObject implements JavaCommandLine { if (perModule != null && perModule.size() > 1) { final String classpath = myConfiguration.getPersistentData().getScope() == TestSearchScope.WHOLE_PROJECT - ? null : myJavaParameters.getClassPath().getPathsString(); + ? null : javaParameters.getClassPath().getPathsString(); final PrintWriter wWriter = new PrintWriter(myWorkingDirsFile, CharsetToolkit.UTF8); try { @@ -608,16 +540,31 @@ public abstract class TestObject implements JavaCommandLine { } } - protected void createTempFiles() throws IOException { + protected void createTempFiles(JavaParameters javaParameters) throws IOException { myTempFile = FileUtil.createTempFile("idea_junit", ".tmp"); myTempFile.deleteOnExit(); - myJavaParameters.getProgramParametersList().add("@" + myTempFile.getAbsolutePath()); + javaParameters.getProgramParametersList().add("@" + myTempFile.getAbsolutePath()); myWorkingDirsFile = FileUtil.createTempFile("idea_working_dirs_junit", ".tmp"); myWorkingDirsFile.deleteOnExit(); - myJavaParameters.getProgramParametersList().add("@w@" + myWorkingDirsFile.getAbsolutePath()); + javaParameters.getProgramParametersList().add("@w@" + myWorkingDirsFile.getAbsolutePath()); } public void clear() { - myJavaParameters = null; + } + + @NotNull + protected String getFrameworkName() { + return JUNIT_TEST_FRAMEWORK_NAME; + } + + @NotNull + protected String getVMParameter() { + return "-Didea.junit.sm_runner"; + } + + @NotNull + protected AbstractRerunFailedTestsAction createRerunFailedTestsAction(TestConsoleProperties testConsoleProperties, + ConsoleView consoleView) { + return new RerunFailedTestsAction(consoleView, testConsoleProperties); } } diff --git a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java index 53bda2b9fb75..604b9f85a45d 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java @@ -17,6 +17,7 @@ package com.intellij.execution.junit; import com.intellij.execution.*; +import com.intellij.execution.configurations.JavaParameters; import com.intellij.execution.configurations.RuntimeConfigurationException; import com.intellij.execution.configurations.RuntimeConfigurationWarning; import com.intellij.execution.junit2.ui.model.JUnitRunningModel; @@ -33,7 +34,6 @@ import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PackageScope; import com.intellij.refactoring.listeners.RefactoringElementListener; -import com.intellij.util.Consumer; import com.intellij.util.Function; import gnu.trove.THashSet; import org.jetbrains.annotations.Nullable; @@ -41,7 +41,6 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; -import java.util.Collection; public class TestPackage extends TestObject { protected ServerSocket myServerSocket; @@ -111,9 +110,9 @@ public class TestPackage extends TestObject { return null; } } - }, getPackageName(data), false); + }, getPackageName(data), false, getJavaParameters()); } - catch (CantRunException ignored) {} + catch (ExecutionException ignored) {} } }; } @@ -123,14 +122,14 @@ public class TestPackage extends TestObject { } @Override - protected void initialize() throws ExecutionException { - super.initialize(); + protected void initialize(JavaParameters javaParameters) throws ExecutionException { + super.initialize(javaParameters); final JUnitConfiguration.Data data = myConfiguration.getPersistentData(); getClassFilter(data);//check if junit found - configureClasspath(); + configureClasspath(javaParameters); try { - createTempFiles(); + createTempFiles(javaParameters); } catch (IOException e) { LOG.error(e); @@ -138,20 +137,20 @@ public class TestPackage extends TestObject { try { myServerSocket = new ServerSocket(0, 0, InetAddress.getByName("127.0.0.1")); - myJavaParameters.getProgramParametersList().add("-socket" + myServerSocket.getLocalPort()); + javaParameters.getProgramParametersList().add("-socket" + myServerSocket.getLocalPort()); } catch (IOException e) { LOG.error(e); } } - protected void configureClasspath() throws ExecutionException { + protected void configureClasspath(final JavaParameters javaParameters) throws ExecutionException { final ExecutionException[] exception = new ExecutionException[1]; ApplicationManager.getApplication().runReadAction(new Runnable() { @Override public void run() { try { - myConfiguration.configureClasspath(myJavaParameters); + myConfiguration.configureClasspath(javaParameters); } catch (CantRunException e) { exception[0] = e; diff --git a/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java b/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java index 6494bc498133..c24d7d82e8be 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java @@ -21,6 +21,7 @@ package com.intellij.execution.junit; import com.intellij.execution.CantRunException; +import com.intellij.execution.ExecutionException; import com.intellij.execution.JavaExecutionUtil; import com.intellij.execution.configurations.JavaParameters; import com.intellij.execution.configurations.RuntimeConfigurationException; @@ -72,7 +73,7 @@ public class TestsPattern extends TestPackage { if (classNames.size() == data.getPatterns().size()) { return new SearchForTestsTask(project, myServerSocket) { @Override - protected void search() throws CantRunException { + protected void search() throws ExecutionException { final Function nameFunction = StringUtil.isEmpty(data.METHOD_NAME) ? FunctionUtil.id() : new Function() { @@ -81,7 +82,7 @@ public class TestsPattern extends TestPackage { return className; } }; - addClassesListToJavaParameters(classNames, nameFunction, "", false); + addClassesListToJavaParameters(classNames, nameFunction, "", false, getJavaParameters()); } @Override @@ -99,17 +100,17 @@ public class TestsPattern extends TestPackage { : className).trim(), GlobalSearchScope.allScope(project)); } - protected void configureClasspath() throws CantRunException { + protected void configureClasspath(JavaParameters javaParameters) throws CantRunException { final String jreHome = myConfiguration.isAlternativeJrePathEnabled() ? myConfiguration.getAlternativeJrePath() : null; final Module module = myConfiguration.getConfigurationModule().getModule(); if (module != null) { - JavaParametersUtil.configureModule(module, myJavaParameters, JavaParameters.JDK_AND_CLASSES_AND_TESTS, jreHome); + JavaParametersUtil.configureModule(module, javaParameters, JavaParameters.JDK_AND_CLASSES_AND_TESTS, jreHome); } else { JavaParametersUtil - .configureProject(myConfiguration.getProject(), myJavaParameters, JavaParameters.JDK_AND_CLASSES_AND_TESTS, jreHome); + .configureProject(myConfiguration.getProject(), javaParameters, JavaParameters.JDK_AND_CLASSES_AND_TESTS, jreHome); } } diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java index 3b3d1b5b95d0..edf561ea8d25 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java @@ -22,6 +22,7 @@ package com.theoryinpractice.testng.configuration; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.execution.CantRunException; +import com.intellij.execution.ExecutionException; import com.intellij.execution.testframework.SearchForTestsTask; import com.intellij.execution.testframework.TestSearchScope; import com.intellij.openapi.application.ApplicationManager; @@ -114,7 +115,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { if (!Registry.is("testng_sm_runner")) myClient.startListening(myConfig); } - protected void logCantRunException(CantRunException e) { + protected void logCantRunException(ExecutionException e) { try { final String message = "CantRunException" + e.getMessage() + "\n"; FileUtil.writeToFile(myTempFile, message.getBytes()); diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java index 510c8e3f90fe..47bd0c3f2271 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java @@ -26,10 +26,12 @@ import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.testframework.*; +import com.intellij.execution.testframework.actions.AbstractRerunFailedTestsAction; import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil; import com.intellij.execution.testframework.sm.runner.SMTRunnerConsoleProperties; import com.intellij.execution.testframework.sm.runner.ui.SMTRunnerConsoleView; import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView; +import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.execution.util.JavaParametersUtil; import com.intellij.openapi.diagnostic.Logger; @@ -75,7 +77,7 @@ import java.net.InetAddress; import java.net.ServerSocket; import java.net.UnknownHostException; -public class TestNGRunnableState extends JavaCommandLineState { +public class TestNGRunnableState extends JavaTestFrameworkRunnableState { private static final Logger LOG = Logger.getInstance("TestNG Runner"); private static final String TESTNG_TEST_FRAMEWORK_NAME = "TestNG"; private final TestNGConfiguration config; @@ -110,12 +112,32 @@ public class TestNGRunnableState extends JavaCommandLineState { } } + @NotNull + @Override + protected OSProcessHandler startProcess() throws ExecutionException { + final OSProcessHandler handler = super.startProcess(); + final SearchingForTestsTask task = createSearchingForTestsTask(myServerSocket, config, myTempFile); + handler.addProcessListener(new ProcessAdapter() { + @Override + public void processTerminated(final ProcessEvent event) { + task.ensureFinished(); + } + + @Override + public void startNotified(final ProcessEvent event) { + task.startSearch(); + } + }); + + return handler; + } + @NotNull @Override public ExecutionResult execute(@NotNull final Executor executor, @NotNull final ProgramRunner runner) throws ExecutionException { final boolean smRunner = Registry.is("testng_sm_runner"); if (smRunner) { - return startSMRunner(executor); + return startSMRunner(executor, startProcess(), config, getEnvironment()); } OSProcessHandler processHandler = startProcess(); final TreeRootNode unboundOutputRoot = new TreeRootNode(); @@ -124,7 +146,6 @@ public class TestNGRunnableState extends JavaCommandLineState { unboundOutputRoot.setPrinter(console.getPrinter()); Disposer.register(console, unboundOutputRoot); JavaRunConfigurationExtensionManager.getInstance().attachExtensionsToProcess(config, processHandler, runnerSettings); - final SearchingForTestsTask task = createSearchingForTestsTask(myServerSocket, config, myTempFile); processHandler.addProcessListener(new ProcessAdapter() { private boolean myStarted = false; @@ -132,7 +153,6 @@ public class TestNGRunnableState extends JavaCommandLineState { public void processTerminated(final ProcessEvent event) { unboundOutputRoot.flush(); - task.ensureFinished(); } @Override @@ -143,7 +163,6 @@ public class TestNGRunnableState extends JavaCommandLineState { } client.prepareListening(listener, config.getProject(), port); myStarted = true; - task.startSearch(); } @Override @@ -190,49 +209,23 @@ public class TestNGRunnableState extends JavaCommandLineState { return result; } - private ExecutionResult startSMRunner(Executor executor) throws ExecutionException { - getJavaParameters().getVMParametersList().add("-Didea.testng.sm_runner"); - getJavaParameters().getClassPath().add(PathUtil.getJarPathForClass(ServiceMessageTypes.class)); + @NotNull + @Override + protected String getVMParameter() { + return "-Didea.testng.sm_runner"; + } - OSProcessHandler handler = startProcess(); - TestConsoleProperties testConsoleProperties = new SMTRunnerConsoleProperties(config, TESTNG_TEST_FRAMEWORK_NAME, executor); + @NotNull + @Override + protected String getFrameworkName() { + return TESTNG_TEST_FRAMEWORK_NAME; + } - testConsoleProperties.setIfUndefined(TestConsoleProperties.HIDE_PASSED_TESTS, false); - - final BaseTestsOutputConsoleView smtConsoleView = SMTestRunnerConnectionUtil.createConsoleWithCustomLocator( - TESTNG_TEST_FRAMEWORK_NAME, - testConsoleProperties, - getEnvironment(), null); - - - Disposer.register(getEnvironment().getProject(), smtConsoleView); - smtConsoleView.attachToProcess(handler); - final RerunFailedTestsAction rerunFailedTestsAction = new RerunFailedTestsAction(smtConsoleView, testConsoleProperties); - rerunFailedTestsAction.setModelProvider(new Getter() { - @Override - public TestFrameworkRunningModel get() { - return ((SMTRunnerConsoleView)smtConsoleView).getResultsViewer(); - } - }); - - final DefaultExecutionResult result = new DefaultExecutionResult(smtConsoleView, handler); - result.setRestartActions(rerunFailedTestsAction); - - JavaRunConfigurationExtensionManager.getInstance().attachExtensionsToProcess(config, handler, runnerSettings); - final SearchingForTestsTask task = createSearchingForTestsTask(myServerSocket, config, myTempFile); - handler.addProcessListener(new ProcessAdapter() { - @Override - public void processTerminated(final ProcessEvent event) { - task.ensureFinished(); - } - - @Override - public void startNotified(final ProcessEvent event) { - task.startSearch(); - } - }); - - return result; + @NotNull + @Override + protected AbstractRerunFailedTestsAction createRerunFailedTestsAction(TestConsoleProperties testConsoleProperties, + ConsoleView consoleView) { + return new RerunFailedTestsAction(consoleView, testConsoleProperties); } @Override