package org.testng.internal; import org.testng.ITestClass; import org.testng.ITestNGMethod; import org.testng.annotations.ITestAnnotation; import org.testng.internal.annotations.AnnotationHelper; import org.testng.internal.annotations.IAnnotationFinder; import org.testng.xml.XmlTest; import java.io.Serializable; import java.lang.reflect.Method; import java.util.Comparator; /** * This class represents a test method. * * @author Cedric Beust, May 3, 2004 * @author <a href = "mailto:the_mindstorm@evolva.ro">Alexandru Popescu</a> */ public class TestNGMethod extends BaseTestMethod implements Serializable { private int m_threadPoolSize = 0; private int m_invocationCount = 1; private int m_successPercentage = 100; /** * Constructs a <code>TestNGMethod</code> * * @param method * @param finder */ public TestNGMethod(Method method, IAnnotationFinder finder, XmlTest xmlTest) { this(method, finder, true, xmlTest); } private TestNGMethod(Method method, IAnnotationFinder finder, boolean initialize, XmlTest xmlTest) { super(method, finder); if(initialize) { init(xmlTest); } } /** * {@inheritDoc} */ @Override public int getInvocationCount() { return m_invocationCount; } /** * {@inheritDoc} */ @Override public int getSuccessPercentage() { return m_successPercentage; } /** * {@inheritDoc} */ @Override public boolean isTest() { return true; } private void ppp(String s) { System.out.println("[TestNGMethod] " + s); } private void init(XmlTest xmlTest) { setXmlTest(xmlTest); setInvocationNumbers(xmlTest.getInvocationNumbers( m_method.getDeclaringClass().getName() + "." + m_method.getName())); { ITestAnnotation testAnnotation = AnnotationHelper.findTest(getAnnotationFinder(), m_method); if (testAnnotation == null) { // Try on the class testAnnotation = AnnotationHelper.findTest(getAnnotationFinder(), m_method.getDeclaringClass()); } if (null != testAnnotation) { setTimeOut(testAnnotation.getTimeOut()); m_successPercentage = testAnnotation.getSuccessPercentage(); setInvocationCount(testAnnotation.getInvocationCount()); setThreadPoolSize(testAnnotation.getThreadPoolSize()); setAlwaysRun(testAnnotation.getAlwaysRun()); setDescription(testAnnotation.getDescription()); setRetryAnalyzer(testAnnotation.getRetryAnalyzer()); setSkipFailedInvocations(testAnnotation.skipFailedInvocations()); setInvocationTimeOut(testAnnotation.invocationTimeOut()); setIgnoreMissingDependencies(testAnnotation.ignoreMissingDependencies()); setPriority(testAnnotation.getPriority()); } // Groups { initGroups(ITestAnnotation.class); } } } /** * {@inheritDoc} */ @Override public int getThreadPoolSize() { return m_threadPoolSize; } /** * Sets the number of threads on which this method should be invoked. */ @Override public void setThreadPoolSize(int threadPoolSize) { m_threadPoolSize = threadPoolSize; } /** * Sets the number of invocations for this method. */ @Override public void setInvocationCount(int counter) { m_invocationCount= counter; } /** * Clones the current <code>TestNGMethod</code> and its @BeforeMethod and @AfterMethod methods. * @see org.testng.internal.BaseTestMethod#clone() */ @Override public TestNGMethod clone() { TestNGMethod clone= new TestNGMethod(getMethod(), getAnnotationFinder(), false, getXmlTest()); ITestClass tc= getTestClass(); NoOpTestClass testClass= new NoOpTestClass(tc); testClass.setBeforeTestMethods(clone(tc.getBeforeTestMethods())); testClass.setAfterTestMethod(clone(tc.getAfterTestMethods())); clone.m_testClass= testClass; clone.setDate(getDate()); clone.setGroups(getGroups()); clone.setGroupsDependedUpon(getGroupsDependedUpon()); clone.setMethodsDependedUpon(getMethodsDependedUpon()); clone.setAlwaysRun(isAlwaysRun()); clone.m_beforeGroups= getBeforeGroups(); clone.m_afterGroups= getAfterGroups(); clone.m_currentInvocationCount= m_currentInvocationCount; clone.setMissingGroup(getMissingGroup()); clone.setThreadPoolSize(getThreadPoolSize()); clone.setDescription(getDescription()); clone.setParameterInvocationCount(getParameterInvocationCount()); clone.setInvocationCount(getInvocationCount()); clone.m_successPercentage = getSuccessPercentage(); clone.setTimeOut(getTimeOut()); clone.setRetryAnalyzer(getRetryAnalyzer()); clone.setSkipFailedInvocations(skipFailedInvocations()); clone.setInvocationNumbers(getInvocationNumbers()); return clone; } private ITestNGMethod[] clone(ITestNGMethod[] sources) { ITestNGMethod[] clones= new ITestNGMethod[sources.length]; for(int i= 0; i < sources.length; i++) { clones[i]= sources[i].clone(); } return clones; } /** Sorts ITestNGMethod by Class name. */ public static final Comparator<ITestNGMethod> SORT_BY_CLASS = new Comparator<ITestNGMethod>() { @Override public int compare(ITestNGMethod o1, ITestNGMethod o2) { String c1 = o1.getTestClass().getName(); String c2 = o2.getTestClass().getName(); return c1.compareTo(c2); } }; }