From 48f69f243e273d0c7353029cbf6123ddd33686c1 Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Thu, 14 Jul 2016 14:19:35 +0200 Subject: [PATCH] Fix #1084 Using deprecated addListener methods should not register any times --- CHANGES.txt | 1 + src/main/java/org/testng/TestNG.java | 35 ++-- .../java/test/listeners/ListenerTest.java | 23 ++- .../java/test/listeners/MultiListener.java | 153 ++++++++++++++++++ .../java/test/listeners/SimpleSample.java | 11 ++ .../test/multiplelisteners/TestMaker.java | 2 +- 6 files changed, 210 insertions(+), 15 deletions(-) create mode 100644 src/test/java/test/listeners/MultiListener.java create mode 100644 src/test/java/test/listeners/SimpleSample.java diff --git a/CHANGES.txt b/CHANGES.txt index 9f4dd97483..d1f59e7606 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,6 @@ Current Fixed: GITHUB-1085 Remove Guava dependency (Erik C. Thauvin & Julien Herr) +Fixed: GITHUB-1084 Using deprecated addListener methods should not register many times (Anna Kozlova & Julien Herr) 6.9.12 2016/06/21 diff --git a/src/main/java/org/testng/TestNG.java b/src/main/java/org/testng/TestNG.java index 5ceefb4b69..8650c6844e 100644 --- a/src/main/java/org/testng/TestNG.java +++ b/src/main/java/org/testng/TestNG.java @@ -683,8 +683,8 @@ public void setObjectFactory(ITestObjectFactory factory) { * @param classes A list of classes, which must be either ISuiteListener, * ITestListener or IReporter */ - public void setListenerClasses(List classes) { - for (Class cls: classes) { + public void setListenerClasses(List> classes) { + for (Class cls: classes) { addListener(ClassHelper.newInstance(cls)); } } @@ -752,7 +752,9 @@ public void addListener(ITestNGListener listener) { // TODO remove later @Deprecated public void addListener(IInvokedMethodListener listener) { - addListener((ITestNGListener) listener); + if (!m_invokedMethodListeners.contains(listener)) { + addListener((ITestNGListener) listener); + } } /** @@ -761,7 +763,9 @@ public void addListener(IInvokedMethodListener listener) { // TODO remove later @Deprecated public void addListener(ISuiteListener listener) { - addListener((ITestNGListener) listener); + if (!m_suiteListeners.contains(listener)) { + addListener((ITestNGListener) listener); + } } /** @@ -770,7 +774,9 @@ public void addListener(ISuiteListener listener) { // TODO remove later @Deprecated public void addListener(ITestListener listener) { - addListener((ITestNGListener) listener); + if (!m_testListeners.contains(listener)) { + addListener((ITestNGListener) listener); + } } /** @@ -779,7 +785,9 @@ public void addListener(ITestListener listener) { // TODO remove later @Deprecated public void addListener(IClassListener listener) { - addListener((ITestNGListener) listener); + if (!m_classListeners.contains(listener)) { + addListener((ITestNGListener) listener); + } } /** @@ -788,7 +796,9 @@ public void addListener(IClassListener listener) { // TODO remove later @Deprecated public void addListener(IReporter listener) { - addListener((ITestNGListener) listener); + if (!m_reporters.contains(listener)) { + addListener((ITestNGListener) listener); + } } /** @@ -797,7 +807,9 @@ public void addListener(IReporter listener) { // TODO remove later @Deprecated public void addInvokedMethodListener(IInvokedMethodListener listener) { - addListener((ITestNGListener) listener); + if (!m_invokedMethodListeners.contains(listener)) { + addListener((ITestNGListener) listener); + } } public Set getReporters() { @@ -1485,10 +1497,13 @@ protected void configure(CommandLineArgs cla) { sep = ","; } String[] strs = Utils.split(cla.listener, sep); - List classes = Lists.newArrayList(); + List> classes = Lists.newArrayList(); for (String cls : strs) { - classes.add(ClassHelper.fileToClass(cls)); + Class clazz = ClassHelper.fileToClass(cls); + if (ITestNGListener.class.isAssignableFrom(clazz)) { + classes.add((Class) clazz); + } } setListenerClasses(classes); diff --git a/src/test/java/test/listeners/ListenerTest.java b/src/test/java/test/listeners/ListenerTest.java index bac7834fb4..c9e9dced7b 100644 --- a/src/test/java/test/listeners/ListenerTest.java +++ b/src/test/java/test/listeners/ListenerTest.java @@ -1,9 +1,6 @@ package test.listeners; -import org.testng.Assert; -import org.testng.ITestNGListener; -import org.testng.TestListenerAdapter; -import org.testng.TestNG; +import org.testng.*; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.testng.collections.Lists; @@ -215,4 +212,22 @@ public void setStatusShouldWorkInListener() { Assert.assertEquals(listener.getContext().getSkippedTests().size(), 0); Assert.assertEquals(listener.getContext().getPassedTests().size(), 1); } + + @Test(description = "GITHUB-1084: Using deprecated addListener methods should not register many times") + public void listenerRegistration() { + MultiListener listener = new MultiListener(); + TestNG tng = create(SimpleSample.class); + tng.addListener((ISuiteListener) listener); + tng.addListener((ITestListener) listener); + tng.addInvokedMethodListener(listener); + tng.run(); + Assert.assertEquals(listener.getOnSuiteStartCount(), 1); + Assert.assertEquals(listener.getOnSuiteFinishCount(), 1); + Assert.assertEquals(listener.getOnTestStartCount(), 1); + Assert.assertEquals(listener.getOnTestFinishCount(), 1); + Assert.assertEquals(listener.getBeforeInvocationCount(), 1); + Assert.assertEquals(listener.getAfterInvocationCount(), 1); + Assert.assertEquals(listener.getOnMethodTestStartCount(), 1); + Assert.assertEquals(listener.getOnMethodTestSuccessCount(), 1); + } } diff --git a/src/test/java/test/listeners/MultiListener.java b/src/test/java/test/listeners/MultiListener.java new file mode 100644 index 0000000000..4512bb82d3 --- /dev/null +++ b/src/test/java/test/listeners/MultiListener.java @@ -0,0 +1,153 @@ +package test.listeners; + +import org.testng.IInvokedMethod; +import org.testng.IInvokedMethodListener; +import org.testng.ISuite; +import org.testng.ISuiteListener; +import org.testng.ITestContext; +import org.testng.ITestResult; +import org.testng.internal.IResultListener; + +public class MultiListener implements ISuiteListener, IResultListener, IInvokedMethodListener { + + private int onConfigurationSuccessCount = 0; + private int onConfigurationFailureCount = 0; + private int onConfigurationSkipCount = 0; + private int beforeInvocationCount = 0; + private int afterInvocationCount = 0; + private int onSuiteStartCount = 0; + private int onSuiteFinishCount = 0; + private int onMethodTestStartCount = 0; + private int onMethodTestSuccessCount = 0; + private int onMethodTestFailureCount = 0; + private int onMethodTestSkippedCount = 0; + private int onMethodTestFailedButWithinSuccessPercentageCount = 0; + private int onTestStartCount = 0; + private int onTestFinishCount = 0; + + @Override + public void onConfigurationSuccess(ITestResult itr) { + onConfigurationSuccessCount++; + } + + @Override + public void onConfigurationFailure(ITestResult itr) { + onConfigurationFailureCount++; + } + + @Override + public void onConfigurationSkip(ITestResult itr) { + onConfigurationSkipCount++; + } + + @Override + public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { + beforeInvocationCount++; + } + + @Override + public void afterInvocation(IInvokedMethod method, ITestResult testResult) { + afterInvocationCount++; + } + + @Override + public void onStart(ISuite suite) { + onSuiteStartCount++; + } + + @Override + public void onFinish(ISuite suite) { + onSuiteFinishCount++; + } + + @Override + public void onTestStart(ITestResult result) { + onMethodTestStartCount++; + } + + @Override + public void onTestSuccess(ITestResult result) { + onMethodTestSuccessCount++; + } + + @Override + public void onTestFailure(ITestResult result) { + onMethodTestFailureCount++; + } + + @Override + public void onTestSkipped(ITestResult result) { + onMethodTestSkippedCount++; + } + + @Override + public void onTestFailedButWithinSuccessPercentage(ITestResult result) { + onMethodTestFailedButWithinSuccessPercentageCount++; + } + + @Override + public void onStart(ITestContext context) { + onTestStartCount++; + } + + @Override + public void onFinish(ITestContext context) { + onTestFinishCount++; + } + + public int getOnConfigurationSuccessCount() { + return onConfigurationSuccessCount; + } + + public int getOnConfigurationFailureCount() { + return onConfigurationFailureCount; + } + + public int getOnConfigurationSkipCount() { + return onConfigurationSkipCount; + } + + public int getBeforeInvocationCount() { + return beforeInvocationCount; + } + + public int getAfterInvocationCount() { + return afterInvocationCount; + } + + public int getOnSuiteStartCount() { + return onSuiteStartCount; + } + + public int getOnSuiteFinishCount() { + return onSuiteFinishCount; + } + + public int getOnMethodTestStartCount() { + return onMethodTestStartCount; + } + + public int getOnMethodTestSuccessCount() { + return onMethodTestSuccessCount; + } + + public int getOnMethodTestFailureCount() { + return onMethodTestFailureCount; + } + + public int getOnMethodTestSkippedCount() { + return onMethodTestSkippedCount; + } + + public int getOnMethodTestFailedButWithinSuccessPercentageCount() { + return onMethodTestFailedButWithinSuccessPercentageCount; + } + + public int getOnTestStartCount() { + return onTestStartCount; + } + + public int getOnTestFinishCount() { + return onTestFinishCount; + } +} diff --git a/src/test/java/test/listeners/SimpleSample.java b/src/test/java/test/listeners/SimpleSample.java new file mode 100644 index 0000000000..752aefd6f0 --- /dev/null +++ b/src/test/java/test/listeners/SimpleSample.java @@ -0,0 +1,11 @@ +package test.listeners; + +import org.testng.annotations.Test; + +public class SimpleSample { + + @Test + public void test() { + + } +} diff --git a/src/test/java/test/multiplelisteners/TestMaker.java b/src/test/java/test/multiplelisteners/TestMaker.java index 15795dce96..0262578a09 100755 --- a/src/test/java/test/multiplelisteners/TestMaker.java +++ b/src/test/java/test/multiplelisteners/TestMaker.java @@ -19,7 +19,7 @@ public void run() { final TestNG tng = new TestNG(); tng.setUseDefaultListeners(false); - tng.setListenerClasses(Arrays. asList(TestListenerAdapter.class, SimpleReporter.class)); + tng.setListenerClasses(Arrays.asList(TestListenerAdapter.class, SimpleReporter.class)); final List suites = createSuites(); tng.setXmlSuites(suites); tng.setVerbose(0);