/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * https://oss.oracle.com/licenses/CDDL+GPL-1.1 * or LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package com.sun.ejte.ccl.reporter; /** * @Class : Reporter @Description : Main class used for Uniform reporting of results @Author : Ramesh Mandava @Last Modified : Initial Creation by Ramesh Mandava after taking input from Jeanfrancois and other Team members @Last Modified : By Ramesh on 1/20/2002 , Added code to use new testIdVector and testCaseIdVector for preserving order of entry of them and now <tests> element is added around multiple tests @Last Modified : By Ramesh on 4/5/2002, Taken care of machine name unavailability under J2EE. And allowed having . in the path of result file * */ import java.util.Hashtable; import java.util.Vector; import java.util.Enumeration; import java.util.Date; import java.util.Calendar; import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class Reporter extends Thread implements Serializable { /* FIELDS */ private static Reporter reporterInstance = null; private String resultFile="default.xml"; private FileOutputStream fout; private static String ws_home="sqe-pe"; transient public PrintWriter out = new PrintWriter(System.out); private boolean hasBeenPrinted = false; /** testSuiteHash is a Hashtable holding info about different testsuites. */ private static Hashtable testSuiteHash = new Hashtable(); /** This method is used for setting the TestSuite Info */ public void setTestSuite( String id, String name, String description ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( id.trim() ); if ( myTestSuite == null ) { myTestSuite = new TestSuite( id, name,description); testSuiteHash.put( id.trim(), myTestSuite ); } } /** This method is used for setting the TestSuite Info */ public void setTestSuite( String id, String name) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( id.trim() ); if ( myTestSuite == null ) { myTestSuite = new TestSuite( id.trim(), name); testSuiteHash.put( id.trim(), myTestSuite ); } } /** This method is used for setting the TestSuite Info */ public void setTestSuite( String id) { System.err.println("setTestSuite with id -> " + id ); TestSuite myTestSuite = (TestSuite)testSuiteHash.get( id.trim() ); if ( myTestSuite == null ) { myTestSuite = new TestSuite( id.trim()); testSuiteHash.put( id.trim(), myTestSuite ); } } /** After setting Test Suite info. suing setTestSuite, We need to use this addTest method for adding information about particular Test. We need to pass both TestSuiteId and TestId along with othe info of Test */ public void addTest( String testSuiteId, String testId, String testName, String testDescription ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:addTest might have called without setTestSuite. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id -> " + testSuiteId.trim() ); return; } Test myTest = new Test( testId, testName, testDescription ); myTestSuite.addTest( myTest ); } /** After setting Test Suite info. suing setTestSuite, We need to use this addTest method for adding information about particular Test. We need to pass both TestSuiteId and TestId along with othe info of Test */ public void addTest( String testSuiteId, String testId, String testName ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:addTest might have called without setTestSuite. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id -> " + testSuiteId.trim() ); return; } Test myTest = new Test( testId, testName ); myTestSuite.addTest( myTest ); } /** After using setthing Test Suite info. We need to use this addTest method for adding information about particular Test. We need to pass both TestSuiteId and TestId */ public void addTest( String testSuiteId, String testId ) { System.out.println("addTest with testSuiteId:: testId -> " + testSuiteId + "::" + testId ); TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:addTest might have called without setTestSuite. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id -> " + testSuiteId.trim() ); return; } Test myTest = new Test( testId ); myTestSuite.addTest( myTest ); } /** After adding a Test using addTest , We need to use this setTestStatus method for setting Test status(pass/fail) information about particular Test. We need to pass both TestSuiteId and TestId al ong with expected and actual result. This is optional as in some case only TestCases will have status */ public void setTestStatus ( String testSuiteId, String testId, String status, String expected, String actual ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:setTestStatus might have called without setTestSuite. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id -> " + testSuiteId.trim() ); return; } Test myTest = (Test)myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:setTestStatus might have called without addTest. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id::Test Id -> " + testSuiteId.trim() + "::" + testId.trim() ); return; } myTest.setStatus( status); myTest.setExpected( expected); myTest.setActual( actual); } /** After adding a Test using addTest , We need to use this setTestStatus method for setting Test status(pass/fail) information about particular Test. We need to pass both TestSuiteId and TestId along with status information. This is optional as in some case only TestCases will have status */ public void setTestStatus ( String testSuiteId, String testId, String status, String statusDescription ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:setTestStatus might have called without setTestSuite. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id -> " + testSuiteId.trim() ); return; } Test myTest = (Test)myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:setTestStatus might have called without addTest. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id::Test Id -> " + testSuiteId.trim() + "::" + testId.trim() ); return; } myTest.setStatus( status); myTest.setStatusDescription( statusDescription); } /** After adding a Test using addTest , We need to use this setTestStatus method for setting Test status(pass/fail) information about particular Test. We need to pass both TestSuiteId and TestId along with status information. This is optional as in some case only TestCases will have status */ public void setTestStatus ( String testSuiteId, String testId, String status ) { System.out.println("setTestStatus testSuiteId::testId::status -> " + testSuiteId + "::" + testId + "::" + status ); TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:setTestStatus might have called without setTestSuite. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id -> " + testSuiteId.trim() ); return; } Test myTest =(Test) myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:setTestStatus might have called without addTest. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id::Test Id -> " + testSuiteId.trim() + "::" + testId.trim() ); return; } myTest.setStatus( status); } /** After adding a Test using addTest, We need to use this addTestCase method for adding information about particular TestCase corresponding to that Test. We need to pass TestSuiteId, TestId and TestCaseId along with othe info of TestCase */ public void addTestCase( String testSuiteId, String testId , String testCaseId) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:addTestCase might have called without setTestSuite. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id -> " + testSuiteId.trim() ); return; } Test myTest = (Test)myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:addTestCase might have called without addTest. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id::Test Id -> " + testSuiteId.trim() + "::" + testId.trim() ); return; } TestCase myTestCase = new TestCase( testCaseId.trim() ); myTest.addTestCase ( myTestCase ); } /** After adding a Test using addTest, We need to use this addTestCase method for adding information about particular TestCase corresponding to that Test. We need to pass TestSuiteId, TestId and TestCaseId along with othe info of TestCase */ public void addTestCase( String testSuiteId, String testId , String testCaseId, String testCaseName ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:addTestCase might have called without setTestSuite. PENDING : Shall we throw Exception?"); return; } Test myTest = (Test)myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:addTestCase might have called without addTest. PENDING : Shall we throw Exception?"); System.err.println("Given TestSuite Id::Test Id -> " + testSuiteId.trim() + "::" + testId.trim() ); return; } TestCase myTestCase = new TestCase( testCaseId.trim(), testCaseName ); myTest.addTestCase ( myTestCase ); } /** After adding a Test using addTest, We need to use this addTestCase method for adding information about particular TestCase corresponding to that Test. We need to pass TestSuiteId, TestId and TestCaseId along with othe info of TestCase */ public void addTestCase( String testSuiteId, String testId , String testCaseId, String testCaseName , String testCaseDescription ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:addTestCase might have called without setTestSuite. PENDING : Shall we throw Exception?"); return; } Test myTest = (Test)myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:addTestCase might have called without addTest. PENDING : Shall we throw Exception?"); return; } TestCase myTestCase = new TestCase( testCaseId.trim(), testCaseName, testCaseDescription ); myTest.addTestCase ( myTestCase ); } /** After adding a TestCase using addTestCase , We need to use this setTestCaseStatus method for setting TestCase status(pass/fail) information about particular TestCase. We need to pass TestSuiteId, TestId and TestCaseId along with status information. We pass expected and actual information along with pass/fail here */ public void setTestCaseStatus ( String testSuiteId, String testId, String testCaseId, String status, String expected, String actual ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:setTestCaseStatus might have called without setTestSuite. PENDING : Shall we throwException?"); return; } Test myTest = (Test)myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:setTestCaseStatus might have called without addTest. PENDING : Shall we throw Exception?"); return; } TestCase myTestCase =(TestCase) myTest.getTestCaseHash().get( testCaseId.trim() ); if ( myTestCase == null ) { System.err.println("ERROR:setTestCaseStatus might have called without addTestCase. PENDING : Shall we throwException?"); return; } myTestCase.setStatus( status); myTestCase.setExpected( expected); myTestCase.setActual( actual); } /** After adding a TestCase using addTestCase , We need to use this setTestCaseStatus method for setting TestCase status(pass/fail) information about particular TestCase. We need to pass TestSuiteId, TestId and TestCaseId along with status information. Each TestCase will have status */ public void setTestCaseStatus ( String testSuiteId, String testId, String testCaseId, String status, String statusDescription ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:setTestCaseStatus might have called without setTestSuite. PENDING : Shall we throw Exception?"); return; } Test myTest = (Test)myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:setTestCaseStatus might have called without addTest. PENDING : Shall we throw Exception?"); return; } TestCase myTestCase =(TestCase) myTest.getTestCaseHash().get( testCaseId.trim() ); if ( myTestCase == null ) { System.err.println("ERROR:setTestCaseStatus might have called without addTestCase. PENDING : Shall we throw Exception?"); return; } myTestCase.setStatus( status); myTestCase.setStatusDescription( statusDescription); } /** After adding a TestCase using addTestCase , We need to use this setTestCaseStatus method for setting TestCase status(pass/fail) information about particular TestCase. We need to pass TestSuiteId, TestId and TestCaseId along with status information. only TestCases will have status */ public void setTestCaseStatus ( String testSuiteId, String testId, String testCaseId, String status ) { TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId.trim() ); if ( myTestSuite== null ) { System.err.println("ERROR:setTestCaseStatus might have called without setTestSuite. PENDING : Shall we throw Exception?"); return; } Test myTest =(Test) myTestSuite.getTestHash().get( testId.trim() ); if ( myTest == null ) { System.err.println("ERROR:setTestCaseStatus might have called without addTest. PENDING : Shall we throw Exception?"); return; } TestCase myTestCase = (TestCase)myTest.getTestCaseHash().get( testCaseId.trim() ); if ( myTestCase == null ) { System.err.println("ERROR:setTestCaseStatus might have called without addTestCase. PENDING : Shall we throw Exception?"); return; } myTestCase.setStatus( status); } /** * Change done on 7/10/02 by Deepa Singh * Now Reporter will by default create results file in $EJTE_HOME if no results file is specified * So no need to pass the environment variable. * Reporter.getInstance should create test_results.xml at j2ee-test/ * */ public static Reporter getInstance( ) { if ( reporterInstance == null ) { //reporterInstance = new Reporter( ); String rootpath=new File(".").getAbsolutePath(); String ejte_home=rootpath.substring(0,rootpath.indexOf(ws_home)); //ejte_home contains OS dependent path separator character without j2ee-test String outputDir=ejte_home+ws_home; reporterInstance = Reporter.getInstance( outputDir + File.separatorChar + "test_results.xml" ); } return reporterInstance; } public static Reporter getInstance(String wshome) { if(reporterInstance == null) { String rootpath = (new File(".")).getAbsolutePath(); String ejte_home = rootpath.substring(0, rootpath.indexOf(wshome)); String outputDir = ejte_home + wshome; reporterInstance = new Reporter(outputDir + File.separatorChar + "test_results.xml"); } return reporterInstance; } public static Reporter getInstance( String resultFilePath,boolean pathSpecified ) { if ( reporterInstance == null ) { reporterInstance = new Reporter(resultFilePath ); } return reporterInstance; } //done only for the webtests. /*public static Reporter getInstance(String wshome) { if ( reporterInstance == null ) { String rootpath=new File(".").getAbsolutePath(); //System.out.println("wshome from param is :"+wshome); //System.out.println("ROOT IS"+rootpath); String ejte_home=rootpath.substring(0,rootpath.indexOf(wshome)); //ejte_home contains OS dependent path separator character without j2ee-test String outputDir=ejte_home+wshome; reporterInstance = new Reporter(outputDir + File.separatorChar + "test_results.xml"); //reporterInstance = Reporter.getInstance( outputDir + File.separatorChar + "test_results.xml" ); //reporterInstance = new Reporter(resultFilePath ); } return reporterInstance; }*/ public static Reporter getInstance( OutputStream outStream ) { if ( reporterInstance == null ) { reporterInstance = new Reporter(outStream ); } return reporterInstance; } public static Reporter getInstance( Writer writer ) { if ( reporterInstance == null ) { reporterInstance = new Reporter(writer ); } return reporterInstance; } /* CONSTRUCTORS */ private Reporter( ) { try{ Runtime.getRuntime().addShutdownHook(this); } catch (java.lang.Exception ex){ //System.out.println("WARNING: Reporter hook thread not created. No XML file will be produced."); System.out.println(ex.getMessage()); } } private Reporter( String resultFilePath ) { try{ resultFile= resultFilePath; Runtime.getRuntime().addShutdownHook(this); } catch (java.lang.Exception ex){ //System.out.println("WARNING: Reporter hook thread not created. No XML file will be produced."); } } private Reporter (OutputStream o) { this(); out = new PrintWriter(o); } /* constructor for JSPs: * the "out" field in a JSP is a JSPWriter * which extends PrintWriter. */ private Reporter (Writer w) { this(); out = new PrintWriter(w); } public void generateValidReport( ) { // System.out.println("REPORTER\t Inside generateValidReport"); FileChannel rChannel = null; FileChannel wChannel = null; try { //Now flush all the TestSuite info //System.out.println("REPORTER\t generateValidReport.flushAll"); flushAll(); String oFileName =null; if ( resultFile.lastIndexOf(".") > 0 ) { oFileName = resultFile.substring(0, resultFile.lastIndexOf(".") ) + "Valid.xml"; } else { oFileName = resultFile + "Valid.xml"; } wChannel = new FileOutputStream(oFileName).getChannel(); String osName = System.getProperty("os.name"); String osVersion = System.getProperty("os.version"); String currentDate = (new Date()).toString(); String extraXML = "<report> <date> " + currentDate + "</date><configuration>"; extraXML += "<os>" + osName + osVersion + "</os>"; extraXML += "<jdkVersion>" + System.getProperty("java.version") + "</jdkVersion>"; String machineName = "unavailable"; InputStream in = null; try { in = Runtime.getRuntime().exec("uname -n").getInputStream(); byte[] myBytes = new byte[200]; in.read(myBytes); machineName = new String( myBytes ).trim(); } catch ( Exception me ) { } finally { close(in); } extraXML += "<machineName>" + machineName + "</machineName>"; extraXML += "</configuration> <testsuites>"; wChannel.write(ByteBuffer.wrap(extraXML.getBytes())); rChannel = new FileInputStream(resultFile).getChannel(); wChannel.transferFrom(rChannel, wChannel.position(), rChannel.size()); wChannel.position(wChannel.position() + rChannel.size()); wChannel.write(ByteBuffer.wrap("</testsuites>\n</report>\n".getBytes())); //System.out.println("REPORTER\t File validation complete"); } catch ( Exception e ) { System.out.println("ERROR : " + e ); } finally { close(rChannel); close(wChannel); } } public void flushAll ( ) { // System.out.println("REPORTER\t inside flushAll") ; InputStream in = null; FileOutputStream foutput = null; try { Enumeration testSuiteEnum = testSuiteHash.keys(); if ( resultFile.equals("default.xml") ) { in = Runtime.getRuntime().exec("uname -n").getInputStream(); byte[] myBytes = new byte[200]; in.read(myBytes); String myResultFile = "result_"; String machineName = new String( myBytes ).trim(); myResultFile += machineName; Calendar myCalendar = Calendar.getInstance(); String month = new Integer( myCalendar.get ( Calendar.MONTH)).toString(); String day = new Integer(myCalendar.get ( Calendar.DAY_OF_MONTH)).toString(); String year = new Integer(myCalendar.get ( Calendar.YEAR)).toString(); myResultFile += "_" + month + day + year + ".xml"; resultFile= myResultFile; } foutput = new FileOutputStream( resultFile, true ); while ( testSuiteEnum.hasMoreElements( ) ) { String testSuiteId = (String) testSuiteEnum.nextElement(); flush( testSuiteId, foutput ); } System.out.println("in flushAll , creating new testSuiteHash"); // Now take out the TestSuite info from memory testSuiteHash = new Hashtable(); } catch ( Exception e ) { System.err.println("ERROR: " + e ); } finally { close(in); close(foutput); } } /** * This method prepares and output an XML representation of the Reporter class' content for the given testSuite. * @param testSuiteName the test suite's name. * @return returns true if the file is succesfully created */ public boolean flush(String testSuiteId) { //System.out.println("REPORTER\t flush(testsuiteID"); boolean returnVal=false; InputStream in = null; FileOutputStream foutput = null; try { if ( resultFile.equals("default.xml") ) { in = Runtime.getRuntime().exec("uname -n").getInputStream(); byte[] myBytes = new byte[200]; in.read(myBytes); String myResultFile = "result_"; String machineName = new String( myBytes ).trim(); myResultFile += machineName; Calendar myCalendar = Calendar.getInstance(); String month = new Integer( myCalendar.get ( Calendar.MONTH)).toString(); String day = new Integer(myCalendar.get ( Calendar.DAY_OF_MONTH)).toString(); String year = new Integer(myCalendar.get ( Calendar.YEAR)).toString(); myResultFile += "_" + month + day + year + ".xml"; resultFile= myResultFile; } foutput = new FileOutputStream( resultFile, true ); returnVal= flush( testSuiteId, foutput); } catch ( Exception e ) { System.err.println("ERROR : " + e ); } finally { close(in); close(foutput); } return returnVal; } /** * This method prepares and output an XML representation of the Reporter class' content for the given testSuite. * @param testSuiteName the test suite's name. * @param foutput the FileOutputStream in which we need to write. * @return returns true if the file is succesfully created */ public boolean flush(String testSuiteId, FileOutputStream foutput){ //System.out.println("REPORTER\t flush(testsuiteId,fout)"); try{ StringBuffer xmlRepresentation = new StringBuffer(); /* xmlRepresentation.append("<?xml version=\"1.0\"?>\n"); xmlRepresentation.append("<!DOCTYPE testsuite SYSTEM \"test_suite.dtd\">\n"); xmlRepresentation.append("<!-- ID are defined as: test suite: test case : local id-->\n"); */ TestSuite myTestSuite = (TestSuite)testSuiteHash.get( testSuiteId ); if ( myTestSuite == null ) { System.err.println("ERROR: Information for TestSuite Id : " + testSuiteId + " doesn't exist"); return false; } String testSuiteName = myTestSuite.getName(); String testSuiteDescription = myTestSuite.getDescription(); xmlRepresentation.append("<testsuite>\n" ); xmlRepresentation.append(" <id> " + testSuiteId + " </id>\n"); if (!testSuiteName.equals( ReporterConstants.NA ) ) { xmlRepresentation.append("<name>" + testSuiteName.trim() + "</name>\n"); } if (!testSuiteDescription.equals( ReporterConstants.NA ) ) { xmlRepresentation.append("<description><![CDATA[" + testSuiteDescription + "]]></description>\n"); } Hashtable testHash = myTestSuite.getTestHash( ); Vector testIdVector = myTestSuite.getTestIdVector( ); xmlRepresentation.append("<tests>\n"); for ( int ti=0; ti< testIdVector.size(); ti++ ) { String testId = (String)testIdVector.elementAt(ti ); Test myTest = (Test)testHash.get( testId.trim() ); String testName = myTest.getName(); String testDescription = myTest.getDescription(); String testStatus = myTest.getStatus(); String testStatusDescription = myTest.getStatusDescription(); String testExpected= myTest.getExpected( ); String testActual= myTest.getActual( ); xmlRepresentation.append("<test>\n"); xmlRepresentation.append("<id>" + testId + "</id>\n"); if (!testName.equals( ReporterConstants.NA ) ) { xmlRepresentation.append("<name>" + testName + "</name>\n"); } if (!testDescription.equals( ReporterConstants.NA ) ) { xmlRepresentation.append("<description><![CDATA[" + testDescription + "]]></description>\n"); } if (!testStatus.equals( ReporterConstants.OPTIONAL ) ) { if (!testStatusDescription.equals( ReporterConstants.OPTIONAL ) ) { xmlRepresentation.append("<status value=\"" + testStatus + "\"><![CDATA[" + testStatusDescription + "]]></status>\n"); } else if ( ( testExpected != null ) && ( testActual != null ) ) { xmlRepresentation.append("<status value=\"" + testStatus + "\"> <expected><![CDATA[" + testExpected + "]]></expected><actual><![CDATA[" + testActual + "]]></actual></status>\n"); } else { xmlRepresentation.append("<status value=\"" + testStatus + "\">" + "</status>\n"); } } Hashtable testCaseHash = myTest.getTestCaseHash(); Vector testCaseIdVector = myTest.getTestCaseIdVector( ); /* if ( testCaseIdVector.size( ) < 1 ) { // This means there are no test cases and Test has the status info xmlRepresentation.append("</test>\n"); } */ if ( testCaseIdVector.size() >= 1 ) { xmlRepresentation.append("<testcases>\n"); for ( int tc=0; tc< testCaseIdVector.size(); tc++ ) { String testCaseId = (String)testCaseIdVector.elementAt( tc ); TestCase myTestCase = (TestCase)testCaseHash.get( testCaseId.trim() ); String testCaseName = myTestCase.getName(); String testCaseDescription = myTestCase.getDescription(); String testCaseStatus = myTestCase.getStatus(); String testCaseStatusDescription = myTestCase.getStatusDescription(); String testCaseExpected = myTestCase.getExpected(); String testCaseActual = myTestCase.getActual(); xmlRepresentation.append("<testcase>\n"); xmlRepresentation.append("<id> " + testCaseId + "</id>\n"); if (!testCaseName.equals( ReporterConstants.NA ) ) { xmlRepresentation.append("<name>" + testCaseName + "</name>\n"); } if (!testCaseDescription.equals( ReporterConstants.NA ) ) { xmlRepresentation.append("<description><![CDATA[" + testCaseDescription + "]]></description>\n"); } if (!testCaseStatusDescription.equals( ReporterConstants.NA ) ) { xmlRepresentation.append("<status value=\"" + testCaseStatus + "\"><![CDATA[" + testCaseStatusDescription + "]]></status>\n"); } else if ( ( testCaseExpected != null ) && ( testCaseActual != null ) ) { xmlRepresentation.append("<status value=\"" + testCaseStatus + "\"> <expected><![CDATA[" + testCaseExpected + "]]></expected><actual><![CDATA[" + testCaseActual + "]]></actual></status>\n"); } else { xmlRepresentation.append("<status value=\"" + testCaseStatus + "\">" + "</status>\n"); } xmlRepresentation.append("</testcase>\n"); } xmlRepresentation.append("</testcases>\n"); } xmlRepresentation.append("</test>\n"); } xmlRepresentation.append("</tests>\n" ); xmlRepresentation.append("</testsuite>\n" ); boolean writeResult = writeXMLFile(xmlRepresentation, foutput); // Now remove TestSuite from Hashtable: PENDING if ( writeResult==true ) { // If we could write teh content properly then remove the TestSuite from Hashtable testSuiteHash.remove( testSuiteId.trim() ); } return writeResult; } catch (java.lang.Exception ex){ return false; } } private boolean writeXMLFile(StringBuffer xmlStringBuffer){ PrintWriter writer = null; try{ writer = new PrintWriter(new BufferedWriter(new FileWriter(resultFile))); writer.println( xmlStringBuffer.toString() ); writer.flush(); } catch(java.io.IOException ex){ ex.printStackTrace(); return false; } finally { close(writer); } return true; } private boolean writeXMLFile(StringBuffer xmlStringBuffer, FileOutputStream fout){ try{ fout.write( xmlStringBuffer.toString().getBytes() ); fout.flush( ); } catch(java.io.IOException ex){ ex.printStackTrace(); return false; } return true; } public void run(){ //System.out.println("REPORTER\t Inside run"); generateValidReport(); } private void close(InputStream in) { if (in != null) { try { in.close(); } catch(IOException ioe) { // ignore } } } private void close(OutputStream out) { if (out != null) { try { out.close(); } catch(IOException ioe) { // ignore } } } private void close(Writer writer) { if (writer != null) { try { writer.close(); } catch(IOException ioe) { // ignore } } } private void close(FileChannel fileChannel) { if (fileChannel != null) { try { fileChannel.close(); } catch(IOException ioe) { // ignore } } } } // end class Reporter