1package org.testng.internal;
2
3import org.testng.ITestClass;
4import org.testng.ITestContext;
5import org.testng.ITestNGMethod;
6import org.testng.ITestResult;
7import org.testng.collections.Lists;
8import org.testng.xml.XmlSuite;
9
10import java.util.List;
11import java.util.Map;
12import java.util.concurrent.Callable;
13
14public 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