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 b9f392170ab6..5cd70d89a263 100644 --- a/java/execution/impl/src/com/intellij/execution/testframework/SearchForTestsTask.java +++ b/java/execution/impl/src/com/intellij/execution/testframework/SearchForTestsTask.java @@ -22,13 +22,11 @@ import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.progress.Task; +import com.intellij.openapi.progress.*; import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -45,7 +43,7 @@ public abstract class SearchForTestsTask extends Task.Backgroundable { private ProgressIndicator myProcessIndicator; public SearchForTestsTask(@Nullable final Project project, - @NotNull final ServerSocket socket) { + final ServerSocket socket) { super(project, ExecutionBundle.message("searching.test.progress.title"), true); myServerSocket = socket; } diff --git a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java index c46da083db47..4825768c8ec8 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java @@ -41,6 +41,9 @@ import com.intellij.util.Function; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; + +import java.io.File; public class TestPackage extends TestObject { private boolean myFoundTests = true; @@ -98,7 +101,7 @@ public class TestPackage extends TestObject { return null; } } - }, getPackageName(data), false, getJavaParameters()); + }, getPackageName(data), ApplicationManager.getApplication().isUnitTestMode(), getJavaParameters()); } catch (ExecutionException ignored) {} } @@ -207,4 +210,9 @@ public class TestPackage extends TestObject { super.notifyByBalloon(model, started, consoleProperties); } } + + @TestOnly + public File getWorkingDirsFile() { + return myWorkingDirsFile; + } } diff --git a/plugins/junit/test/com/intellij/execution/junit/JUnitClasspathTest.java b/plugins/junit/test/com/intellij/execution/junit/JUnitClasspathTest.java new file mode 100644 index 000000000000..9ff52eb8c813 --- /dev/null +++ b/plugins/junit/test/com/intellij/execution/junit/JUnitClasspathTest.java @@ -0,0 +1,157 @@ +/* + * 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.junit; + +import com.intellij.execution.executors.DefaultRunExecutor; +import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.runners.ExecutionEnvironmentBuilder; +import com.intellij.execution.testframework.TestSearchScope; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.module.JavaModuleType; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.projectRoots.ex.JavaSdkUtil; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.registry.RegistryValue; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.rt.execution.junit.JUnitStarter; +import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.PsiTestUtil; +import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase; +import com.intellij.util.PathUtil; +import jetbrains.buildServer.messages.serviceMessages.ServiceMessageTypes; +import junit.framework.TestCase; + +import java.io.File; +import java.io.IOException; + +public class JUnitClasspathTest extends JavaCodeInsightFixtureTestCase { + + public void testWorkingDirsFileWhenConfigurationSpansToMultipleModules() throws Exception { + final Module mod1 = setupModule("mod1", "T1"); + final Module mod2 = setupModule("mod2", "T2"); + + final JUnitConfiguration configuration = + new JUnitConfiguration("p", getProject(), JUnitConfigurationType.getInstance().getConfigurationFactories()[0]); + configuration.setWorkingDirectory("$MODULE_DIR$"); + final JUnitConfiguration.Data persistentData = configuration.getPersistentData(); + persistentData.setScope(TestSearchScope.SINGLE_MODULE); + configuration.setModule(mod1); + persistentData.PACKAGE_NAME = "p"; + persistentData.TEST_OBJECT = JUnitConfiguration.TEST_PACKAGE; + + final ExecutionEnvironment environment = + ExecutionEnvironmentBuilder.create(DefaultRunExecutor.getRunExecutorInstance(), configuration).build(); + final TestPackage aPackage = new TestPackage(configuration, environment); + + //ensure no fork if single module is selected + aPackage.createSearchingForTestsTask().startSearch(); + File workingDirsFile = aPackage.getWorkingDirsFile(); + assertNotNull(workingDirsFile); + assertEmpty(FileUtil.loadFile(workingDirsFile)); + + //ensure fork when whole project is used + persistentData.setScope(TestSearchScope.WHOLE_PROJECT); + final RegistryValue smRunnerProperty = Registry.get("junit_sm_runner"); + final boolean oldValue = smRunnerProperty.asBoolean(); + try { + //check old format + smRunnerProperty.setValue(false); + aPackage.createSearchingForTestsTask().startSearch(); + workingDirsFile = aPackage.getWorkingDirsFile(); + assertNotNull(workingDirsFile); + String file = preparePathsForComparison(FileUtil.loadFile(workingDirsFile), mod1, mod2); + assertEquals("p\n" + + "MODULE_1\n" + + "APP_HOME/idea_rt.jar;APP_HOME/junit-rt.jar;IDEA_HOME/lib/junit-4.12.jar;IDEA_HOME/java/mockJDK-1.7/jre/lib/annotations.jar;IDEA_HOME/java/mockJDK-1.7/jre/lib/rt.jar\n" + + "1\n" + + "p.T1\n" + + "MODULE_2\n" + + "APP_HOME/idea_rt.jar;APP_HOME/junit-rt.jar;IDEA_HOME/lib/junit-4.12.jar;IDEA_HOME/java/mockJDK-1.7/jre/lib/annotations.jar;IDEA_HOME/java/mockJDK-1.7/jre/lib/rt.jar\n" + + "1\n" + + "p.T2\n", file); + + //check sm runner + smRunnerProperty.setValue(true); + aPackage.createSearchingForTestsTask().startSearch(); + workingDirsFile = aPackage.getWorkingDirsFile(); + assertNotNull(workingDirsFile); + file = preparePathsForComparison(FileUtil.loadFile(workingDirsFile), mod1, mod2); + assertEquals("p\n" + + "MODULE_1\n" + + "APP_HOME/idea_rt.jar;APP_HOME/junit-rt.jar;IDEA_HOME/lib/serviceMessages.jar;IDEA_HOME/lib/junit-4.12.jar;IDEA_HOME/java/mockJDK-1.7/jre/lib/annotations.jar;IDEA_HOME/java/mockJDK-1.7/jre/lib/rt.jar\n" + + "1\n" + + "p.T1\n" + + "MODULE_2\n" + + "APP_HOME/idea_rt.jar;APP_HOME/junit-rt.jar;IDEA_HOME/lib/serviceMessages.jar;IDEA_HOME/lib/junit-4.12.jar;IDEA_HOME/java/mockJDK-1.7/jre/lib/annotations.jar;IDEA_HOME/java/mockJDK-1.7/jre/lib/rt.jar\n" + + "1\n" + + "p.T2\n", file); + } + finally { + smRunnerProperty.setValue(oldValue); + } + } + + public void testNoWorkingDirsFileWhenOnlyOneModuleExist() throws Exception { + setupModule("mod1", "T1"); + final JUnitConfiguration configuration = + new JUnitConfiguration("p", getProject(), JUnitConfigurationType.getInstance().getConfigurationFactories()[0]); + configuration.setWorkingDirectory("$MODULE_DIR$"); + final JUnitConfiguration.Data persistentData = configuration.getPersistentData(); + persistentData.setScope(TestSearchScope.WHOLE_PROJECT); + persistentData.PACKAGE_NAME = "p"; + persistentData.TEST_OBJECT = JUnitConfiguration.TEST_PACKAGE; + final ExecutionEnvironment environment = + ExecutionEnvironmentBuilder.create(DefaultRunExecutor.getRunExecutorInstance(), configuration).build(); + final TestPackage aPackage = new TestPackage(configuration, environment); + aPackage.createSearchingForTestsTask().startSearch(); + final File workingDirsFile = aPackage.getWorkingDirsFile(); + assertNotNull(workingDirsFile); + assertEmpty(FileUtil.loadFile(workingDirsFile)); + } + + private Module setupModule(String moduleName, final String className) throws IOException { + final VirtualFile root1 = myFixture.getTempDirFixture().findOrCreateDir(moduleName); + final Module module = PsiTestUtil.addModule(getProject(), JavaModuleType.getModuleType(), moduleName, root1); + PsiTestUtil.removeAllRoots(module, IdeaTestUtil.getMockJdk17()); + PsiTestUtil.addSourceRoot(module, root1, true); + myFixture.addFileToProject(moduleName + "/p/" + className + ".java", + "package p;\n" + + "public class " + className + " extends junit.framework.TestCase {\n" + + " public void testName1(){}" + + "}"); + final String pathForClass = PathUtil.getJarPathForClass(TestCase.class); + PsiTestUtil.addLibrary(module, + "junit4", + StringUtil.getPackageName(pathForClass, File.separatorChar), + StringUtil.getShortName(pathForClass, File.separatorChar)); + return module; + } + + private static String preparePathsForComparison(String fileContent, Module mod1, Module mod2) { + fileContent = fileContent.replaceAll(ModuleRootManager.getInstance(mod1).getContentRoots()[0].getPath(), "MODULE_1"); + fileContent = fileContent.replaceAll(ModuleRootManager.getInstance(mod2).getContentRoots()[0].getPath(), "MODULE_2"); + fileContent = fileContent.replaceAll(PathManager.getHomePath() + File.separator + "community", "IDEA_HOME"); + fileContent = fileContent.replaceAll(PathManager.getHomePath(), "IDEA_HOME"); + fileContent = fileContent.replaceAll(StringUtil.getPackageName(PathUtil.getJarPathForClass(JUnitStarter.class), File.separatorChar), "APP_HOME"); + fileContent = fileContent.replaceAll(StringUtil.getPackageName(JavaSdkUtil.getIdeaRtJarPath(), File.separatorChar), "APP_HOME"); + fileContent = fileContent.replaceAll(StringUtil.getPackageName(PathUtil.getJarPathForClass(ServiceMessageTypes.class), File.separatorChar), "APP_HOME"); + fileContent = fileContent.replaceAll(File.pathSeparator, ";"); + return fileContent; + } +}