| package org.testng.remote.strprotocol; |
| |
| |
| import java.io.PrintWriter; |
| import java.io.StringWriter; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.testng.ITestContext; |
| import org.testng.ITestResult; |
| import org.testng.SkipException; |
| import org.testng.collections.Lists; |
| |
| |
| /** |
| * An <code>IStringMessage</code> implementation for test results events. |
| * |
| * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a> |
| */ |
| public class TestResultMessage implements IStringMessage { |
| private static final Object[] EMPTY_PARAMS= new Object[0]; |
| private static final Class[] EMPTY_TYPES= new Class[0]; |
| |
| protected int m_messageType; |
| protected String m_suiteName; |
| protected String m_testName; |
| protected String m_testClassName; |
| protected String m_testMethodName; |
| protected String m_stackTrace; |
| protected long m_startMillis; |
| protected long m_endMillis; |
| protected String[] m_parameters= new String[0]; |
| protected String[] m_paramTypes= new String[0]; |
| private String m_testDescription; |
| |
| TestResultMessage(final int resultType, |
| final String suiteName, |
| final String testName, |
| final String className, |
| final String methodName, |
| final String testDescriptor, |
| final String[] params, |
| final long startMillis, |
| final long endMillis, |
| final String stackTrace) |
| { |
| init(resultType, |
| suiteName, |
| testName, |
| className, |
| methodName, |
| stackTrace, |
| startMillis, |
| endMillis, |
| extractParams(params), |
| extractParamTypes(params), |
| testDescriptor |
| ); |
| } |
| |
| public TestResultMessage(final String suiteName, |
| final String testName, |
| final ITestResult result) |
| { |
| String stackTrace = null; |
| |
| if((ITestResult.FAILURE == result.getStatus()) |
| || (ITestResult.SUCCESS_PERCENTAGE_FAILURE == result.getStatus())) { |
| StringWriter sw = new StringWriter(); |
| PrintWriter pw = new PrintWriter(sw); |
| Throwable cause= result.getThrowable(); |
| if (null != cause) { |
| cause.printStackTrace(pw); |
| stackTrace = sw.getBuffer().toString(); |
| } |
| else { |
| stackTrace= "unknown stack trace"; |
| } |
| } |
| else if(ITestResult.SKIP == result.getStatus() |
| && (result.getThrowable() != null && SkipException.class.isAssignableFrom(result.getThrowable().getClass()))) { |
| stackTrace= result.getThrowable().getMessage(); |
| } |
| |
| init(MessageHelper.TEST_RESULT + result.getStatus(), |
| suiteName, |
| testName, |
| result.getTestClass().getName(), |
| result.getMethod().getMethod().getName(), |
| MessageHelper.replaceUnicodeCharactersWithAscii(stackTrace), |
| result.getStartMillis(), |
| result.getEndMillis(), |
| toString(result.getParameters(), result.getMethod().getMethod().getParameterTypes()), |
| toString(result.getMethod().getMethod().getParameterTypes()), |
| MessageHelper.replaceUnicodeCharactersWithAscii(result.getName()) |
| ); |
| } |
| |
| public TestResultMessage(final ITestContext testCtx, final ITestResult result) { |
| this(testCtx.getSuite().getName(), testCtx.getName(), result); |
| } |
| |
| private void init(final int resultType, |
| final String suiteName, |
| final String testName, |
| final String className, |
| final String methodName, |
| final String stackTrace, |
| final long startMillis, |
| final long endMillis, |
| final String[] parameters, |
| final String[] types, |
| final String testDescription) { |
| m_messageType = resultType; |
| m_suiteName = suiteName; |
| m_testName = testName; |
| m_testClassName = className; |
| m_testMethodName = methodName; |
| m_stackTrace = stackTrace; |
| m_startMillis= startMillis; |
| m_endMillis= endMillis; |
| m_parameters= parameters; |
| m_paramTypes= types; |
| m_testDescription= testDescription; |
| } |
| |
| public int getResult() { |
| return m_messageType; |
| } |
| |
| public String getMessageAsString() { |
| StringBuffer buf = new StringBuffer(); |
| StringBuffer parambuf = new StringBuffer(); |
| |
| if(null != m_parameters && m_parameters.length > 0) { |
| for (int j = 0; j < m_parameters.length; j++) { |
| if (j > 0) parambuf.append(MessageHelper.PARAM_DELIMITER); |
| parambuf.append(m_paramTypes[j] + ":" + m_parameters[j]); |
| } |
| } |
| |
| buf.append(m_messageType) |
| .append(MessageHelper.DELIMITER) |
| .append(m_suiteName) |
| .append(MessageHelper.DELIMITER) |
| .append(m_testName) |
| .append(MessageHelper.DELIMITER) |
| .append(m_testClassName) |
| .append(MessageHelper.DELIMITER) |
| .append(m_testMethodName) |
| .append(MessageHelper.DELIMITER) |
| .append(parambuf) |
| .append(MessageHelper.DELIMITER) |
| .append(m_startMillis) |
| .append(MessageHelper.DELIMITER) |
| .append(m_endMillis) |
| .append(MessageHelper.DELIMITER) |
| .append(MessageHelper.replaceNewLine(m_stackTrace)) |
| .append(MessageHelper.DELIMITER) |
| .append(MessageHelper.replaceNewLine(m_testDescription)) |
| ; |
| |
| return buf.toString(); |
| } |
| |
| public String getSuiteName() { |
| return m_suiteName; |
| } |
| |
| public String getTestClass() { |
| return m_testClassName; |
| } |
| |
| public String getMethod() { |
| return m_testMethodName; |
| } |
| |
| public String getName() { |
| return m_testName; |
| } |
| |
| public String getStackTrace() { |
| return m_stackTrace; |
| } |
| |
| public long getEndMillis() { |
| return m_endMillis; |
| } |
| |
| public long getStartMillis() { |
| return m_startMillis; |
| } |
| |
| public String[] getParameters() { |
| return m_parameters; |
| } |
| |
| public String[] getParameterTypes() { |
| return m_paramTypes; |
| } |
| |
| public String getTestDescription() { |
| return m_testDescription; |
| } |
| |
| public String toDisplayString() { |
| StringBuffer buf= new StringBuffer(m_testMethodName); |
| |
| if(null != m_parameters && m_parameters.length > 0) { |
| buf.append("("); |
| for(int i= 0; i < m_parameters.length; i++) { |
| if(i > 0) buf.append(", "); |
| if("java.lang.String".equals(m_paramTypes[i]) && !("null".equals(m_parameters[i]) || "\"\"".equals(m_parameters[i]))) { |
| buf.append("\"").append(m_parameters[i]).append("\""); |
| } |
| else { |
| buf.append(m_parameters[i]); |
| } |
| |
| } |
| buf.append(")"); |
| } |
| |
| return buf.toString(); |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if(this == o) return true; |
| if(o == null || getClass() != o.getClass()) return false; |
| |
| final TestResultMessage that = (TestResultMessage) o; |
| |
| if(m_suiteName != null ? !m_suiteName.equals(that.m_suiteName) : that.m_suiteName != null) return false; |
| if(m_testName != null ? !m_testName.equals(that.m_testName) : that.m_testName != null) return false; |
| if(m_testClassName != null ? !m_testClassName.equals(that.m_testClassName) : that.m_testClassName != null) return false; |
| String toDisplayString= toDisplayString(); |
| if(toDisplayString != null ? !toDisplayString.equals(that.toDisplayString()) : that.toDisplayString() != null) return false; |
| |
| return true; |
| } |
| |
| @Override |
| public int hashCode() { |
| int result = (m_suiteName != null ? m_suiteName.hashCode() : 0); |
| result = 29 * result + (m_testName != null ? m_testName.hashCode() : 0); |
| result = 29 * result + m_testClassName.hashCode(); |
| result = 29 * result + toDisplayString().hashCode(); |
| return result; |
| } |
| |
| private String[] toString(Object[] objects, Class[] objectClasses) { |
| if(null == objects) return new String[0]; |
| List<String> result= Lists.newArrayList(objects.length); |
| for(Object o: objects) { |
| if(null == o) { |
| result.add("null"); |
| } |
| else { |
| String tostring= o.toString(); |
| if("".equals(tostring)) { |
| result.add("\"\""); |
| } |
| else { |
| result.add(MessageHelper.replaceNewLine(tostring)); |
| } |
| } |
| } |
| |
| return result.toArray(new String[result.size()]); |
| } |
| |
| private String[] toString(Class[] classes) { |
| if(null == classes) return new String[0]; |
| List<String> result= Lists.newArrayList(classes.length); |
| for(Class cls: classes) { |
| result.add(cls.getName()); |
| } |
| |
| return result.toArray(new String[result.size()]); |
| } |
| |
| /** |
| * @param params |
| * @return |
| */ |
| private String[] extractParamTypes(String[] params) { |
| List<String> result= Lists.newArrayList(params.length); |
| for(String s: params) { |
| result.add(s.substring(0, s.indexOf(':'))); |
| } |
| |
| return result.toArray(new String[result.size()]); |
| } |
| |
| private String[] extractParams(String[] params) { |
| List<String> result= Lists.newArrayList(params.length); |
| for(String s: params) { |
| result.add(MessageHelper.replaceNewLineReplacer(s.substring(s.indexOf(':') + 1))); |
| } |
| |
| return result.toArray(new String[result.size()]); |
| } |
| } |