package test.thread.parallelization;
import test.thread.parallelization.TestNgRunStateTracker.EventLog;
import test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent;
import org.testng.ISuite;
import org.testng.ISuiteListener;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
import java.util.concurrent.TimeUnit;
import static test.thread.parallelization.TestNgRunStateTracker.EventInfo.CLASS_INSTANCE;
import static test.thread.parallelization.TestNgRunStateTracker.EventInfo.CLASS_NAME;
import static test.thread.parallelization.TestNgRunStateTracker.EventInfo.METHOD_NAME;
import static test.thread.parallelization.TestNgRunStateTracker.EventInfo.SUITE_NAME;
import static test.thread.parallelization.TestNgRunStateTracker.EventInfo.TEST_NAME;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_SUITE_START;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_SUITE_FINISH;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_TEST_START;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_TEST_FINISH;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_TEST_METHOD_FAIL;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_TEST_METHOD_FAIL_PERCENTAGE;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_TEST_METHOD_SKIPPED;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_TEST_METHOD_START;
import static test.thread.parallelization.TestNgRunStateTracker.TestNgRunEvent.LISTENER_TEST_METHOD_PASS;
import static test.thread.parallelization.TestNgRunStateTracker.logEvent;
public class TestNgRunStateListener implements ISuiteListener, ITestListener {
@Override
public void onStart(ISuite suite) {
logEvent(buildEventLog(suite, LISTENER_SUITE_START).build());
delayAfterEvent(LISTENER_SUITE_START);
}
@Override
public void onFinish(ISuite suite) {
logEvent(buildEventLog(suite, LISTENER_SUITE_FINISH).build());
delayAfterEvent(LISTENER_SUITE_FINISH);
}
@Override
public void onStart(ITestContext context) {
logEvent(buildEventLog(context, LISTENER_TEST_START).build());
delayAfterEvent(LISTENER_TEST_START);
}
@Override
public void onFinish(ITestContext context) {
logEvent(buildEventLog(context, LISTENER_TEST_FINISH).build());
delayAfterEvent(LISTENER_TEST_FINISH);
}
@Override
public void onTestStart(ITestResult result) {
logEvent(buildEventLog(result, LISTENER_TEST_METHOD_START).build());
delayAfterEvent(LISTENER_TEST_METHOD_START);
}
@Override
public void onTestSuccess(ITestResult result) {
logEvent(buildEventLog(result, LISTENER_TEST_METHOD_PASS).build());
delayAfterEvent(LISTENER_TEST_METHOD_PASS);
}
@Override
public void onTestFailure(ITestResult result) {
logEvent(buildEventLog(result, LISTENER_TEST_METHOD_FAIL).build());
delayAfterEvent(LISTENER_TEST_METHOD_FAIL);
}
@Override
public void onTestSkipped(ITestResult result) {
logEvent(buildEventLog(result, LISTENER_TEST_METHOD_SKIPPED).build());
delayAfterEvent(LISTENER_TEST_METHOD_SKIPPED);
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
logEvent(buildEventLog(result, LISTENER_TEST_METHOD_FAIL_PERCENTAGE).build());
delayAfterEvent(LISTENER_TEST_METHOD_FAIL_PERCENTAGE);
}
private TestNgRunStateTracker.EventLogBuilder buildEventLog(ISuite suite, TestNgRunEvent event) {
long time = System.currentTimeMillis();
return EventLog.builder()
.setEvent(event)
.setTimeOfEvent(time)
.setThread(Thread.currentThread())
.addData(SUITE_NAME, suite.getName());
}
private TestNgRunStateTracker.EventLogBuilder buildEventLog(ITestContext context, TestNgRunEvent event) {
return buildEventLog(context.getSuite(), event)
.addData(TEST_NAME, context.getName());
}
private TestNgRunStateTracker.EventLogBuilder buildEventLog(ITestResult result, TestNgRunEvent event) {
return(buildEventLog(result.getTestContext(), event))
.addData(METHOD_NAME, result.getMethod().getMethodName())
.addData(CLASS_NAME, result.getMethod().getRealClass().getCanonicalName())
.addData(CLASS_INSTANCE, result.getMethod().getInstance());
}
private void delayAfterEvent(TestNgRunEvent event) {
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch(InterruptedException e) {
throw new RuntimeException("Problem with delaying after listener event: " + event, e);
}
}
}