/*
* Copyright (C) 2013 Ustream Inc.
* author chaotx <lombai.ferenc@ustream.tv>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.robin.reporter;
import java.io.File;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang.StringEscapeUtils;
import org.testng.ITestResult;
import com.robin.BaseFunctionality;
import com.robin.utilities.config.ConfigParams;
public final class Reporter
{
public static final String ELEMENT_NAME_STYLE = "loc_name";
public static final String LOCATOR_STYLE = "locator";
public static final String VALUE_STYLE = "value";
public static final String CLICK_EVENT_STYLE = "click";
public static final String TYPE_EVENT_STYLE = "type";
public static final String SELECT_EVENT_STYLE = "select";
public static final String CHECK_EVENT_STYLE = "check";
public static final String WAIT_EVENT_STYLE = "wait";
public static final String CONFIG_EVENT_STYLE = "conf";
public static final String CHECKING_EVENT_STYLE = "checking";
public static final String JS_EVENT_STYLE = "js_event";
public static final String READ_EVENT_STYLE = "reading";
public static final String FLASH_EVENT_STYLE = "flash";
public static final String FACEBOOK_EVENT_STYLE = "facebook";
public static final String SCROLLING_EVENT_STYLE = "scroll";
public static final String NEWLINE = "<br>";
private static int textIdCounter = 0;
/**
* Main verbose level of logging. If this value is greater or equal then the
* given input verbosity, the reporter print message into the html
* report.
*/
private static final int BASE_VERBOSITY = 1;
private static PrintStream origSysOut = null;
private static PrintStream logFileOutput = null;
private Reporter()
{
}
/**
* Adds an HTML new line sign to the end of the input string.
* @param lineText any string that will appear in the HTML report
* @return lineText appended with a new line sign
*/
private static String addNewLine(final String lineText)
{
return lineText + NEWLINE;
}
/**
* Escapes HTML special characters.
* @param text any string that will appear in the HTML report
* @return text where HTML characters are escaped
*/
public static String escapeHtml(final String text)
{
return StringEscapeUtils.escapeHtml(text);
}
/**
* Determines weather the given log level allows to write log text or not.
* @param level is the integer value of the actual log level
* @return true if the given log level is grater or equals then the base log
* level, false otherwise
*/
private static boolean isLogLevel(final int level)
{
return BASE_VERBOSITY >= level;
}
/**
* Paste a new line into the HTML report as xml source, using original
* testNG reporter class.
* @param logLineText xml code of a new line in the report
*/
public static void log(final String logLineText)
{
org.testng.Reporter.log(addNewLine(logLineText));
}
public static void logConsole(final String logLineText)
{
printToStandardOutput(logLineText);
}
/**
* Paste a new line into the HTML report as xml source, using original
* testNG reporter class.
* @param logLineText xml code of a new line in the report
* @param logToStandardOut Whether to print this string on standard out too
*/
public static void log(final String logLineText,
final boolean logToStandardOut)
{
if (logToStandardOut)
{
printToStandardOutput(logLineText);
}
org.testng.Reporter.log(addNewLine(logLineText));
}
/**
* Use OutputStreamWriter to encode UTF-8 and print text to standard output.
* @param logLineText Text to encode and print.
*/
private static void printToStandardOutput(final String logLineText)
{
getOriginalSysOut().println(logLineText);
}
/**
* Paste a new line into the HTML report as xml source, using original
* testNG reporter class if the current verbosity is equal or greater than
* the one passed in parameter.
* @param logLineText xml code of a new line in the report
* @param level the verbosity of this message
*/
public static void log(final String logLineText, final int level)
{
if (isLogLevel(level))
{
org.testng.Reporter.log(addNewLine(logLineText));
}
}
/**
* Paste a new line into the HTML report as xml source, using original
* testNG reporter class if the current verbosity is equal or greater than
* the one passed in parameter.
* @param logLineText xml code of a new line in the report
* @param level the verbosity of this message
* @param logToStandardOut Whether to print this string on standard out too
*/
public static void log(final String logLineText, final int level,
final boolean logToStandardOut)
{
if (isLogLevel(level))
{
if (logToStandardOut)
{
printToStandardOutput(logLineText);
}
org.testng.Reporter.log(addNewLine(logLineText));
}
}
/**
* Paste string into the HTML report as xml source, using original testNG
* reporter class.
* @param logLineText xml code of a new line in the report
*/
public static void logInLine(final String logLineText)
{
org.testng.Reporter.log(logLineText);
}
/**
* Paste string into the HTML report as xml source, using original testNG
* reporter class.
* @param logLineText xml code of a new line in the report
* @param logToStandardOut Whether to print this string on standard out too
*/
public static void logInLine(final String logLineText,
final boolean logToStandardOut)
{
if (logToStandardOut)
{
printToStandardOutput(logLineText);
}
org.testng.Reporter.log(logLineText);
}
/**
* Paste string into the HTML report as xml source, using original testNG
* reporter class if the current verbosity is equal or greater than the one
* passed in parameter.
* @param logLineText xml code of a new line in the report
* @param level the verbosity of this message
*/
public static void logInLine(final String logLineText, final int level)
{
if (isLogLevel(level))
{
org.testng.Reporter.log(logLineText);
}
}
/**
* Paste string into the HTML report as xml source, using original testNG
* reporter class if the current verbosity is equal or greater than the one
* passed in parameter.
* @param logLineText xml code of a new line in the report
* @param level the verbosity of this message
* @param logToStandardOut Whether to print this string on standard out too
*/
public static void logInLine(final String logLineText, final int level,
final boolean logToStandardOut)
{
if (isLogLevel(level))
{
if (logToStandardOut)
{
printToStandardOutput(logLineText);
}
org.testng.Reporter.log(logLineText);
}
}
/**
* Get an HTML link definition from an url string.
* @param url the link url
* @return the HTML link
*/
public static String getHtmlLink(final String url)
{
return getHtmlLink(url, url);
}
/**
* Get an HTML link definition from an url string and a displayed text
* string.
* @param url the link url
* @param text the link text field to appear
* @return the HTML link
*/
public static String getHtmlLink(final String url, final String text)
{
return "<a href=\"" + url + "\" target=\"_blank\">" + text + "</a>";
}
/**
* Get a toggle link to be able to hide long output string in the report.
* @param title the link title
* @param text the text field to hide/appear
* @return the toggle part HTML code
*/
public static String getToogleText(final String title, final String text)
{
final String textClass = "textoutput";
final String textID = textClass + "-" + textIdCounter;
synchronized (Reporter.class)
{
textIdCounter++;
return addNewLine(String.format(
"<a title=\"Click to expand/collapse\""
+ " href=\"javascript:toggleElement('%s', 'block')\">%s"
+ "</a>",
textID,
title))
+ getDiv(textID, textClass, text);
}
}
/**
* Get a HTML div code with a class attributes.
* @param divClass the div class attribute
* @param divText the div text content
* @return the toggle part HTML code
*/
public static String getDiv(final String divClass, final String divText)
{
return String.format("<div class=\"%s\">%s</div>", divClass, divText);
}
/**
* Get a HTML div code with id and class attributes.
* @param divID the div id attribute
* @param divClass the div class attribute
* @param divText the div text content
* @return the toggle part HTML code
*/
public static String getDiv(final String divID, final String divClass,
final String divText)
{
return String.format(
"<div id=\"%s\" class=\"%s\">%s</div>",
divID,
divClass,
divText);
}
/**
* Get an image insertion definition from an image path string.
* @param filePath the relative url of the file to the report html
* @return the image insert HTML string
*/
public static String getImageInsert(final String filePath)
{
return getImageInsert(filePath, filePath);
}
/**
* Get an image insertion definition from an image path string and a
* displayed text string.
* @param filePath the relative url of the file to the report html
* @param text tooltip fot the image
* @return the image insert HTML string
*/
public static String getImageInsert(final String filePath,
final String text)
{
return "<img title = \"" + text + "\" src=\"file:///" + filePath
+ "\" target=\"_blank\">" + text + "</img>";
}
public static String
getFileInsert(final String filePath, final String text)
{
return "<a href=\"file:///" + filePath + "\" target=\"_blank\">"
+ text + "</a>";
}
public static ITestResult getCurrentTestResult()
{
return org.testng.Reporter.getCurrentTestResult();
}
public static void setCurrentTestResult(final ITestResult result)
{
org.testng.Reporter.setCurrentTestResult(result);
}
public static PrintStream getOriginalSysOut()
{
if (origSysOut == null)
{
storeOriginalSysOut();
}
return origSysOut;
}
public static void storeOriginalSysOut()
{
if (origSysOut == null)
{
try
{
origSysOut = new PrintStream(System.out, true, "UTF-8");
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
origSysOut = new PrintStream(System.out, true);
}
}
}
public static PrintStream getLogFileOutputStream()
{
if (logFileOutput == null)
{
File logFile =
new File(BaseFunctionality.config().getValue(
ConfigParams.LOGFILE));
try
{
logFileOutput = new PrintStream(logFile, "UTF-8");
} catch (Exception e)
{
e.printStackTrace();
}
}
return logFileOutput;
}
}