Package org.teiid.test.client.ctc

Source Code of org.teiid.test.client.ctc.XMLExpectedResults

/*
* 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;




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 compareResultsfinal 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;
    }



}
TOP

Related Classes of org.teiid.test.client.ctc.XMLExpectedResults

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.