package org.testng.eclipse.ui; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.debug.core.ILaunch; import org.testng.ITestResult; import org.testng.remote.strprotocol.GenericMessage; import org.testng.remote.strprotocol.IRemoteSuiteListener; import org.testng.remote.strprotocol.IRemoteTestListener; import org.testng.remote.strprotocol.SuiteMessage; import org.testng.remote.strprotocol.TestMessage; import org.testng.remote.strprotocol.TestResultMessage; /** * Holds the result of running a test suite. It is useful for keeping the history of test runs. * * @author Jean-Noel Rouvignac */ public class SuiteRunInfo implements IRemoteSuiteListener, IRemoteTestListener { private IRemoteSuiteListener suiteDelegateListener; private IRemoteTestListener testDelegateListener; // ~ counters private int m_suitesTotalCount; private int m_testsTotalCount; private int m_methodTotalCount; private int m_suiteCount; private int m_testCount; private int m_methodCount; private int m_passedCount; private int m_failedCount; private int m_skippedCount; private int m_successPercentageFailed; private long m_startTime; private long m_stopTime; private List<RunInfo> m_results = new ArrayList<>(); /** * The launcher that has started the test. May be used for reruns. */ private ILaunch launch; public SuiteRunInfo(final IRemoteSuiteListener suiteDelegateListener, final IRemoteTestListener testDelegateListener, ILaunch launch) { this.suiteDelegateListener = suiteDelegateListener; this.testDelegateListener = testDelegateListener; this.launch = launch; } public void removeDelegateListeners() { this.suiteDelegateListener = null; this.testDelegateListener = null; } public SuiteRunInfo(final int suiteCount, final int testCount) { m_suitesTotalCount = suiteCount; m_testsTotalCount = testCount; } boolean hasErrors() { return m_failedCount > 0 || m_successPercentageFailed > 0; } public ILaunch getLaunch() { return launch; } int getStatus() { if (hasErrors()) { return ITestResult.FAILURE; } else if (m_skippedCount > 0) { return ITestResult.SKIP; } return ITestResult.SUCCESS; } public void onInitialization(GenericMessage genericMessage) { m_suiteCount = genericMessage.getSuiteCount(); m_testCount = genericMessage.getTestCount(); m_startTime = System.currentTimeMillis(); if (suiteDelegateListener != null) { suiteDelegateListener.onInitialization(genericMessage); } } public void onStart(SuiteMessage suiteMessage) { if (suiteDelegateListener != null) { suiteDelegateListener.onStart(suiteMessage); } } public void onFinish(SuiteMessage suiteMessage) { m_suiteCount++; if (isSuiteRunFinished()) { m_stopTime = System.currentTimeMillis(); } if (suiteDelegateListener != null) { suiteDelegateListener.onFinish(suiteMessage); } } public void onStart(TestMessage tm) { m_methodTotalCount += tm.getTestMethodCount(); if (testDelegateListener != null) { testDelegateListener.onStart(tm); } } public void onFinish(TestMessage tm) { // m_testCount++; // The method count is more accurate than m_methodTotalCount since it also // takes data providers and other dynamic invocations into account. if (m_methodCount != m_methodTotalCount) { m_methodTotalCount = m_methodCount; // trust the methodCount } if (testDelegateListener != null) { testDelegateListener.onFinish(tm); } } public void onTestStart(TestResultMessage trm) { if (testDelegateListener != null) { testDelegateListener.onTestStart(trm); } } public void onTestSuccess(TestResultMessage trm) { m_passedCount++; m_methodCount++; if (testDelegateListener != null) { testDelegateListener.onTestSuccess(trm); } } public void onTestFailure(TestResultMessage trm) { m_failedCount++; m_methodCount++; if (testDelegateListener != null) { testDelegateListener.onTestFailure(trm); } } public void onTestSkipped(TestResultMessage trm) { m_skippedCount++; m_methodCount++; if (testDelegateListener != null) { testDelegateListener.onTestSkipped(trm); } } public void onTestFailedButWithinSuccessPercentage(TestResultMessage trm) { m_successPercentageFailed++; m_methodCount++; if (testDelegateListener != null) { testDelegateListener.onTestFailedButWithinSuccessPercentage(trm); } } public boolean isSuiteRunFinished() { return m_suitesTotalCount < m_suiteCount; } public boolean hasRun() { return m_startTime != 0L && m_stopTime != 0L; } public long getRunDuration() { return m_stopTime - m_startTime; } public int getNewMax() { return (m_methodTotalCount * m_testsTotalCount + 1) / (m_testCount + 1); } public int getMethodCount() { return m_methodCount; } public int getPassedCount() { return m_passedCount; } public int getFailedCount() { return m_failedCount; } public int getSkippedCount() { return m_skippedCount; } public long getStartTime() { return m_startTime; } public int getMethodTotalCount() { return m_methodTotalCount; } public List<RunInfo> getResults() { return Collections.unmodifiableList(m_results); } public int getNbResults() { return getResults().size(); } public void add(RunInfo runInfo) { this.m_results.add(runInfo); } public void setSuitesTotalCount(int suitesTotalCount) { this.m_suitesTotalCount = suitesTotalCount; } public void setTestsTotalCount(int testsTotalCount) { this.m_testsTotalCount = testsTotalCount; } }