
com.liferay.poshi.runner.logger.CommandLoggerHandler Maven / Gradle / Ivy
/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.poshi.runner.logger;
import com.liferay.poshi.runner.PoshiRunnerContext;
import com.liferay.poshi.runner.PoshiRunnerGetterUtil;
import com.liferay.poshi.runner.PoshiRunnerStackTraceUtil;
import com.liferay.poshi.runner.PoshiRunnerVariablesUtil;
import com.liferay.poshi.runner.exception.PoshiRunnerLoggerException;
import com.liferay.poshi.runner.selenium.LiferaySeleniumHelper;
import com.liferay.poshi.runner.selenium.WebDriverHelper;
import com.liferay.poshi.runner.selenium.WebDriverUtil;
import com.liferay.poshi.runner.util.HtmlUtil;
import com.liferay.poshi.runner.util.StringUtil;
import com.liferay.poshi.runner.util.Validator;
import java.util.List;
import java.util.Objects;
import org.dom4j.Element;
import org.openqa.selenium.WebDriver;
/**
* @author Michael Hashimoto
* @author Peter Yoo
*/
public final class CommandLoggerHandler {
public static void failCommand(Element element)
throws PoshiRunnerLoggerException {
if (!_isCurrentCommand(element)) {
return;
}
try {
_commandElement = null;
_failLineGroupLoggerElement(_lineGroupLoggerElement);
LoggerElement xmlLoggerElement =
XMLLoggerHandler.getXMLLoggerElement(
PoshiRunnerStackTraceUtil.getSimpleStackTrace());
_updateStatus(xmlLoggerElement, "fail");
}
catch (Throwable t) {
throw new PoshiRunnerLoggerException(t.getMessage(), t);
}
}
public static String getCommandLogText() {
return _commandLogLoggerElement.toString();
}
public static int getErrorLinkId() {
return _errorLinkId - 1;
}
public static void logClassCommandName(String classCommandName) {
LoggerElement dividerLineLoggerElement = _getDividerLineLoggerElement(
classCommandName);
_commandLogLoggerElement.addChildLoggerElement(
dividerLineLoggerElement);
}
public static void logExternalMethodCommand(
Element element, List arguments, String returnValue)
throws Exception {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName("line-group linkable");
loggerElement.setName("li");
loggerElement.addChildLoggerElement(
_getExternalMethodLineLoggerElement(
element, arguments, returnValue));
_lineGroupLoggerElement = loggerElement;
_commandLogLoggerElement.addChildLoggerElement(_lineGroupLoggerElement);
LoggerElement xmlLoggerElement = XMLLoggerHandler.getXMLLoggerElement(
PoshiRunnerStackTraceUtil.getSimpleStackTrace());
_linkLoggerElements(xmlLoggerElement);
}
public static void logMessage(Element element)
throws PoshiRunnerLoggerException {
try {
_lineGroupLoggerElement = _getMessageGroupLoggerElement(element);
_commandLogLoggerElement.addChildLoggerElement(
_lineGroupLoggerElement);
LoggerElement xmlLoggerElement =
XMLLoggerHandler.getXMLLoggerElement(
PoshiRunnerStackTraceUtil.getSimpleStackTrace());
_linkLoggerElements(xmlLoggerElement);
_updateStatus(xmlLoggerElement, "pass");
}
catch (Throwable t) {
throw new PoshiRunnerLoggerException(t.getMessage(), t);
}
}
public static void logSeleniumCommand(
Element element, List arguments) {
LoggerElement loggerElement = _lineGroupLoggerElement.loggerElement(
"ul");
loggerElement.addChildLoggerElement(
_getRunLineLoggerElement(element, arguments));
}
public static void passCommand(Element element) {
if (!_isCurrentCommand(element)) {
return;
}
_commandElement = null;
LoggerElement xmlLoggerElement = XMLLoggerHandler.getXMLLoggerElement(
PoshiRunnerStackTraceUtil.getSimpleStackTrace());
_updateStatus(xmlLoggerElement, "pass");
}
public static void startCommand(Element element)
throws PoshiRunnerLoggerException {
if (!_isCommand(element)) {
return;
}
try {
_takeScreenshot("before", _errorLinkId);
_commandElement = element;
_lineGroupLoggerElement = _getLineGroupLoggerElement(element);
_commandLogLoggerElement.addChildLoggerElement(
_lineGroupLoggerElement);
LoggerElement xmlLoggerElement =
XMLLoggerHandler.getXMLLoggerElement(
PoshiRunnerStackTraceUtil.getSimpleStackTrace());
_linkLoggerElements(xmlLoggerElement);
_updateStatus(xmlLoggerElement, "pending");
}
catch (Throwable t) {
throw new PoshiRunnerLoggerException(t.getMessage(), t);
}
}
public static void startRunning() {
_commandLogLoggerElement = new LoggerElement("commandLog");
_commandLogLoggerElement.setAttribute("data-logid", "01");
_commandLogLoggerElement.setClassName("collapse command-log running");
_commandLogLoggerElement.setName("ul");
_commandLogLoggerElement.setWrittenToLogger(true);
}
public static void stopRunning() {
_commandLogLoggerElement.removeClassName("running");
}
public static void warnCommand(Element element)
throws PoshiRunnerLoggerException {
if (!_isCurrentCommand(element)) {
return;
}
try {
_commandElement = null;
_warningLineGroupLoggerElement(_lineGroupLoggerElement);
LoggerElement xmlLoggerElement =
XMLLoggerHandler.getXMLLoggerElement(
PoshiRunnerStackTraceUtil.getSimpleStackTrace());
_updateStatus(xmlLoggerElement, "warning");
}
catch (Throwable t) {
throw new PoshiRunnerLoggerException(t.getMessage(), t);
}
}
private static void _failLineGroupLoggerElement(
LoggerElement lineGroupLoggerElement)
throws Exception {
lineGroupLoggerElement.addClassName("failed");
lineGroupLoggerElement.addChildLoggerElement(
_getErrorContainerLoggerElement());
LoggerElement childContainerLoggerElement =
lineGroupLoggerElement.loggerElement("ul");
List runLineLoggerElements =
childContainerLoggerElement.loggerElements("li");
if (!runLineLoggerElements.isEmpty()) {
LoggerElement runLineLoggerElement = runLineLoggerElements.get(
runLineLoggerElements.size() - 1);
runLineLoggerElement.addClassName("error-line");
}
}
private static LoggerElement _getButtonLoggerElement(int btnLinkId) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setAttribute("data-btnlinkid", "command-" + btnLinkId);
loggerElement.setClassName("btn expand-toggle");
return loggerElement;
}
private static LoggerElement _getChildContainerLoggerElement(
int btnLinkId) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setAttribute("data-btnlinkid", "command-" + btnLinkId);
loggerElement.setClassName("child-container collapse");
loggerElement.setName("ul");
return loggerElement;
}
private static LoggerElement _getConsoleLoggerElement(int errorLinkId) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setAttribute(
"data-errorlinkid", "console-" + errorLinkId);
loggerElement.setClassName("console errorPanel toggle");
loggerElement.addChildLoggerElement(
SummaryLoggerHandler.getSummarySnapshotLoggerElement());
return loggerElement;
}
private static LoggerElement _getDividerLineLoggerElement(
String classCommandName) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName("divider-line");
loggerElement.setText(classCommandName);
return loggerElement;
}
private static LoggerElement _getErrorContainerLoggerElement()
throws Exception {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName("error-container hidden");
loggerElement.addChildLoggerElement(
_getConsoleLoggerElement(_errorLinkId));
loggerElement.addChildLoggerElement(
_getScreenshotsLoggerElement(_errorLinkId));
_errorLinkId++;
return loggerElement;
}
private static LoggerElement _getExternalMethodLineLoggerElement(
Element element, List arguments, String returnValue)
throws Exception {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName("line-container");
loggerElement.setText(
_getExternalMethodLineText(element, arguments, returnValue));
return loggerElement;
}
private static String _getExternalMethodLineText(
Element element, List arguments, String returnValue)
throws Exception {
StringBuilder sb = new StringBuilder();
sb.append(_getLineItemText("misc", "Running "));
sb.append(
_getLineItemText("command-name", element.attributeValue("method")));
if (!arguments.isEmpty()) {
sb.append(_getLineItemText("misc", " with parameters"));
for (String argument : arguments) {
argument = "Arg: " + argument;
sb.append(
_getLineItemText("param-value", HtmlUtil.escape(argument)));
}
}
if (returnValue != null) {
returnValue = "Return: " + returnValue;
sb.append(
_getLineItemText("param-value", HtmlUtil.escape(returnValue)));
}
return sb.toString();
}
private static LoggerElement _getLineContainerLoggerElement(Element element)
throws Exception {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName("line-container");
loggerElement.setText(_getLineContainerText(element));
return loggerElement;
}
private static String _getLineContainerText(Element element)
throws Exception {
StringBuilder sb = new StringBuilder();
sb.append(_getLineItemText("misc", "Running "));
String classCommandName = element.attributeValue("function");
sb.append(_getLineItemText("command-name", classCommandName));
String className =
PoshiRunnerGetterUtil.getClassNameFromClassCommandName(
classCommandName);
int functionLocatorCount = PoshiRunnerContext.getFunctionLocatorCount(
className);
for (int i = 0; i < functionLocatorCount; i++) {
String locatorKey = "locator" + (i + 1);
if (PoshiRunnerVariablesUtil.containsKeyInExecuteMap(locatorKey)) {
sb.append(_getLineItemText("misc", " with "));
sb.append(_getLineItemText("param-type", locatorKey));
String paramValue =
PoshiRunnerVariablesUtil.getValueFromExecuteMap(locatorKey);
sb.append(
_getLineItemText(
"param-value", HtmlUtil.escape(paramValue)));
}
String valueKey = "value" + (i + 1);
if (PoshiRunnerVariablesUtil.containsKeyInExecuteMap(valueKey)) {
sb.append(_getLineItemText("misc", " with "));
sb.append(_getLineItemText("param-type", valueKey));
String paramValue =
PoshiRunnerVariablesUtil.getValueFromExecuteMap(valueKey);
sb.append(
_getLineItemText(
"param-value", HtmlUtil.escape(paramValue)));
}
}
return sb.toString();
}
private static LoggerElement _getLineGroupLoggerElement(Element element)
throws Exception {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName("line-group linkable");
loggerElement.setName("li");
loggerElement.addChildLoggerElement(
_getButtonLoggerElement(_btnLinkId));
loggerElement.addChildLoggerElement(
_getLineContainerLoggerElement(element));
loggerElement.addChildLoggerElement(
_getChildContainerLoggerElement(_btnLinkId));
_btnLinkId++;
return loggerElement;
}
private static String _getLineItemText(String className, String text) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName(className);
loggerElement.setID(null);
loggerElement.setName("span");
loggerElement.setText(text);
return loggerElement.toString();
}
private static LoggerElement _getMessageContainerLoggerElement(
Element element)
throws Exception {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName("line-container");
loggerElement.setText(_getMessageContainerText(element));
return loggerElement;
}
private static String _getMessageContainerText(Element element)
throws Exception {
String message = element.attributeValue("message");
if (message == null) {
message = element.getText();
}
return PoshiRunnerVariablesUtil.replaceCommandVars(message);
}
private static LoggerElement _getMessageGroupLoggerElement(Element element)
throws Exception {
LoggerElement loggerElement = new LoggerElement();
String className = "line-group linkable";
if (_isFail(element)) {
className = className + " failed";
}
loggerElement.setClassName(className);
loggerElement.setName("li");
loggerElement.addChildLoggerElement(
_getMessageContainerLoggerElement(element));
return loggerElement;
}
private static LoggerElement _getRunLineLoggerElement(
Element element, List arguments) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName("run-line");
loggerElement.setName("li");
loggerElement.setText(_getRunLineText(element, arguments));
return loggerElement;
}
private static String _getRunLineText(
Element element, List arguments) {
StringBuilder sb = new StringBuilder();
sb.append(_getLineItemText("misc", "Running "));
sb.append(
_getLineItemText(
"command-name", element.attributeValue("selenium")));
if (!arguments.isEmpty()) {
sb.append(_getLineItemText("misc", " with parameters"));
for (String argument : arguments) {
sb.append(
_getLineItemText("param-value", HtmlUtil.escape(argument)));
}
}
return sb.toString();
}
private static LoggerElement _getScreenshotContainerLoggerElement(
String screenshotName, int errorLinkId) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setClassName(screenshotName + " screenshot-container");
loggerElement.addChildLoggerElement(
_getScreenshotLoggerElement(screenshotName, errorLinkId));
loggerElement.addChildLoggerElement(
_getScreenshotSpanLoggerElement(
StringUtil.upperCaseFirstLetter(screenshotName)));
return loggerElement;
}
private static LoggerElement _getScreenshotLoggerElement(
String screenshotName, int errorLinkId) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setAttribute("alt", screenshotName + errorLinkId);
loggerElement.setAttribute(
"src", "screenshots/" + screenshotName + errorLinkId + ".jpg");
loggerElement.setName("img");
return loggerElement;
}
private static LoggerElement _getScreenshotsLoggerElement(int errorLinkId)
throws Exception {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setAttribute(
"data-errorlinkid", "screenshots-" + errorLinkId);
loggerElement.setClassName("errorPanel screenshots toggle");
loggerElement.addChildLoggerElement(
_getScreenshotContainerLoggerElement("before", errorLinkId));
_takeScreenshot("after", errorLinkId);
loggerElement.addChildLoggerElement(
_getScreenshotContainerLoggerElement("after", errorLinkId));
return loggerElement;
}
private static LoggerElement _getScreenshotSpanLoggerElement(
String screenshotName) {
LoggerElement loggerElement = new LoggerElement();
loggerElement.setName("span");
loggerElement.setText(StringUtil.upperCaseFirstLetter(screenshotName));
return loggerElement;
}
private static boolean _isCommand(Element element) {
if (!Objects.equals(element.getName(), "condition") &&
!Objects.equals(element.getName(), "execute")) {
return false;
}
if (Validator.isNull(element.attributeValue("function"))) {
return false;
}
if (_commandElement != null) {
return false;
}
return true;
}
private static boolean _isCurrentCommand(Element element) {
return element.equals(_commandElement);
}
private static boolean _isFail(Element element) {
return Objects.equals(
StringUtil.toLowerCase(element.getName()), "fail");
}
private static void _linkLoggerElements(LoggerElement xmlLoggerElement) {
String functionLinkID = xmlLoggerElement.getAttributeValue(
"data-functionlinkid");
if (functionLinkID != null) {
_functionLinkId = Integer.parseInt(functionLinkID.substring(15));
}
xmlLoggerElement.setAttribute(
"data-functionlinkid", "functionLinkId-" + _functionLinkId);
_lineGroupLoggerElement.setAttribute(
"data-functionlinkid", "functionLinkId-" + _functionLinkId);
_functionLinkId++;
}
private static void _setHTMLSource() throws Exception {
WebDriver webDriver = WebDriverUtil.getWebDriver();
_htmlSource = webDriver.getPageSource();
}
private static void _takeScreenshot(String screenshotName, int errorLinkId)
throws Exception {
String testClassCommandName =
PoshiRunnerContext.getTestCaseCommandName();
testClassCommandName = StringUtil.replace(
testClassCommandName, "#", "_");
LiferaySeleniumHelper.captureScreen(
PoshiRunnerGetterUtil.getCanonicalPath(".") + "/test-results/" +
testClassCommandName + "/screenshots/" + screenshotName +
errorLinkId + ".jpg");
}
private static void _updateStatus(
LoggerElement loggerElement, String status) {
loggerElement.setAttribute("data-status01", status);
LoggerUtil.executeJavaScript(
"loggerInterface.fire('command-complete', '" +
loggerElement.getID() + "')");
}
private static void _warningLineGroupLoggerElement(
LoggerElement lineGroupLoggerElement)
throws Exception {
lineGroupLoggerElement.addClassName("warning");
lineGroupLoggerElement.addChildLoggerElement(
_getErrorContainerLoggerElement());
LoggerElement childContainerLoggerElement =
lineGroupLoggerElement.loggerElement("ul");
List runLineLoggerElements =
childContainerLoggerElement.loggerElements("li");
if (!runLineLoggerElements.isEmpty()) {
LoggerElement runLineLoggerElement = runLineLoggerElements.get(
runLineLoggerElements.size() - 1);
runLineLoggerElement.addClassName("warning-line");
}
}
private static void _writeWebPage(int errorLinkId) throws Exception {
String testClassCommandName =
PoshiRunnerContext.getTestCaseCommandName();
testClassCommandName = StringUtil.replace(
testClassCommandName, "#", "_");
WebDriverHelper.saveWebPage(
PoshiRunnerGetterUtil.getCanonicalPath(".") + "/test-results/" +
testClassCommandName + "/web-pages/index" + errorLinkId +
".html",
_htmlSource);
}
private static int _btnLinkId;
private static Element _commandElement;
private static LoggerElement _commandLogLoggerElement;
private static int _errorLinkId;
private static int _functionLinkId;
private static String _htmlSource;
private static LoggerElement _lineGroupLoggerElement;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy