package jp.vmi.selenium.selenese.inject; import org.aopalliance.intercept.MethodInvocation; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jp.vmi.junit.result.ITestCase; import jp.vmi.junit.result.JUnitResult; import jp.vmi.junit.result.JUnitResultHolder; import jp.vmi.selenium.selenese.Context; import jp.vmi.selenium.selenese.Selenese; import jp.vmi.selenium.selenese.TestCase; import jp.vmi.selenium.selenese.result.Result; import jp.vmi.selenium.selenese.utils.LogRecorder; import jp.vmi.selenium.selenese.utils.StopWatch; /** * Interceptor for logging and recoding test-case result. */ public class ExecuteTestCaseInterceptor extends AbstractExecuteTestCaseInterceptor { private static final Logger log = LoggerFactory.getLogger(ExecuteTestCaseInterceptor.class); @Override protected Result invoke(MethodInvocation invocation, ITestCase testCase, Selenese parent, Context context) throws Throwable { JUnitResult jUnitResult; if (context instanceof JUnitResultHolder) { jUnitResult = ((JUnitResultHolder) context).getJUnitResult(); jUnitResult.startTestCase(parent, testCase); } else { jUnitResult = null; } StopWatch sw = testCase.getStopWatch(); LogRecorder clr; if (parent instanceof TestCase) clr = ((TestCase) parent).getLogRecorder(); else clr = new LogRecorder(context.getPrintStream()); testCase.setLogRecorder(clr); sw.start(); if (!testCase.isError()) { log.info("Start: {}", testCase); clr.info("Start: " + testCase); } if (testCase instanceof TestCase) { String baseURL = StringUtils.defaultString(context.getOverridingBaseURL(), ((TestCase) testCase).getBaseURL()); log.info("baseURL: {}", baseURL); clr.info("baseURL: " + baseURL); } try { Result result = (Result) invocation.proceed(); if (jUnitResult != null) { if (result.isSuccess()) jUnitResult.setSuccess(testCase); else jUnitResult.setFailure(testCase, result.getMessage(), null); } return result; } catch (Throwable t) { String msg = t.getMessage(); log.error(msg); clr.error(msg); if (jUnitResult != null) jUnitResult.setError(testCase, msg, t.toString()); throw t; } finally { sw.end(); if (!testCase.isError()) { String msg = "End(" + sw.getDurationString() + "): " + testCase; log.info(msg); clr.info(msg); } if (jUnitResult != null) jUnitResult.endTestCase(testCase); } } }