/*
* Copyright 1999-2015 dangdang.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/
package com.dangdang.ddframe.rdb.sharding.executor;
import com.dangdang.ddframe.rdb.sharding.executor.event.DMLExecutionEventBus;
import com.dangdang.ddframe.rdb.sharding.executor.event.DQLExecutionEventBus;
import com.dangdang.ddframe.rdb.sharding.executor.event.EventExecutionType;
import com.dangdang.ddframe.rdb.sharding.executor.fixture.EventCaller;
import com.dangdang.ddframe.rdb.sharding.executor.fixture.ExecutorTestUtil;
import com.dangdang.ddframe.rdb.sharding.executor.fixture.TestDMLExecutionEventListener;
import com.dangdang.ddframe.rdb.sharding.executor.fixture.TestDQLExecutionEventListener;
import com.dangdang.ddframe.rdb.sharding.executor.wrapper.StatementExecutorWrapper;
import com.dangdang.ddframe.rdb.sharding.parser.result.router.SQLBuilder;
import com.dangdang.ddframe.rdb.sharding.router.SQLExecutionUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public final class StatementExecutorTest {
private static final String SELECT_FROM_DUAL = "SELECT * FROM dual";
private static final String DELETE_FROM_DUAL = "DELETE FROM dual";
private ExecutorEngine executorEngine;
@Mock
private EventCaller eventCaller;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ExecutorExceptionHandler.setExceptionThrown(false);
executorEngine = new ExecutorEngine(ExecutorTestUtil.createShardingProperties());
DMLExecutionEventBus.register(new TestDMLExecutionEventListener(eventCaller));
DQLExecutionEventBus.register(new TestDQLExecutionEventListener(eventCaller));
}
@After
public void tearDown() throws NoSuchFieldException, IllegalAccessException {
ExecutorTestUtil.clear();
DMLExecutionEventBus.clearListener();
DQLExecutionEventBus.clearListener();
executorEngine.shutdown();
}
@Test
public void assertNoStatement() throws SQLException {
StatementExecutor actual = new StatementExecutor(executorEngine);
assertThat(actual.execute(), is(false));
assertThat(actual.executeUpdate(), is(0));
assertThat(actual.executeQuery().size(), is(0));
}
@Test
public void assertExecuteQueryForSingleStatementSuccess() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDQL(statement, "ds_0");
ResultSet resultSet = mock(ResultSet.class);
when(statement.executeQuery(SELECT_FROM_DUAL)).thenReturn(resultSet);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertThat(actual.executeQuery(), is(Collections.singletonList(resultSet)));
verify(statement).executeQuery(SELECT_FROM_DUAL);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(SELECT_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteQueryForMultipleStatementsSuccess() throws SQLException {
Statement statement1 = mock(Statement.class);
Statement statement2 = mock(Statement.class);
ResultSet resultSet1 = mock(ResultSet.class);
ResultSet resultSet2 = mock(ResultSet.class);
when(statement1.executeQuery(SELECT_FROM_DUAL)).thenReturn(resultSet1);
when(statement1.getConnection()).thenReturn(mock(Connection.class));
when(statement2.executeQuery(SELECT_FROM_DUAL)).thenReturn(resultSet2);
when(statement2.getConnection()).thenReturn(mock(Connection.class));
StatementExecutor actual = new StatementExecutor(executorEngine);
StatementExecutorWrapper wrapper1 = createStatementExecutorWrapperForDQL(statement1, "ds_0");
actual.addStatement(wrapper1);
StatementExecutorWrapper wrapper2 = createStatementExecutorWrapperForDQL(statement2, "ds_1");
actual.addStatement(wrapper2);
List<ResultSet> actualResultSets = actual.executeQuery();
assertThat(actualResultSets, hasItem(resultSet1));
assertThat(actualResultSets, hasItem(resultSet2));
verify(statement1).executeQuery(SELECT_FROM_DUAL);
verify(statement1).getConnection();
verify(statement2).executeQuery(SELECT_FROM_DUAL);
verify(statement2).getConnection();
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifyDataSource("ds_1");
verify(eventCaller, times(4)).verifySQL(SELECT_FROM_DUAL);
verify(eventCaller, times(4)).verifyParameters(Collections.emptyList());
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteQueryForSingleStatementFailure() throws SQLException {
Statement statement = mock(Statement.class);
SQLException exp = new SQLException();
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDQL(statement, "ds_0");
when(statement.executeQuery(SELECT_FROM_DUAL)).thenThrow(exp);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertThat(actual.executeQuery(), is(Collections.singletonList((ResultSet) null)));
verify(statement).executeQuery(SELECT_FROM_DUAL);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(SELECT_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_FAILURE);
verify(eventCaller).verifyException(exp);
}
@Test
public void assertExecuteQueryForMultipleStatementsFailure() throws SQLException {
Statement statement1 = mock(Statement.class);
Statement statement2 = mock(Statement.class);
SQLException exp = new SQLException();
when(statement1.executeQuery(SELECT_FROM_DUAL)).thenThrow(exp);
when(statement2.executeQuery(SELECT_FROM_DUAL)).thenThrow(exp);
when(statement1.getConnection()).thenReturn(mock(Connection.class));
when(statement2.getConnection()).thenReturn(mock(Connection.class));
StatementExecutor actual = new StatementExecutor(executorEngine);
StatementExecutorWrapper wrapper1 = createStatementExecutorWrapperForDQL(statement1, "ds_0");
actual.addStatement(wrapper1);
StatementExecutorWrapper wrapper2 = createStatementExecutorWrapperForDQL(statement2, "ds_1");
actual.addStatement(wrapper2);
List<ResultSet> actualResultSets = actual.executeQuery();
assertThat(actualResultSets, is(Arrays.asList((ResultSet) null, null)));
verify(statement1).executeQuery(SELECT_FROM_DUAL);
verify(statement2).executeQuery(SELECT_FROM_DUAL);
verify(statement1).getConnection();
verify(statement2).getConnection();
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifyDataSource("ds_1");
verify(eventCaller, times(4)).verifySQL(SELECT_FROM_DUAL);
verify(eventCaller, times(4)).verifyParameters(Collections.emptyList());
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.EXECUTE_FAILURE);
verify(eventCaller, times(2)).verifyException(exp);
}
@Test
public void assertExecuteUpdateForSingleStatementSuccess() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
when(statement.executeUpdate(DELETE_FROM_DUAL)).thenReturn(10);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertThat(actual.executeUpdate(), is(10));
verify(statement).executeUpdate(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteUpdateForMultipleStatementsSuccess() throws SQLException {
Statement statement1 = mock(Statement.class);
Statement statement2 = mock(Statement.class);
when(statement1.executeUpdate(DELETE_FROM_DUAL)).thenReturn(10);
when(statement2.executeUpdate(DELETE_FROM_DUAL)).thenReturn(20);
when(statement1.getConnection()).thenReturn(mock(Connection.class));
when(statement2.getConnection()).thenReturn(mock(Connection.class));
StatementExecutor actual = new StatementExecutor(executorEngine);
StatementExecutorWrapper wrapper1 = createStatementExecutorWrapperForDML(statement1, "ds_0");
actual.addStatement(wrapper1);
StatementExecutorWrapper wrapper2 = createStatementExecutorWrapperForDML(statement2, "ds_1");
actual.addStatement(wrapper2);
assertThat(actual.executeUpdate(), is(30));
verify(statement1).executeUpdate(DELETE_FROM_DUAL);
verify(statement2).executeUpdate(DELETE_FROM_DUAL);
verify(statement1).getConnection();
verify(statement2).getConnection();
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifyDataSource("ds_1");
verify(eventCaller, times(4)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(4)).verifyParameters(Collections.emptyList());
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteUpdateForSingleStatementFailure() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
SQLException exp = new SQLException();
when(statement.executeUpdate(DELETE_FROM_DUAL)).thenThrow(exp);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertThat(actual.executeUpdate(), is(0));
verify(statement).executeUpdate(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_FAILURE);
verify(eventCaller).verifyException(exp);
}
@Test
public void assertExecuteUpdateForMultipleStatementsFailure() throws SQLException {
Statement statement1 = mock(Statement.class);
Statement statement2 = mock(Statement.class);
SQLException exp = new SQLException();
when(statement1.executeUpdate(DELETE_FROM_DUAL)).thenThrow(exp);
when(statement2.executeUpdate(DELETE_FROM_DUAL)).thenThrow(exp);
when(statement1.getConnection()).thenReturn(mock(Connection.class));
when(statement2.getConnection()).thenReturn(mock(Connection.class));
StatementExecutor actual = new StatementExecutor(executorEngine);
StatementExecutorWrapper wrapper1 = createStatementExecutorWrapperForDML(statement1, "ds_0");
actual.addStatement(wrapper1);
StatementExecutorWrapper wrapper2 = createStatementExecutorWrapperForDML(statement2, "ds_1");
actual.addStatement(wrapper2);
assertThat(actual.executeUpdate(), is(0));
verify(statement1).executeUpdate(DELETE_FROM_DUAL);
verify(statement2).executeUpdate(DELETE_FROM_DUAL);
verify(statement1).getConnection();
verify(statement2).getConnection();
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifyDataSource("ds_1");
verify(eventCaller, times(4)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(4)).verifyParameters(Collections.emptyList());
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.EXECUTE_FAILURE);
verify(eventCaller, times(2)).verifyException(exp);
}
@Test
public void assertExecuteUpdateWithAutoGeneratedKeys() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
when(statement.executeUpdate(DELETE_FROM_DUAL, Statement.NO_GENERATED_KEYS)).thenReturn(10);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertThat(actual.executeUpdate(Statement.NO_GENERATED_KEYS), is(10));
verify(statement).executeUpdate(DELETE_FROM_DUAL, Statement.NO_GENERATED_KEYS);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteUpdateWithColumnIndexes() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
when(statement.executeUpdate(DELETE_FROM_DUAL, new int[] {1})).thenReturn(10);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertThat(actual.executeUpdate(new int[] {1}), is(10));
verify(statement).executeUpdate(DELETE_FROM_DUAL, new int[] {1});
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteUpdateWithColumnNames() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
when(statement.executeUpdate(DELETE_FROM_DUAL, new String[] {"col"})).thenReturn(10);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertThat(actual.executeUpdate(new String[] {"col"}), is(10));
verify(statement).executeUpdate(DELETE_FROM_DUAL, new String[] {"col"});
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteForSingleStatementSuccessWithDML() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
when(statement.execute(DELETE_FROM_DUAL)).thenReturn(false);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertFalse(actual.execute());
verify(statement).execute(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteForMultipleStatementsSuccessWithDML() throws SQLException {
Statement statement1 = mock(Statement.class);
Statement statement2 = mock(Statement.class);
when(statement1.execute(DELETE_FROM_DUAL)).thenReturn(false);
when(statement2.execute(DELETE_FROM_DUAL)).thenReturn(false);
when(statement1.getConnection()).thenReturn(mock(Connection.class));
when(statement2.getConnection()).thenReturn(mock(Connection.class));
StatementExecutor actual = new StatementExecutor(executorEngine);
StatementExecutorWrapper wrapper1 = createStatementExecutorWrapperForDML(statement1, "ds_0");
actual.addStatement(wrapper1);
StatementExecutorWrapper wrapper2 = createStatementExecutorWrapperForDML(statement2, "ds_1");
actual.addStatement(wrapper2);
assertFalse(actual.execute());
verify(statement1).execute(DELETE_FROM_DUAL);
verify(statement2).execute(DELETE_FROM_DUAL);
verify(statement1).getConnection();
verify(statement2).getConnection();
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifyDataSource("ds_1");
verify(eventCaller, times(4)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(4)).verifyParameters(Collections.emptyList());
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteForSingleStatementFailureWithDML() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
SQLException exp = new SQLException();
when(statement.execute(DELETE_FROM_DUAL)).thenThrow(exp);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertFalse(actual.execute());
verify(statement).execute(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_FAILURE);
verify(eventCaller).verifyException(exp);
}
@Test
public void assertExecuteForMultipleStatementsFailureWithDML() throws SQLException {
Statement statement1 = mock(Statement.class);
Statement statement2 = mock(Statement.class);
SQLException exp = new SQLException();
when(statement1.execute(DELETE_FROM_DUAL)).thenThrow(exp);
when(statement2.execute(DELETE_FROM_DUAL)).thenThrow(exp);
when(statement1.getConnection()).thenReturn(mock(Connection.class));
when(statement2.getConnection()).thenReturn(mock(Connection.class));
StatementExecutor actual = new StatementExecutor(executorEngine);
StatementExecutorWrapper wrapper1 = createStatementExecutorWrapperForDML(statement1, "ds_0");
actual.addStatement(wrapper1);
StatementExecutorWrapper wrapper2 = createStatementExecutorWrapperForDML(statement2, "ds_1");
actual.addStatement(wrapper2);
assertFalse(actual.execute());
verify(statement1).execute(DELETE_FROM_DUAL);
verify(statement2).execute(DELETE_FROM_DUAL);
verify(statement1).getConnection();
verify(statement2).getConnection();
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifyDataSource("ds_1");
verify(eventCaller, times(4)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(4)).verifyParameters(Collections.emptyList());
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.EXECUTE_FAILURE);
verify(eventCaller, times(2)).verifyException(exp);
}
@Test
public void assertExecuteForSingleStatementWithDQL() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDQL(statement, "ds_0");
when(statement.execute(SELECT_FROM_DUAL)).thenReturn(true);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertTrue(actual.execute());
verify(statement).execute(SELECT_FROM_DUAL);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(SELECT_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteForMultipleStatements() throws SQLException {
Statement statement1 = mock(Statement.class);
Statement statement2 = mock(Statement.class);
when(statement1.execute(SELECT_FROM_DUAL)).thenReturn(true);
when(statement2.execute(SELECT_FROM_DUAL)).thenReturn(true);
when(statement1.getConnection()).thenReturn(mock(Connection.class));
when(statement2.getConnection()).thenReturn(mock(Connection.class));
StatementExecutor actual = new StatementExecutor(executorEngine);
StatementExecutorWrapper wrapper1 = createStatementExecutorWrapperForDQL(statement1, "ds_0");
actual.addStatement(wrapper1);
StatementExecutorWrapper wrapper2 = createStatementExecutorWrapperForDQL(statement2, "ds_0");
actual.addStatement(wrapper2);
assertTrue(actual.execute());
verify(statement1).execute(SELECT_FROM_DUAL);
verify(statement2).execute(SELECT_FROM_DUAL);
verify(statement1).getConnection();
verify(statement2).getConnection();
verify(eventCaller, times(4)).verifyDataSource("ds_0");
verify(eventCaller, times(4)).verifySQL(SELECT_FROM_DUAL);
verify(eventCaller, times(4)).verifyParameters(Collections.emptyList());
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller, times(2)).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteWithAutoGeneratedKeys() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
when(statement.execute(DELETE_FROM_DUAL, Statement.NO_GENERATED_KEYS)).thenReturn(false);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertFalse(actual.execute(Statement.NO_GENERATED_KEYS));
verify(statement).execute(DELETE_FROM_DUAL, Statement.NO_GENERATED_KEYS);
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteWithColumnIndexes() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
when(statement.execute(DELETE_FROM_DUAL, new int[] {1})).thenReturn(false);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertFalse(actual.execute(new int[] {1}));
verify(statement).execute(DELETE_FROM_DUAL, new int[] {1});
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
@Test
public void assertExecuteWithColumnNames() throws SQLException {
Statement statement = mock(Statement.class);
StatementExecutorWrapper wrapper = createStatementExecutorWrapperForDML(statement, "ds_0");
when(statement.execute(DELETE_FROM_DUAL, new String[] {"col"})).thenReturn(false);
StatementExecutor actual = new StatementExecutor(executorEngine);
actual.addStatement(wrapper);
assertFalse(actual.execute(new String[] {"col"}));
verify(statement).execute(DELETE_FROM_DUAL, new String[] {"col"});
verify(eventCaller, times(2)).verifyDataSource("ds_0");
verify(eventCaller, times(2)).verifySQL(DELETE_FROM_DUAL);
verify(eventCaller, times(2)).verifyParameters(Collections.emptyList());
verify(eventCaller).verifyEventExecutionType(EventExecutionType.BEFORE_EXECUTE);
verify(eventCaller).verifyEventExecutionType(EventExecutionType.EXECUTE_SUCCESS);
verify(eventCaller, times(0)).verifyException(null);
}
private StatementExecutorWrapper createStatementExecutorWrapperForDQL(final Statement statement, final String dataSource) {
try {
return new StatementExecutorWrapper(statement, new SQLExecutionUnit(dataSource, (SQLBuilder) new SQLBuilder().append(SELECT_FROM_DUAL)));
} catch (final IOException ex) {
throw new RuntimeException(ex);
}
}
private StatementExecutorWrapper createStatementExecutorWrapperForDML(final Statement statement, final String dataSource) {
try {
return new StatementExecutorWrapper(statement, new SQLExecutionUnit(dataSource, (SQLBuilder) new SQLBuilder().append(DELETE_FROM_DUAL)));
} catch (final IOException ex) {
throw new RuntimeException(ex);
}
}
}