/* * 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.ctc; import java.io.File; import java.io.IOException; import java.sql.Blob; import java.sql.Clob; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLXML; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import org.jdom.JDOMException; import org.teiid.core.util.ObjectConverterUtil; import org.teiid.core.util.StringUtil; import org.teiid.test.client.ClassFactory; import org.teiid.test.client.ExpectedResults; import org.teiid.test.client.QueryScenario; import org.teiid.test.client.QueryTest; import org.teiid.test.client.ResultsGenerator; import org.teiid.test.client.TestProperties; import org.teiid.test.client.TestResult; import org.teiid.test.framework.ConfigPropertyLoader; import org.teiid.test.framework.ConfigPropertyNames; import org.teiid.test.framework.TestLogger; import org.teiid.test.framework.exception.QueryTestFailedException; @SuppressWarnings("nls") public class XMLExpectedResults implements ExpectedResults { protected Properties props; protected String resultMode = TestProperties.RESULT_MODES.NONE; protected String generateDir = null; protected String querySetIdentifier = null; protected String results_dir_loc = null; protected Map<String, ResultsHolder> loadedResults = new HashMap<String, ResultsHolder>(); public XMLExpectedResults(String querySetIdentifier, Properties properties) { this.props = properties; this.querySetIdentifier = querySetIdentifier; this.results_dir_loc = props.getProperty( PROP_EXPECTED_RESULTS_DIR_LOC, ""); String expected_root_loc = this.props .getProperty(PROP_EXPECTED_RESULTS_ROOT_DIR); if (expected_root_loc != null) { File dir = new File(expected_root_loc, results_dir_loc); this.results_dir_loc = dir.getAbsolutePath(); } validateResultsMode(this.props); TestLogger.logDebug("Expected results loc: " + this.results_dir_loc); } protected void validateResultsMode(Properties props) { // Determine from property what to do with query results String resultModeStr = props.getProperty( TestProperties.PROP_RESULT_MODE, ""); // No need to check for null prop here since we've just checked for this // required property if (resultModeStr.equalsIgnoreCase(TestProperties.RESULT_MODES.NONE) || resultModeStr .equalsIgnoreCase(TestProperties.RESULT_MODES.COMPARE) || resultModeStr .equalsIgnoreCase(TestProperties.RESULT_MODES.GENERATE)) { //$NON-NLS-1$ resultMode = resultModeStr; } // otherwise use default of NONE TestLogger.logDebug("\nResults mode: " + resultMode); //$NON-NLS-1$ } public boolean isExpectedResultsNeeded() { return (resultMode.equalsIgnoreCase(TestProperties.RESULT_MODES.COMPARE)); } @Override public boolean isExceptionExpected(String queryidentifier) throws QueryTestFailedException { if (resultMode.equalsIgnoreCase( TestProperties.RESULT_MODES.COMPARE)) { ResultsHolder expectedResults = (ResultsHolder) getResults(queryidentifier); return (expectedResults.getExceptionMsg() == null ? false : true); } return false; } @Override public String getQuerySetID() { return this.querySetIdentifier; } @Override public synchronized File getResultsFile(String queryidentifier) throws QueryTestFailedException { return findExpectedResultsFile(queryidentifier, this.querySetIdentifier); } private ResultsHolder getResults(String queryidentifier) throws QueryTestFailedException { ResultsHolder rh = null; if (!loadedResults.containsKey(queryidentifier)) { rh = loadExpectedResults( findExpectedResultsFile(queryidentifier, this.querySetIdentifier)); } else { rh = loadedResults.get(queryidentifier); } return rh; } /** * Compare the results of a query with those that were expected. * * @param expectedResults * The expected results. * @param results * The actual results - may be null if <code>actualException</code>. * @param actualException * The actual exception recieved durring query execution - may be null if <code>results</code>. * @param isOrdered * Are the actual results ordered? * @param batchSize * Size of the batch(es) used in determining when the first batch of results were read. * @return The response time for comparing the first batch (sizes) of resutls. * @throws QueryTestFailedException * If comparison fails. */ public Object compareResults( final String queryIdentifier, final String sql, final ResultSet resultSet, final Throwable actualException, final int testStatus, final boolean isOrdered, final int batchSize, final boolean resultFromQuery) throws QueryTestFailedException { final String eMsg = "CompareResults Error: "; //$NON-NLS-1$ ResultsHolder expectedResults = (ResultsHolder) getResults(queryIdentifier); ResultsHolder actualResults; switch (testStatus) { case TestResult.RESULT_STATE.TEST_EXCEPTION: throw new QueryTestFailedException( eMsg + "Test resulted in unexpected exception " + actualException.getMessage()); //$NON-NLS-1$ case TestResult.RESULT_STATE.TEST_EXPECTED_EXCEPTION: if (!expectedResults.isException()) { // The actual exception was expected, but the expected results was not throw new QueryTestFailedException(eMsg + "The actual result was an exception, but the Expected results wasn't an exception. Actual exception: '" //$NON-NLS-1$ + actualException.getMessage() + "'"); //$NON-NLS-1$ } // We got an exception that we expected - convert actual exception to ResultsHolder actualResults = new ResultsHolder(TagNames.Elements.EXCEPTION); actualResults.setQueryID(expectedResults.getQueryID()); actualResults = convertException(actualException, actualResults); compareExceptions(actualResults, expectedResults, eMsg); break; default: // DEBUG: // debugOut.println("*** Expected Results (holder): " + // expectedResults); // DEBUG: // debugOut.println("*** Actual Results (ResultSet): " + // printResultSet(results)); // Convert results to ResultsHolder actualResults = new ResultsHolder(TagNames.Elements.QUERY_RESULTS); actualResults.setQueryID(expectedResults.getQueryID()); convertResults(resultSet, batchSize, actualResults); if (expectedResults.getRows().size() > 0) { compareResults(actualResults, expectedResults, eMsg, isOrdered); } else if (actualResults.getRows() != null && actualResults.getRows().size() > 0) { throw new QueryTestFailedException(eMsg + "Expected results indicated no results, but actual shows " + actualResults.getRows().size() + " rows."); //$NON-NLS-1$ } // DEBUG: // debugOut.println("*** Actual Results (holder): " + // actualResults); // Compare expected results with actual results, record by record break; } return null; } private ResultsHolder convertException(final Throwable actualException, final ResultsHolder actualResults) { actualResults.setExceptionClassName(actualException.getClass() .getName()); actualResults.setExceptionMsg(actualException.getMessage()); return actualResults; } /** * Helper to convert results into records and record first batch response time. * * @param results * @param batchSize * @param resultsHolder * Modified - results added by this method. * @return List of sorted results. * @throws QueryTestFailedException * replaced SQLException. */ private final long convertResults(final ResultSet results, final int batchSize, ResultsHolder resultsHolder) throws QueryTestFailedException { long firstBatchResponseTime = 0; final List records = new ArrayList(); final List columnTypeNames = new ArrayList(); final List columnTypes = new ArrayList(); final ResultSetMetaData rsMetadata; final int colCount; // Get column info try { rsMetadata = results.getMetaData(); colCount = rsMetadata.getColumnCount(); // Read types of all columns for (int col = 1; col <= colCount; col++) { columnTypeNames.add(rsMetadata.getColumnName(col)); columnTypes.add(rsMetadata.getColumnTypeName(col)); } } catch (SQLException qre) { throw new QueryTestFailedException("Can't get results metadata: " + qre.getMessage()); //$NON-NLS-1$ } // Get rows try { // Read all the rows for (int row = 0; results.next(); row++) { final List currentRecord = new ArrayList(colCount); // Read values for this row for (int col = 1; col <= colCount; col++) { currentRecord.add(results.getObject(col)); } records.add(currentRecord); // If this row is the (fetch size - 1)th row, record first batch response time if (row == batchSize) { firstBatchResponseTime = System.currentTimeMillis(); } } } catch (SQLException qre) { throw new QueryTestFailedException("Can't get results: " + qre.getMessage()); //$NON-NLS-1$ } // Set info on resultsHolder resultsHolder.setRows(records); resultsHolder.setIdentifiers(columnTypeNames); resultsHolder.setTypes(columnTypes); return firstBatchResponseTime; } /** * Added primarily for public access to the compare code for testing. * * @param actualResults * @param expectedResults * @param eMsg * @param isOrdered * @throws QueryTestFailedException */ protected void compareResults(final ResultsHolder actualResults, final ResultsHolder expectedResults, final String eMsg, boolean isOrdered) throws QueryTestFailedException { // if (actualResults.isException() && expectedResults.isException()) { // // Compare exceptions // compareExceptions(actualResults, expectedResults, eMsg); // } else // if (actualResults.isResult() && expectedResults.isResult()) { // Compare results if (isOrdered == false && actualResults.hasRows() && expectedResults.hasRows()) { // If the results are not ordered, we can sort both // results and expected results to compare record for record // Otherwise, actual and expected results are already assumed // to be in same order //sort the sortedResults in ascending order final List actualRows = actualResults.getRows(); sortRecords(actualRows, true); actualResults.setRows(actualRows); //sort the expectedResults with ascending order final List expectedRows = expectedResults.getRows(); sortRecords(expectedRows, true); expectedResults.setRows(expectedRows); } compareResultSets(actualResults.getRows(), actualResults.getTypes(), actualResults.getIdentifiers(), expectedResults.getRows(), expectedResults.getTypes(), expectedResults.getIdentifiers(), eMsg); // } else if (actualResults.isResult() && expectedResults.isException()) { // // Error - expected exception but got result // } else if (actualResults.isException() && expectedResults.isResult()) { // // Error - expected result but got exception // } } /** * sort one result that is composed of records of all columns */ private static void sortRecords(List records, boolean ascending) { //if record's size == 0, don't need to sort if (records.size() != 0) { int nFields = ((List)records.get(0)).size(); for (int k = 0; k < nFields; k++) { for (int m = k; m < nFields; m++) { int[] params = new int[m - k + 1]; for (int n = k, j = 0; n <= m; n++, j++) { params[j] = n; } Collections.sort(records, new ListNestedSortComparator(params, ascending)); } } } } private void compareExceptions(final ResultsHolder actualResults, final ResultsHolder expectedResults, String eMsg) throws QueryTestFailedException { final String expectedExceptionClass = expectedResults .getExceptionClassName(); final String expectedExceptionMsg = expectedResults.getExceptionMsg().toLowerCase(); final String actualExceptionClass = actualResults .getExceptionClassName(); final String actualExceptionMsg = actualResults.getExceptionMsg().toLowerCase(); if (actualExceptionClass == null) { // We didn't get an actual exception, we should have throw new QueryTestFailedException(eMsg + "Expected exception: " //$NON-NLS-1$ + expectedExceptionClass + " but got none."); //$NON-NLS-1$ } // Compare exception classes if (!expectedExceptionClass.equals(actualExceptionClass)) { throw new QueryTestFailedException(eMsg + "Got wrong exception, expected \"" //$NON-NLS-1$ + expectedExceptionClass + "\" but got \"" + //$NON-NLS-1$ actualExceptionClass + "\""); //$NON-NLS-1$ } // Compare exception messages if (!expectedExceptionMsg.equals(actualExceptionMsg)) { // Give it another chance by comparing w/o line separators if (!compareStrTokens(expectedExceptionMsg, actualExceptionMsg)) { throw new QueryTestFailedException( eMsg + "Got expected exception but with wrong message. Got " + actualExceptionMsg); //$NON-NLS-1$ } } } private boolean compareStrTokens(String expectedStr, String gotStr) { String newline = System.getProperty("line.separator"); //$NON-NLS-1$ List expectedTokens = StringUtil.split(expectedStr, newline); List gotTokens = StringUtil.split(gotStr, newline); for (int i = 0; i < expectedTokens.size(); i++) { String expected = (String) expectedTokens.get(i); String got = (String) gotTokens.get(i); if (!expected.equals(got)) { return false; } } return true; } /** * Compare actual results, identifiers and types with expected. <br> * <strong>Note </strong>: result list are expected to match element for element.</br> * * @param actualResults * @param actualDatatypes * @param actualIdentifiers * @param expectedResults * @param expectedDatatypes * @param expectedIdentifiers * @param eMsg * @throws QueryTestFailedException * If comparison fails. */ protected void compareResultSets(final List actualResults, final List actualDatatypes, final List actualIdentifiers, final List expectedResults, final List expectedDatatypes, final List expectedIdentifiers, final String eMsg) throws QueryTestFailedException { // Compare column names and types compareIdentifiers(actualIdentifiers, expectedIdentifiers, actualDatatypes, expectedDatatypes); // Walk through records and compare actual against expected final int actualRowCount = actualResults.size(); final int expectedRowCount = expectedResults.size(); final int actualColumnCount = actualIdentifiers.size(); // Check for less records than in expected results if (actualRowCount < expectedRowCount) { throw new QueryTestFailedException(eMsg + "Expected " + expectedRowCount + //$NON-NLS-1$ " records but received only " + actualRowCount); //$NON-NLS-1$ } else if (actualRowCount > expectedRowCount) { // Check also for more records than expected throw new QueryTestFailedException(eMsg + "Expected " + expectedRowCount + //$NON-NLS-1$ " records but received " + actualRowCount); //$NON-NLS-1$ } // DEBUG: // debugOut.println("================== Compariing Rows ==================="); // Loop through rows for (int row = 0; row < actualRowCount; row++) { // Get actual record final List actualRecord = (List)actualResults.get(row); // Get expected record final List expectedRecord = (List)expectedResults.get(row); // DEBUG: // debugOut.println("Row: " + (row + 1)); // debugOut.println(" expectedRecord: " + expectedRecord); // debugOut.println(" actualRecord: " + actualRecord); // Loop through columns // Compare actual elements with expected elements column by column in this row for (int col = 0; col < actualColumnCount; col++) { // Get actual value Object actualValue = actualRecord.get(col); // Get expected value Object expectedValue = expectedRecord.get(col); // DEBUG: // debugOut.println(" Col: " +(col +1) + ": expectedValue:[" + expectedValue + "] actualValue:[" + actualValue + // "]"); // Compare these values if ( ( expectedValue == null && actualValue != null) || (actualValue == null && expectedValue != null) ){ // Compare nulls throw new QueryTestFailedException(eMsg + "Value mismatch at row " + (row + 1) //$NON-NLS-1$ + " and column " + (col + 1) //$NON-NLS-1$ + ": expected = [" //$NON-NLS-1$ + (expectedValue!=null?expectedValue:"null") + "], actual = [" //$NON-NLS-1$ + (actualValue!=null?actualValue:"null") + "]"); //$NON-NLS-1$ } if (expectedValue == null && actualValue == null) { continue; } if (actualValue instanceof Blob || actualValue instanceof Clob || actualValue instanceof SQLXML) { if (actualValue instanceof Clob){ Clob c = (Clob)actualValue; try { actualValue = ObjectConverterUtil.convertToString(c.getAsciiStream()); } catch (Throwable e) { // TODO Auto-generated catch block throw new QueryTestFailedException(e); } } else if (actualValue instanceof Blob){ Blob b = (Blob)actualValue; try { actualValue = ObjectConverterUtil.convertToString(b.getBinaryStream()); } catch (Throwable e) { // TODO Auto-generated catch block throw new QueryTestFailedException(e); } } else if (actualValue instanceof SQLXML){ SQLXML s = (SQLXML)actualValue; try { actualValue = ObjectConverterUtil.convertToString(s.getBinaryStream()); } catch (Throwable e) { // TODO Auto-generated catch block throw new QueryTestFailedException(e); } } if (!(expectedValue instanceof String)) { expectedValue = expectedValue.toString(); } } // Compare values with equals if (!expectedValue.equals(actualValue)) { // DEBUG: // debugOut.println(" ExpectedType: " + expectedValue.getClass() + " ActualType: " + // actualValue.getClass()); if (expectedValue instanceof String) { final String expectedString = (String)expectedValue; // if (actualValue instanceof Blob || actualValue instanceof Clob || actualValue instanceof SQLXML) { // // Clob c = (Clob)actualValue; // // LOB types are special case - metadata says they're Object types so // // expected results are of type String. Actual object type is MMBlob, MMClob. // // Must compare w/ String verion of actual! // if (!expectedValue.equals(actualValue.toString())) { // throw new QueryTestFailedException(eMsg + "LOB Value mismatch at row " + (row + 1) //$NON-NLS-1$ // + " and column " + (col + 1) //$NON-NLS-1$ // + ": expected = [" //$NON-NLS-1$ // + expectedValue + "], actual = [" //$NON-NLS-1$ // + actualValue + "]"); //$NON-NLS-1$ // } // } else if (!(actualValue instanceof String)) { throw new QueryTestFailedException(eMsg + "Value mismatch at row " + (row + 1) //$NON-NLS-1$ + " and column " + (col + 1) //$NON-NLS-1$ + ": expected = [" //$NON-NLS-1$ + expectedValue + "], actual = [" //$NON-NLS-1$ + actualValue + "]"); //$NON-NLS-1$ } else if (expectedString.length() > 0) { // Check for String difference assertStringsMatch(expectedString, (String)actualValue, (row + 1), (col + 1), eMsg); } } else { throw new QueryTestFailedException(eMsg + "Value mismatch at row " + (row + 1) //$NON-NLS-1$ + " and column " + (col + 1) //$NON-NLS-1$ + ": expected = [" //$NON-NLS-1$ + expectedValue + "], actual = [" //$NON-NLS-1$ + actualValue + "]"); //$NON-NLS-1$ } } } // end loop through columns } // end loop through rows } protected void compareIdentifiers(List actualIdentifiers, List expectedIdentifiers, List actualDataTypes, List expectedDatatypes) throws QueryTestFailedException { // Check sizes if (expectedIdentifiers.size() != actualIdentifiers.size()) { throw new QueryTestFailedException( "Got incorrect number of columns, expected = " + expectedIdentifiers.size() + ", actual = " //$NON-NLS-1$ //$NON-NLS-2$ + actualIdentifiers.size()); } // Compare identifier lists only by short name for (int i = 0; i < actualIdentifiers.size(); i++) { String actualIdent = (String) actualIdentifiers.get(i); String expectedIdent = (String) expectedIdentifiers.get(i); String actualType = (String) actualDataTypes.get(i); String expectedType = (String) expectedDatatypes.get(i); // Get short name for each identifier String actualShort = getShortName(actualIdent); String expectedShort = getShortName(expectedIdent); if (!expectedShort.equalsIgnoreCase(actualShort)) { throw new QueryTestFailedException( "Got incorrect column name at column " + i + ", expected = " + expectedShort + " but got = " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + actualShort); } if (actualType.equalsIgnoreCase("xml")) {//$NON-NLS-1$ actualType = "string";//$NON-NLS-1$ } if (actualType.equalsIgnoreCase("clob")) {//$NON-NLS-1$ actualType = "string";//$NON-NLS-1$ } if (!expectedType.equalsIgnoreCase(actualType)) { throw new QueryTestFailedException( "Got incorrect column type at column " + i + ", expected = " + expectedType + " but got = " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + actualType); } } } protected String getShortName(String ident) { int index = ident.lastIndexOf("."); //$NON-NLS-1$ if (index >= 0) { return ident.substring(index + 1); } return ident; } private static final int MISMATCH_OFFSET = 20; private static final int MAX_MESSAGE_SIZE = 50; protected void assertStringsMatch(final String expectedStr, final String actualStr, final int row, final int col, final String eMsg) throws QueryTestFailedException { // TODO: Replace stripCR() with XMLUnit comparison for XML results. // stripCR() is a workaround for comparing XML Queries // that have '\r'. String expected = stripCR(expectedStr).trim(); String actual = stripCR(actualStr).trim(); String locationText = ""; //$NON-NLS-1$ int mismatchIndex = -1; boolean isequal = Arrays.equals(expected.toCharArray(), actual.toCharArray()); //if (!expected.equals(actual)) { if (!isequal) { if (expected != null && actual != null) { int shortestStringLength = expected.length(); if (actual.length() < expected.length()) { shortestStringLength = actual.length(); } for (int i = 0; i < shortestStringLength; i++) { if (expected.charAt(i) != actual.charAt(i)) { locationText = " Strings do not match at character: " + (i + 1) + //$NON-NLS-1$ ". Expected [" + expected.charAt(i) + "] but got [" + actual.charAt(i) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ mismatchIndex = i; break; } } } String expectedPartOfMessage = expected; String actualPartOfMessage = actual; if (expected.length() + actual.length() > MAX_MESSAGE_SIZE) { expectedPartOfMessage = safeSubString(expected, mismatchIndex - MISMATCH_OFFSET, mismatchIndex + MISMATCH_OFFSET); actualPartOfMessage = safeSubString(actual, mismatchIndex - MISMATCH_OFFSET, mismatchIndex + MISMATCH_OFFSET); } String message = eMsg + "Value mismatch at row " + row + //$NON-NLS-1$ " and column " + col + //$NON-NLS-1$ ". Expected: {0} but was: {1}" + locationText; //$NON-NLS-1$ message = MessageFormat.format(message, new Object[] { expectedPartOfMessage, actualPartOfMessage }); throw new QueryTestFailedException(message); } } private String safeSubString(String text, int startIndex, int endIndex) { String prefix = "...'"; //$NON-NLS-1$ String suffix = "'..."; //$NON-NLS-1$ int actualStartIndex = startIndex; if (actualStartIndex < 0) { actualStartIndex = 0; prefix = "'"; //$NON-NLS-1$ } int actualEndIndex = endIndex; if (actualEndIndex > text.length() - 1) { actualEndIndex = text.length() - 1; if (actualEndIndex < 0) { actualEndIndex = 0; } } if (actualEndIndex == text.length() - 1 || text.length() == 0) { suffix = "'"; //$NON-NLS-1$ } return prefix + text.substring(actualStartIndex, actualEndIndex) + suffix; } private String stripCR(final String text) { if (text.indexOf('\r') >= 0) { StringBuffer stripped = new StringBuffer(text.length()); int len = text.length(); for (int i = 0; i < len; i++) { char current = text.charAt(i); if (current != '\r') { stripped.append(current); } } return stripped.toString(); } return text; } @Override public Object getMetaData(String queryidentifier) { // TODO Auto-generated method stub return null; } private ResultsHolder loadExpectedResults(File resultsFile) throws QueryTestFailedException { XMLQueryVisitationStrategy jstrat = new XMLQueryVisitationStrategy(); final ResultsHolder expectedResult; try { expectedResult = jstrat.parseXMLResultsFile(resultsFile); } catch (IOException e) { throw new QueryTestFailedException("Unable to load expected results: " + e.getMessage()); //$NON-NLS-1$ } catch (JDOMException e) { throw new QueryTestFailedException("Unable to load expected results: " + e.getMessage()); //$NON-NLS-1$ } return expectedResult; } private File findExpectedResultsFile(String queryIdentifier, String querySetIdentifier) throws QueryTestFailedException { String resultFileName = queryIdentifier + ".xml"; //$NON-NLS-1$ File file = new File(results_dir_loc + "/" + querySetIdentifier, resultFileName); if (!file.exists() && this.isExpectedResultsNeeded()) { throw new QueryTestFailedException("Query results file " + file.getAbsolutePath() + " cannot be found"); } return file; } public static void main(String[] args) { System.setProperty(ConfigPropertyNames.CONFIG_FILE, "ctc-bqt-test.properties"); ConfigPropertyLoader _instance = ConfigPropertyLoader.getInstance(); Properties p = _instance.getProperties(); if (p == null || p.isEmpty()) { throw new RuntimeException("Failed to load config properties file"); } QueryScenario set = ClassFactory.createQueryScenario("testscenario"); _instance.setProperty(XMLQueryReader.PROP_QUERY_FILES_ROOT_DIR, new File("src/main/resources/").getAbsolutePath() ); try { Iterator<String> it = set.getQuerySetIDs().iterator(); while (it.hasNext()) { String querySetID = it.next(); List<QueryTest> queries = set.getQueries(querySetID); if (queries.size() == 0l) { System.out.println("Failed, didn't load any queries " ); } ExpectedResults er = set.getExpectedResults(querySetID); //new XMLExpectedResults(_instance.getProperties(), querySetID); ResultsGenerator gr = set.getResultsGenerator(); //new XMLGenerateResults(_instance.getProperties(), "testname", set.getOutputDirectory()); Iterator<QueryTest> qIt = queries.iterator(); while(qIt.hasNext()) { QueryTest q = qIt.next(); // String qId = (String) qIt.next(); // String sql = (String) queries.get(qId); // System.out.println("SetID #: " + cnt + " Qid: " + qId + " sql: " + sql); File resultsFile = er.getResultsFile(q.getQueryID()); if (resultsFile == null) { System.out.println("Failed to get results file for queryID " + q.getQueryID()); } } } System.out.println("Completed Test"); } catch (QueryTestFailedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private long compareResults(final ResultsHolder expectedResults, final ResultSet results, final int testStatus, final Throwable actualException, final boolean isOrdered, final int batchSize) throws QueryTestFailedException { ResultsHolder actualResults; long firstBatchResponseTime = 0; final String eMsg = "CompareResults Error: "; //$NON-NLS-1$ switch (testStatus) { case TestResult.RESULT_STATE.TEST_EXCEPTION: throw new QueryTestFailedException(eMsg + "TestResult indicates test exception occured, the process should not have passed it in for comparison."); //$NON-NLS-1$ // break; case TestResult.RESULT_STATE.TEST_EXPECTED_EXCEPTION: // String actualExceptionClass = actualException.getClass().getName(); if (!expectedResults.isException()) { // The actual exception was expected, but the expected results was not throw new QueryTestFailedException(eMsg + "The actual result was an exception, but the Expected results wasn't an exception. Actual exception: '" //$NON-NLS-1$ + actualException.getMessage() + "'"); //$NON-NLS-1$ } // We got an exception that we expected - convert actual exception to ResultsHolder actualResults = new ResultsHolder(TagNames.Elements.EXCEPTION); actualResults.setQueryID(expectedResults.getQueryID()); actualResults = convertException(actualException, actualResults); compareExceptions(actualResults, expectedResults, eMsg); return firstBatchResponseTime; // break; } // if (results == null) { // // The result is an exception - compare exceptions // // String actualExceptionClass = null; // if (actualException != null) { // actualExceptionClass = actualException.getClass().getName(); // } else { // // We didn't get results but there was no exception either // throw new QueryTestFailedException(eMsg // + "Didn't get results or exception '"); //$NON-NLS-1$ // } // // if (!expectedResults.isException()) { // // We didn't get results but there was no expected exception // // either // throw new QueryTestFailedException( // eMsg // + "Expected results but didn't get results or exception '" //$NON-NLS-1$ // + actualExceptionClass + "'"); //$NON-NLS-1$ // } // // We got an exception that we expected - convert actual exception // // to ResultsHolder // actualResults = new ResultsHolder(TagNames.Elements.EXCEPTION); // actualResults.setQueryID(expectedResults.getQueryID()); // // actualResults = convertException(actualException, actualResults); // // } else { // The result is a ResultSet - compare actual results with expected if (expectedResults.isException()) { throw new QueryTestFailedException( eMsg + "Expected exception " + expectedResults.getExceptionMsg() //$NON-NLS-1$ + " but got results"); //$NON-NLS-1$ } // DEBUG: // debugOut.println("*** Expected Results (holder): " + // expectedResults); // DEBUG: // debugOut.println("*** Actual Results (ResultSet): " + // printResultSet(results)); // Convert results to ResultsHolder actualResults = new ResultsHolder(TagNames.Elements.QUERY_RESULTS); actualResults.setQueryID(expectedResults.getQueryID()); firstBatchResponseTime = convertResults(results, batchSize, actualResults); // DEBUG: // debugOut.println("*** Actual Results (holder): " + // actualResults); // } // end is resultSet // Compare expected results with actual results, record by record compareResults(actualResults, expectedResults, eMsg, isOrdered); return firstBatchResponseTime; } }