diff --git a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java index b4f1acaf96d7..bc75c4f1359d 100644 --- a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java +++ b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java @@ -21,10 +21,7 @@ import com.intellij.execution.process.OSProcessHandler; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.runners.ExecutionEnvironment; -import com.intellij.execution.testframework.JavaTestLocationProvider; -import com.intellij.execution.testframework.SearchForTestsTask; -import com.intellij.execution.testframework.TestConsoleProperties; -import com.intellij.execution.testframework.TestFrameworkRunningModel; +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; @@ -37,23 +34,39 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.JavaSdkType; +import com.intellij.openapi.projectRoots.JdkUtil; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.ex.JavaSdkUtil; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringUtilRt; +import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiPackage; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopesCore; +import com.intellij.rt.execution.CommandLineWrapper; import com.intellij.util.PathUtil; +import com.intellij.util.ui.UIUtil; import jetbrains.buildServer.messages.serviceMessages.ServiceMessageTypes; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.serialization.PathMacroUtil; import javax.swing.*; import java.io.File; import java.io.IOException; +import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; +import java.util.Locale; public abstract class JavaTestFrameworkRunnableState & CommonJavaRunConfigurationParameters> extends JavaCommandLineState { private static final Logger LOG = Logger.getInstance("#" + JavaTestFrameworkRunnableState.class.getName()); @@ -74,6 +87,10 @@ public abstract class JavaTestFrameworkRunnableState" + + "Please specify single working directory, or change test scope to single module."); + } + } else { + return; + } + } else if (getRunnerSettings() != null) { + final String actionName = executor.getActionName(); + throw new CantRunException(actionName + " is disabled in fork mode.
Please change fork mode to <none> to " + actionName.toLowerCase( + Locale.ENGLISH) + "."); + } + + final JavaParameters javaParameters = getJavaParameters(); + final Sdk jdk = javaParameters.getJdk(); + if (jdk == null) { + throw new ExecutionException(ExecutionBundle.message("run.configuration.error.no.jdk.specified")); + } + + try { + final File tempFile = FileUtil.createTempFile("command.line", "", true); + final PrintWriter writer = new PrintWriter(tempFile, CharsetToolkit.UTF8); + try { + if (JdkUtil.useDynamicClasspath(getConfiguration().getProject())) { + String classpath = PathUtil.getJarPathForClass(CommandLineWrapper.class); + final String utilRtPath = PathUtil.getJarPathForClass(StringUtilRt.class); + if (!classpath.equals(utilRtPath)) { + classpath += File.pathSeparator + utilRtPath; + } + writer.println(classpath); + } + else { + writer.println(""); + } + + writer.println(((JavaSdkType)jdk.getSdkType()).getVMExecutablePath(jdk)); + for (String vmParameter : javaParameters.getVMParametersList().getList()) { + writer.println(vmParameter); + } + } + finally { + writer.close(); + } + + passForkMode(forkMode, tempFile); + } + catch (Exception e) { + LOG.error(e); + } + } + + protected abstract void passForkMode(String forkMode, File tempFile) throws ExecutionException; + protected void collectListeners(JavaParameters javaParameters, StringBuilder buf, String epName, String delimiter) { final T configuration = getConfiguration(); final Object[] listeners = Extensions.getExtensions(epName); @@ -223,6 +298,37 @@ public abstract class JavaTestFrameworkRunnableState 1; + } + } + } + } + return false; + } + + /** + * Configuration based on package which spans multiple modules + */ + protected boolean forkPerModule() { + final String workingDirectory = getConfiguration().getWorkingDirectory(); + return getScope() != TestSearchScope.SINGLE_MODULE && + ("$" + PathMacroUtil.MODULE_DIR_MACRO_NAME + "$").equals(workingDirectory) && + spansMultipleModules(); + } + protected void createTempFiles(JavaParameters javaParameters) { try { myTempFile = FileUtil.createTempFile("idea_" + getFrameworkId(), ".tmp"); diff --git a/plugins/junit/src/com/intellij/execution/junit/TestObject.java b/plugins/junit/src/com/intellij/execution/junit/TestObject.java index e5fc301a0244..7a5f8b10f45a 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestObject.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestObject.java @@ -48,30 +48,20 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.JavaSdkType; -import com.intellij.openapi.projectRoots.JdkUtil; -import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.ex.JavaSdkUtil; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.util.text.StringUtilRt; import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.psi.*; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.GlobalSearchScopesCore; import com.intellij.refactoring.listeners.RefactoringElementListener; -import com.intellij.rt.execution.CommandLineWrapper; import com.intellij.rt.execution.junit.IDEAJUnitListener; import com.intellij.rt.execution.junit.JUnitStarter; 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; @@ -318,88 +308,10 @@ public abstract class TestObject extends JavaTestFrameworkRunnableState 1; - } - } - } - } - return false; - } - - private void appendForkInfo(Executor executor) throws ExecutionException { - final String forkMode = getConfiguration().getForkMode(); - if (Comparing.strEqual(forkMode, "none")) { - if (forkPerModule()) { - if (getRunnerSettings() != null) { - final String actionName = UIUtil.removeMnemonic(executor.getStartActionText()); - throw new CantRunException("'" + actionName + "' is disabled when per-module working directory is configured.
" + - "Please specify single working directory, or change test scope to single module."); - } - } else { - return; - } - } else if (getRunnerSettings() != null) { - final String actionName = executor.getActionName(); - throw new CantRunException(actionName + " is disabled in fork mode.
Please change fork mode to <none> to " + actionName.toLowerCase(Locale.ENGLISH) + "."); - } - - final JavaParameters javaParameters = getJavaParameters(); - final Sdk jdk = javaParameters.getJdk(); - if (jdk == null) { - throw new ExecutionException(ExecutionBundle.message("run.configuration.error.no.jdk.specified")); - } - - try { - final File tempFile = FileUtil.createTempFile("command.line", "", true); - final PrintWriter writer = new PrintWriter(tempFile, CharsetToolkit.UTF8); - try { - if (JdkUtil.useDynamicClasspath(getConfiguration().getProject())) { - String classpath = PathUtil.getJarPathForClass(CommandLineWrapper.class); - final String utilRtPath = PathUtil.getJarPathForClass(StringUtilRt.class); - if (!classpath.equals(utilRtPath)) { - classpath += File.pathSeparator + utilRtPath; - } - writer.println(classpath); - } - else { - writer.println(""); - } - - writer.println(((JavaSdkType)jdk.getSdkType()).getVMExecutablePath(jdk)); - for (String vmParameter : javaParameters.getVMParametersList().getList()) { - writer.println(vmParameter); - } - } - finally { - writer.close(); - } - - getJavaParameters().getProgramParametersList().add("@@@" + forkMode + ',' + tempFile.getAbsolutePath()); - } - catch (Exception e) { - LOG.error(e); - } + @NotNull + @Override + protected String getForkMode() { + return getConfiguration().getForkMode(); } protected void addClassesListToJavaParameters(Collection elements, Function nameFunction, String packageName, @@ -455,7 +367,7 @@ public abstract class TestObject extends JavaTestFrameworkRunnableState 1) { - final String classpath = getConfiguration().getPersistentData().getScope() == TestSearchScope.WHOLE_PROJECT + final String classpath = getScope() == TestSearchScope.WHOLE_PROJECT ? null : javaParameters.getClassPath().getPathsString(); final PrintWriter wWriter = new PrintWriter(myWorkingDirsFile, CharsetToolkit.UTF8); @@ -543,4 +455,13 @@ public abstract class TestObject extends JavaTestFrameworkRunnableState { @@ -226,6 +227,12 @@ public class TestNGRunnableState extends JavaTestFrameworkRunnableState