/* * 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; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.teiid.test.client.results.TestResultStat; import org.teiid.test.framework.TestLogger; import org.teiid.test.framework.exception.QueryTestFailedException; import org.teiid.test.framework.exception.TransactionRuntimeException; import org.teiid.test.framework.query.AbstractQueryTransactionTest; /** * TestClientTransaction * * @author vanhalbert * */ @SuppressWarnings("nls") public class TestClientTransaction extends AbstractQueryTransactionTest { private QueryScenario querySet = null; private ExpectedResults expectedResults = null; private QueryTest query = null; private long endTS = 0; private long beginTS = 0; private int testStatus = TestResult.RESULT_STATE.TEST_SUCCESS; private boolean errorExpected = false; private String sql = null; private boolean resultFromQuery = false; private TestResultsSummary testResultsSummary; public TestClientTransaction(QueryScenario querySet) { super(querySet.getQueryScenarioIdentifier()); this.querySet = querySet; } public void init(TestResultsSummary testResultsSummary, ExpectedResults expectedResults, QueryTest query) { this.query = query; this.testResultsSummary = testResultsSummary; this.expectedResults = expectedResults; endTS = 0; beginTS = 0; testStatus = TestResult.RESULT_STATE.TEST_SUCCESS; errorExpected = false; resultFromQuery = false; } public String getTestName() { return query.getQueryScenarioID() + ":" + (query.getQueryID()!=null?query.getQueryID():"NA"); } @Override public void before() { // TODO Auto-generated method stub super.before(); try { this.errorExpected = expectedResults .isExceptionExpected(query.getQueryID()); } catch (QueryTestFailedException e) { // TODO Auto-generated catch block throw new TransactionRuntimeException("ProgramError: " + e.getMessage()); } } @Override public void testCase() throws Exception { TestLogger.logDebug("expected error: " + this.errorExpected); TestLogger.logInfo("ID: " + query.geQuerySetID() + " - " + query.getQueryID()); QuerySQL[] queries = query.getQueries(); int l = queries.length; try { // need to set this so the underlying query execution handles an // error properly. beginTS = System.currentTimeMillis(); for (int i= 0; i < l; i++) { QuerySQL qsql = queries[i]; this.sql = qsql.getSql(); resultFromQuery = execute(sql, qsql.getParms()); if (qsql.getUpdateCnt() >= 0) { this.assertUpdateCount(qsql.getUpdateCnt()); } else if (qsql.getRowCnt() >= 0) { this.assertRowCount(qsql.getRowCnt()); } } } catch (Throwable t) { this.setApplicationException(t); } finally { // Capture resp time endTS = System.currentTimeMillis(); } } @Override public void after() { // TODO Auto-generated method stub super.after(); TestResult rs = null; Throwable resultException = null; resultException = (this.getLastException() != null ? this .getLastException() : this.getApplicationException()); if (resultException != null) { if (this.exceptionExpected()) { testStatus = TestResult.RESULT_STATE.TEST_EXPECTED_EXCEPTION; } else { testStatus = TestResult.RESULT_STATE.TEST_EXCEPTION; } } rs = new TestResultStat(query.geQuerySetID(), query.getQueryID(), sql, testStatus, beginTS, endTS, resultException, null); this.testResultsSummary.addTestResult(query.geQuerySetID(), rs); this.querySet.handleTestResult(rs, this.internalResultSet, this.updateCount, resultFromQuery, sql); } @Override protected Statement createStatement() throws SQLException { return this.internalConnection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); } // need to override this method because the abstract logic for throwing // exceptions depends on this @Override public boolean exceptionExpected() { return this.errorExpected; } /** * Override the super cleanup() so that the connection to Teiid is not * cleaned up at this time. * * This will be handled after all queries in the set have been executed. * * @see TestClient#runTest(); * */ @Override public void cleanup() { // // NOTE: do not cleanup TestResults because {@link #getTestResult} is called // after cleanup } }