[testng] 97/355: Invoker: use FailureContext to pass modifiable failure count&instances. Properly invoke handleInvocationResults: do not call it twice. (from invokeMethod and invokeTestMethods) Now it called only from invokeMethod with proper FailureContext This commit fixes #566

Eugene Zhukov eugene-guest at moszumanska.debian.org
Tue Aug 18 10:19:52 UTC 2015


This is an automated email from the git hooks/post-receive script.

eugene-guest pushed a commit to annotated tag OpenBSD
in repository testng.

commit 6b47dc8954e2ffbb351cb1c72523af24bfc96ef1
Author: Vladislav Rassokhin <vladrassokhin at gmail.com>
Date:   Sun Nov 23 02:03:13 2014 +0300

    Invoker: use FailureContext to pass modifiable failure count&instances.
    Properly invoke handleInvocationResults: do not call it twice. (from invokeMethod and invokeTestMethods) Now it called only from invokeMethod with proper FailureContext
    This commit fixes #566
---
 src/main/java/org/testng/internal/Invoker.java     | 106 +++++++++++----------
 .../TestMethodWithDataProviderMethodWorker.java    |  19 ++--
 2 files changed, 65 insertions(+), 60 deletions(-)

diff --git a/src/main/java/org/testng/internal/Invoker.java b/src/main/java/org/testng/internal/Invoker.java
index 002f15d..4680200 100644
--- a/src/main/java/org/testng/internal/Invoker.java
+++ b/src/main/java/org/testng/internal/Invoker.java
@@ -618,7 +618,8 @@ public class Invoker implements IInvoker {
                                    ITestClass testClass,
                                    ITestNGMethod[] beforeMethods,
                                    ITestNGMethod[] afterMethods,
-                                   ConfigurationGroupMethods groupMethods) {
+                                   ConfigurationGroupMethods groupMethods,
+                                   FailureContext failureContext) {
     TestResult testResult = new TestResult();
 
     //
@@ -734,8 +735,8 @@ public class Invoker implements IInvoker {
       ExpectedExceptionsHolder expectedExceptionClasses
           = MethodHelper.findExpectedExceptions(m_annotationFinder, tm.getMethod());
       List<ITestResult> results = Lists.<ITestResult>newArrayList(testResult);
-      handleInvocationResults(tm, results, null, 0, expectedExceptionClasses, false,
-          false /* collect results */);
+      handleInvocationResults(tm, results, expectedExceptionClasses, false,
+          false /* collect results */, failureContext);
 
       // If this method has a data provider and just failed, memorize the number
       // at which it failed.
@@ -872,13 +873,14 @@ public class Invoker implements IInvoker {
                                              ITestClass testClass,
                                              ITestNGMethod[] beforeMethods,
                                              ITestNGMethod[] afterMethods,
-                                             ConfigurationGroupMethods groupMethods)
+                                             ConfigurationGroupMethods groupMethods,
+                                             FailureContext failureContext)
   {
     // Mark this method with the current thread id
     tm.setId(ThreadUtil.currentThreadInfo());
 
     ITestResult result = invokeMethod(instance, tm, parameterValues, parametersIndex, suite, params,
-          testClass, beforeMethods, afterMethods, groupMethods);
+        testClass, beforeMethods, afterMethods, groupMethods, failureContext);
 
     return result;
   }
@@ -1009,10 +1011,9 @@ public class Invoker implements IInvoker {
                            ITestContext testContext,
                            Map<String, String> parameters,
                            int parametersIndex) {
-    List<Object> failedInstances;
-
+    final FailureContext failure = new FailureContext();
+    failure.count = failureCount;
     do {
-      failedInstances = Lists.newArrayList();
       Map<String, String> allParameters = Maps.newHashMap();
       /**
        * TODO: This recreates all the parameters every time when we only need
@@ -1023,13 +1024,13 @@ public class Invoker implements IInvoker {
       Object[] parameterValues =
           getParametersFromIndex(bag.parameterHolder.parameters, parametersIndex);
 
-      result.add(invokeMethod(instance, tm, parameterValues,parametersIndex, suite,
-          allParameters, testClass, beforeMethods, afterMethods, groupMethods));
-      failureCount = handleInvocationResults(tm, result, failedInstances,
-          failureCount, expectedExceptionHolder, true, true /* collect results */);
+      result.add(invokeMethod(instance, tm, parameterValues, parametersIndex, suite,
+          allParameters, testClass, beforeMethods, afterMethods, groupMethods, failure));
+      // It's already handled inside 'invokeMethod' but results not collected
+      handleInvocationResults(tm, result, expectedExceptionHolder, true, true/* collect results */, failure);
     }
