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