From a1b74b6bff21de8a5548a206295a7ad8a1175f53 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 15 Apr 2015 19:33:00 +0300 Subject: [PATCH 01/10] import projects without showing wizard --- .../src/com/intellij/ide/actions/ImportModuleAction.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java b/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java index c992d544a4e3..40206ba56b1e 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java @@ -82,7 +82,7 @@ public class ImportModuleAction extends AnAction { } public static List createFromWizard(@Nullable Project project, AbstractProjectWizard wizard) { - if (project == null && wizard.getStepCount() > 0) { + if (project == null) { Project newProject = NewProjectUtil.createFromWizard(wizard, null); return newProject == null ? Collections.emptyList() : Arrays.asList(ModuleManager.getInstance(newProject).getModules()); } @@ -94,7 +94,6 @@ public class ImportModuleAction extends AnAction { return Collections.singletonList(module); } else { - assert project != null; return projectBuilder.commit(project); } } From e145aa66ee2890a73a2a8d387863855448f7807f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 15 Apr 2015 14:55:48 +0200 Subject: [PATCH 02/10] testng: create suites according to invocation numbers provided -> rerun failed tests would include only 'failing' params --- .../configuration/SearchingForTestsTask.java | 109 ++++++++++++------ .../TestNGConfigurationProducer.java | 2 +- .../ui/actions/RerunFailedTestsAction.java | 28 +++-- 3 files changed, 95 insertions(+), 44 deletions(-) diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java index edf561ea8d25..da4701d312ad 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java @@ -40,7 +40,6 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PackageScope; import com.intellij.psi.search.searches.AnnotatedMembersSearch; import com.intellij.psi.util.ClassUtil; -import com.intellij.util.containers.ContainerUtil; import com.theoryinpractice.testng.model.IDEARemoteTestRunnerClient; import com.theoryinpractice.testng.model.TestClassFilter; import com.theoryinpractice.testng.model.TestData; @@ -48,10 +47,7 @@ import com.theoryinpractice.testng.model.TestType; import com.theoryinpractice.testng.util.TestNGUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.testng.xml.LaunchSuite; -import org.testng.xml.Parser; -import org.testng.xml.SuiteGenerator; -import org.testng.xml.XmlSuite; +import org.testng.xml.*; import java.io.*; import java.net.ServerSocket; @@ -61,7 +57,7 @@ import java.util.regex.PatternSyntaxException; public class SearchingForTestsTask extends SearchForTestsTask { private static final Logger LOG = Logger.getInstance("#" + SearchingForTestsTask.class.getName()); - private final Map> myClasses; + private final Map>> myClasses; private final TestData myData; private final Project myProject; private final TestNGConfiguration myConfig; @@ -78,7 +74,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { myProject = config.getProject(); myConfig = config; myTempFile = tempFile; - myClasses = new LinkedHashMap>(); + myClasses = new LinkedHashMap>>(); } @Override @@ -126,20 +122,20 @@ public class SearchingForTestsTask extends SearchForTestsTask { } private void composeTestSuiteFromClasses() { - Map> map = new LinkedHashMap>(); + Map>> map = new LinkedHashMap>>(); final boolean findTestMethodsForClass = shouldSearchForTestMethods(); - for (final Map.Entry> entry : myClasses.entrySet()) { - final Collection depMethods = entry.getValue(); - Collection methods = new LinkedHashSet(depMethods.size()); - for (PsiMethod method : depMethods) { - methods.add(method.getName()); + for (final Map.Entry>> entry : myClasses.entrySet()) { + final Map> depMethods = entry.getValue(); + LinkedHashMap> methods = new LinkedHashMap>(); + for (Map.Entry> method : depMethods.entrySet()) { + methods.put(method.getKey().getName(), method.getValue()); } if (findTestMethodsForClass && depMethods.isEmpty()) { for (PsiMethod method : entry.getKey().getMethods()) { if (TestNGUtil.hasTest(method)) { - methods.add(method.getName()); + methods.put(method.getName(), Collections.emptyList()); } } } @@ -180,10 +176,53 @@ public class SearchingForTestsTask extends SearchForTestsTask { logLevel = 1; } - LaunchSuite suite = - SuiteGenerator.createSuite(myProject.getName(), null, map, groupNames, testParams, "jdk", logLevel); - - File xmlFile = suite.save(new File(PathManager.getSystemPath())); + File xmlFile; + if (groupNames != null) { + final LinkedHashMap> methodNames = new LinkedHashMap>(); + for (Map.Entry>> entry : map.entrySet()) { + methodNames.put(entry.getKey(), entry.getValue().keySet()); + } + LaunchSuite suite = + SuiteGenerator.createSuite(myProject.getName(), null, methodNames, groupNames, testParams, "jdk", logLevel); + xmlFile = suite.save(new File(PathManager.getSystemPath())); + } + else { + final XmlSuite xmlSuite = new XmlSuite(); + XmlTest xmlTest = new XmlTest(xmlSuite); + xmlTest.setName(myProject.getName()); + xmlTest.setParameters(testParams); + List xmlClasses = new ArrayList(); + int idx = 0; + for (String className : map.keySet()) { + final XmlClass xmlClass = new XmlClass(className, idx++, false); + final ArrayList includedMethods = new ArrayList(); + final Map> collection = map.get(className); + int mIdx = 0; + for (String methodName : collection.keySet()) { + final List includes = new ArrayList(); + for (String include : collection.get(methodName)) { + try { + includes.add(Integer.parseInt(include)); + } + catch (NumberFormatException e) { + LOG.error(e); + } + } + includedMethods.add(new XmlInclude(methodName, includes, mIdx++)); + } + xmlClass.setIncludedMethods(includedMethods); + xmlClasses.add(xmlClass); + } + xmlTest.setXmlClasses(xmlClasses); + xmlFile = new File(PathManager.getSystemPath(), "temp-testng-customsuite.xml"); + final String toXml = xmlSuite.toXml(); + try { + FileUtil.writeToFile(xmlFile, toXml); + } + catch (IOException e) { + LOG.error(e); + } + } String path = xmlFile.getAbsolutePath() + "\n"; try { FileUtil.writeToFile(myTempFile, path.getBytes(CharsetToolkit.UTF8_CHARSET), true); @@ -195,7 +234,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { private boolean shouldSearchForTestMethods() { boolean dependantMethods = false; - for (Collection methods : myClasses.values()) { + for (Map> methods : myClasses.values()) { if (!methods.isEmpty()) { dependantMethods = true; break; @@ -239,7 +278,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { } } - protected void fillTestObjects(final Map> classes) + protected void fillTestObjects(final Map>> classes) throws CantRunException { final TestData data = myConfig.getPersistantData(); final PsiManager psiManager = PsiManager.getInstance(myProject); @@ -322,7 +361,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { .getAllTestClasses(new TestClassFilter(data.getScope().getSourceScope(myConfig).getGlobalSearchScope(), myProject, true, true), false); if (testClasses != null) { for (PsiClass c : testClasses) { - classes.put(c, new HashSet()); + classes.put(c, new LinkedHashMap>()); } } } @@ -401,7 +440,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { } } - private void collectTestMethods(Map> classes, final PsiClass psiClass, final String methodName) { + private void collectTestMethods(Map>> classes, final PsiClass psiClass, final String methodName) { final PsiMethod[] methods = ApplicationManager.getApplication().runReadAction( new Computable() { public PsiMethod[] compute() { @@ -410,12 +449,14 @@ public class SearchingForTestsTask extends SearchForTestsTask { } ); calculateDependencies(methods, classes, psiClass); - Collection psiMethods = classes.get(psiClass); + Map> psiMethods = classes.get(psiClass); if (psiMethods == null) { - psiMethods = new LinkedHashSet(); + psiMethods = new LinkedHashMap>(); classes.put(psiClass, psiMethods); } - ContainerUtil.addAll(psiMethods, methods); + for (PsiMethod method : methods) { + psiMethods.put(method, Collections.emptyList()); + } } private Map buildTestParameters() { @@ -452,13 +493,13 @@ public class SearchingForTestsTask extends SearchForTestsTask { } private void calculateDependencies(PsiMethod[] methods, - final Map> results, + final Map>> results, @Nullable final PsiClass... classes) { calculateDependencies(methods, results, new LinkedHashSet(), classes); } private void calculateDependencies(final PsiMethod[] methods, - final Map> results, + final Map>> results, final Set alreadyMarkedToBeChecked, @Nullable final PsiClass... classes) { if (classes != null && classes.length > 0) { @@ -488,7 +529,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { if (methods == null) { for (PsiClass c : classes) { - results.put(c, new LinkedHashSet()); + results.put(c, new LinkedHashMap>()); } } else { for (PsiMember psiMember : membersToCheckNow) { @@ -506,7 +547,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { } } - private static void collectDependsOnMethods(final Map> results, + private static void collectDependsOnMethods(final Map>> results, final Set alreadyMarkedToBeChecked, final Set membersToCheckNow, final PsiMethod[] methods, @@ -557,7 +598,7 @@ public class SearchingForTestsTask extends SearchForTestsTask { PsiClass containingClass, Set alreadyMarkedToBeChecked, Set membersToCheckNow, - Map> results) { + Map>> results) { final PsiMethod[] psiMethods = containingClass.findMethodsByName(methodName, true); for (PsiMethod method : psiMethods) { if (AnnotationUtil.isAnnotated(method, TestNGUtil.TEST_ANNOTATION_FQN, false) && @@ -569,19 +610,19 @@ public class SearchingForTestsTask extends SearchForTestsTask { private static boolean appendMember(final PsiMember psiMember, final Set underConsideration, - final Map> results) { + final Map>> results) { boolean result = false; final PsiClass psiClass = psiMember instanceof PsiClass ? ((PsiClass)psiMember) : psiMember.getContainingClass(); - Collection psiMethods = results.get(psiClass); + Map> psiMethods = results.get(psiClass); if (psiMethods == null) { - psiMethods = new LinkedHashSet(); + psiMethods = new LinkedHashMap>(); results.put(psiClass, psiMethods); if (psiMember instanceof PsiClass) { result = underConsideration.add(psiMember); } } if (psiMember instanceof PsiMethod) { - final boolean add = psiMethods.add((PsiMethod)psiMember); + final boolean add = psiMethods.put((PsiMethod)psiMember, Collections.emptyList()) != null; if (add) { return underConsideration.add(psiMember); } diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java index 950138652b22..5203f6c09819 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java @@ -69,7 +69,7 @@ public abstract class TestNGConfigurationProducer extends JavaRunConfigurationPr return false; } - protected static String getInvocationNumber(String str) { + public static String getInvocationNumber(String str) { final int indexOf = str.indexOf(IDEATestNGRemoteListener.INVOCATION_NUMBER); if (indexOf > 0) { final int lastIdx = str.indexOf(")", indexOf); diff --git a/plugins/testng/src/com/theoryinpractice/testng/ui/actions/RerunFailedTestsAction.java b/plugins/testng/src/com/theoryinpractice/testng/ui/actions/RerunFailedTestsAction.java index bc8f52c26eaf..275559f1d496 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/ui/actions/RerunFailedTestsAction.java +++ b/plugins/testng/src/com/theoryinpractice/testng/ui/actions/RerunFailedTestsAction.java @@ -5,9 +5,9 @@ import com.intellij.execution.Executor; import com.intellij.execution.Location; import com.intellij.execution.actions.JavaRerunFailedTestsAction; import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.junit2.PsiMemberParameterizedLocation; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.testframework.AbstractTestProxy; -import com.intellij.execution.testframework.SourceScope; import com.intellij.execution.testframework.TestConsoleProperties; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; @@ -22,12 +22,11 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.containers.ContainerUtil; import com.theoryinpractice.testng.configuration.SearchingForTestsTask; import com.theoryinpractice.testng.configuration.TestNGConfiguration; +import com.theoryinpractice.testng.configuration.TestNGConfigurationProducer; import com.theoryinpractice.testng.configuration.TestNGRunnableState; import com.theoryinpractice.testng.util.TestNGUtil; import org.jetbrains.annotations.NotNull; -import java.io.File; -import java.net.ServerSocket; import java.util.*; public class RerunFailedTestsAction extends JavaRerunFailedTestsAction { @@ -53,8 +52,8 @@ public class RerunFailedTestsAction extends JavaRerunFailedTestsAction { public SearchingForTestsTask createSearchingForTestsTask() { return new SearchingForTestsTask(myServerSocket, getConfiguration(), myTempFile, client) { @Override - protected void fillTestObjects(final Map> classes) throws CantRunException { - final HashMap> fullClassList = ContainerUtil.newHashMap(); + protected void fillTestObjects(final Map>> classes) throws CantRunException { + final HashMap>> fullClassList = ContainerUtil.newHashMap(); super.fillTestObjects(fullClassList); for (final PsiClass aClass : fullClassList.keySet()) { if (!ApplicationManager.getApplication().runReadAction(new Computable() { @@ -78,7 +77,7 @@ public class RerunFailedTestsAction extends JavaRerunFailedTestsAction { } } - private void includeFailedTestWithDependencies(Map> classes, + private void includeFailedTestWithDependencies(Map>> classes, GlobalSearchScope scope, Project project, AbstractTestProxy proxy) { @@ -95,12 +94,23 @@ public class RerunFailedTestsAction extends JavaRerunFailedTestsAction { psiClass = (PsiClass)elt; } } - Collection psiMethods = classes.get(psiClass); + Map> psiMethods = classes.get(psiClass); if (psiMethods == null) { - psiMethods = new ArrayList(); + psiMethods = new LinkedHashMap>(); classes.put(psiClass, psiMethods); } - psiMethods.add(psiMethod); + List strings = psiMethods.get(psiMethod); + if (strings == null) { + strings = new ArrayList(); + } + if (location instanceof PsiMemberParameterizedLocation) { + final String paramSetName = ((PsiMemberParameterizedLocation)location).getParamSetName(); + final String invocationNumber = TestNGConfigurationProducer.getInvocationNumber(paramSetName); + if (invocationNumber != null) { + strings.add(invocationNumber); + } + } + psiMethods.put(psiMethod, strings); } } } From 2b53c5402672c27f00c2a75b15750ec9c635bfb0 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 15 Apr 2015 15:26:33 +0200 Subject: [PATCH 03/10] sm testng: use initial invocation number so rerun would pick correct failure after rerun failed --- plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java | 4 ++-- .../src/org/testng/IDEATestNGRemoteListener.java | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java b/plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java index cb55ecda63aa..a0a7d064eedb 100644 --- a/plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java +++ b/plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java @@ -73,8 +73,8 @@ public class IDEARemoteTestNG extends TestNG { final HashMap map = new HashMap(); map.put("count", String.valueOf(testCount)); System.out.println(ServiceMessage.asString("testCount", map)); - addListener((ISuiteListener) new IDEATestNGRemoteListener(myParam)); - addListener((ITestListener) new IDEATestNGRemoteListener(myParam)); + addListener((ISuiteListener) new IDEATestNGRemoteListener()); + addListener((ITestListener) new IDEATestNGRemoteListener()); super.run(); } else { diff --git a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java index 8aa1176d245a..06a202dd9d11 100644 --- a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java +++ b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java @@ -7,6 +7,7 @@ import org.testng.internal.IResultListener; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -16,15 +17,10 @@ import java.util.Map; public class IDEATestNGRemoteListener implements ISuiteListener, IResultListener{ public static final String INVOCATION_NUMBER = "invocation number: "; - private final String myParam; private String myCurrentClassName; private String myMethodName; private int myInvocationCount = 0; - public IDEATestNGRemoteListener(String param) { - myParam = param; - } - public void onConfigurationSuccess(ITestResult itr) { //won't be called } @@ -75,7 +71,9 @@ public class IDEATestNGRemoteListener implements ISuiteListener, IResultListener } } if (parameters.length > 0) { - methodName += "[" + parameters[0].toString() + (myParam == null ? (" (" + INVOCATION_NUMBER + myInvocationCount + ")") : "") + "]"; + final List invocationNumbers = result.getMethod().getInvocationNumbers(); + methodName += "[" + parameters[0].toString() + " (" + INVOCATION_NUMBER + + (invocationNumbers.isEmpty() ? myInvocationCount : invocationNumbers.get(myInvocationCount)) + ")" + "]"; if (changeCount) { myInvocationCount++; } From ccae6eacfb3c8155d7281a8c74df90036352ee50 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 15 Apr 2015 16:12:16 +0200 Subject: [PATCH 04/10] sm runner: don't miss line breaks --- .../junit_rt/src/com/intellij/junit4/SMTestSender.java | 8 ++++---- .../src/org/testng/IDEATestNGRemoteListener.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/junit_rt/src/com/intellij/junit4/SMTestSender.java b/plugins/junit_rt/src/com/intellij/junit4/SMTestSender.java index f513cd375bc6..3667bb19ef89 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/SMTestSender.java +++ b/plugins/junit_rt/src/com/intellij/junit4/SMTestSender.java @@ -46,15 +46,15 @@ class SMTestSender extends RunListener { public void testRunStarted(Description description) throws Exception { myCurrentClassName = myIgnoreTopSuite ? description.toString() : null; - System.out.println("##teamcity[enteredTheMatrix]"); + System.out.println("##teamcity[enteredTheMatrix]\n"); } public void testRunFinished(Result result) throws Exception { if (myParamName != null) { - System.out.println("##teamcity[testSuiteFinished name=\'" + myParamName + "\']"); + System.out.println("##teamcity[testSuiteFinished name=\'" + myParamName + "\']\n"); } if (myCurrentClassName != null) { - System.out.println("##teamcity[testSuiteFinished name=\'" + myCurrentClassName + "\']"); + System.out.println("##teamcity[testSuiteFinished name=\'" + myCurrentClassName + "\']\n"); } } @@ -87,7 +87,7 @@ class SMTestSender extends RunListener { } public void testFinished(Description description) throws Exception { - System.out.println("##teamcity[testFinished name=\'" + JUnit4ReflectionUtil.getMethodName(description) + "\']"); + System.out.println("\n##teamcity[testFinished name=\'" + JUnit4ReflectionUtil.getMethodName(description) + "\']"); } public void testFailure(Failure failure) throws Exception { diff --git a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java index 06a202dd9d11..db8f7b81dc68 100644 --- a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java +++ b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java @@ -82,7 +82,7 @@ public class IDEATestNGRemoteListener implements ISuiteListener, IResultListener } public void onTestSuccess(ITestResult result) { - System.out.println("##teamcity[testFinished name=\'" + getMethodName(result) + "\']"); + System.out.println("\n##teamcity[testFinished name=\'" + getMethodName(result) + "\']"); } public String getTrace(Throwable tr) { @@ -104,11 +104,11 @@ public class IDEATestNGRemoteListener implements ISuiteListener, IResultListener attrs.put("details", trace); attrs.put("error", "true"); System.out.println(ServiceMessage.asString(ServiceMessageTypes.TEST_FAILED, attrs)); - System.out.println("##teamcity[testFinished name=\'" + methodName + "\']"); + System.out.println("\n##teamcity[testFinished name=\'" + methodName + "\']"); } public void onTestSkipped(ITestResult result) { - System.out.println("##teamcity[testFinished name=\'" + getMethodName(result) + "\']"); + System.out.println("\n##teamcity[testFinished name=\'" + getMethodName(result) + "\']"); } public void onTestFailedButWithinSuccessPercentage(ITestResult result) { From b062b8061a8a5e32d2f286ae214fe699b3a68484 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 15 Apr 2015 17:16:21 +0200 Subject: [PATCH 05/10] sm runner: don't use segmented output streams; provide separate runner for junit 3 --- .../execution/ConfigurationsTest.java | 3 +- .../intellij/junit3/JUnit3IdeaTestRunner.java | 76 ++++++++++++++++--- .../intellij/junit4/JUnit4IdeaTestRunner.java | 7 +- .../rt/execution/junit/IdeaTestRunner.java | 3 +- .../execution/junit/JUnitForkedStarter.java | 16 ++-- .../rt/execution/junit/JUnitStarter.java | 44 +++++------ 6 files changed, 101 insertions(+), 48 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/execution/ConfigurationsTest.java b/java/java-tests/testSrc/com/intellij/execution/ConfigurationsTest.java index 73ddb14b4805..1bc6d3e6a92b 100644 --- a/java/java-tests/testSrc/com/intellij/execution/ConfigurationsTest.java +++ b/java/java-tests/testSrc/com/intellij/execution/ConfigurationsTest.java @@ -136,8 +136,9 @@ public class ConfigurationsTest extends BaseConfigurationTestCase { JUnitConfiguration configuration = createConfiguration(testA); JavaParameters parameters = checkCanRun(configuration); CHECK.empty(parameters.getVMParametersList().getList()); + final SegmentedOutputStream notifications = new SegmentedOutputStream(System.out); assertTrue(JUnitStarter.checkVersion(parameters.getProgramParametersList().getArray(), - new SegmentedOutputStream(System.out))); + new PrintStream(notifications))); assertTrue(parameters.getProgramParametersList().getList().contains(testA.getQualifiedName())); assertEquals(JUnitStarter.class.getName(), parameters.getMainClass()); assertEquals(myJdk.getHomeDirectory().getPresentableUrl(), parameters.getJdkPath()); diff --git a/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java b/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java index d5fec550859a..60318a25c2a7 100644 --- a/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java +++ b/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java @@ -17,15 +17,14 @@ package com.intellij.junit3; import com.intellij.rt.execution.junit.*; import com.intellij.rt.execution.junit.segments.OutputObjectRegistry; -import com.intellij.rt.execution.junit.segments.SegmentedOutputStream; +import com.intellij.rt.execution.junit.segments.PacketProcessor; +import jetbrains.buildServer.messages.serviceMessages.ServiceMessage; +import jetbrains.buildServer.messages.serviceMessages.ServiceMessageTypes; import junit.framework.*; import junit.textui.ResultPrinter; import junit.textui.TestRunner; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; -import java.util.Vector; +import java.util.*; public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner { private TestListener myTestsListener; @@ -39,7 +38,7 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner { public int startRunnerWithArgs(String[] args, ArrayList listeners, String name, int count, boolean sendTree) { myListeners = listeners; - mySendTree = sendTree; + mySendTree = sendTree && !(myTestsListener instanceof SMTestListener); if (sendTree) { setPrinter(new TimeSender(myRegistry)); } @@ -69,9 +68,13 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner { super.runFailed(message); } - public void setStreams(SegmentedOutputStream segmentedOut, SegmentedOutputStream segmentedErr, int lastIdx) { - myRegistry = new JUnit3OutputObjectRegistry(segmentedOut, lastIdx); - myTestsListener = new TestResultsSender(myRegistry); + public void setStreams(Object segmentedOut, Object segmentedErr, int lastIdx) { + if (JUnitStarter.SM_RUNNER) { + myTestsListener = new SMTestListener(); + } else { + myRegistry = new JUnit3OutputObjectRegistry((PacketProcessor)segmentedOut, lastIdx); + myTestsListener = new TestResultsSender(myRegistry); + } } public Object getTestToStart(String[] args, String name) { @@ -138,7 +141,11 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner { System.err.println("Internal Error occured."); e.printStackTrace(System.err); } - return super.doRun(suite, wait); + final TestResult testResult = super.doRun(suite, wait); + if (myTestsListener instanceof SMTestListener) { + ((SMTestListener)myTestsListener).finishSuite(); + } + return testResult; } static Vector getTestCasesOf(Test test) { @@ -163,4 +170,53 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner { super(DeafStream.DEAF_PRINT_STREAM); } } + + private static class SMTestListener implements TestListener { + private String myClassName; + + public void addError(Test test, Throwable e) { + final String failureMessage = e.getMessage(); + final Map attrs = new HashMap(); + attrs.put("name", getMethodName(test)); + attrs.put("message", failureMessage != null ? failureMessage : ""); + System.out.println(ServiceMessage.asString(ServiceMessageTypes.TEST_FAILED, attrs)); + } + + private static String getMethodName(Test test) { + final String toString = test.toString(); + final int braceIdx = toString.indexOf("("); + return braceIdx > 0 ? toString.substring(0, braceIdx) : toString; + } + + private static String getClassName(Test test) { + final String toString = test.toString(); + final int braceIdx = toString.indexOf("("); + return braceIdx > 0 && toString.endsWith(")") ? toString.substring(braceIdx + 1, toString.length() - 1) : null; + } + + public void addFailure(Test test, AssertionFailedError e) { + addError(test, e); + } + + public void endTest(Test test) { + System.out.println("\n##teamcity[testFinished name=\'" + getMethodName(test) + "\']"); + } + + public void startTest(Test test) { + final String className = getClassName(test); + if (className != null && !className.equals(myClassName)) { + finishSuite(); + myClassName = className; + System.out.println("##teamcity[testSuiteStarted name =\'" + myClassName + "\' locationHint=\'java:suite://" + className + "\']"); + } + final String methodName = getMethodName(test); + System.out.println("##teamcity[testStarted name=\'" + methodName + "\' locationHint=\'java:test://" + className + "." + methodName + "\']"); + } + + protected void finishSuite() { + if (myClassName != null) { + System.out.println("##teamcity[testSuiteFinished name=\'" + myClassName + "\']"); + } + } + } } diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java index 21ae31db25e3..7512a386d5d4 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java +++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java @@ -17,8 +17,7 @@ package com.intellij.junit4; import com.intellij.rt.execution.junit.*; import com.intellij.rt.execution.junit.segments.OutputObjectRegistry; -import com.intellij.rt.execution.junit.segments.Packet; -import com.intellij.rt.execution.junit.segments.SegmentedOutputStream; +import com.intellij.rt.execution.junit.segments.PacketProcessor; import org.junit.internal.requests.ClassRequest; import org.junit.internal.requests.FilterRequest; import org.junit.runner.*; @@ -183,11 +182,11 @@ public class JUnit4IdeaTestRunner implements IdeaTestRunner { } - public void setStreams(SegmentedOutputStream segmentedOut, SegmentedOutputStream segmentedErr, int lastIdx) { + public void setStreams(Object segmentedOut, Object segmentedErr, int lastIdx) { if (JUnitStarter.SM_RUNNER) { myTestsListener = new SMTestSender(); } else { - myRegistry = new JUnit4OutputObjectRegistry(segmentedOut, lastIdx); + myRegistry = new JUnit4OutputObjectRegistry((PacketProcessor)segmentedOut, lastIdx); myTestsListener = new JUnit4TestResultsSender(myRegistry); } } diff --git a/plugins/junit_rt/src/com/intellij/rt/execution/junit/IdeaTestRunner.java b/plugins/junit_rt/src/com/intellij/rt/execution/junit/IdeaTestRunner.java index a37c250b20a3..c6d9942f72da 100644 --- a/plugins/junit_rt/src/com/intellij/rt/execution/junit/IdeaTestRunner.java +++ b/plugins/junit_rt/src/com/intellij/rt/execution/junit/IdeaTestRunner.java @@ -21,7 +21,6 @@ package com.intellij.rt.execution.junit; import com.intellij.rt.execution.junit.segments.OutputObjectRegistry; -import com.intellij.rt.execution.junit.segments.SegmentedOutputStream; import java.util.ArrayList; import java.util.List; @@ -29,7 +28,7 @@ import java.util.List; public interface IdeaTestRunner { int startRunnerWithArgs(String[] args, ArrayList listeners, String name, int count, boolean sendTree); - void setStreams(SegmentedOutputStream segmentedOut, SegmentedOutputStream segmentedErr, int lastIdx); + void setStreams(Object segmentedOut, Object segmentedErr, int lastIdx); Object getTestToStart(String[] args, String name); List getChildTests(Object description); diff --git a/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitForkedStarter.java b/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitForkedStarter.java index 1cb4e9b4f169..8925177dfe08 100644 --- a/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitForkedStarter.java +++ b/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitForkedStarter.java @@ -72,8 +72,8 @@ public class JUnitForkedStarter { String[] args, boolean isJUnit4, List listeners, - String params, SegmentedOutputStream out, - SegmentedOutputStream err, + String params, Object out, + Object err, String forkMode, String path) throws Exception { final List parameters = new ArrayList(); @@ -178,8 +178,8 @@ public class JUnitForkedStarter { private static int processChildren(boolean isJUnit4, List listeners, - SegmentedOutputStream out, - SegmentedOutputStream err, + Object out, + Object err, List parameters, IdeaTestRunner testRunner, List children, @@ -206,8 +206,8 @@ public class JUnitForkedStarter { private static int runChild(boolean isJUnit4, List listeners, - SegmentedOutputStream out, - SegmentedOutputStream err, + Object out, + Object err, List parameters, String description, File workingDir, @@ -265,7 +265,9 @@ public class JUnitForkedStarter { final Process exec = builder.createProcess(); final int result = exec.waitFor(); - ForkedVMWrapper.readWrapped(testOutputPath, out.getPrintStream(), err.getPrintStream()); + ForkedVMWrapper.readWrapped(testOutputPath, + JUnitStarter.SM_RUNNER ? ((PrintStream)out) : ((SegmentedOutputStream)out).getPrintStream(), + JUnitStarter.SM_RUNNER ? ((PrintStream)err) : ((SegmentedOutputStream)err).getPrintStream()); return result; } } diff --git a/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java b/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java index 6ba413034184..7fce15057ead 100644 --- a/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java +++ b/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java @@ -51,8 +51,6 @@ public class JUnitStarter { } public static void main(String[] args) throws IOException { - SegmentedOutputStream out = new SegmentedOutputStream(System.out); - SegmentedOutputStream err = new SegmentedOutputStream(System.err); Vector argList = new Vector(); for (int i = 0; i < args.length; i++) { String arg = args[i]; @@ -64,18 +62,16 @@ public class JUnitStarter { boolean isJUnit4 = processParameters(argList, listeners, name); - if (!canWorkWithJUnitVersion(err, isJUnit4)) { - err.flush(); + if (!canWorkWithJUnitVersion(System.err, isJUnit4)) { System.exit(-3); } - if (!checkVersion(args, err)) { - err.flush(); + if (!checkVersion(args, System.err)) { System.exit(-3); } String[] array = new String[argList.size()]; argList.copyInto(array); - int exitCode = prepareStreamsAndStart(array, isJUnit4, listeners, name[0], out, err); + int exitCode = prepareStreamsAndStart(array, isJUnit4, listeners, name[0]); System.exit(exitCode); } @@ -171,15 +167,14 @@ public class JUnitStarter { } } - public static boolean checkVersion(String[] args, SegmentedOutputStream notifications) { + public static boolean checkVersion(String[] args, PrintStream printStream) { for (int i = 0; i < args.length; i++) { String arg = args[i]; if (arg.startsWith(IDE_VERSION)) { int ideVersion = Integer.parseInt(arg.substring(IDE_VERSION.length(), arg.length())); if (ideVersion != VERSION) { - PrintStream stream = new PrintStream(notifications); - stream.println("Wrong agent version: " + VERSION + ". IDE expects version: " + ideVersion); - stream.flush(); + printStream.println("Wrong agent version: " + VERSION + ". IDE expects version: " + ideVersion); + printStream.flush(); return false; } else return true; @@ -188,18 +183,17 @@ public class JUnitStarter { return false; } - private static boolean canWorkWithJUnitVersion(OutputStream notifications, boolean isJUnit4) { - final PrintStream stream = new PrintStream(notifications); + private static boolean canWorkWithJUnitVersion(PrintStream printStream, boolean isJUnit4) { try { junitVersionChecks(isJUnit4); } catch (Throwable e) { - stream.println("!!! JUnit version 3.8 or later expected:"); - stream.println(); - e.printStackTrace(stream); - stream.flush(); + printStream.println("!!! JUnit version 3.8 or later expected:"); + printStream.println(); + e.printStackTrace(printStream); + printStream.flush(); return false; } finally { - stream.flush(); + printStream.flush(); } return true; } @@ -214,20 +208,22 @@ public class JUnitStarter { private static int prepareStreamsAndStart(String[] args, final boolean isJUnit4, ArrayList listeners, - String name, - SegmentedOutputStream out, - SegmentedOutputStream err) { + String name) { PrintStream oldOut = System.out; PrintStream oldErr = System.err; try { - System.setOut(new PrintStream(out)); - System.setErr(new PrintStream(err)); + IdeaTestRunner testRunner = (IdeaTestRunner)getAgentClass(isJUnit4).newInstance(); + Object out = SM_RUNNER ? System.out : (Object)new SegmentedOutputStream(System.out); + Object err = SM_RUNNER ? System.err : (Object)new SegmentedOutputStream(System.err); + if (!SM_RUNNER) { + System.setOut(new PrintStream((OutputStream)out)); + System.setErr(new PrintStream((OutputStream)err)); + } if (ourCommandFileName != null) { if (!"none".equals(ourForkMode) || ourWorkingDirs != null && new File(ourWorkingDirs).length() > 0) { return JUnitForkedStarter.startForkedVMs(ourWorkingDirs, args, isJUnit4, listeners, name, out, err, ourForkMode, ourCommandFileName); } } - IdeaTestRunner testRunner = (IdeaTestRunner)getAgentClass(isJUnit4).newInstance(); testRunner.setStreams(out, err, 0); return testRunner.startRunnerWithArgs(args, listeners, name, ourCount, !SM_RUNNER); } From 5bd088c2f713536d8e1b870ad6995bda8747c11c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 15 Apr 2015 17:32:24 +0200 Subject: [PATCH 06/10] sm runner: allow multi-selection in tests view --- .../JavaAwareTestConsoleProperties.java | 6 ++++++ .../testframework/TestConsoleProperties.java | 7 +++++++ .../execution/testframework/TestTreeView.java | 14 +++++--------- .../execution/junit2/ui/JUnitTestTreeView.java | 6 ------ .../testng/ui/TestNGTestTreeView.java | 7 ------- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/testframework/JavaAwareTestConsoleProperties.java b/java/execution/impl/src/com/intellij/execution/testframework/JavaAwareTestConsoleProperties.java index 48a29d132de0..4c4c6e1e2eaa 100644 --- a/java/execution/impl/src/com/intellij/execution/testframework/JavaAwareTestConsoleProperties.java +++ b/java/execution/impl/src/com/intellij/execution/testframework/JavaAwareTestConsoleProperties.java @@ -30,6 +30,7 @@ import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.testframework.sm.runner.SMTRunnerConsoleProperties; import org.jetbrains.annotations.Nullable; +import javax.swing.tree.TreeSelectionModel; import java.util.Collection; public abstract class JavaAwareTestConsoleProperties & CommonJavaRunConfigurationParameters> extends SMTRunnerConsoleProperties { @@ -48,6 +49,11 @@ public abstract class JavaAwareTestConsoleProperties Date: Wed, 15 Apr 2015 18:43:02 +0200 Subject: [PATCH 07/10] sm testng: clear invocation count for new method --- .../src/org/testng/IDEATestNGRemoteListener.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java index db8f7b81dc68..4a3d76543e1b 100644 --- a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java +++ b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java @@ -64,11 +64,9 @@ public class IDEATestNGRemoteListener implements ISuiteListener, IResultListener private String getMethodName(ITestResult result, boolean changeCount) { String methodName = result.getMethod().getMethodName(); final Object[] parameters = result.getParameters(); - if (changeCount) { - if (!methodName.equals(myMethodName)) { - myInvocationCount = 0; - myMethodName = methodName; - } + if (!methodName.equals(myMethodName)) { + myInvocationCount = 0; + myMethodName = methodName; } if (parameters.length > 0) { final List invocationNumbers = result.getMethod().getInvocationNumbers(); From 8ddbfb53ed40dc38b5f999eb0d924f7ff67749c8 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 15 Apr 2015 19:09:10 +0200 Subject: [PATCH 08/10] testng: do not mark as test if all tests are disabled --- .../testng/util/TestNGUtil.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java b/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java index 565af249a27f..4c11b23b6575 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java +++ b/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java @@ -25,7 +25,6 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootModificationUtil; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.io.JarUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; @@ -191,21 +190,29 @@ public class TestNGUtil { if (element instanceof PsiClass) { PsiClass psiClass = (PsiClass) element; for (PsiMethod method : psiClass.getAllMethods()) { - if (AnnotationUtil.isAnnotated(method, TEST_ANNOTATION_FQN, false, true)) return true; + PsiAnnotation annotation = AnnotationUtil.findAnnotation(method, true, TEST_ANNOTATION_FQN); + if (annotation != null) { + if (checkDisabled) { + if (isDisabled(annotation)) continue; + } + return true; + } if (AnnotationUtil.isAnnotated(method, FACTORY_ANNOTATION_FQN, false, true)) return true; if (hasTestJavaDoc(method, checkJavadoc)) return true; } - return AnnotationUtil.isAnnotated(element, TEST_ANNOTATION_FQN, true, true); + return false; } else if (element instanceof PsiMethod) { //if it's a method, we check if the class it's in has a global @Test annotation PsiClass psiClass = ((PsiMethod)element).getContainingClass(); if (psiClass != null) { - if (AnnotationUtil.isAnnotated(psiClass, TEST_ANNOTATION_FQN, true, true)) { + final PsiAnnotation annotation = AnnotationUtil.findAnnotation(psiClass, true, TEST_ANNOTATION_FQN); + if (annotation != null) { + if (checkDisabled && isDisabled(annotation)) return false; //even if it has a global test, we ignore private methods boolean isPrivate = element.hasModifierProperty(PsiModifier.PRIVATE); return !isPrivate && !element.hasModifierProperty(PsiModifier.STATIC) && !hasConfig(element); } - if (hasTestJavaDoc(psiClass, checkJavadoc)) return true; + else if (hasTestJavaDoc(psiClass, checkJavadoc)) return true; } } return false; From 5fd8ec0cff37fdfb50a90aa546b0f1b69423acd2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 15 Apr 2015 20:01:00 +0200 Subject: [PATCH 09/10] testng: do not include classes with method level configs in suite; include success/fail of configuration method --- .../testng/model/TestClassFilter.java | 2 +- .../testng/util/TestNGUtil.java | 27 ++++++++++++++++--- .../org/testng/IDEATestNGRemoteListener.java | 19 +++++++++---- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/plugins/testng/src/com/theoryinpractice/testng/model/TestClassFilter.java b/plugins/testng/src/com/theoryinpractice/testng/model/TestClassFilter.java index 6570b55b53af..b7f3219a0a72 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/model/TestClassFilter.java +++ b/plugins/testng/src/com/theoryinpractice/testng/model/TestClassFilter.java @@ -94,7 +94,7 @@ public class TestClassFilter implements ClassFilter.ClassFilterWithScope return true; } - return includeConfig && TestNGUtil.hasConfig(psiClass); + return includeConfig && TestNGUtil.hasConfig(psiClass, TestNGUtil.CONFIG_ANNOTATIONS_FQN_NO_TEST_LEVEL); } }); } diff --git a/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java b/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java index 4c11b23b6575..38fd89d5e695 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java +++ b/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java @@ -90,6 +90,20 @@ public class TestNGUtil { AfterTest.class.getName() }; + @SuppressWarnings("deprecation") public static final String[] CONFIG_ANNOTATIONS_FQN_NO_TEST_LEVEL = { + Configuration.class.getName(), + Factory.class.getName(), + ObjectFactory.class.getName(), + BeforeClass.class.getName(), + BeforeGroups.class.getName(), + BeforeSuite.class.getName(), + BeforeTest.class.getName(), + AfterClass.class.getName(), + AfterGroups.class.getName(), + AfterSuite.class.getName(), + AfterTest.class.getName() + }; + @NonNls private static final String[] CONFIG_JAVADOC_TAGS = { "testng.configuration", @@ -112,19 +126,24 @@ public class TestNGUtil { private static final String SUITE_TAG_NAME = "suite"; public static boolean hasConfig(PsiModifierListOwner element) { + return hasConfig(element, CONFIG_ANNOTATIONS_FQN); + } + + public static boolean hasConfig(PsiModifierListOwner element, + String[] configAnnotationsFqn) { if (element instanceof PsiClass) { for (PsiMethod method : ((PsiClass)element).getAllMethods()) { - if (isConfigMethod(method)) return true; + if (isConfigMethod(method, configAnnotationsFqn)) return true; } } else { if (!(element instanceof PsiMethod)) return false; - return isConfigMethod((PsiMethod)element); + return isConfigMethod((PsiMethod)element, configAnnotationsFqn); } return false; } - private static boolean isConfigMethod(PsiMethod method) { - for (String fqn : CONFIG_ANNOTATIONS_FQN) { + private static boolean isConfigMethod(PsiMethod method, String[] configAnnotationsFqn) { + for (String fqn : configAnnotationsFqn) { if (AnnotationUtil.isAnnotated(method, fqn, false)) return true; } diff --git a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java index 4a3d76543e1b..303ae5bc6125 100644 --- a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java +++ b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java @@ -21,16 +21,25 @@ public class IDEATestNGRemoteListener implements ISuiteListener, IResultListener private String myMethodName; private int myInvocationCount = 0; - public void onConfigurationSuccess(ITestResult itr) { - //won't be called + public void onConfigurationSuccess(ITestResult result) { + final String className = result.getTestClass().getName(); + System.out.println("##teamcity[testSuiteStarted name=\'" + className + "\']"); + final String methodName = result.getMethod().getMethodName(); + System.out.println("##teamcity[testStarted name=\'" + methodName + "\']"); + onTestSuccess(result); + System.out.println("\n##teamcity[testSuiteFinished name=\'" + className + "\']"); } - public void onConfigurationFailure(ITestResult itr) { - //won't be called + public void onConfigurationFailure(ITestResult result) { + final String className = result.getTestClass().getName(); + System.out.println("##teamcity[testSuiteStarted name=\'" + className + "\']"); + final String methodName = result.getMethod().getMethodName(); + System.out.println("##teamcity[testStarted name=\'" + methodName + "\']"); + onTestFailure(result); + System.out.println("\n##teamcity[testSuiteFinished name=\'" + className + "\']"); } public void onConfigurationSkip(ITestResult itr) { - //won't be called } public void onStart(ISuite suite) { From b581e3c5ebc64c6438085dbd77063cd57d9e744d Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Wed, 15 Apr 2015 21:18:15 +0300 Subject: [PATCH 10/10] EA-67821 --- .../org/editorconfig/configmanagement/LineEndingsManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java index a65d00796699..0cfd3d6e9b36 100644 --- a/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java +++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/LineEndingsManager.java @@ -48,7 +48,7 @@ public class LineEndingsManager extends FileDocumentManagerAdapter { @Override public void run() { IdeFrame frame = WindowManager.getInstance().getIdeFrame(myProject); - StatusBar statusBar = frame.getStatusBar(); + StatusBar statusBar = frame != null ? frame.getStatusBar() : null; StatusBarWidget widget = statusBar != null ? statusBar.getWidget("LineSeparator") : null; if (widget instanceof LineSeparatorPanel) {