diff --git a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java index bc75c4f1359d..f98778128f5d 100644 --- a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java +++ b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java @@ -45,6 +45,7 @@ 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.StringUtil; import com.intellij.openapi.util.text.StringUtilRt; import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.psi.JavaPsiFacade; @@ -195,6 +196,11 @@ public abstract class JavaTestFrameworkRunnableState 0) { diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java index ce777ae383bb..950138652b22 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java @@ -20,21 +20,20 @@ */ package com.theoryinpractice.testng.configuration; -import com.intellij.execution.*; +import com.intellij.execution.JavaExecutionUtil; +import com.intellij.execution.Location; +import com.intellij.execution.RunManager; +import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.RunConfigurationProducer; import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.execution.impl.RunManagerImpl; -import com.intellij.execution.junit.JUnitUtil; import com.intellij.execution.junit.JavaRunConfigurationProducerBase; -import com.intellij.execution.junit.JavaRuntimeConfigurationProducerBase; +import com.intellij.execution.junit2.PsiMemberParameterizedLocation; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.Comparing; -import com.intellij.psi.*; +import com.intellij.psi.PsiElement; import com.theoryinpractice.testng.model.TestData; -import org.jetbrains.annotations.NotNull; - -import java.util.List; +import org.testng.IDEATestNGRemoteListener; public abstract class TestNGConfigurationProducer extends JavaRunConfigurationProducerBase implements Cloneable { @@ -48,13 +47,17 @@ public abstract class TestNGConfigurationProducer extends JavaRunConfigurationPr return false; } final RunConfiguration predefinedConfiguration = context.getOriginalConfiguration(TestNGConfigurationType.getInstance()); - Location location = JavaExecutionUtil.stepIntoSingleClass(context.getLocation()); + final Location contextLocation = context.getLocation(); + Location location = JavaExecutionUtil.stepIntoSingleClass(contextLocation); final PsiElement element = location.getPsiElement(); RunnerAndConfigurationSettings template = RunManager.getInstance(location.getProject()).getConfigurationTemplate(getConfigurationFactory()); final Module predefinedModule = ((TestNGConfiguration)template.getConfiguration()).getConfigurationModule().getModule(); final String vmParameters = predefinedConfiguration instanceof TestNGConfiguration ? ((TestNGConfiguration)predefinedConfiguration).getVMParameters() : null; if (vmParameters != null && !Comparing.strEqual(vmParameters, testNGConfiguration.getVMParameters())) return false; + String paramSetName = contextLocation instanceof PsiMemberParameterizedLocation + ? getInvocationNumber(((PsiMemberParameterizedLocation)contextLocation).getParamSetName()) : null; + if (paramSetName != null && !Comparing.strEqual(paramSetName, testNGConfiguration.getProgramParameters())) return false; TestData testobject = testNGConfiguration.getPersistantData(); if (testobject != null) { if (testobject.isConfiguredByElement(element)) { @@ -65,4 +68,15 @@ public abstract class TestNGConfigurationProducer extends JavaRunConfigurationPr } return false; } + + protected static String getInvocationNumber(String str) { + final int indexOf = str.indexOf(IDEATestNGRemoteListener.INVOCATION_NUMBER); + if (indexOf > 0) { + final int lastIdx = str.indexOf(")", indexOf); + if (lastIdx > 0) { + return str.substring(indexOf + IDEATestNGRemoteListener.INVOCATION_NUMBER.length(), lastIdx); + } + } + return null; + } } \ No newline at end of file diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGInClassConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGInClassConfigurationProducer.java index fdc1387f3c57..497967e352cf 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGInClassConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGInClassConfigurationProducer.java @@ -20,12 +20,14 @@ */ package com.theoryinpractice.testng.configuration; +import com.intellij.execution.Location; import com.intellij.execution.PsiLocation; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.execution.actions.RunConfigurationProducer; import com.intellij.execution.junit.InheritorChooser; +import com.intellij.execution.junit2.PsiMemberParameterizedLocation; import com.intellij.execution.junit2.info.MethodLocation; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -100,6 +102,14 @@ public class TestNGInClassConfigurationProducer extends TestNGConfigurationProdu return false; } + final Location contextLocation = context.getLocation(); + if (contextLocation instanceof PsiMemberParameterizedLocation) { + final String paramSetName = getInvocationNumber(((PsiMemberParameterizedLocation)contextLocation).getParamSetName()); + if (paramSetName != null) { + configuration.setProgramParameters(paramSetName); + } + } + PsiClass psiClass = null; PsiElement element = context.getPsiLocation(); while (element != null) { diff --git a/plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java b/plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java index f0f8fd96c975..cb55ecda63aa 100644 --- a/plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java +++ b/plugins/testng_rt/src/org/testng/IDEARemoteTestNG.java @@ -19,14 +19,21 @@ package org.testng; import jetbrains.buildServer.messages.serviceMessages.ServiceMessage; import org.testng.collections.Lists; import org.testng.xml.XmlClass; +import org.testng.xml.XmlInclude; import org.testng.xml.XmlSuite; import org.testng.xml.XmlTest; +import java.util.Arrays; import java.util.HashMap; import java.util.List; public class IDEARemoteTestNG extends TestNG { + private final String myParam; + public IDEARemoteTestNG(String param) { + myParam = param; + } + private static void calculateAllSuites(List suites, List outSuites) { for (XmlSuite s : suites) { outSuites.add(s); @@ -50,6 +57,12 @@ public class IDEARemoteTestNG extends TestNG { for (XmlTest test : tests) { for (XmlClass aClass : test.getXmlClasses()) { System.out.println("##teamcity[suiteTreeStarted name=\'" + aClass.getName() + "\' locationHint=\'java:suite://" + aClass.getName() + "\']"); + if (myParam != null) { + for (XmlInclude include : aClass.getIncludedMethods()) { + aClass.setIncludedMethods(Arrays.asList(new XmlInclude(include.getName(), Arrays.asList(Integer.parseInt(myParam)), 0))); + } + } + System.out.println("##teamcity[suiteTreeEnded name=\'" + aClass.getName() + "\']"); } testCount += test.getClasses().size(); @@ -60,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()); - addListener((ITestListener) new IDEATestNGRemoteListener()); + addListener((ISuiteListener) new IDEATestNGRemoteListener(myParam)); + addListener((ITestListener) new IDEATestNGRemoteListener(myParam)); super.run(); } else { diff --git a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java index f8413d1c7943..8aa1176d245a 100644 --- a/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java +++ b/plugins/testng_rt/src/org/testng/IDEATestNGRemoteListener.java @@ -15,7 +15,15 @@ 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 @@ -46,17 +54,31 @@ public class IDEATestNGRemoteListener implements ISuiteListener, IResultListener } System.out.println("##teamcity[testSuiteStarted name =\'" + className + "\']"); myCurrentClassName = className; + myInvocationCount = 0; } - String methodName = getMethodName(result); + String methodName = getMethodName(result, false); System.out.println("##teamcity[testStarted name=\'" + methodName + "\' locationHint=\'java:test://" + className + "." + methodName + "\']"); } - private static String getMethodName(ITestResult result) { + private String getMethodName(ITestResult result) { + return getMethodName(result, true); + } + + 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 (parameters.length > 0) { - methodName += "[" + parameters[0].toString() + "]"; + methodName += "[" + parameters[0].toString() + (myParam == null ? (" (" + INVOCATION_NUMBER + myInvocationCount + ")") : "") + "]"; + if (changeCount) { + myInvocationCount++; + } } return methodName; } @@ -77,13 +99,14 @@ public class IDEATestNGRemoteListener implements ISuiteListener, IResultListener final Throwable ex = result.getThrowable(); final String trace = getTrace(ex); final Map attrs = new HashMap(); - attrs.put("name", getMethodName(result)); + final String methodName = getMethodName(result); + attrs.put("name", methodName); final String failureMessage = ex.getMessage(); attrs.put("message", failureMessage != null ? failureMessage : ""); attrs.put("details", trace); attrs.put("error", "true"); System.out.println(ServiceMessage.asString(ServiceMessageTypes.TEST_FAILED, attrs)); - System.out.println("##teamcity[testFinished name=\'" + getMethodName(result) + "\']"); + System.out.println("##teamcity[testFinished name=\'" + methodName + "\']"); } public void onTestSkipped(ITestResult result) { diff --git a/plugins/testng_rt/src/org/testng/RemoteTestNGStarter.java b/plugins/testng_rt/src/org/testng/RemoteTestNGStarter.java index 3aa287ec66a1..8068d099ee99 100644 --- a/plugins/testng_rt/src/org/testng/RemoteTestNGStarter.java +++ b/plugins/testng_rt/src/org/testng/RemoteTestNGStarter.java @@ -38,10 +38,14 @@ public class RemoteTestNGStarter { private static final String SOCKET = "-socket"; public static void main(String[] args) throws Exception { int i = 0; + String param = null; Vector resultArgs = new Vector(); for (; i < args.length; i++) { String arg = args[i]; - if (arg.startsWith(SOCKET)) { + if (arg.startsWith("@name")) { + param = arg.substring(5); + continue; + } else if (arg.startsWith(SOCKET)) { final int port = Integer.parseInt(arg.substring(SOCKET.length())); try { final Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), port); //start collecting tests @@ -95,7 +99,7 @@ public class RemoteTestNGStarter { } if (SM_RUNNER) { - final IDEARemoteTestNG testNG = new IDEARemoteTestNG(); + final IDEARemoteTestNG testNG = new IDEARemoteTestNG(param); CommandLineArgs cla = new CommandLineArgs(); RemoteArgs ra = new RemoteArgs(); new JCommander(Arrays.asList(cla, ra), (String[])resultArgs.toArray(new String[resultArgs.size()]));