/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.test.client.impl; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.sql.ResultSet; import java.text.SimpleDateFormat; import java.util.List; import java.util.Properties; import org.junit.Assert; import org.teiid.core.util.FileUtils; import org.teiid.test.client.ResultsGenerator; import org.teiid.test.client.TestProperties; import org.teiid.test.framework.exception.QueryTestFailedException; import org.teiid.test.util.TestResultSetUtil; @SuppressWarnings("nls") public class ResultsGeneratorImpl implements ResultsGenerator { private static final SimpleDateFormat FILE_NAME_DATE_FORMATER = new SimpleDateFormat( "yyyyMMdd_HHmmss"); //$NON-NLS-1$ private String outputDir = ""; private String generateDir = ""; private static final int MAX_COL_WIDTH = 65; public ResultsGeneratorImpl( String testname, Properties props) { outputDir = props.getProperty(TestProperties.PROP_OUTPUT_DIR, "."); Assert.assertNotNull("Property " + TestProperties.PROP_OUTPUT_DIR + " was not specified", outputDir); outputDir = outputDir + "/" + testname; generateDir = props.getProperty(PROP_GENERATE_DIR, "."); Assert.assertNotNull("Property " + PROP_GENERATE_DIR + " was not specified", this.generateDir); File d = new File(this.outputDir); this.outputDir = d.getAbsolutePath(); d = new File(this.outputDir); if (d.exists()) { FileUtils.removeDirectoryAndChildren(d); } if (!d.exists()) { d.mkdirs(); } d = new File(generateDir, testname); generateDir = d.getAbsolutePath(); d = new File(generateDir); if (d.exists()) { FileUtils.removeDirectoryAndChildren(d); } if (!d.exists()) { d.mkdirs(); } } @Override public String getGenerateDir() { // TODO Auto-generated method stub return this.generateDir; } @Override public String getOutputDir() { // TODO Auto-generated method stub return outputDir; } /** * Generate query results. These are actual results from the server and may * be used for comparing to results from a later test run. * * @param queryID * @param resultsFile * @param result * @param ex * @throws QueryTestFailedException */ public void generateQueryResultFile(String querySetID, String queryID, String query, ResultSet result, Throwable ex, int testStatus) throws QueryTestFailedException { File fos = createNewResultsFile(queryID, querySetID, getGenerateDir()); FileOutputStream actualOut = null; try { actualOut = new FileOutputStream(fos); PrintStream filePrintStream = new PrintStream(actualOut); if (ex != null) { TestResultSetUtil.printThrowable(ex, query, filePrintStream); } else if (result != null ){ result.beforeFirst(); TestResultSetUtil.printResultSet(result, query, MAX_COL_WIDTH, true, filePrintStream); } } catch (Exception e) { e.printStackTrace(); throw new QueryTestFailedException(e); } finally { if (actualOut != null) { try { actualOut.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public String generateErrorFile(final String querySetID, final String queryID, final String sql, final ResultSet resultSet, final Throwable queryError, final Object results) throws QueryTestFailedException { String errorFileName = null; try { // write actual results to error file errorFileName = generateErrorFileName(queryID, querySetID); // configID, queryID, Integer.toString(clientID)); // CombinedTestClient.log("\t" + this.clientID + ": Writing error file with actual results: " + errorFileName); //$NON-NLS-1$ //$NON-NLS-2$ File errorFile = new File(getOutputDir(), errorFileName); // the resultset will be passed in as null when // the error was due to a thrown exception, and not based comparison issues if (resultSet == null) { FileOutputStream actualOut = null; try { actualOut = new FileOutputStream(errorFile); PrintStream filePrintStream = new PrintStream(actualOut); TestResultSetUtil.printThrowable(queryError, sql, filePrintStream); filePrintStream.flush(); } catch (Exception e) { e.printStackTrace(); throw new QueryTestFailedException(e); } finally { if (actualOut != null) { try { actualOut.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return errorFileName; } // rewind resultset resultSet.beforeFirst(); generateErrorResults(querySetID, queryID, sql, errorFile, resultSet, (results != null ? (List) results : null)); } catch (Throwable e) { throw new QueryTestFailedException(e.getMessage()); // CombinedTestClient.logError("Error writing error file \"" + outputDir + "\"/" + errorFileName + ": " + e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } return errorFileName; } private File createNewResultsFile(String queryID, String querySetID, String genDir) { String resultFileName = queryID + ".txt"; //$NON-NLS-1$ String targetDirname = genDir + File.separator + querySetID; //$NON-NLS-1$ File targetDir = new File(targetDirname); targetDir.mkdirs(); return new File(targetDir, resultFileName); } private String generateErrorFileName(String queryID, String querySetID) { // String errorFileName = "ERROR_" // // configID + "_" //$NON-NLS-1$ //$NON-NLS-2$ // // + querySetID + "_" //$NON-NLS-1$ // + queryID // + "_" //$NON-NLS-1$ // + FILE_NAME_DATE_FORMATER.format(new Date(System // .currentTimeMillis())) + ".txt"; //$NON-NLS-1$ // return errorFileName; return queryID + ".txt"; } /** * Generate an error file for a query that failed comparison. File should * have the SQL, the actual results returned from the server and the results * that were expected. * * @param queryID * @param sql * @param resultsFile * @param actualResult * @param expectedResultFile * @param ex * @throws QueryTestFailedException */ private void generateErrorResults(String querySetID, String queryID, String sql, File resultsFile, ResultSet actualResult, List<String> results) throws QueryTestFailedException { FileOutputStream actualOut = null; try { actualOut = new FileOutputStream(resultsFile); PrintStream filePrintStream = new PrintStream(actualOut); TestResultSetUtil.printResultSet(actualResult, sql, MAX_COL_WIDTH, true, filePrintStream); // if (results != null) { // for (Iterator<String> it=results.iterator(); it.hasNext();) { // String line = it.next(); // filePrintStream.print(line); // } // } else { // // ResultSetUtil.printResultSet(actualResult, MAX_COL_WIDTH, true, filePrintStream); // } } catch (Exception e) { e.printStackTrace(); throw new QueryTestFailedException(e); } finally { if (actualOut != null) { try { actualOut.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }