package com.photon.phresco.framework.actions.applications;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.photon.phresco.commons.FrameworkConstants;
import com.photon.phresco.exception.PhrescoException;
import com.photon.phresco.framework.api.Project;
import com.photon.phresco.framework.commons.AllTestSuite;
import com.photon.phresco.framework.commons.AndroidPerfReport;
import com.photon.phresco.framework.commons.FrameworkUtil;
import com.photon.phresco.framework.commons.JmeterReport;
import com.photon.phresco.framework.commons.JmeterTypeReport;
import com.photon.phresco.framework.commons.LoadTestReport;
import com.photon.phresco.framework.commons.SureFireReport;
import com.photon.phresco.framework.commons.XmlReport;
import com.photon.phresco.framework.model.PerformanceTestResult;
import com.photon.phresco.framework.model.TestCase;
import com.photon.phresco.framework.model.TestCaseError;
import com.photon.phresco.framework.model.TestCaseFailure;
import com.photon.phresco.framework.model.TestResult;
import com.photon.phresco.framework.model.TestSuite;
import com.photon.phresco.util.TechnologyTypes;
import com.photon.phresco.util.Utility;
public class PhrescoReportGeneration implements FrameworkConstants {
private static final Logger S_LOGGER = Logger.getLogger(PhrescoReportGeneration.class);
private static Boolean debugEnabled =S_LOGGER.isDebugEnabled();
private Project project = null;
private String techId = null;
private String techName = null;
private String testType = null;
private String projectCode = null;
private String projectName = null;
private FrameworkUtil reportPaths = null;
private String reportDatasType = null;
//test suite details
private float noOfTstSuiteTests = 0;
private float noOfTstSuiteFailures = 0;
private float noOfTstSuiteErrors = 0;
private String fileName = null;
public PhrescoReportGeneration() {
final Date today = Calendar.getInstance().getTime();
final DateFormat yymmdd = new SimpleDateFormat("MMM dd yyyy HH.mm");
this.fileName = yymmdd.format(today);
}
public void generatePdfReport(Project proj, String tstType, String reportDataType) throws PhrescoException {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.generatePdfReport()");
try {
reportPaths = FrameworkUtil.getInstance();
project = proj;
testType = tstType;
techId = project.getProjectInfo().getTechnology().getId();
projectCode = project.getProjectInfo().getCode();
projectName = project.getProjectInfo().getName();
techName = project.getProjectInfo().getTechnology().getName();
reportDatasType = reportDataType;
// Report generation for unit and functional
if (UNIT.equals(testType) || FUNCTIONAL.equals(testType)) {
//crisp and detail view report generation
SureFireReport sureFireReports = sureFireReports();
generateUnitAndFunctionalReport(sureFireReports);
// Report generation for performance
} else if (PERFORMACE.equals(testType)) {
if(TechnologyTypes.ANDROIDS.contains(techId)) {
//android technology reports
List<AndroidPerfReport> jmeterTestResultsForAndroid = getJmeterTestResultsForAndroid();
generateAndroidPerformanceReport(jmeterTestResultsForAndroid);
} else {
ArrayList<JmeterTypeReport> jmeterTestResults = getJmeterTestResults();
// Performance test report generation
generateJmeterPerformanceReport(jmeterTestResults);
}
} else if (LOAD.equals(testType)) {
List<LoadTestReport> loadTestResults = getLoadTestResults();
// Load test report generation
generateLoadTestReport(loadTestResults);
}
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.generatePdfReport()" + FrameworkUtil.getStackTraceAsString(e));
throw new PhrescoException(e);
}
}
public void cumulativePdfReport(Project proj, String tstType, String reportDataType) throws PhrescoException {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.cumulativePdfReport()");
try {
reportPaths = FrameworkUtil.getInstance();
project = proj;
testType = tstType;
techId = project.getProjectInfo().getTechnology().getId();
techName = project.getProjectInfo().getTechnology().getName();
projectCode = project.getProjectInfo().getCode();
projectName = project.getProjectInfo().getName();
reportDatasType = reportDataType;
cumalitiveTestReport();
} catch(Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.cumulativePdfReport()" + FrameworkUtil.getStackTraceAsString(e));
throw new PhrescoException(e);
}
}
//Consolidated report for all test
public void cumalitiveTestReport() throws Exception {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.cumalitiveTestReport()");
//unit and functional details
testType = "unit";
SureFireReport unitTestSureFireReports = sureFireReports();
List<AllTestSuite> allTestSuites = unitTestSureFireReports.getAllTestSuites();
for (AllTestSuite allTestSuite : allTestSuites) {
}
testType = "functional";
SureFireReport functionalSureFireReports = sureFireReports();
testType = "";
//performance details
List<AndroidPerfReport> jmeterTestResultsForAndroid = null;
ArrayList<JmeterTypeReport> jmeterTestResults = null;
if(TechnologyTypes.ANDROIDS.contains(techId)) {
jmeterTestResultsForAndroid = getJmeterTestResultsForAndroid();
S_LOGGER.debug("jmeterTestResultsForAndroid " + jmeterTestResultsForAndroid);
} else {
jmeterTestResults = getJmeterTestResults();
S_LOGGER.debug("jmeterTestResults " + jmeterTestResultsForAndroid);
}
//load test details
List<LoadTestReport> loadTestResults = getLoadTestResults();
S_LOGGER.debug("loadTestResults " + loadTestResults);
Map<String, Object> cumulativeReportparams = new HashMap<String,Object>();
cumulativeReportparams.put("projectCode", projectCode);
cumulativeReportparams.put("projectName", projectName);
cumulativeReportparams.put("techName", techName);
cumulativeReportparams.put("reportsDataType", reportDatasType);
cumulativeReportparams.put("unitTestReports", Arrays.asList(unitTestSureFireReports));
cumulativeReportparams.put("functionalTestReports", Arrays.asList(functionalSureFireReports));
if(TechnologyTypes.ANDROIDS.contains(techId)) {
cumulativeReportparams.put("performanceSpecialHandle", true);
cumulativeReportparams.put("performanceTestReports",jmeterTestResultsForAndroid);
} else {
cumulativeReportparams.put("performanceSpecialHandle", false);
cumulativeReportparams.put("performanceTestReports", jmeterTestResults);
}
cumulativeReportparams.put("loadTestReports", loadTestResults);
generateCumulativeTestReport(cumulativeReportparams);
}
//cumulative test report generation
public void generateCumulativeTestReport(Map<String, Object> cumulativeReportparams) throws PhrescoException {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.generateCumulativeTestReport()");
InputStream reportStream = null;
BufferedInputStream bufferedInputStream = null;
try {
String outFileNamePDF = Utility.getProjectHome() + projectCode + File.separator + DO_NOT_CHECKIN_DIR + File.separator + ARCHIVES + File.separator + CUMULATIVE + File.separator + projectCode + UNDERSCORE + reportDatasType + UNDERSCORE + fileName + DOT + PDF;
new File(outFileNamePDF).getParentFile().mkdirs();
String jasperFile = "PhrescoCumulativeReport.jasper";
reportStream = this.getClass().getClassLoader().getResourceAsStream("reports/jasper/" + jasperFile);
bufferedInputStream = new BufferedInputStream(reportStream);
JREmptyDataSource dataSource = new JREmptyDataSource();
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(bufferedInputStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, cumulativeReportparams, dataSource);
JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFileNamePDF);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.exportReport();
S_LOGGER.debug("Cumulative Report generation completed" + outFileNamePDF);
} catch(Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.generateCumulativeTestReport()" + FrameworkUtil.getStackTraceAsString(e));
S_LOGGER.error("Report generation errorr ");
throw new PhrescoException(e);
} finally {
if (reportStream != null) {
try {
reportStream.close();
} catch (IOException e) {
S_LOGGER.error("Report generation errorr ");
}
}
if (bufferedInputStream != null) {
try {
bufferedInputStream.close();
} catch (IOException e) {
S_LOGGER.error("Report generation errorr ");
}
}
}
}
// Unit and functional pdf report generation
public void generateUnitAndFunctionalReport(SureFireReport sureFireReports) throws PhrescoException {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.generateUnitAndFunctionalReport()");
InputStream reportStream = null;
BufferedInputStream bufferedInputStream = null;
try {
String outFileNamePDF = Utility.getProjectHome() + projectCode + File.separator + DO_NOT_CHECKIN_DIR + File.separator + ARCHIVES + File.separator + testType + File.separator + testType + UNDERSCORE + reportDatasType + UNDERSCORE + fileName + DOT + PDF;
new File(outFileNamePDF).getParentFile().mkdirs();
String containerJasperFile = "PhrescoSureFireReport.jasper";
reportStream = this.getClass().getClassLoader().getResourceAsStream("reports/jasper/" + containerJasperFile);
bufferedInputStream = new BufferedInputStream(reportStream);
Map<String, Object> parameters = new HashMap<String,Object>();
parameters.put("projectCode", projectCode);
parameters.put("projectName", projectName);
parameters.put("techName", techName);
parameters.put("testType", testType);
parameters.put("reportsDataType", reportDatasType);
JRBeanArrayDataSource dataSource = new JRBeanArrayDataSource(new SureFireReport[]{sureFireReports});
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(bufferedInputStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFileNamePDF);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.exportReport();
S_LOGGER.debug("Unit and functional Report generation completed" + outFileNamePDF);
} catch(Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.generateUnitAndFunctionalReport()" + FrameworkUtil.getStackTraceAsString(e));
S_LOGGER.error("Unit and functional generation error");
throw new PhrescoException(e);
} finally {
if (reportStream != null) {
try {
reportStream.close();
} catch (IOException e) {
S_LOGGER.error("Report generation errorr ");
}
}
if (bufferedInputStream != null) {
try {
bufferedInputStream.close();
} catch (IOException e) {
S_LOGGER.error("Report generation errorr ");
}
}
}
}
// performance test report
public void generateJmeterPerformanceReport(ArrayList<JmeterTypeReport> jmeterTestResults) throws PhrescoException {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.generateJmeterPerformanceReport()");
try {
ArrayList<JmeterTypeReport> jmeterTstResults = jmeterTestResults;
String outFileNamePDF = Utility.getProjectHome() + projectCode + File.separator + DO_NOT_CHECKIN_DIR + File.separator + ARCHIVES + File.separator + testType + File.separator + testType + UNDERSCORE + reportDatasType + UNDERSCORE + fileName + DOT + PDF;
String jasperFile = "PhrescoPerfContain.jasper";
Map<String, Object> parameters = new HashMap<String,Object>();
parameters.put("projectCode", projectCode);
parameters.put("projectName", projectName);
parameters.put("techName", techName);
parameters.put("testType", testType);
parameters.put("reportsDataType", reportDatasType);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(jmeterTstResults);
reportGenerate(outFileNamePDF, jasperFile, parameters, dataSource);
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.generateJmeterPerformanceReport()" + FrameworkUtil.getStackTraceAsString(e));
S_LOGGER.error("Performance generation error ");
throw new PhrescoException(e);
}
}
// performance test report
public void generateAndroidPerformanceReport(List<AndroidPerfReport> androidPerReports) throws PhrescoException {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.generateAndroidPerformanceReport()");
try {
String outFileNamePDF = Utility.getProjectHome() + projectCode + File.separator + DO_NOT_CHECKIN_DIR + File.separator + ARCHIVES + File.separator + testType + File.separator + testType + UNDERSCORE + reportDatasType + UNDERSCORE + fileName + DOT + PDF;
String jasperFile = "PhrescoAndroidPerfContain.jasper";
Map<String, Object> parameters = new HashMap<String,Object>();
parameters.put("projectCode", projectCode);
parameters.put("projectName", projectName);
parameters.put("techName", techName);
parameters.put("testType", testType);
parameters.put("reportsDataType", reportDatasType);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(androidPerReports);
reportGenerate(outFileNamePDF, jasperFile, parameters, dataSource);
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.generateAndroidPerformanceReport()" + FrameworkUtil.getStackTraceAsString(e));
S_LOGGER.error("Android Performance generation error ");
throw new PhrescoException(e);
}
}
// load test report
public void generateLoadTestReport(List<LoadTestReport> loadTestResults) throws PhrescoException {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.generateLoadTestReport()");
try {
String outFileNamePDF = Utility.getProjectHome() + projectCode + File.separator + DO_NOT_CHECKIN_DIR + File.separator + ARCHIVES + File.separator + testType + File.separator + testType + UNDERSCORE + reportDatasType + UNDERSCORE + fileName + DOT + PDF;
String jasperFile = "PhrescoLoadTestContain.jasper";
Map<String, Object> parameters = new HashMap<String,Object>();
parameters.put("projectCode", projectCode);
parameters.put("projectName", projectName);
parameters.put("techName", techName);
parameters.put("testType", testType);
parameters.put("reportsDataType", reportDatasType);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(loadTestResults);
reportGenerate(outFileNamePDF, jasperFile, parameters, dataSource);
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.generateLoadTestReport()" + FrameworkUtil.getStackTraceAsString(e));
S_LOGGER.error("Load report generation error");
throw new PhrescoException(e);
}
}
public void reportGenerate(String outFileNamePDF, String jasperFile, Map<String, Object> parameters, JRBeanCollectionDataSource dataSource) throws PhrescoException {
S_LOGGER.debug("Entering Method PhrescoReportGeneration.reportGenerate()");
InputStream reportStream = null;
BufferedInputStream bufferedInputStream = null;
try {
new File(outFileNamePDF).getParentFile().mkdirs();
reportStream = this.getClass().getClassLoader().getResourceAsStream("reports/jasper/"+ jasperFile);
bufferedInputStream = new BufferedInputStream(reportStream);
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(bufferedInputStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFileNamePDF);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.exportReport();
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.reportGenerate()" + FrameworkUtil.getStackTraceAsString(e));
S_LOGGER.error("Load report generation error");
throw new PhrescoException(e);
} finally {
if (reportStream != null) {
try {
reportStream.close();
} catch (IOException e) {
S_LOGGER.error("Report generation errorr ");
}
}
if (bufferedInputStream != null) {
try {
bufferedInputStream.close();
} catch (IOException e) {
S_LOGGER.error("Report generation errorr ");
}
}
}
}
public List<LoadTestReport> getLoadTestResults() throws Exception {
List<LoadTestReport> loadTestReports = new ArrayList<LoadTestReport>();
String reportFilePath = Utility.getProjectHome() + projectCode + reportPaths.getLoadReportDir(techId);
List<String> testResultFiles = getTestResultFiles(reportFilePath);
for (String resultFile : testResultFiles) {
Document doc = getDocumentOfFile(reportFilePath, resultFile);
List<TestResult> loadTestResults = getLoadTestResult(doc);
for (TestResult testResult : loadTestResults) {
S_LOGGER.debug("testResult name ======> " + testResult.getThreadName());
}
// Adding report data to bean object
LoadTestReport loadTestReport = new LoadTestReport();
loadTestReport.setFileName(resultFile);
loadTestReport.setTestResults(loadTestResults);
loadTestReports.add(loadTestReport);
}
return loadTestReports;
}
public ArrayList<JmeterTypeReport> getJmeterTestResults() throws Exception {
List<String> testResultsTypes = new ArrayList<String>();
testResultsTypes.add("server");
testResultsTypes.add("database");
testResultsTypes.add("webservices");
// List of performance test types
ArrayList<JmeterTypeReport> jmeterTypeReports = new ArrayList<JmeterTypeReport>();
for(String perType: testResultsTypes) {
StringBuilder sb = new StringBuilder();
sb.append(Utility.getProjectHome());
sb.append(project.getProjectInfo().getCode());
String performanceReportDir = reportPaths.getPerformanceReportDir(project.getProjectInfo().getTechnology().getId());
if (StringUtils.isNotEmpty(performanceReportDir) && StringUtils.isNotEmpty(perType)) {
Pattern p = Pattern.compile("dir_type");
Matcher matcher = p.matcher(performanceReportDir);
performanceReportDir = matcher.replaceAll(perType);
sb.append(performanceReportDir);
}
List<String> testResultFiles = getTestResultFiles(sb.toString());
String deviceId = null; // for android alone
// List of performance test reports
List<JmeterReport> jmeterReports = new ArrayList<JmeterReport>();
for (String testResultFile : testResultFiles) {
Document document = getDocumentOfFile(sb.toString(), testResultFile);
JmeterReport jmeterReport = getPerformanceReport(document, testResultFile, techId, deviceId); // need to pass tech id and tag name
jmeterReports.add(jmeterReport);
}
// When data is not available dont show in i report
if (!jmeterReports.isEmpty()) {
JmeterTypeReport jmeterTypeReport = new JmeterTypeReport();
jmeterTypeReport.setType(perType);
jmeterTypeReport.setFileReport(jmeterReports);
// adding final data to jmeter type reports
jmeterTypeReports.add(jmeterTypeReport);
}
}
for (JmeterTypeReport jmeterTypeReport : jmeterTypeReports) {
String type = jmeterTypeReport.getType();
List<JmeterReport> fileReports = jmeterTypeReport.getFileReport();
}
return jmeterTypeReports;
}
public List<AndroidPerfReport> getJmeterTestResultsForAndroid() throws Exception {
// List of performance test types
StringBuilder sb = new StringBuilder();
sb.append(Utility.getProjectHome());
sb.append(project.getProjectInfo().getCode());
String performanceReportDir = reportPaths.getPerformanceReportDir(project.getProjectInfo().getTechnology().getId());
if (StringUtils.isNotEmpty(performanceReportDir)) {
sb.append(performanceReportDir);
}
List<String> testResultFiles = getTestResultFiles(sb.toString());
// List of performance test reports
List<AndroidPerfReport> androidPerfFilesWithDatas = new ArrayList<AndroidPerfReport>(); //kalees
for (String testResultFile : testResultFiles) {
Document document = getDocumentOfFile(sb.toString(), testResultFile);
Map<String, String> deviceNamesWithId = getDeviceNames(document);
Set st = deviceNamesWithId.entrySet();
Iterator it = st.iterator();
List<JmeterReport> androidDeviceWithDatas = new ArrayList<JmeterReport>();
while (it.hasNext()) {
Map.Entry m = (Map.Entry) it.next();
String androidDeviceId = (String) m.getKey();
String androidDeviceName = (String) m.getValue();
JmeterReport jmeterReport = getPerformanceReport(document, testResultFile, techId, androidDeviceId); // need to pass tech id and tag name
jmeterReport.setFileName(androidDeviceName);
androidDeviceWithDatas.add(jmeterReport);
}
AndroidPerfReport androidPerReport = new AndroidPerfReport();
androidPerReport.setFileName(testResultFile);
androidPerReport.setDeviceReport(androidDeviceWithDatas);
androidPerfFilesWithDatas.add(androidPerReport);
}
for (AndroidPerfReport androidPerfFilesWithData : androidPerfFilesWithDatas) {
List<JmeterReport> deviceReports = androidPerfFilesWithData.getDeviceReport();
for (JmeterReport jmeterReport : deviceReports) {
S_LOGGER.debug("getTotalAvg ======> " + jmeterReport.getTotalAvg());
}
}
return androidPerfFilesWithDatas;
}
// unit and functional test report
public ArrayList<XmlReport> sureFireReport() throws Exception {
ArrayList<XmlReport> xmlReports = new ArrayList<XmlReport>();
String reportFilePath = "";
if (UNIT.equals(testType)) {
reportFilePath = Utility.getProjectHome() + projectCode + reportPaths.getUnitReportDir(techId);
} else {
reportFilePath = Utility.getProjectHome() + projectCode + reportPaths.getFunctionalReportDir(techId);
}
List<String> testResultFiles = getTestResultFiles(reportFilePath);
for (String resultFile : testResultFiles) {
XmlReport xmlReport = new XmlReport();
xmlReport.setFileName(resultFile);
ArrayList<TestSuite> testSuiteWithTestCase = new ArrayList<TestSuite>();
Document doc = getDocumentOfFile(reportFilePath, resultFile);
List<TestSuite> testSuites = getTestSuite(doc);
for (TestSuite testSuite : testSuites) { // test suite ll have graph details
List<TestCase> testCases = getTestCases(doc, testSuite.getName());
testSuite.setTestCases(testCases);
testSuiteWithTestCase.add(testSuite);
}
xmlReport.setTestSuites(testSuiteWithTestCase);
xmlReports.add(xmlReport);
}
return xmlReports;
}
// unit and functional test report
public SureFireReport sureFireReports() throws Exception {
SureFireReport sureFireReport = new SureFireReport();
String reportFilePath = "";
if (UNIT.equals(testType)) {
reportFilePath = Utility.getProjectHome() + projectCode + reportPaths.getUnitReportDir(techId);
} else {
reportFilePath = Utility.getProjectHome() + projectCode + reportPaths.getFunctionalReportDir(techId);
}
List<String> testResultFiles = getTestResultFiles(reportFilePath);
ArrayList<TestSuite> testSuiteWithTestCase = null;
ArrayList<AllTestSuite> allTestSuiteDetails = null;
for (String resultFile : testResultFiles) {
testSuiteWithTestCase = new ArrayList<TestSuite>();
allTestSuiteDetails = new ArrayList<AllTestSuite>();
Document doc = getDocumentOfFile(reportFilePath, resultFile);
List<TestSuite> testSuites = getTestSuite(doc);
//crisp info
float totalTestSuites = 0;
float successTestSuites = 0;
float failureTestSuites = 0;
float errorTestSuites = 0;
for (TestSuite testSuite : testSuites) { // test suite ll have graph details
List<TestCase> testCases = getTestCases(doc, testSuite.getName());
float tests = 0;
float failures = 0;
float errors = 0;
failures = getNoOfTstSuiteFailures();
errors = getNoOfTstSuiteErrors();
tests = getNoOfTstSuiteTests();
float success = 0;
if (failures != 0 && errors == 0) {
if (failures > tests) {
success = failures - tests;
} else {
success = tests - failures;
}
} else if (failures == 0 && errors != 0) {
if (errors > tests) {
success = errors - tests;
} else {
success = tests - errors;
}
} else if (failures != 0 && errors != 0) {
float failTotal = (failures + errors);
if (failTotal > tests) {
success = failTotal - tests;
} else {
success = tests - failTotal;
}
} else {
success = tests;
}
totalTestSuites = totalTestSuites + tests;
failureTestSuites = failureTestSuites + failures;
errorTestSuites = errorTestSuites + errors;
successTestSuites = successTestSuites + success;
String rstValues = tests + "," + success + "," + failures + "," + errors;
S_LOGGER.debug("rstValues ====> " + rstValues);
AllTestSuite allTestSuiteDetail = new AllTestSuite(testSuite.getName(), tests, success, failures, errors);
allTestSuiteDetails.add(allTestSuiteDetail);
testSuite.setTestCases(testCases);
testSuiteWithTestCase.add(testSuite);
}
}
// detailed info
sureFireReport.setTestSuites(testSuiteWithTestCase);
//crisp info
sureFireReport.setAllTestSuites(allTestSuiteDetails);
return sureFireReport;
}
private List<TestSuite> getTestSuite(Document doc) throws TransformerException, PhrescoException {
try {
String testSuitePath = null;
if (UNIT.equals(testType)) {
testSuitePath = reportPaths.getUnitTestSuitePath(techId);
} else {
testSuitePath = reportPaths.getFunctionalTestSuitePath(techId);
}
NodeList nodelist = org.apache.xpath.XPathAPI.selectNodeList(doc, XPATH_MULTIPLE_TESTSUITE);
if (nodelist.getLength() == 0) {
nodelist = org.apache.xpath.XPathAPI.selectNodeList(doc, testSuitePath);
}
List<TestSuite> testSuites = new ArrayList<TestSuite>(2);
TestSuite testSuite = null;
for (int i = 0; i < nodelist.getLength(); i++) {
testSuite = new TestSuite();
Node node = nodelist.item(i);
NamedNodeMap nameNodeMap = node.getAttributes();
for (int k = 0; k < nameNodeMap.getLength(); k++){
Node attribute = nameNodeMap.item(k);
String attributeName = attribute.getNodeName();
String attributeValue = attribute.getNodeValue();
if (ATTR_ASSERTIONS.equals(attributeName)) {
testSuite.setAssertions(attributeValue);
} else if (ATTR_ERRORS.equals(attributeName)) {
testSuite.setErrors(Float.parseFloat(attributeValue));
} else if (ATTR_FAILURES.equals(attributeName)) {
testSuite.setFailures(Float.parseFloat(attributeValue));
} else if (ATTR_FILE.equals(attributeName)) {
testSuite.setFile(attributeValue);
} else if (ATTR_NAME.equals(attributeName)) {
testSuite.setName(attributeValue);
} else if (ATTR_TESTS.equals(attributeName)) {
testSuite.setTests(Float.parseFloat(attributeValue));
} else if (ATTR_TIME.equals(attributeName)) {
testSuite.setTime(attributeValue);
}
}
testSuites.add(testSuite);
}
return testSuites;
} catch (Exception e) {
throw new PhrescoException(e);
}
}
private List<TestCase> getTestCases(Document doc, String testSuiteName) throws TransformerException, PhrescoException {
try {
String testCasePath = null;
String testSuitePath = null;
if (UNIT.equals(testType)) {
testSuitePath = reportPaths.getUnitTestSuitePath(techId);
} else {
testSuitePath = reportPaths.getFunctionalTestSuitePath(techId);
}
testCasePath = reportPaths.getTestCasePath(techId);
StringBuilder sb = new StringBuilder(); //testsuites/testsuite[@name='yyy']/testcase
//sb.append(XPATH_SINGLE_TESTSUITE);
sb.append(testSuitePath);
sb.append(NAME_FILTER_PREFIX);
sb.append(testSuiteName);
sb.append(NAME_FILTER_SUFIX);
sb.append(testCasePath);
//sb.append(XPATH_TESTCASE);
NodeList nodelist = org.apache.xpath.XPathAPI.selectNodeList(doc, sb.toString());
// For tehnologies like php and drupal duoe to plugin change xml testcase path modified
if (nodelist.getLength() == 0) {
StringBuilder sbMulti = new StringBuilder();
sbMulti.append(testSuitePath);
sbMulti.append(NAME_FILTER_PREFIX);
sbMulti.append(testSuiteName);
sbMulti.append(NAME_FILTER_SUFIX);
sbMulti.append(XPATH_TESTSUTE_TESTCASE);
nodelist = org.apache.xpath.XPathAPI.selectNodeList(doc, sbMulti.toString());
}
// For technology sharepoint
if (nodelist.getLength() == 0) {
StringBuilder sbMulti = new StringBuilder(); //testsuites/testsuite[@name='yyy']/testcase
sbMulti.append(XPATH_MULTIPLE_TESTSUITE);
sbMulti.append(NAME_FILTER_PREFIX);
sbMulti.append(testSuiteName);
sbMulti.append(NAME_FILTER_SUFIX);
//sbMulti.append(XPATH_TESTCASE);
sbMulti.append(testCasePath);
nodelist = org.apache.xpath.XPathAPI.selectNodeList(doc, sbMulti.toString());
}
List<TestCase> testCases = new ArrayList<TestCase>();
int failureTestCases = 0;
int errorTestCases = 0;
for (int i = 0; i < nodelist.getLength(); i++) {
Node node = nodelist.item(i);
NodeList childNodes = node.getChildNodes();
NamedNodeMap nameNodeMap = node.getAttributes();
TestCase testCase = new TestCase();
if (childNodes != null && childNodes.getLength() > 0) {
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
if (ELEMENT_FAILURE.equals(childNode.getNodeName())) {
failureTestCases++;
TestCaseFailure failure = getFailure(childNode);
if (failure != null) {
testCase.setTestCaseFailure(failure);
}
}
if (ELEMENT_ERROR.equals(childNode.getNodeName())) {
errorTestCases++;
TestCaseError error = getError(childNode);
if (error != null) {
testCase.setTestCaseError(error);
}
}
}
}
for (int k = 0; k < nameNodeMap.getLength(); k++){
Node attribute = nameNodeMap.item(k);
String attributeName = attribute.getNodeName();
String attributeValue = attribute.getNodeValue();
if (ATTR_NAME.equals(attributeName)) {
testCase.setName(attributeValue);
} else if (ATTR_CLASS.equals(attributeName) || ATTR_CLASSNAME.equals(attributeName)) {
testCase.setTestClass(attributeValue);
} else if (ATTR_FILE.equals(attributeName)) {
testCase.setFile(attributeValue);
} else if (ATTR_LINE.equals(attributeName)) {
testCase.setLine(Float.parseFloat(attributeValue));
} else if (ATTR_ASSERTIONS.equals(attributeName)) {
testCase.setAssertions(Float.parseFloat(attributeValue));
} else if (ATTR_TIME.equals(attributeName)) {
testCase.setTime(attributeValue);
}
}
testCases.add(testCase);
}
setNoOfTstSuiteFailures(failureTestCases);
setNoOfTstSuiteErrors(errorTestCases);
setNoOfTstSuiteTests(nodelist.getLength());
return testCases;
} catch (Exception e) {
throw new PhrescoException(e);
}
}
private TestCaseFailure getFailure(Node failureNode) throws TransformerException {
TestCaseFailure failure = new TestCaseFailure();
try {
failure.setDescription(failureNode.getTextContent());
failure.setFailureType(REQ_TITLE_EXCEPTION);
NamedNodeMap nameNodeMap = failureNode.getAttributes();
if (nameNodeMap != null && nameNodeMap.getLength() > 0) {
for (int k = 0; k < nameNodeMap.getLength(); k++){
Node attribute = nameNodeMap.item(k);
String attributeName = attribute.getNodeName();
String attributeValue = attribute.getNodeValue();
if (ATTR_TYPE.equals(attributeName)) {
failure.setFailureType(attributeValue);
}
}
}
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.getFailure()" + FrameworkUtil.getStackTraceAsString(e));
}
return failure;
}
private TestCaseError getError(Node errorNode) throws TransformerException {
TestCaseError tcError = new TestCaseError();
try {
tcError.setDescription(errorNode.getTextContent());
tcError.setErrorType(REQ_TITLE_ERROR);
NamedNodeMap nameNodeMap = errorNode.getAttributes();
if (nameNodeMap != null && nameNodeMap.getLength() > 0) {
for (int k = 0; k < nameNodeMap.getLength(); k++){
Node attribute = nameNodeMap.item(k);
String attributeName = attribute.getNodeName();
String attributeValue = attribute.getNodeValue();
if (ATTR_TYPE.equals(attributeName)) {
tcError.setErrorType(attributeValue);
}
}
}
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.getError()" + FrameworkUtil.getStackTraceAsString(e));
}
return tcError;
}
public static JmeterReport getPerformanceReport(Document document, String fileName, String techId, String deviceId) throws Exception { // deviceid is the tag name for android
JmeterReport jmeterReport = new JmeterReport();
List<PerformanceTestResult> performanceTestResultOfFile = new ArrayList<PerformanceTestResult>();
String xpath = "/*/*"; // For other technologies
String device = "*";
if(StringUtils.isNotEmpty(deviceId)) {
device = "deviceInfo[@id='" + deviceId + "']";
}
if(TechnologyTypes.ANDROIDS.contains(techId)) {
xpath = "/*/" + device + "/*";
}
NodeList nodeList = org.apache.xpath.XPathAPI.selectNodeList(document, xpath);
Map<String, PerformanceTestResult> results = new LinkedHashMap<String, PerformanceTestResult>(100);
double maxTs = 0;
double minTs = 0;
int lastTime = 0;
int noOfSamples = nodeList.getLength();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
NamedNodeMap nameNodeMap = node.getAttributes();
Node timeAttr = nameNodeMap.getNamedItem(FrameworkConstants.ATTR_JM_TIME);
int time = Integer.parseInt(timeAttr.getNodeValue());
Node bytesAttr = nameNodeMap.getNamedItem(FrameworkConstants.ATTR_JM_BYTES);
int bytes = Integer.parseInt(bytesAttr.getNodeValue());
Node successFlagAttr = nameNodeMap.getNamedItem(FrameworkConstants.ATTR_JM_SUCCESS_FLAG);
boolean success = Boolean.parseBoolean(successFlagAttr.getNodeValue()) ? true : false ;
Node labelAttr = nameNodeMap.getNamedItem(FrameworkConstants.ATTR_JM_LABEL);
String label = labelAttr.getNodeValue();
Node timeStampAttr = nameNodeMap.getNamedItem(FrameworkConstants.ATTR_JM_TIMESTAMP);
double timeStamp = Long.parseLong(timeStampAttr.getNodeValue());
boolean firstEntry = false;
PerformanceTestResult performanceTestResult = results.get(label);
if (performanceTestResult == null) {
performanceTestResult = new PerformanceTestResult();
firstEntry = true;
} else {
firstEntry = false;
}
performanceTestResult.setLabel(label.trim());
performanceTestResult.setNoOfSamples(performanceTestResult.getNoOfSamples() + 1);
performanceTestResult.getTimes().add(time);
performanceTestResult.setTotalTime(performanceTestResult.getTotalTime() + time);
performanceTestResult.setTotalBytes(performanceTestResult.getTotalBytes() + bytes);
if (time < performanceTestResult.getMin() || firstEntry) {
performanceTestResult.setMin(time);
}
if (time > performanceTestResult.getMax()) {
performanceTestResult.setMax(time);
}
// Error calculation
if (!success) {
performanceTestResult.setErr(performanceTestResult.getErr() + 1);
}
// Throughput calculation
if (timeStamp >= performanceTestResult.getMaxTs()) {
performanceTestResult.setMaxTs(timeStamp);
performanceTestResult.setLastTime(time);
}
if(i == 0 || (performanceTestResult.getMaxTs() > maxTs)) {
maxTs = performanceTestResult.getMaxTs();
lastTime = performanceTestResult.getLastTime();
}
if (timeStamp < performanceTestResult.getMinTs() || firstEntry) {
performanceTestResult.setMinTs(timeStamp);
}
if(i == 0 ) {
minTs = performanceTestResult.getMinTs();
} else if(performanceTestResult.getMinTs() < minTs) {
minTs = performanceTestResult.getMinTs();
}
Double calThroughPut = new Double(performanceTestResult.getNoOfSamples());
calThroughPut = calThroughPut / (performanceTestResult.getMaxTs() + performanceTestResult.getLastTime() -
performanceTestResult.getMinTs());
double throughPut = calThroughPut * 1000;
performanceTestResult.setThroughtPut(throughPut);
results.put(label, performanceTestResult);
}
// Total Throughput calculation
double totalThroughput = (noOfSamples /((maxTs + lastTime) - minTs)) * 1000;
double stdDev = setStdDevToResults(results);
// Getting all performance result objects
// calculating total values
int totalValue = results.keySet().size();
int NoOfSample = 0;
double avg = 0;
int min = 0;
int max = 0;
double StdDev = 0;
int Err = 0;
double KbPerSec = 0;
double sumOfBytes = 0;
int i = 1;
for (String key : results.keySet()) {
PerformanceTestResult performanceTestResult = results.get(key);
performanceTestResultOfFile.add(performanceTestResult);
// calculating min,max, avgbytes, kbsec
NoOfSample = NoOfSample + performanceTestResult.getNoOfSamples();
avg = avg + performanceTestResult.getAvg();
if (i == 1) {
min = performanceTestResult.getMin();
max = performanceTestResult.getMax();
}
if (i != 1 && performanceTestResult.getMin() < min) {
min = performanceTestResult.getMin();
}
if (i != 1 && performanceTestResult.getMax() > max) {
max = performanceTestResult.getMax();
}
StdDev = StdDev + performanceTestResult.getStdDev();
Err = Err + performanceTestResult.getErr();
sumOfBytes = sumOfBytes + performanceTestResult.getAvgBytes();
i++;
}
// Calculation of avg bytes of a file
double avgBytes = sumOfBytes / totalValue;
KbPerSec = (avgBytes / 1024) * totalThroughput;
// setting performance file name and list objects
jmeterReport.setFileName(fileName);
jmeterReport.setJmeterTestResult(performanceTestResultOfFile);
jmeterReport.setTotalThroughput(FrameworkUtil.roundFloat(2,totalThroughput)+"");
jmeterReport.setTotalStdDev(FrameworkUtil.roundFloat(2,stdDev)+"");
jmeterReport.setTotalNoOfSample(NoOfSample+"");
jmeterReport.setTotalAvg((avg/totalValue)+"");
jmeterReport.setMin(min+"");
jmeterReport.setMax(max+"");
jmeterReport.setTotalErr((Err/totalValue)+"");
jmeterReport.setTotalAvgBytes(avgBytes+"");
jmeterReport.setTotalKbPerSec(FrameworkUtil.roundFloat(2,KbPerSec)+"");
return jmeterReport;
}
private static double setStdDevToResults(Map<String, PerformanceTestResult> results) {
Set<String> keySet = results.keySet();
long xBar = 0; //XBar Calculation
long sumOfTime = 0;
int totalSamples = 0;
double sumMean = 0;
List<Integer> allTimes = new ArrayList<Integer>();
for (String key : keySet) {
PerformanceTestResult performanceTestResult = results.get(key);
// calculation of average time
double avg = performanceTestResult.getTotalTime() / performanceTestResult.getNoOfSamples();
sumOfTime = sumOfTime + performanceTestResult.getTotalTime();
totalSamples = totalSamples + performanceTestResult.getNoOfSamples();
performanceTestResult.setAvg(avg);
// calculation of average bytes
double avgBytes = (double) performanceTestResult.getTotalBytes() / performanceTestResult.getNoOfSamples();
performanceTestResult.setAvgBytes(Math.round(avgBytes));
// KB/Sec calculation
Double calKbPerSec = new Double(performanceTestResult.getThroughtPut());
calKbPerSec = calKbPerSec * (((double) avgBytes) / 1024) ;
performanceTestResult.setKbPerSec(calKbPerSec);
// Std.Dev calculation
List<Integer> times = performanceTestResult.getTimes();
allTimes.addAll(times);
Double totalMean = new Double(0);
for (Integer time : times) {
totalMean += Math.pow(time - avg, 2);
}
performanceTestResult.setStdDev((float) Math.sqrt(totalMean / performanceTestResult.getNoOfSamples()));
performanceTestResult.setErr((performanceTestResult.getErr() / performanceTestResult.getNoOfSamples()) * 100);
}
//Total Std.Dev calculation
xBar = sumOfTime / totalSamples;
for (Integer time : allTimes) {
sumMean += Math.pow(time - xBar, 2);
}
double stdDev = Math.sqrt(sumMean / totalSamples);
return stdDev;
}
private List<TestResult> getLoadTestResult(Document doc) throws TransformerException, PhrescoException, ParserConfigurationException, SAXException, IOException {
List<TestResult> testResults = new ArrayList<TestResult>(2);
try {
NodeList nodeList = org.apache.xpath.XPathAPI.selectNodeList(doc, XPATH_TEST_RESULT);
TestResult testResult = null;
for (int i = 0; i < nodeList.getLength(); i++) {
testResult = new TestResult();
Node node = nodeList.item(i);
// NodeList childNodes = node.getChildNodes();
NamedNodeMap nameNodeMap = node.getAttributes();
for (int k = 0; k < nameNodeMap.getLength(); k++) {
Node attribute = nameNodeMap.item(k);
String attributeName = attribute.getNodeName();
String attributeValue = attribute.getNodeValue();
if (ATTR_JM_TIME.equals(attributeName)) {
testResult.setTime(Integer.parseInt(attributeValue));
} else if (ATTR_JM_LATENCY_TIME.equals(attributeName)) {
testResult.setLatencyTime(Integer.parseInt(attributeValue));
} else if (ATTR_JM_TIMESTAMP.equals(attributeName)) {
Date date = new Date(Long.parseLong(attributeValue));
DateFormat format = new SimpleDateFormat(DATE_TIME_FORMAT);
String strDate = format.format(date);
testResult.setTimeStamp(strDate);
} else if (ATTR_JM_SUCCESS_FLAG.equals(attributeName)) {
testResult.setSuccess(Boolean.parseBoolean(attributeValue));
} else if (ATTR_JM_LABEL.equals(attributeName)) {
testResult.setLabel(attributeValue);
} else if (ATTR_JM_THREAD_NAME.equals(attributeName)) {
testResult.setThreadName(attributeValue);
}
}
testResults.add(testResult);
}
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.getLoadTestResult()" + FrameworkUtil.getStackTraceAsString(e));
}
return testResults;
}
private Document getDocumentOfFile(String path, String fileName) {
Document doc = null;
InputStream fis = null;
DocumentBuilder builder = null;
try {
fis = new FileInputStream(new File(path + "/" + fileName)); // here should be new File(path + "/" + selectedTestResultFileName);
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(false);
builder = domFactory.newDocumentBuilder();
doc = builder.parse(fis);
} catch (Exception e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.getDocumentOfFile()" + FrameworkUtil.getStackTraceAsString(e));
} finally {
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
S_LOGGER.error("Entering into catch block of PhrescoReportGeneration.getDocumentOfFile()" + FrameworkUtil.getStackTraceAsString(e));
}
}
}
return doc;
}
private List<String> getTestResultFiles(String path) {
File testDir = new File(path);
List<String> testResultFileNames = new ArrayList<String>();
if(testDir.isDirectory()){
FilenameFilter filter = new PhrescoFileFilter("", XML);
File[] listFiles = testDir.listFiles(filter);
for (File file : listFiles) {
if (file.isFile()) {
testResultFileNames.add(file.getName());
}
}
}
return testResultFileNames;
}
public static Map<String, String> getDeviceNames(Document document) throws Exception {
NodeList nodeList = org.apache.xpath.XPathAPI.selectNodeList(document, "/*/*");
Map<String, String> deviceList = new LinkedHashMap<String, String>(100);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
NamedNodeMap nameNodeMap = node.getAttributes();
String deviceId = "";
String deviceName = "";
Node idAttr = nameNodeMap.getNamedItem(FrameworkConstants.ATTR_ID);
deviceId = idAttr.getNodeValue();
Node nameAttr = nameNodeMap.getNamedItem(FrameworkConstants.ATTR_NAME);
deviceName = nameAttr.getNodeValue();
deviceList.put(deviceId, deviceName);
}
return deviceList;
}
public float getNoOfTstSuiteTests() {
return noOfTstSuiteTests;
}
public void setNoOfTstSuiteTests(float noOfTstSuiteTests) {
this.noOfTstSuiteTests = noOfTstSuiteTests;
}
public float getNoOfTstSuiteFailures() {
return noOfTstSuiteFailures;
}
public void setNoOfTstSuiteFailures(float noOfTstSuiteFailures) {
this.noOfTstSuiteFailures = noOfTstSuiteFailures;
}
public float getNoOfTstSuiteErrors() {
return noOfTstSuiteErrors;
}
public void setNoOfTstSuiteErrors(float noOfTstSuiteErrors) {
this.noOfTstSuiteErrors = noOfTstSuiteErrors;
}
public String getTechName() {
return techName;
}
public void setTechName(String techName) {
this.techName = techName;
}
}
class PhrescoFileFilter implements FilenameFilter {
private String name;
private String extension;
public PhrescoFileFilter(String name, String extension) {
this.name = name;
this.extension = extension;
}
public boolean accept(File directory, String filename) {
boolean fileOK = true;
if (name != null) {
fileOK &= filename.startsWith(name);
}
if (extension != null) {
fileOK &= filename.endsWith('.' + extension);
}
return fileOK;
}
}
class FileExtensionFileFilter implements FilenameFilter {
private String filter_;
public FileExtensionFileFilter(String filter) {
filter_ = filter;
}
public boolean accept(File dir, String name) {
return name.endsWith(filter_);
}
}