Added beforeConfiguration() to IConfigurationListener.
diff --git a/src/main/java/org/testng/internal/IConfigurationListener.java b/src/main/java/org/testng/IConfigurationListener.java
similarity index 78%
rename from src/main/java/org/testng/internal/IConfigurationListener.java
rename to src/main/java/org/testng/IConfigurationListener.java
index a38fe6c..19e0b9b 100755
--- a/src/main/java/org/testng/internal/IConfigurationListener.java
+++ b/src/main/java/org/testng/IConfigurationListener.java
@@ -1,12 +1,15 @@
-package org.testng.internal;
-
-import org.testng.ITestNGListener;
-import org.testng.ITestResult;
+package org.testng;
/**
* Listener interface for events related to configuration methods.
*/
public interface IConfigurationListener extends ITestNGListener {
+
+ /**
+ * Invoked before a configuration method is invoked.
+ */
+ void beforeConfiguration(ITestResult tr);
+
/**
* Invoked whenever a configuration method succeeded.
*/
diff --git a/src/main/java/org/testng/SuiteRunner.java b/src/main/java/org/testng/SuiteRunner.java
index f7de79d..176fe93 100644
--- a/src/main/java/org/testng/SuiteRunner.java
+++ b/src/main/java/org/testng/SuiteRunner.java
@@ -7,7 +7,6 @@
import org.testng.internal.AnnotationTypeEnum;
import org.testng.internal.Attributes;
import org.testng.internal.IConfiguration;
-import org.testng.internal.IConfigurationListener;
import org.testng.internal.IInvoker;
import org.testng.internal.Utils;
import org.testng.internal.annotations.IAnnotationFinder;
diff --git a/src/main/java/org/testng/TestListenerAdapter.java b/src/main/java/org/testng/TestListenerAdapter.java
index dce2587..973bfa8 100755
--- a/src/main/java/org/testng/TestListenerAdapter.java
+++ b/src/main/java/org/testng/TestListenerAdapter.java
@@ -145,7 +145,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
*/
@Override
public void onConfigurationFailure(ITestResult itr) {
@@ -156,8 +156,12 @@
return m_skippedConfs;
}
+ @Override
+ public void beforeConfiguration(ITestResult tr) {
+ }
+
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
*/
@Override
public void onConfigurationSkip(ITestResult itr) {
@@ -165,7 +169,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
*/
@Override
public void onConfigurationSuccess(ITestResult itr) {
diff --git a/src/main/java/org/testng/TestNG.java b/src/main/java/org/testng/TestNG.java
index daf7924..fb82d89 100644
--- a/src/main/java/org/testng/TestNG.java
+++ b/src/main/java/org/testng/TestNG.java
@@ -15,7 +15,6 @@
import org.testng.internal.Configuration;
import org.testng.internal.DynamicGraph;
import org.testng.internal.IConfiguration;
-import org.testng.internal.IConfigurationListener;
import org.testng.internal.IResultListener;
import org.testng.internal.OverrideProcessor;
import org.testng.internal.Utils;
@@ -1799,6 +1798,10 @@
}
@Override
+ public void beforeConfiguration(ITestResult tr) {
+ }
+
+ @Override
public void onTestFailure(ITestResult result) {
setHasRunTests();
m_mainRunner.setStatus(HAS_FAILURE);
@@ -1840,7 +1843,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
*/
@Override
public void onConfigurationFailure(ITestResult itr) {
@@ -1848,7 +1851,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
*/
@Override
public void onConfigurationSkip(ITestResult itr) {
@@ -1856,7 +1859,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
*/
@Override
public void onConfigurationSuccess(ITestResult itr) {
diff --git a/src/main/java/org/testng/TestRunner.java b/src/main/java/org/testng/TestRunner.java
index b2431f5..d7081b3 100644
--- a/src/main/java/org/testng/TestRunner.java
+++ b/src/main/java/org/testng/TestRunner.java
@@ -13,7 +13,6 @@
import org.testng.internal.Constants;
import org.testng.internal.DynamicGraph;
import org.testng.internal.IConfiguration;
-import org.testng.internal.IConfigurationListener;
import org.testng.internal.IInvoker;
import org.testng.internal.ITestResultNotifier;
import org.testng.internal.InvokedMethod;
@@ -1751,6 +1750,10 @@
private class ConfigurationListener implements IConfigurationListener {
@Override
+ public void beforeConfiguration(ITestResult tr) {
+ }
+
+ @Override
public void onConfigurationFailure(ITestResult itr) {
m_failedConfigurations.addResult(itr, itr.getMethod());
}
diff --git a/src/main/java/org/testng/internal/Configuration.java b/src/main/java/org/testng/internal/Configuration.java
index 6f882e2..47aaeb9 100644
--- a/src/main/java/org/testng/internal/Configuration.java
+++ b/src/main/java/org/testng/internal/Configuration.java
@@ -1,6 +1,7 @@
package org.testng.internal;
import org.testng.IConfigurable;
+import org.testng.IConfigurationListener;
import org.testng.IExecutionListener;
import org.testng.IHookable;
import org.testng.ITestObjectFactory;
diff --git a/src/main/java/org/testng/internal/IConfiguration.java b/src/main/java/org/testng/internal/IConfiguration.java
index 8fac109..2791b06 100644
--- a/src/main/java/org/testng/internal/IConfiguration.java
+++ b/src/main/java/org/testng/internal/IConfiguration.java
@@ -1,6 +1,7 @@
package org.testng.internal;
import org.testng.IConfigurable;
+import org.testng.IConfigurationListener;
import org.testng.IExecutionListener;
import org.testng.IHookable;
import org.testng.ITestObjectFactory;
diff --git a/src/main/java/org/testng/internal/IResultListener.java b/src/main/java/org/testng/internal/IResultListener.java
index ccfd3d1..29ef001 100755
--- a/src/main/java/org/testng/internal/IResultListener.java
+++ b/src/main/java/org/testng/internal/IResultListener.java
@@ -1,5 +1,6 @@
package org.testng.internal;
+import org.testng.IConfigurationListener;
import org.testng.ITestListener;
diff --git a/src/main/java/org/testng/internal/ITestResultNotifier.java b/src/main/java/org/testng/internal/ITestResultNotifier.java
index dc72e40..c801a27 100755
--- a/src/main/java/org/testng/internal/ITestResultNotifier.java
+++ b/src/main/java/org/testng/internal/ITestResultNotifier.java
@@ -1,5 +1,6 @@
package org.testng.internal;
+import org.testng.IConfigurationListener;
import org.testng.ITestListener;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
diff --git a/src/main/java/org/testng/internal/Invoker.java b/src/main/java/org/testng/internal/Invoker.java
index de34fc2..c91b106 100644
--- a/src/main/java/org/testng/internal/Invoker.java
+++ b/src/main/java/org/testng/internal/Invoker.java
@@ -2,6 +2,7 @@
import org.testng.IClass;
import org.testng.IConfigurable;
+import org.testng.IConfigurationListener;
import org.testng.IHookable;
import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
@@ -199,12 +200,14 @@
Object[] newInstances= (null != instance) ? new Object[] { instance } : instances;
+ runConfigurationListeners(testResult, true /* before */);
+
invokeConfigurationMethod(newInstances, tm,
parameters, isClassConfiguration, isSuiteConfiguration, testResult);
// TODO: probably we should trigger the event for each instance???
testResult.setEndMillis(System.currentTimeMillis());
- runConfigurationListeners(testResult);
+ runConfigurationListeners(testResult, false /* after */);
}
else {
log(3,
@@ -247,7 +250,7 @@
XmlSuite suite) {
recordConfigurationInvocationFailed(tm, testResult.getTestClass(), annotation, currentTestMethod, instance, suite);
testResult.setStatus(ITestResult.SKIP);
- runConfigurationListeners(testResult);
+ runConfigurationListeners(testResult, false /* after */);
}
/**
@@ -320,7 +323,7 @@
Utils.log("", 3, "Failed to invoke configuration method "
+ tm.getRealClass().getName() + "." + tm.getMethodName() + ":" + cause.getMessage());
handleException(cause, tm, testResult, 1);
- runConfigurationListeners(testResult);
+ runConfigurationListeners(testResult, false /* after */);
//
// If in TestNG mode, need to take a look at the annotation to figure out
@@ -1787,18 +1790,24 @@
return result;
}
- private void runConfigurationListeners(ITestResult tr) {
- for(IConfigurationListener icl: m_notifier.getConfigurationListeners()) {
- switch(tr.getStatus()) {
- case ITestResult.SKIP:
- icl.onConfigurationSkip(tr);
- break;
- case ITestResult.FAILURE:
- icl.onConfigurationFailure(tr);
- break;
- case ITestResult.SUCCESS:
- icl.onConfigurationSuccess(tr);
- break;
+ private void runConfigurationListeners(ITestResult tr, boolean before) {
+ if (before) {
+ for(IConfigurationListener icl: m_notifier.getConfigurationListeners()) {
+ icl.beforeConfiguration(tr);
+ }
+ } else {
+ for(IConfigurationListener icl: m_notifier.getConfigurationListeners()) {
+ switch(tr.getStatus()) {
+ case ITestResult.SKIP:
+ icl.onConfigurationSkip(tr);
+ break;
+ case ITestResult.FAILURE:
+ icl.onConfigurationFailure(tr);
+ break;
+ case ITestResult.SUCCESS:
+ icl.onConfigurationSuccess(tr);
+ break;
+ }
}
}
}
diff --git a/src/main/java/org/testng/remote/strprotocol/RemoteTestListener.java b/src/main/java/org/testng/remote/strprotocol/RemoteTestListener.java
index c16fe85..b33c356 100755
--- a/src/main/java/org/testng/remote/strprotocol/RemoteTestListener.java
+++ b/src/main/java/org/testng/remote/strprotocol/RemoteTestListener.java
@@ -50,6 +50,10 @@
}
@Override
+ public void beforeConfiguration(ITestResult tr) {
+ }
+
+ @Override
public void onTestFailedButWithinSuccessPercentage(ITestResult testResult) {
if (null == m_currentTestContext) {
m_sender.sendMessage(new TestResultMessage(m_suite.getName(), m_xmlTest.getName(), testResult));
@@ -90,7 +94,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
*/
@Override
public void onConfigurationFailure(ITestResult itr) {
@@ -98,7 +102,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
*/
@Override
public void onConfigurationSkip(ITestResult itr) {
@@ -106,7 +110,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
*/
@Override
public void onConfigurationSuccess(ITestResult itr) {
diff --git a/src/main/java/org/testng/reporters/JUnitXMLReporter.java b/src/main/java/org/testng/reporters/JUnitXMLReporter.java
index 81dbccc..3ee7539 100755
--- a/src/main/java/org/testng/reporters/JUnitXMLReporter.java
+++ b/src/main/java/org/testng/reporters/JUnitXMLReporter.java
@@ -61,6 +61,10 @@
public void onTestStart(ITestResult result) {
}
+ @Override
+ public void beforeConfiguration(ITestResult tr) {
+ }
+
/**
* Invoked each time a test succeeds.
*/
@@ -116,7 +120,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
*/
@Override
public void onConfigurationFailure(ITestResult itr) {
@@ -124,7 +128,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
*/
@Override
public void onConfigurationSkip(ITestResult itr) {
@@ -132,7 +136,7 @@
}
/**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
+ * @see org.testng.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
*/
@Override
public void onConfigurationSuccess(ITestResult itr) {
diff --git a/src/main/java/org/testng/reporters/JUnitXMLReporter2.java b/src/main/java/org/testng/reporters/JUnitXMLReporter2.java
deleted file mode 100755
index 88c6d6b..0000000
--- a/src/main/java/org/testng/reporters/JUnitXMLReporter2.java
+++ /dev/null
@@ -1,233 +0,0 @@
-package org.testng.reporters;
-
-
-import org.testng.ITestContext;
-import org.testng.ITestResult;
-import org.testng.collections.Lists;
-import org.testng.internal.IResultListener;
-import org.testng.internal.Utils;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-/**
- * this XML Reporter will produce XML format compatible with the XMLJUnitResultFormatter from ant
- * this enables TestNG output to be processed by tools that already handle this format
- *
- * borrows heavily from ideas in org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter
- *
- * this is the original version which was replaced by JUnitXMLReporter
- * @TODO: clean up
- */
-public class JUnitXMLReporter2 implements IResultListener {
-
- private String m_outputFileName= null;
- private File m_outputFile= null;
- private ITestContext m_testContext= null;
-
- /**
- * keep lists of all the results
- */
- private int m_numPassed= 0;
- private int m_numFailed= 0;
- private int m_numSkipped= 0;
- private int m_numFailedButIgnored= 0;
- private List<ITestResult> m_allTests
- = Collections.synchronizedList(Lists.<ITestResult>newArrayList());
- private List<ITestResult> m_configIssues
- = Collections.synchronizedList(Lists.<ITestResult>newArrayList());
-
- @Override
- public void onTestStart(ITestResult result) {
- }
-
- /**
- * Invoked each time a test succeeds.
- */
- @Override
- public void onTestSuccess(ITestResult tr) {
- m_allTests.add(tr);
- m_numPassed++;
- }
-
- @Override
- public void onTestFailedButWithinSuccessPercentage(ITestResult tr) {
- m_allTests.add(tr);
- m_numFailedButIgnored++;
- }
-
- /**
- * Invoked each time a test fails.
- */
- @Override
- public void onTestFailure(ITestResult tr) {
- m_allTests.add(tr);
- m_numFailed++;
- }
-
- /**
- * Invoked each time a test is skipped.
- */
- @Override
- public void onTestSkipped(ITestResult tr) {
- m_allTests.add(tr);
- m_numSkipped++;
- }
-
- /**
- * Invoked after the test class is instantiated and before
- * any configuration method is called.
- *
- */
- @Override
- public void onStart(ITestContext context) {
- m_outputFileName= context.getOutputDirectory() + File.separator + context.getName() + ".xml";
- m_outputFile= new File(m_outputFileName);
- m_testContext= context;
- }
-
- /**
- * Invoked after all the tests have run and all their
- * Configuration methods have been called.
- *
- */
- @Override
- public void onFinish(ITestContext context) {
- generateReport();
- }
-
- /**
- * generate the XML report given what we know from all the test results
- */
- protected void generateReport() {
- try {
- DocumentBuilderFactory docBuilderFactory= DocumentBuilderFactory.newInstance();
- docBuilderFactory.setNamespaceAware(true); // so we can transform it later
- DocumentBuilder docBuilder= docBuilderFactory.newDocumentBuilder();
- Document d= docBuilder.newDocument();
- Element rootElement= d.createElement(XMLConstants.TESTSUITE);
- rootElement.setAttribute(XMLConstants.ATTR_NAME, m_testContext.getName());
-
- Element propsElement= d.createElement(XMLConstants.PROPERTIES);
- rootElement.appendChild(propsElement);
-
- // properties. just TestNG properties or also System properties?
-
- rootElement.setAttribute(XMLConstants.ATTR_TESTS, "" + m_allTests.size());
- rootElement.setAttribute(XMLConstants.ATTR_FAILURES, "" + m_numFailed);
- rootElement.setAttribute(XMLConstants.ATTR_ERRORS, "0"); // FIXME
-
- long elapsedTimeMillis= m_testContext.getEndDate().getTime()
- - m_testContext.getStartDate().getTime();
- rootElement.setAttribute(XMLConstants.ATTR_TIME, "" + (elapsedTimeMillis / 1000.0));
-
- for(ITestResult tr: m_configIssues) {
- Element element= createElement(d, tr);
- rootElement.appendChild(element);
- }
- for(ITestResult tr : m_allTests) {
- Element testCaseElement= createElement(d, tr);
- rootElement.appendChild(testCaseElement);
- }
-
- BufferedWriter fw= new BufferedWriter(new FileWriter(m_outputFile));
-
- Transformer transformer= TransformerFactory.newInstance().newTransformer();
- transformer.transform(new DOMSource(rootElement), new StreamResult(fw));
- fw.flush();
- fw.close();
- }
- catch(IOException ioe) {
- ioe.printStackTrace();
- System.err.println("failed to create JUnitXML because of " + ioe);
- }
- catch(ParserConfigurationException pce) {
- pce.printStackTrace();
- System.err.println("failed to create JUnitXML because of " + pce);
- }
- catch(TransformerException te) {
- te.printStackTrace();
- System.err.println("Error while writing out JUnitXML because of " + te);
- }
- }
-
- private Element createElement(Document doc, ITestResult tr) {
- Element resultElement= doc.createElement(XMLConstants.TESTCASE);
- long elapsedTimeMillis= tr.getEndMillis() - tr.getStartMillis();
- String name= tr.getMethod().isTest() ? tr.getName() : Utils.detailedMethodName(tr.getMethod(), false);
- resultElement.setAttribute(XMLConstants.ATTR_NAME, name);
- resultElement.setAttribute(XMLConstants.ATTR_CLASSNAME,
- tr.getTestClass().getRealClass().getName());
- resultElement.setAttribute(XMLConstants.ATTR_TIME,
- "" + ((double) elapsedTimeMillis)/1000);
- if (ITestResult.FAILURE == tr.getStatus()) {
- Element nested = createFailureElement(doc, tr);
- resultElement.appendChild(nested);
- }
- else if (ITestResult.SKIP == tr.getStatus()) {
- Element nested = createSkipElement(doc, tr);
- resultElement.appendChild(nested);
- }
-
- return resultElement;
- }
-
- private Element createFailureElement(Document doc, ITestResult tr) {
- Element nested= doc.createElement(XMLConstants.FAILURE);
- Throwable t = tr.getThrowable();
- if (t != null) {
- nested.setAttribute(XMLConstants.ATTR_TYPE, t.getClass().getName());
- String message = t.getMessage();
- if ((message != null) && (message.length() > 0)) {
- nested.setAttribute(XMLConstants.ATTR_MESSAGE, message);
- }
- CDATASection trace= doc.createCDATASection(Utils.stackTrace(t, false)[0]);
- nested.appendChild(trace);
- }
-
- return nested;
- }
-
- private Element createSkipElement(Document doc, ITestResult tr) {
- return doc.createElement("skipped");
- }
-
- /**
- * @see org.testng.internal.IConfigurationListener#onConfigurationFailure(org.testng.ITestResult)
- */
- @Override
- public void onConfigurationFailure(ITestResult itr) {
- m_configIssues.add(itr);
- }
-
- /**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSkip(org.testng.ITestResult)
- */
- @Override
- public void onConfigurationSkip(ITestResult itr) {
- m_configIssues.add(itr);
- }
-
- /**
- * @see org.testng.internal.IConfigurationListener#onConfigurationSuccess(org.testng.ITestResult)
- */
- @Override
- public void onConfigurationSuccess(ITestResult itr) {
- }
-}
diff --git a/src/test/java/test/listeners/ConfigurationListenerTest.java b/src/test/java/test/listeners/ConfigurationListenerTest.java
index 19acca1..6670779 100644
--- a/src/test/java/test/listeners/ConfigurationListenerTest.java
+++ b/src/test/java/test/listeners/ConfigurationListenerTest.java
@@ -1,10 +1,10 @@
package test.listeners;
import org.testng.Assert;
+import org.testng.IConfigurationListener;
import org.testng.ITestResult;
import org.testng.TestNG;
import org.testng.annotations.Test;
-import org.testng.internal.IConfigurationListener;
import test.SimpleBaseTest;
@@ -15,20 +15,25 @@
private static int m_status = 0;
@Override
- public void onConfigurationSuccess(ITestResult itr) {
+ public void beforeConfiguration(ITestResult tr) {
m_status += 1;
}
@Override
- public void onConfigurationFailure(ITestResult itr) {
+ public void onConfigurationSuccess(ITestResult itr) {
m_status += 3;
}
@Override
- public void onConfigurationSkip(ITestResult itr) {
+ public void onConfigurationFailure(ITestResult itr) {
m_status += 5;
}
-
+
+ @Override
+ public void onConfigurationSkip(ITestResult itr) {
+ m_status += 7;
+ }
+
}
private void runTest(Class<?> cls, int expected) {
@@ -43,16 +48,16 @@
@Test
public void shouldSucceed() {
- runTest(ConfigurationListenerSucceedSampleTest.class, 1);
+ runTest(ConfigurationListenerSucceedSampleTest.class, 1 + 3);
}
@Test
public void shouldFail() {
- runTest(ConfigurationListenerFailSampleTest.class, 3);
+ runTest(ConfigurationListenerFailSampleTest.class, 1 + 5);
}
@Test
public void shouldSkip() {
- runTest(ConfigurationListenerSkipSampleTest.class, 8); // fail + skip
+ runTest(ConfigurationListenerSkipSampleTest.class, 1 + 5 + 7); // fail + skip
}
}
diff --git a/src/test/java/test/listeners/ResultListener.java b/src/test/java/test/listeners/ResultListener.java
index 8f3cfc9..5dc40f8 100644
--- a/src/test/java/test/listeners/ResultListener.java
+++ b/src/test/java/test/listeners/ResultListener.java
@@ -15,6 +15,10 @@
}
@Override
+ public void beforeConfiguration(ITestResult tr) {
+ }
+
+ @Override
public void onTestSuccess(ITestResult result) {
m_end = result.getEndMillis();
}