Home | History | Annotate | Download | only in internal
      1 package org.testng.internal;
      2 
      3 import org.testng.ITestClass;
      4 import org.testng.ITestContext;
      5 import org.testng.ITestNGMethod;
      6 import org.testng.ITestResult;
      7 import org.testng.collections.Lists;
      8 import org.testng.xml.XmlSuite;
      9 
     10 import java.util.List;
     11 import java.util.Map;
     12 import java.util.concurrent.Callable;
     13 
     14 public class TestMethodWithDataProviderMethodWorker implements Callable<List<ITestResult>> {
     15 
     16   private ITestNGMethod m_testMethod;
     17   private Object[] m_parameterValues;
     18   private Object m_instance;
     19   private XmlSuite m_xmlSuite;
     20   private Map<String, String> m_parameters;
     21   private ITestClass m_testClass;
     22   private ITestNGMethod[] m_beforeMethods;
     23   private ITestNGMethod[] m_afterMethods;
     24   private ConfigurationGroupMethods m_groupMethods;
     25   private Invoker m_invoker;
     26   private ExpectedExceptionsHolder m_expectedExceptionHolder;
     27   private ITestContext m_testContext;
     28   private int m_parameterIndex;
     29   private boolean m_skipFailedInvocationCounts;
     30   private int m_invocationCount;
     31   private ITestResultNotifier m_notifier;
     32 
     33   private List<ITestResult> m_testResults = Lists.newArrayList();
     34   private int m_failureCount;
     35 
     36   public TestMethodWithDataProviderMethodWorker(Invoker invoker, ITestNGMethod testMethod,
     37       int parameterIndex,
     38       Object[] parameterValues, Object instance, XmlSuite suite,
     39       Map<String, String> parameters, ITestClass testClass,
     40       ITestNGMethod[] beforeMethods, ITestNGMethod[] afterMethods,
     41       ConfigurationGroupMethods groupMethods, ExpectedExceptionsHolder expectedExceptionHolder,
     42       ITestContext testContext, boolean skipFailedInvocationCounts,
     43       int invocationCount, int failureCount, ITestResultNotifier notifier) {
     44     m_invoker = invoker;
     45     m_testMethod = testMethod;
     46     m_parameterIndex = parameterIndex;
     47     m_parameterValues = parameterValues;
     48     m_instance = instance;
     49     m_xmlSuite = suite;
     50     m_parameters = parameters;
     51     m_testClass = testClass;
     52     m_beforeMethods = beforeMethods;
     53     m_afterMethods = afterMethods;
     54     m_groupMethods = groupMethods;
     55     m_expectedExceptionHolder = expectedExceptionHolder;
     56     m_skipFailedInvocationCounts = skipFailedInvocationCounts;
     57     m_testContext = testContext;
     58     m_invocationCount = invocationCount;
     59     m_failureCount = failureCount;
     60     m_notifier = notifier;
     61   }
     62 
     63   public long getMaxTimeOut() {
     64     return 500;
     65   }
     66 
     67   @Override
     68   public List<ITestResult> call() {
     69     List<ITestResult> tmpResults = Lists.newArrayList();
     70     long start = System.currentTimeMillis();
     71 
     72     final Invoker.FailureContext failure = new Invoker.FailureContext();
     73     failure.count = m_failureCount;
     74     try {
     75       tmpResults.add(m_invoker.invokeTestMethod(m_instance,
     76           m_testMethod,
     77           m_parameterValues,
     78           m_parameterIndex,
     79           m_xmlSuite,
     80           m_parameters,
     81           m_testClass,
     82           m_beforeMethods,
     83           m_afterMethods,
     84           m_groupMethods,
     85           failure));
     86     }
     87     finally {
     88       m_failureCount = failure.count;
     89       if (failure.instances.isEmpty()) {
     90         m_testResults.addAll(tmpResults);
     91       } else {
     92         for (Object instance : failure.instances) {
     93           List<ITestResult> retryResults = Lists.newArrayList();
     94 
     95           m_failureCount =
     96              m_invoker.retryFailed(
     97                  instance, m_testMethod, m_xmlSuite, m_testClass, m_beforeMethods,
     98                  m_afterMethods, m_groupMethods, retryResults,
     99                  m_failureCount, m_expectedExceptionHolder,
    100                  m_testContext, m_parameters, m_parameterIndex);
    101           m_testResults.addAll(retryResults);
    102         }
    103       }
    104 
    105       //
    106       // If we have a failure, skip all the
    107       // other invocationCounts
    108       //
    109 
    110       // If not specified globally, use the attribute
    111       // on the annotation
    112       //
    113       if (! m_skipFailedInvocationCounts) {
    114         m_skipFailedInvocationCounts = m_testMethod.skipFailedInvocations();
    115       }
    116       if (m_failureCount > 0 && m_skipFailedInvocationCounts) {
    117         while (m_invocationCount-- > 0) {
    118           ITestResult r =
    119             new TestResult(m_testMethod.getTestClass(),
    120               m_instance,
    121               m_testMethod,
    122               null,
    123               start,
    124               System.currentTimeMillis(),
    125               m_testContext);
    126           r.setStatus(TestResult.SKIP);
    127           m_testResults.add(r);
    128           m_invoker.runTestListeners(r);
    129           m_notifier.addSkippedTest(m_testMethod, r);
    130         }
    131       }
    132     }
    133     m_parameterIndex++;
    134 
    135     return m_testResults;
    136   }
    137 
    138   public List<ITestResult> getTestResults() {
    139     return m_testResults;
    140   }
    141 
    142   public int getInvocationCount() {
    143     return m_invocationCount;
    144   }
    145 
    146   public int getFailureCount() {
    147     return m_failureCount;
    148   }
    149 }
    150