/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.core.businessprocess;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jubula.client.core.ClientTest;
import org.eclipse.jubula.client.core.IClientTest;
import org.eclipse.jubula.client.core.events.DataEventDispatcher;
import org.eclipse.jubula.client.core.events.DataEventDispatcher.DataState;
import org.eclipse.jubula.client.core.i18n.Messages;
import org.eclipse.jubula.client.core.model.IALMReportingRulePO;
import org.eclipse.jubula.client.core.model.IAUTConfigPO;
import org.eclipse.jubula.client.core.model.IAUTMainPO;
import org.eclipse.jubula.client.core.model.IAbstractContainerPO;
import org.eclipse.jubula.client.core.model.ICapPO;
import org.eclipse.jubula.client.core.model.ICommentPO;
import org.eclipse.jubula.client.core.model.IConditionalStatementPO;
import org.eclipse.jubula.client.core.model.IDoWhilePO;
import org.eclipse.jubula.client.core.model.IIteratePO;
import org.eclipse.jubula.client.core.model.INodePO;
import org.eclipse.jubula.client.core.model.IParameterDetailsPO;
import org.eclipse.jubula.client.core.model.IProjectPO;
import org.eclipse.jubula.client.core.model.IProjectPropertiesPO;
import org.eclipse.jubula.client.core.model.ITestCasePO;
import org.eclipse.jubula.client.core.model.ITestJobPO;
import org.eclipse.jubula.client.core.model.ITestResultPO;
import org.eclipse.jubula.client.core.model.ITestResultSummaryPO;
import org.eclipse.jubula.client.core.model.ITestResultSummaryPO.AlmReportStatus;
import org.eclipse.jubula.client.core.model.ITestSuitePO;
import org.eclipse.jubula.client.core.model.IWhileDoPO;
import org.eclipse.jubula.client.core.model.NodeMaker;
import org.eclipse.jubula.client.core.model.PoMaker;
import org.eclipse.jubula.client.core.model.TestResult;
import org.eclipse.jubula.client.core.model.TestResultNode;
import org.eclipse.jubula.client.core.model.TestResultParameter;
import org.eclipse.jubula.client.core.persistence.PMException;
import org.eclipse.jubula.client.core.persistence.Persistor;
import org.eclipse.jubula.tools.internal.constants.AutConfigConstants;
import org.eclipse.jubula.tools.internal.constants.MonitoringConstants;
import org.eclipse.jubula.tools.internal.exception.JBFatalException;
import org.eclipse.jubula.tools.internal.exception.ProjectDeletedException;
import org.eclipse.jubula.tools.internal.i18n.CompSystemI18n;
import org.eclipse.jubula.tools.internal.i18n.I18n;
import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs;
import org.eclipse.jubula.tools.internal.objects.event.TestErrorEvent;
import org.eclipse.jubula.tools.internal.utils.TimeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Class to get keywords and summary from testresultnode to persist in database
*
* @author BREDEX GmbH
* @created Mar 4, 2010
*/
public class TestresultSummaryBP {
/**
* <code>autrun</code>
* if autconfig is null because autrun ist used,
* use this constant for summary table
*/
public static final String AUTRUN = "autrun"; //$NON-NLS-1$
/** constant for keyword type Iterate loop */
public static final int TYPE_ITERATE = 9;
/** constant for keyword type While Do loop */
public static final int TYPE_WHILEDO = 8;
/** constant for keyword type Do While loop */
public static final int TYPE_DOWHILE = 7;
/** constant for keyword type Abstract Container */
public static final int TYPE_CONTAINER = 6;
/** constant for keyword type Condition */
public static final int TYPE_CONDITION = 5;
/** constant for keyword type Comment */
public static final int TYPE_COMMENT = 4;
/** constant for keyword type Test Step */
public static final int TYPE_TEST_STEP = 3;
/** constant for keyword type Test Case */
public static final int TYPE_TEST_CASE = 2;
/** constant for keyword type Test Suite */
public static final int TYPE_TEST_SUITE = 1;
/** the logger */
private static Logger log = LoggerFactory.getLogger(
TestresultSummaryBP.class);
/** instance */
private static TestresultSummaryBP instance = null;
/** id of parent keyword*/
private Long m_parentKeyWordId;
/**
* @param result The Test Result containing the source data.
* @param summary The Test Result Summary to fill with data.
*/
public void fillTestResultSummary(TestResult result,
ITestResultSummaryPO summary) {
TestExecution te = TestExecution.getInstance();
ITestSuitePO ts = te.getStartedTestSuite();
IAUTMainPO startedAut = te.getConnectedAut();
if (result.getAutConfigMap() != null && startedAut != null) {
String autConfigName = result.getAutConfigName();
for (IAUTConfigPO conf : startedAut.getAutConfigSet()) {
if (conf.getValue(AutConfigConstants.AUT_CONFIG_NAME, "invalid") //$NON-NLS-1$
.equals(autConfigName)) {
summary.setInternalAutConfigGuid(conf.getGuid());
break;
}
}
} else {
summary.setInternalAutConfigGuid(AUTRUN);
}
summary.setAutConfigName(result.getAutConfigName());
summary.setAutCmdParameter(result.getAutArguments());
summary.setAutId(result.getAutId());
summary.setAutOS(System.getProperty("os.name")); //$NON-NLS-1$
IAUTMainPO aut = startedAut != null ? startedAut : ts.getAut();
if (aut != null) {
summary.setInternalAutGuid(aut.getGuid());
summary.setAutName(aut.getName());
summary.setAutToolkit(aut.getToolkit());
}
summary.setTestsuiteDate(new Date());
summary.setInternalTestsuiteGuid(ts.getGuid());
summary.setTestsuiteName(ts.getName());
summary.setInternalProjectGuid(result.getProjectGuid());
summary.setInternalProjectID(result.getProjectId());
summary.setProjectName(result.getProjectName());
summary.setProjectMajorVersion(result.getProjectMajorVersion());
summary.setProjectMinorVersion(result.getProjectMinorVersion());
summary.setProjectMicroVersion(result.getProjectMicroVersion());
summary.setProjectVersionQualifier(result.getProjectVersionQualifier());
IClientTest clientTest = ClientTest.instance();
Date startTime = clientTest.getTestsuiteStartTime();
summary.setTestsuiteStartTime(startTime);
Date endTime = new Date();
summary.setTestsuiteEndTime(endTime);
summary.setTestsuiteDuration(
TimeUtil.getDurationString(startTime, endTime));
summary.setTestsuiteExecutedTeststeps(te.getNumberOfTestedSteps());
summary.setTestsuiteExpectedTeststeps(te.getExpectedNumberOfSteps());
summary.setTestsuiteEventHandlerTeststeps(
te.getNumberOfEventHandlerSteps()
+ te.getNumberOfRetriedSteps());
summary.setTestsuiteFailedTeststeps(te.getNumberOfFailedSteps());
summary.setTestsuiteRelevant(te.getStartedTestSuite().getRelevant());
ITestJobPO tj = te.getStartedTestJob();
if (tj != null) {
summary.setTestJobName(tj.getName());
summary.setInternalTestJobGuid(tj.getGuid());
summary.setTestJobStartTime(clientTest
.getTestjobStartTime());
}
summary.setTestsuiteStatus(
result.getRootResultNode().getStatus());
//set default monitoring values.
summary.setInternalMonitoringId(
MonitoringConstants.EMPTY_MONITORING_ID);
summary.setReportWritten(false);
determineAlmRepositoryStatus(summary, result);
summary.setMonitoringValueType(MonitoringConstants.EMPTY_TYPE);
}
/**
* @param summary
* the summary to determine the status for
* @param result
* the result
*/
private void determineAlmRepositoryStatus(ITestResultSummaryPO summary,
TestResult result) {
IProjectPO project = result.getProject();
final IProjectPropertiesPO projectProperties = project
.getProjectProperties();
final boolean reportSuccess = projectProperties.getIsReportOnSuccess();
final boolean reportFailure = projectProperties.getIsReportOnFailure();
final List<IALMReportingRulePO> reportingRules =
projectProperties.getALMReportingRules();
final List<IALMReportingRulePO> reportingRulesCopy =
new ArrayList<IALMReportingRulePO>();
for (IALMReportingRulePO rule : reportingRules) {
reportingRulesCopy.add(rule.copy());
}
final String almRepositoryName = projectProperties
.getALMRepositoryName();
AlmReportStatus status = AlmReportStatus.NOT_CONFIGURED;
if (StringUtils.isNotEmpty(almRepositoryName)
&& (reportSuccess || reportFailure || !reportingRules.isEmpty())
&& summary.isTestsuiteRelevant()) {
status = AlmReportStatus.NOT_YET_REPORTED;
summary.setALMRepositoryName(almRepositoryName);
summary.setIsReportOnSuccess(reportSuccess);
summary.setIsReportOnFailure(reportFailure);
summary.setALMReportingRules(reportingRulesCopy);
summary.setDashboardURL(projectProperties.getDashboardURL());
}
summary.setAlmReportStatus(status);
}
/**
* @param result The Test Result.
* @param summaryId id of test result summary
* @return session of test result details to persist in database
*/
public EntityManager createTestResultDetailsSession(TestResult result,
Long summaryId) {
final EntityManager sess = Persistor.instance().openSession();
Persistor.instance().getTransaction(sess);
buildTestResultDetailsSession(
result.getRootResultNode(), sess, summaryId, 1, 1);
return sess;
}
/**
* Recursively build list of test result details to persist in database.
*
* @param result TestResultNode
* @param sess Session
* @param summaryId id of testrun summary
* @param nodeLevel "Indentation"-level of the node.
* @param startingNodeSequence Initial sequence number for this section
* of the Test Results.
*
* @return the continuation of the sequence number.
*/
private int buildTestResultDetailsSession(TestResultNode result,
EntityManager sess, Long summaryId, final int nodeLevel,
final int startingNodeSequence) {
int nodeSequence = startingNodeSequence;
TestResultNode resultNode = result;
ITestResultPO keyword = PoMaker.createTestResultPO();
fillNode(keyword, resultNode);
keyword.setKeywordLevel(nodeLevel);
keyword.setKeywordSequence(nodeSequence);
keyword.setInternalTestResultSummaryID(summaryId);
keyword.setInternalParentKeywordID(m_parentKeyWordId);
sess.persist(keyword);
for (TestResultNode node : resultNode.getResultNodeList()) {
m_parentKeyWordId = keyword.getId();
nodeSequence = buildTestResultDetailsSession(node, sess, summaryId,
nodeLevel + 1, nodeSequence + 1);
}
return nodeSequence;
}
/**
* fill result node
* @param keyword ITestResultPO
* @param resultNode ITestResultPO
*/
private void fillNode(ITestResultPO keyword, TestResultNode resultNode) {
INodePO node = resultNode.getNode();
keyword.setKeywordName(node.getName());
keyword.setInternalKeywordGuid(node.getGuid());
keyword.setKeywordComment(node.getComment());
keyword.setTaskId(resultNode.getTaskId());
keyword.setInternalKeywordStatus(resultNode.getStatus());
keyword.setKeywordStatus(resultNode.getStatusString());
if (resultNode.getTimeStamp() != null) {
keyword.setTimestamp(resultNode.getTimeStamp());
}
if (resultNode.getParent() != null) {
keyword.setInternalParentKeywordID(
resultNode.getParent().getNode().getId());
}
addParameterListToResult(keyword, resultNode);
keyword.setKeywordType(resultNode.getTypeOfNode());
if (node instanceof ICapPO) {
keyword.setInternalKeywordType(TYPE_TEST_STEP);
//set component name, type and action name
ICapPO cap = (ICapPO)node;
String compNameGuid = cap.getComponentName();
keyword.setInternalComponentNameGuid(compNameGuid);
keyword.setComponentName(
StringUtils.defaultString(resultNode.getComponentName()));
keyword.setInternalComponentType(cap.getComponentType());
keyword.setComponentType(CompSystemI18n.getString(
cap.getComponentType()));
keyword.setInternalActionName(cap.getActionName());
keyword.setActionName(CompSystemI18n.getString(
cap.getActionName()));
String commandlog = resultNode.getCommandLog();
if (StringUtils.isNotBlank(commandlog)) {
keyword.addAdditon(
NodeMaker.createTestResultAddtionPO(commandlog));
}
//add screenshot if exists
if (resultNode.getScreenshot() != null) {
keyword.setImage(resultNode.getScreenshot());
}
//add error details
addErrorDetails(keyword, resultNode);
keyword.setNoOfSimilarComponents(
resultNode.getNoOfSimilarComponents());
keyword.setOmHeuristicEquivalence(
resultNode.getOmHeuristicEquivalence());
} else if (node instanceof ITestCasePO) {
keyword.setInternalKeywordType(TYPE_TEST_CASE);
//setting the JUnitsuite
keyword.setIsJUnitSuite(node.isJUnitTestSuite());
} else if (node instanceof ITestSuitePO) {
keyword.setInternalKeywordType(TYPE_TEST_SUITE);
} else if (node instanceof ICommentPO) {
keyword.setInternalKeywordType(TYPE_COMMENT);
} else if (node instanceof IConditionalStatementPO) {
keyword.setInternalKeywordType(TYPE_CONDITION);
} else if (node instanceof IAbstractContainerPO) {
keyword.setInternalKeywordType(TYPE_CONTAINER);
} else if (node instanceof IDoWhilePO) {
keyword.setInternalKeywordType(TYPE_DOWHILE);
} else if (node instanceof IWhileDoPO) {
keyword.setInternalKeywordType(TYPE_WHILEDO);
} else if (node instanceof IIteratePO) {
keyword.setInternalKeywordType(TYPE_ITERATE);
}
}
/**
* @param node TestResultNode
* @param keyword ITestResultPO
*/
private void addParameterListToResult(ITestResultPO keyword,
TestResultNode node) {
for (TestResultParameter param : node.getParameters()) {
IParameterDetailsPO parameter = PoMaker.createParameterDetailsPO();
parameter.setParameterName(param.getName());
parameter.setParameterType(param.getType());
String value = param.getValue();
if (value.length() >= 3500) {
log.warn("Parameter value to long: " + value); //$NON-NLS-1$
value = StringUtils.substring(value, 0, 3500);
}
parameter.setParameterValue(value);
keyword.addParameter(parameter);
}
}
/**
* add error details to test result element
* @param keyword ITestResultPO
* @param node TestResultNode
*/
private void addErrorDetails(ITestResultPO keyword, TestResultNode node) {
if (node.getStatus() == TestResultNode.ERROR
|| node.getStatus() == TestResultNode.RETRYING) {
TestErrorEvent event = node.getEvent();
keyword.setStatusType(I18n.getString(event.getId(),
true));
Map<String, Object> eventProps = event.getProps();
String descriptionKey = (String) eventProps
.get(TestErrorEvent.Property.DESCRIPTION_KEY);
if (descriptionKey != null) {
Object[] args = (Object[]) eventProps
.get(TestErrorEvent.Property.PARAMETER_KEY);
// error description
keyword.setStatusDescription(String.valueOf(I18n.getString(
descriptionKey, args)));
}
if (eventProps.containsKey(TestErrorEvent.Property.OPERATOR_KEY)) {
String value = String.valueOf(eventProps
.get(TestErrorEvent.Property.OPERATOR_KEY));
keyword.setStatusOperator(value);
}
if (eventProps.containsKey(TestErrorEvent.Property.PATTERN_KEY)) {
String value = String.valueOf(eventProps
.get(TestErrorEvent.Property.PATTERN_KEY));
keyword.setExpectedValue(value);
}
if (eventProps.containsKey(
TestErrorEvent.Property.ACTUAL_VALUE_KEY)) {
String value = String.valueOf(eventProps
.get(TestErrorEvent.Property.ACTUAL_VALUE_KEY));
keyword.setActualValue(value);
}
}
}
/**
* perform model changes
*
* @param selectedSummary the summary to change the comment for
* @param newTitle the new comment title
* @param newDetails the new comment details
*/
public void setCommentTitleAndDetails(
ITestResultSummaryPO selectedSummary, String newTitle,
String newDetails) {
Persistor persistor = Persistor.instance();
final EntityManager sess = persistor.openSession();
try {
final EntityTransaction tx = persistor.getTransaction(sess);
ITestResultSummaryPO summary = sess.merge(selectedSummary);
summary.setCommentTitle(newTitle);
summary.setCommentDetail(newDetails);
persistor.commitTransaction(sess, tx);
DataEventDispatcher.getInstance().fireTestresultSummaryChanged(
summary, DataState.StructureModified);
} catch (PMException e) {
throw new JBFatalException(Messages.StoringOfMetadataFailed, e,
MessageIDs.E_DATABASE_GENERAL);
} catch (ProjectDeletedException e) {
throw new JBFatalException(Messages.StoringOfMetadataFailed, e,
MessageIDs.E_PROJECT_NOT_FOUND);
} finally {
persistor.dropSession(sess);
}
}
/**
* @return instance of TestresultSummaryBP
*/
public static TestresultSummaryBP getInstance() {
if (instance == null) {
instance = new TestresultSummaryBP();
}
return instance;
}
/**
* @param selectedSummary summary
* @param newRelevance newRelevance
*/
public void setRelevance(ITestResultSummaryPO selectedSummary,
boolean newRelevance) {
if (selectedSummary != null) {
Persistor persistor = Persistor.instance();
final EntityManager sess = persistor.openSession();
try {
final EntityTransaction tx = persistor.getTransaction(sess);
ITestResultSummaryPO msummary = sess.merge(selectedSummary);
msummary.setTestsuiteRelevant(newRelevance);
persistor.commitTransaction(sess, tx);
DataEventDispatcher.getInstance().fireTestresultSummaryChanged(
msummary, DataState.StructureModified);
} catch (PMException e) {
throw new JBFatalException(Messages.StoringOfMetadataFailed, e,
MessageIDs.E_DATABASE_GENERAL);
} catch (ProjectDeletedException e) {
throw new JBFatalException(Messages.StoringOfMetadataFailed, e,
MessageIDs.E_PROJECT_NOT_FOUND);
} finally {
persistor.dropSession(sess);
}
}
}
/**
* @param selectedSummary
* summary
* @param reportStatus
* reportStatus
*/
public void setALMReportStatus(ITestResultSummaryPO selectedSummary,
AlmReportStatus reportStatus) {
if (selectedSummary != null) {
Persistor persistor = Persistor.instance();
final EntityManager sess = persistor.openSession();
try {
final EntityTransaction tx = persistor.getTransaction(sess);
ITestResultSummaryPO msummary = sess.merge(selectedSummary);
msummary.setAlmReportStatus(reportStatus);
persistor.commitTransaction(sess, tx);
DataEventDispatcher.getInstance().fireTestresultSummaryChanged(
msummary, DataState.StructureModified);
} catch (PMException e) {
throw new JBFatalException(Messages.StoringOfMetadataFailed, e,
MessageIDs.E_DATABASE_GENERAL);
} catch (ProjectDeletedException e) {
throw new JBFatalException(Messages.StoringOfMetadataFailed, e,
MessageIDs.E_PROJECT_NOT_FOUND);
} finally {
persistor.dropSession(sess);
}
}
}
}