Search in sources :

Example 1 with ServerConnection

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]);
    }
}
Also used : ResultsMessage(org.teiid.client.ResultsMessage) LogonResult(org.teiid.client.security.LogonResult) ArrayList(java.util.ArrayList) Properties(java.util.Properties) RequestMessage(org.teiid.client.RequestMessage) ArrayList(java.util.ArrayList) List(java.util.List) BatchUpdateException(java.sql.BatchUpdateException) DQP(org.teiid.client.DQP) ServerConnection(org.teiid.net.ServerConnection) TeiidException(org.teiid.core.TeiidException) ResultsFuture(org.teiid.client.util.ResultsFuture) InvocationOnMock(org.mockito.invocation.InvocationOnMock) Test(org.junit.Test)

Example 2 with ServerConnection

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);
}
Also used : LogonResult(org.teiid.client.security.LogonResult) ServerConnection(org.teiid.net.ServerConnection)

Example 3 with ServerConnection

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();
}
Also used : ServerConnection(org.teiid.net.ServerConnection) Connection(java.sql.Connection) ServerConnection(org.teiid.net.ServerConnection) Test(org.junit.Test)

Example 4 with ServerConnection

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());
}
Also used : XAResource(javax.transaction.xa.XAResource) XidImpl(org.teiid.client.xa.XidImpl) ServerConnection(org.teiid.net.ServerConnection) Connection(java.sql.Connection) ServerConnection(org.teiid.net.ServerConnection) Test(org.junit.Test)

Example 5 with ServerConnection

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;
}
Also used : LogonResult(org.teiid.client.security.LogonResult) ServerConnection(org.teiid.net.ServerConnection)

Aggregations

ServerConnection (org.teiid.net.ServerConnection)11 Test (org.junit.Test)5 Properties (java.util.Properties)4 LogonResult (org.teiid.client.security.LogonResult)4 DQP (org.teiid.client.DQP)3 Connection (java.sql.Connection)2 InvocationOnMock (org.mockito.invocation.InvocationOnMock)2 TeiidException (org.teiid.core.TeiidException)2 BatchUpdateException (java.sql.BatchUpdateException)1 SQLException (java.sql.SQLException)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 XAResource (javax.transaction.xa.XAResource)1 Module (org.jboss.modules.Module)1 ModuleLoadException (org.jboss.modules.ModuleLoadException)1 ModuleLoader (org.jboss.modules.ModuleLoader)1 Answer (org.mockito.stubbing.Answer)1 RequestMessage (org.teiid.client.RequestMessage)1 ResultsMessage (org.teiid.client.ResultsMessage)1 SessionToken (org.teiid.client.security.SessionToken)1