package org.teiid.test.framework; import java.sql.Connection; import java.util.Properties; import javax.sql.XAConnection; import org.teiid.jdbc.AbstractQueryTest; import org.teiid.test.framework.connection.ConnectionStrategy; import org.teiid.test.framework.exception.QueryTestFailedException; /** * The TransactionQueryTest interface represents the transaction test lifecycle of execution * from which the @link TransactionContainer operates. * <br><br> * QueryTest lifecycle:</br> * * <br> * There are 4 phases or groupings of methods: * <li>Setup </li> * <li>Test </li> * <li>Validation</li> * <li>Cleanup</li> * * <br> * <p> * <b>1. Setup phase is about setting the global environment for the testing</b> * <br> * * <li>{@link #setConnectionStrategy(ConnectionStrategy)} - called first to provide * the environment (i.e, type of connection, parameters, etc) that the test will * be run under. * <li>{@link #hasRequiredDataSources()} - called after the connection * strategy is set so the determination can be made if this test has the * required datasources defined and available in order to run the test. If not, * then the test is bypassed. * <li>{@link #setup()} - called to enable the test to * perform any pretest (i.e., global) setup. Example would be data source setup. * <li>{@link #setConnection(Connection)} - called to set the client driver (i.e., * Teiid) connection that will be used to execute queries against * <li>{@link #setExecutionProperties(Properties)} - called at this time so that the * overriding class can obtain / initialize settings that will be assigned when * <li>{@link AbstractQueryTest#assignExecutionProperties(Statement)} is called * prior to sql execution. (Example: set fetch size, batch time, or timeout) * </li> * <br> * <p> * <b>2. Test phase are the methods for executing a test, including any * before/after test logic to support the test</b> * <br><br> * * <li>{@link #before()} called before the execution of the test so that the * transaction boundary can be set and any other pretest conditions * <li>{@link #testCase()} called to execute the specific test * <li>{@link #after()} called after the test is executed, which will commit/rollback the transaction * and perform any other post conditions * </li> * <br> * <p> * <b>3. Validation phase is meant to enable data validation post transaction * completion. This is especially helpful when performing XA transactions * because the results are not completed and available until after the {@link #after()} step * is performed.</b> * <br><br> * * {@link #validateTestCase()} * * <p> * <b>4. Cleanup</b> * <br><br> * * {@link #cleanup()} Called to allow the testcase to perform any cleanup after execution. * * <br> * ================ * <p> * <b>Other Notes:</b> * <br><br> * * The following methods were exposed from {@link AbstractQueryTest}: * * <li>{@link #exceptionExpected()} - when an exception is expected to occur, the * underlying logic will treat the execution as if it succeeded. </li> * <li>{@link #exceptionOccurred()} - this method indicates when an exception * actually occurred outside of the normal expected results. </li> * <li>{@link #getConnection()} and {@link #getXAConnection()} - these connection * methods are exposed for {@link #before()} and {@link #after()} methods</li> * <li>{@link #rollbackAllways()} - this is exposed for the {@link #after()} method * as to what behavior is expected after the execution of the test</li> * * * <br> * @author vanhalbert * */ public interface TransactionQueryTestCase { /** * Returns the name of the test so that better tracing of what tests are * running/completing. * * @return String is test name */ String getTestName(); /** * Called to get the current connection strategy being used. * * @return connStrategy * * @since */ ConnectionStrategy getConnectionStrategy() ; /** * Called by the {@link TransactionContainer} prior to testcase processing * so that the responsibility for performing an setup duties (ie.., * datasource setup) can be done * * * @since */ void setup() throws QueryTestFailedException; /** * Called by the @link TransactionContainer to set the Teiid connection to * be used in the test. * * @param conn * * @since */ void setConnection(Connection conn); /** * Override <code>before</code> if there is behavior that needs to be * performed prior to {@link #testCase()} being called. * * * @since */ void before(); /** * Implement testCase(), it is the entry point to the execution of the test. * * @throws Exception * * @since */ void testCase() throws Exception; /** * Override <code>after</code> if there is behavior that needs to be * performed after {@link #testCase()} being called. * * * @since */ void after(); /** * Indicates what should be done when a failure occurs in * {@link #testCase()} * * @return * * @since */ boolean rollbackAllways(); /** * Called at the end of the test so that the testcase can clean itself up by * releasing any resources, closing any open connections, etc. * * * @since */ void cleanup(); /** * Returns the connection being used in the test. * * @return * * @since */ Connection getConnection(); XAConnection getXAConnection(); boolean exceptionExpected(); boolean exceptionOccurred(); void setApplicationException(Throwable t); Throwable getApplicationException(); }