-    while (!failedInstances.isEmpty());
-    return failureCount;
+    while (!failure.instances.isEmpty());
+    return failure.count;
   }
 
   private ParameterBag createParameters(ITestNGMethod testMethod,
@@ -1098,10 +1099,10 @@ public class Invoker implements IInvoker {
       timeOutInvocationCount > 0;
 
     int invocationCount = onlyOne ? 1 : testMethod.getInvocationCount();
-    int failureCount = 0;
 
     ExpectedExceptionsHolder expectedExceptionHolder =
         MethodHelper.findExpectedExceptions(m_annotationFinder, testMethod.getMethod());
+    final FailureContext failure = new FailureContext();
     while(invocationCount-- > 0) {
       boolean okToProceed = checkDependencies(testMethod, testContext.getAllTestMethods());
 
@@ -1151,9 +1152,9 @@ public class Invoker implements IInvoker {
             parameters, allParameterNames, suite, testContext, instance);
 
         if (bag.hasErrors()) {
-          failureCount = handleInvocationResults(testMethod,
-              Lists.newArrayList(bag.errorResult), null, failureCount, expectedExceptionHolder, true,
-              true /* collect results */);
+          handleInvocationResults(testMethod,
+              Lists.newArrayList(bag.errorResult), expectedExceptionHolder, true,
+              true /* collect results */, failure);
           ITestResult tr = registerSkippedTestResult(testMethod, instance, start,
               bag.errorResult.getThrowable());
           result.add(tr);
@@ -1177,7 +1178,7 @@ public class Invoker implements IInvoker {
                     parameterValues, instance, suite, parameters, testClass,
                     beforeMethods, afterMethods, groupMethods,
                     expectedExceptionHolder, testContext, m_skipFailedInvocationCounts,
-                    invocationCount, failureCount, m_notifier);
+                    invocationCount, failure.count, m_notifier);
               workers.add(w);
               // testng387: increment the param index in the bag.
               parametersIndex++;
@@ -1206,25 +1207,19 @@ public class Invoker implements IInvoker {
                     testClass,
                     beforeMethods,
                     afterMethods,
-                    groupMethods));
+                    groupMethods, failure));
               }
               finally {
-                List<Object> failedInstances = Lists.newArrayList();
-
-                failureCount = handleInvocationResults(testMethod, tmpResults,
-                    failedInstances, failureCount, expectedExceptionHolder, true,
-                    false /* don't collect results */);
-                if (failedInstances.isEmpty()) {
+                if (failure.instances.isEmpty()) {
                   result.addAll(tmpResults);
                 } else {
-                  for (Object failedInstance : failedInstances) {
+                  for (Object failedInstance : failure.instances) {
                     List<ITestResult> retryResults = Lists.newArrayList();
 
-                    failureCount =
-                     retryFailed(failedInstance,
-                     testMethod, suite, testClass, beforeMethods,
+                    failure.count = retryFailed(
+                            failedInstance, testMethod, suite, testClass, beforeMethods,
                      afterMethods, groupMethods, retryResults,
-                     failureCount, expectedExceptionHolder,
+                     failure.count, expectedExceptionHolder,
                      testContext, parameters, parametersIndex);
                   result.addAll(retryResults);
                   }
@@ -1234,11 +1229,11 @@ public class Invoker implements IInvoker {
                 // If we have a failure, skip all the
                 // other invocationCounts
                 //
-                if (failureCount > 0
+                if (failure.count > 0
                       && (m_skipFailedInvocationCounts
                             || testMethod.skipFailedInvocations())) {
                   while (invocationCount-- > 0) {
-                    result.add(registerSkippedTestResult(testMethod, instance, start, null));
+                    result.add(registerSkippedTestResult(testMethod, instance, System.currentTimeMillis(), null));
                   }
                   break;
                 }
@@ -1409,20 +1404,24 @@ public class Invoker implements IInvoker {
     return runWorkers(testMethod, workers, testMethod.getThreadPoolSize(), groupMethods, suite, parameters);
   }
 
+  static class FailureContext {
+    int count = 0;
+    List<Object> instances = Lists.newArrayList();
+  }
+
   /**
    * @param testMethod
    * @param result
-   * @param failureCount
    * @param expectedExceptionsHolder
+   * @param failure
    * @return
    */
-  int handleInvocationResults(ITestNGMethod testMethod,
-                                      List<ITestResult> result,
-                                      List<Object> failedInstances,
-                                      int failureCount,
-                                      ExpectedExceptionsHolder expectedExceptionsHolder,
-                                      boolean triggerListeners,
-                                      boolean collectResults)
+  void handleInvocationResults(ITestNGMethod testMethod,
+                               List<ITestResult> result,
+                               ExpectedExceptionsHolder expectedExceptionsHolder,
+                               boolean triggerListeners,
+                               boolean collectResults,
+                               FailureContext failure)
   {
     //
     // Go through all the results and create a TestResult for each of them
@@ -1433,6 +1432,8 @@ public class Invoker implements IInvoker {
       Throwable ite= testResult.getThrowable();
       int status= testResult.getStatus();
 
+      boolean handled = false;
+
       // Exception thrown?
       if (ite != null) {
 
@@ -1458,7 +1459,8 @@ public class Invoker implements IInvoker {
                   + " but got " + ite, ite));
           status= ITestResult.FAILURE;
         } else {
-          handleException(ite, testMethod, testResult, failureCount++);
+          handleException(ite, testMethod, testResult, failure.count++);
+          handled = true;
           status = testResult.getStatus();
         }
       }
@@ -1476,12 +1478,17 @@ public class Invoker implements IInvoker {
 
       testResult.setStatus(status);
 
-      if (testResult.getStatus() == ITestResult.FAILURE) {
+      if (status == ITestResult.FAILURE && !handled) {
+        handleException(ite, testMethod, testResult, failure.count++);
+        status = testResult.getStatus();
+      }
+
+      if (status == ITestResult.FAILURE) {
         IRetryAnalyzer retryAnalyzer = testMethod.getRetryAnalyzer();
 
-        if (retryAnalyzer != null && failedInstances != null && retryAnalyzer.retry(testResult)) {
+        if (retryAnalyzer != null &&  failure.instances != null && retryAnalyzer.retry(testResult)) {
           resultsToRetry.add(testResult);
-          failedInstances.add(testResult.getInstance());
+          failure.instances.add(testResult.getInstance());
         }
       }
       if (collectResults) {
@@ -1493,7 +1500,7 @@ public class Invoker implements IInvoker {
       }
     } // for results
 
-    return removeResultsToRetryFromResult(resultsToRetry, result, failureCount);
+    removeResultsToRetryFromResult(resultsToRetry, result, failure);
   }
 
   private String getExpectedExceptionsPluralize(final ExpectedExceptionsHolder holder) {
@@ -1526,15 +1533,14 @@ public class Invoker implements IInvoker {
     }
   }
 
-  private int removeResultsToRetryFromResult(List<ITestResult> resultsToRetry,
-      List<ITestResult> result, int failureCount) {
+  private void removeResultsToRetryFromResult(List<ITestResult> resultsToRetry,
+                                              List<ITestResult> result, FailureContext failure) {
     if (resultsToRetry != null) {
       for (ITestResult res : resultsToRetry) {
         result.remove(res);
-        failureCount--;
+        failure.count--;
       }
     }
-    return failureCount;
   }
 
   /**
diff --git a/src/main/java/org/testng/internal/TestMethodWithDataProviderMethodWorker.java b/src/main/java/org/testng/internal/TestMethodWithDataProviderMethodWorker.java
index 9f71b66..96be14a 100755
--- a/src/main/java/org/testng/internal/TestMethodWithDataProviderMethodWorker.java
+++ b/src/main/java/org/testng/internal/TestMethodWithDataProviderMethodWorker.java
@@ -69,6 +69,8 @@ public class TestMethodWithDataProviderMethodWorker implements Callable<List<ITe
     List<ITestResult> tmpResults = Lists.newArrayList();
     long start = System.currentTimeMillis();
 
+    final Invoker.FailureContext failure = new Invoker.FailureContext();
+    failure.count = m_failureCount;
     try {
       tmpResults.add(m_invoker.invokeTestMethod(m_instance,
           m_testMethod,
@@ -79,23 +81,20 @@ public class TestMethodWithDataProviderMethodWorker implements Callable<List<ITe
           m_testClass,
           m_beforeMethods,
           m_afterMethods,
-          m_groupMethods));
+          m_groupMethods,
+          failure));
     }
     finally {
-      List<Object> failedInstances = Lists.newArrayList();
-
-      m_failureCount = m_invoker.handleInvocationResults(m_testMethod, tmpResults,
-          failedInstances, m_failureCount, m_expectedExceptionHolder, true,
-          false /* don't collect results */);
-      if (failedInstances.isEmpty()) {
+      m_failureCount = failure.count;
+      if (failure.instances.isEmpty()) {
         m_testResults.addAll(tmpResults);
       } else {
-        for (int i = 0; i < failedInstances.size(); i++) {
+        for (Object instance : failure.instances) {
           List<ITestResult> retryResults = Lists.newArrayList();
 
           m_failureCount =
-             m_invoker.retryFailed(failedInstances.get(i),
-                 m_testMethod, m_xmlSuite, m_testClass, m_beforeMethods,
+             m_invoker.retryFailed(
+                 instance, m_testMethod, m_xmlSuite, m_testClass, m_beforeMethods,
                  m_afterMethods, m_groupMethods, retryResults,
                  m_failureCount, m_expectedExceptionHolder,
                  m_testContext, m_parameters, m_parameterIndex);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/testng.git



More information about the pkg-java-commits mailing list