use of org.teiid.net.ServerConnection in project teiid by teiid.
the class TestPreparedStatement method testBatchedUpdateExecution.
/**
* Verify that the <code>executeBatch()</code> method of <code>
* MMPreparedStatement</code> is resulting in the correct command,
* parameter values for each command of the batch, and the request type
* are being set in the request message that would normally be sent to the
* server.
*
* @throws Exception
*/
@Test
public void testBatchedUpdateExecution() throws Exception {
// Build up a fake connection instance for use with the prepared statement
ConnectionImpl conn = Mockito.mock(ConnectionImpl.class);
Mockito.stub(conn.getConnectionProps()).toReturn(new Properties());
DQP dqp = Mockito.mock(DQP.class);
ServerConnection serverConn = Mockito.mock(ServerConnection.class);
LogonResult logonResult = Mockito.mock(LogonResult.class);
// stub methods
Mockito.stub(conn.getServerConnection()).toReturn(serverConn);
Mockito.stub(serverConn.getLogonResult()).toReturn(logonResult);
Mockito.stub(logonResult.getTimeZone()).toReturn(TimeZone.getDefault());
// a dummy result message that is specific to this test case
final ResultsFuture<ResultsMessage> results = new ResultsFuture<ResultsMessage>();
final int[] count = new int[1];
final ResultsMessage rm = new ResultsMessage();
Mockito.stub(dqp.executeRequest(Matchers.anyLong(), (RequestMessage) Matchers.anyObject())).toAnswer(new Answer<ResultsFuture<ResultsMessage>>() {
@Override
public ResultsFuture<ResultsMessage> answer(InvocationOnMock invocation) throws Throwable {
RequestMessage requestMessage = (RequestMessage) invocation.getArguments()[1];
count[0] += requestMessage.getParameterValues().size();
if (count[0] == 100000) {
rm.setException(new TeiidException());
rm.setResults(new List<?>[] { Arrays.asList(Statement.EXECUTE_FAILED) });
} else {
List<?>[] vals = new List<?>[requestMessage.getParameterValues().size()];
Arrays.fill(vals, Arrays.asList(0));
rm.setResults(Arrays.asList(vals));
}
return results;
}
});
rm.setUpdateResult(true);
results.getResultsReceiver().receiveResults(rm);
Mockito.stub(conn.getDQP()).toReturn(dqp);
// some update SQL
// $NON-NLS-1$
String sqlCommand = "delete from table where col=?";
TestableMMPreparedStatement statement = (TestableMMPreparedStatement) getMMPreparedStatement(conn, sqlCommand);
ArrayList<ArrayList<Object>> expectedParameterValues = new ArrayList<ArrayList<Object>>(3);
// Add some batches and their parameter values
expectedParameterValues.add(new ArrayList<Object>(Arrays.asList(new Object[] { new Integer(1) })));
statement.setInt(1, new Integer(1));
statement.addBatch();
expectedParameterValues.add(new ArrayList<Object>(Arrays.asList(new Object[] { new Integer(2) })));
statement.setInt(1, new Integer(2));
statement.addBatch();
expectedParameterValues.add(new ArrayList<Object>(Arrays.asList(new Object[] { new Integer(3) })));
statement.setInt(1, new Integer(3));
statement.addBatch();
// execute the batch and verify that it matches our dummy results
// message set earlier
assertTrue(Arrays.equals(new int[] { 0, 0, 0 }, statement.executeBatch()));
// Now verify the statement's RequestMessage is what we expect
// $NON-NLS-1$
assertEquals("Command does not match", sqlCommand, statement.requestMessage.getCommandString());
// $NON-NLS-1$
assertEquals("Parameter values do not match", expectedParameterValues, statement.requestMessage.getParameterValues());
// $NON-NLS-1$
assertTrue("RequestMessage.isBatchedUpdate should be true", statement.requestMessage.isBatchedUpdate());
// $NON-NLS-1$
assertFalse("RequestMessage.isCallableStatement should be false", statement.requestMessage.isCallableStatement());
// $NON-NLS-1$
assertTrue("RequestMessage.isPreparedStatement should be true", statement.requestMessage.isPreparedStatement());
count[0] = 0;
// large batch handling - should split into 5
for (int i = 0; i < 100000; i++) {
statement.setInt(1, new Integer(1));
statement.addBatch();
}
try {
statement.executeBatch();
fail();
} catch (BatchUpdateException e) {
assertEquals(100000, count[0]);
assertEquals(95309, e.getUpdateCounts().length);
assertEquals(Statement.EXECUTE_FAILED, e.getUpdateCounts()[95308]);
}
}
use of org.teiid.net.ServerConnection in project teiid by teiid.
the class TestPreparedStatement method getMMPreparedStatement.
/**
* A helper method to get an <code>MMPreparedStatement</code> that can be
* used for simple test cases.
* <p>
* The returned value is an instance of <code>TestableMMPreparedStatement</code>
* <p>
* This method invokes <code>getMMPreparedStatement(final MMConnection conn,
* final String sql)</code> with a fake connection object constructed by
* <code>Mockito</code>.
*
* @param sql the query for the prepared statement
* @return an instance of TestableMMPreparedStatement
* @throws SQLException
*/
protected PreparedStatementImpl getMMPreparedStatement(final String sql) throws SQLException {
ConnectionImpl conn = Mockito.mock(ConnectionImpl.class);
ServerConnection serverConn = Mockito.mock(ServerConnection.class);
LogonResult logonResult = Mockito.mock(LogonResult.class);
Mockito.stub(conn.getServerConnection()).toReturn(serverConn);
Mockito.stub(serverConn.getLogonResult()).toReturn(logonResult);
Mockito.stub(logonResult.getTimeZone()).toReturn(TimeZone.getDefault());
return getMMPreparedStatement(conn, sql);
}
use of org.teiid.net.ServerConnection in project teiid by teiid.
the class TestXAConnection method testDisableLoadBalancing.
@Test
public void testDisableLoadBalancing() throws Exception {
final ConnectionImpl mmConn = TestConnection.getMMConnection();
XAConnectionImpl xaConn = new XAConnectionImpl(mmConn);
xaConn.setLoadBalance(false);
Connection conn = xaConn.getConnection();
conn.close();
ServerConnection sc = xaConn.getConnectionImpl().getServerConnection();
Mockito.verify(sc, VerificationModeFactory.times(0)).cleanUp();
}
use of org.teiid.net.ServerConnection in project teiid by teiid.
the class TestXAConnection method testConnectionClose.
@Test
public void testConnectionClose() throws Exception {
final ConnectionImpl mmConn = TestConnection.getMMConnection();
XAConnectionImpl xaConn = new XAConnectionImpl(mmConn);
Connection conn = xaConn.getConnection();
StatementImpl stmt = (StatementImpl) conn.createStatement();
conn.setAutoCommit(false);
conn.close();
ServerConnection sc = xaConn.getConnectionImpl().getServerConnection();
Mockito.verify(sc, VerificationModeFactory.times(1)).cleanUp();
assertTrue(stmt.isClosed());
assertTrue(conn.getAutoCommit());
conn = xaConn.getConnection();
stmt = (StatementImpl) conn.createStatement();
XAResource resource = xaConn.getXAResource();
resource.start(new XidImpl(1, new byte[0], new byte[0]), XAResource.TMNOFLAGS);
conn.close();
assertTrue(stmt.isClosed());
assertTrue(conn.getAutoCommit());
}
use of org.teiid.net.ServerConnection in project teiid by teiid.
the class TestCallableStatement method getCallableStatement.
private CallableStatementImpl getCallableStatement() throws SQLException {
ConnectionImpl conn = Mockito.mock(ConnectionImpl.class);
ServerConnection sc = Mockito.mock(ServerConnection.class);
Mockito.stub(sc.getLogonResult()).toReturn(new LogonResult());
Mockito.stub(conn.getServerConnection()).toReturn(sc);
CallableStatementImpl mmcs = new CallableStatementImpl(conn, "{?=call x(?)}", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
return mmcs;
}
Aggregations