package org.skywalking.apm.plugin.jdbc; import com.mysql.cj.api.jdbc.JdbcConnection; import org.hamcrest.CoreMatchers; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.skywalking.apm.agent.core.boot.ServiceManager; import org.skywalking.apm.agent.core.context.TracerContext; import org.skywalking.apm.sniffer.mock.context.MockTracerContextListener; import org.skywalking.apm.sniffer.mock.context.SegmentAssert; import org.skywalking.apm.trace.Span; import org.skywalking.apm.trace.TraceSegment; import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; import java.net.MalformedURLException; import java.net.URL; import java.sql.*; import java.util.Calendar; import java.util.HashMap; import java.util.Properties; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyByte; import static org.mockito.Matchers.anyDouble; import static org.mockito.Matchers.anyFloat; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyShort; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class SWCallableStatementTest extends AbstractStatementTest { @Mock private Array array; @Mock private SQLXML sqlxml; @Mock private RowId rowId; @Mock private Ref ref; @Mock private Clob clob; @Mock private NClob nClob; @Mock private Reader reader; @Mock private InputStream inputStream; @Mock private Blob blob; @Mock private com.mysql.cj.jdbc.CallableStatement mysqlCallableStatement; @Mock private JdbcConnection jdbcConnection; private SWConnection swConnection; private SWConnection multiHostConnection; private byte[] bytesParam = new byte[] {1, 2}; @Before public void setUp() throws Exception { mockTracerContextListener = new MockTracerContextListener(); ServiceManager.INSTANCE.boot(); swConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306/test", new Properties(), jdbcConnection); multiHostConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306,127.0.0.1:3309/test", new Properties(), jdbcConnection); TracerContext.ListenerManager.add(mockTracerContextListener); when(jdbcConnection.prepareCall(anyString())).thenReturn(mysqlCallableStatement); when(jdbcConnection.prepareCall(anyString(), anyInt(), anyInt(), anyInt())).thenReturn(mysqlCallableStatement); when(jdbcConnection.prepareCall(anyString(), anyInt(), anyInt())).thenReturn(mysqlCallableStatement); } @Test public void testSetParam() throws SQLException, MalformedURLException { CallableStatement callableStatement = multiHostConnection.prepareCall("SELECT * FROM test WHERE a = ? or b = ? or c=? or d = ? or e = ?" + " or e = ? or f = ? or g = ? or h = ? or i = ? or j = ? or k = ? or l = ? or m = ? or n = ? or o = ? or p = ? " + " or r = ? or s = ? or t = ? or u = ? or v = ? or w = ? or x = ? or y = ? or z = ? or a1 = ? or a2 = ? or a3 = ?" + " or a4 = ? or a5 = ? or a6 = ? or a7 = ? or a8 = ? or a9 = ? or b1 = ? or b2 = ? or b3 = ? or b4 = ? or b5 = ?" + " or b6 = ? or b7 = ? or b8 = ? or b9 = ? or c1 = ? or c2 = ? or c3 = ?"); callableStatement.clearParameters(); callableStatement.setAsciiStream(1, inputStream); callableStatement.setAsciiStream(2, inputStream, 10); callableStatement.setAsciiStream(3, inputStream, 1000000L); callableStatement.setCharacterStream(4, reader); callableStatement.setCharacterStream(4, reader, 10); callableStatement.setCharacterStream(5, reader, 10L); callableStatement.setShort(6, (short) 12); callableStatement.setInt(7, 1); callableStatement.setString(8, "test"); callableStatement.setBoolean(9, true); callableStatement.setLong(10, 100L); callableStatement.setDouble(11, 12.0); callableStatement.setFloat(12, 12.0f); callableStatement.setByte(13, (byte) 1); callableStatement.setBytes(14, bytesParam); callableStatement.setDate(15, new Date(System.currentTimeMillis())); callableStatement.setNull(16, 1); callableStatement.setNull(17, 1, "test"); callableStatement.setBigDecimal(18, new BigDecimal(10000)); callableStatement.setBlob(19, inputStream); callableStatement.setBlob(20, inputStream, 1000000L); callableStatement.setClob(21, clob); callableStatement.setClob(22, reader); callableStatement.setClob(23, reader, 100L); callableStatement.setNString(24, "test"); callableStatement.setNCharacterStream(25, reader); callableStatement.setNCharacterStream(26, reader, 1); callableStatement.setNClob(27, nClob); callableStatement.setNClob(28, reader, 1); callableStatement.setObject(29, new Object()); callableStatement.setObject(30, new Object(), 1); callableStatement.setObject(31, new Object(), 1, 1); callableStatement.setRef(32, ref); callableStatement.setRowId(33, rowId); callableStatement.setSQLXML(34, sqlxml); callableStatement.setTime(35, new Time(System.currentTimeMillis())); callableStatement.setTimestamp(36, new Timestamp(System.currentTimeMillis())); callableStatement.setTimestamp(37, new Timestamp(System.currentTimeMillis()), Calendar.getInstance()); callableStatement.setURL(38, new URL("http", "127.0.0.1", "test")); callableStatement.setBinaryStream(39, inputStream); callableStatement.setBinaryStream(40, inputStream, 1); callableStatement.setBinaryStream(41, inputStream, 1L); callableStatement.setNClob(42, reader); callableStatement.setTime(43, new Time(System.currentTimeMillis()), Calendar.getInstance()); callableStatement.setArray(45, array); callableStatement.setBlob(46, blob); callableStatement.setDate(47, new Date(System.currentTimeMillis()), Calendar.getInstance()); callableStatement.getCharacterStream(4); callableStatement.getCharacterStream("d"); callableStatement.getShort(6); callableStatement.getShort("g"); callableStatement.getInt(7); callableStatement.getInt("h"); callableStatement.getString(8); callableStatement.getString("i"); callableStatement.getBoolean(9); callableStatement.getBoolean("j"); callableStatement.getLong(10); callableStatement.getLong("k"); callableStatement.getDouble(11); callableStatement.getDouble("l"); callableStatement.getFloat(12); callableStatement.getFloat("m"); callableStatement.getByte(13); callableStatement.getByte("n"); callableStatement.getBytes(14); callableStatement.getBytes("o"); callableStatement.getDate(15); callableStatement.getDate("p"); callableStatement.getBigDecimal(18); callableStatement.getBigDecimal("s"); callableStatement.getBlob(19); callableStatement.getBlob("t"); callableStatement.getClob(21); callableStatement.getClob(21); callableStatement.getClob("u"); callableStatement.getNString(24); callableStatement.getNString("y"); callableStatement.getNCharacterStream(25); callableStatement.getNCharacterStream("z"); callableStatement.getNClob(27); callableStatement.getNClob("a1"); callableStatement.getRef(32); callableStatement.getRef("a2"); callableStatement.getRowId(33); callableStatement.getRowId("a7"); callableStatement.getSQLXML(34); callableStatement.getSQLXML("a8"); callableStatement.getTime(35); callableStatement.getTime("a9"); callableStatement.getTimestamp(36); callableStatement.getTimestamp("b1"); callableStatement.getURL(38); callableStatement.getURL("b3"); callableStatement.getArray(45); callableStatement.getArray("c4"); callableStatement.getDate(15); callableStatement.getDate("p"); callableStatement.getDate(15, Calendar.getInstance()); callableStatement.getDate("p", Calendar.getInstance()); callableStatement.getTime("a9"); callableStatement.getTime("a9", Calendar.getInstance()); callableStatement.getTime(43); callableStatement.getTime(43, Calendar.getInstance()); callableStatement.getTimestamp("p", Calendar.getInstance()); callableStatement.getTimestamp(36, Calendar.getInstance()); callableStatement.getObject(29); callableStatement.getObject(29, new HashMap>()); callableStatement.getObject("a4"); callableStatement.getObject("a4", new HashMap>()); callableStatement.getBigDecimal(18, 1); callableStatement.wasNull(); callableStatement.setAsciiStream("a", inputStream); callableStatement.setAsciiStream("b", inputStream, 10); callableStatement.setAsciiStream("c", inputStream, 1000000L); callableStatement.setCharacterStream("d", reader); callableStatement.setCharacterStream("e", reader, 10); callableStatement.setCharacterStream("f", reader, 10L); callableStatement.setShort("g", (short) 12); callableStatement.setInt("h", 1); callableStatement.setString("i", "test"); callableStatement.setBoolean("j", true); callableStatement.setLong("k", 100L); callableStatement.setDouble("l", 12.0); callableStatement.setFloat("m", 12.0f); callableStatement.setByte("n", (byte) 1); callableStatement.setBytes("o", bytesParam); callableStatement.setDate("p", new Date(System.currentTimeMillis())); callableStatement.setNull("q", 1); callableStatement.setNull("r", 1, "test"); callableStatement.setBigDecimal("s", new BigDecimal(10000)); callableStatement.setBlob("t", inputStream); callableStatement.setBlob("u", inputStream, 1000000L); callableStatement.setClob("v", clob); callableStatement.setClob("w", reader); callableStatement.setClob("x", reader, 100L); callableStatement.setNString("y", "test"); callableStatement.setNCharacterStream("z", reader); callableStatement.setNCharacterStream("a1", reader, 1); callableStatement.setNClob("a2", nClob); callableStatement.setNClob("a3", reader, 1); callableStatement.setObject("a4", new Object()); callableStatement.setObject("a5", new Object(), 1); callableStatement.setObject("a6", new Object(), 1, 1); callableStatement.setRowId("a7", rowId); callableStatement.setSQLXML("a8", sqlxml); callableStatement.setTime("a9", new Time(System.currentTimeMillis())); callableStatement.setTimestamp("b1", new Timestamp(System.currentTimeMillis())); callableStatement.setTimestamp("b2", new Timestamp(System.currentTimeMillis()), Calendar.getInstance()); callableStatement.setURL("b3", new URL("http", "127.0.0.1", "test")); callableStatement.setBinaryStream("b4", inputStream); callableStatement.setBinaryStream("b5", inputStream, 1); callableStatement.setBinaryStream("b6", inputStream, 1L); callableStatement.setNClob("b7", reader); callableStatement.setTime("b8", new Time(System.currentTimeMillis()), Calendar.getInstance()); callableStatement.setBlob("c1", blob); callableStatement.setDate("c2", new Date(System.currentTimeMillis()), Calendar.getInstance()); callableStatement.registerOutParameter("c4", 1); callableStatement.registerOutParameter("c5", 1, 1); callableStatement.registerOutParameter("c6", 1, "test"); callableStatement.registerOutParameter(48, 1); callableStatement.registerOutParameter(49, 1, 1); callableStatement.registerOutParameter(50, 1, "test"); ResultSet resultSet = callableStatement.executeQuery(); callableStatement.close(); verify(mysqlCallableStatement, times(1)).clearParameters(); verify(mysqlCallableStatement, times(1)).executeQuery(); verify(mysqlCallableStatement, times(1)).close(); verify(mysqlCallableStatement, times(1)).setAsciiStream(anyInt(), any(InputStream.class)); verify(mysqlCallableStatement, times(1)).setAsciiStream(anyInt(), any(InputStream.class), anyInt()); verify(mysqlCallableStatement, times(1)).setAsciiStream(anyInt(), any(InputStream.class), anyLong()); verify(mysqlCallableStatement, times(1)).setCharacterStream(anyInt(), any(Reader.class)); verify(mysqlCallableStatement, times(1)).setCharacterStream(anyInt(), any(Reader.class), anyInt()); verify(mysqlCallableStatement, times(1)).setCharacterStream(anyInt(), any(Reader.class), anyLong()); verify(mysqlCallableStatement, times(1)).setShort(anyInt(), anyShort()); verify(mysqlCallableStatement, times(1)).setInt(anyInt(), anyInt()); verify(mysqlCallableStatement, times(1)).setString(anyInt(), anyString()); verify(mysqlCallableStatement, times(1)).setBoolean(anyInt(), anyBoolean()); verify(mysqlCallableStatement, times(1)).setLong(anyInt(), anyLong()); verify(mysqlCallableStatement, times(1)).setDouble(anyInt(), anyDouble()); verify(mysqlCallableStatement, times(1)).setFloat(anyInt(), anyFloat()); verify(mysqlCallableStatement, times(1)).setByte(anyInt(), anyByte()); verify(mysqlCallableStatement, times(1)).setBytes(14, bytesParam); verify(mysqlCallableStatement, times(1)).setDate(anyInt(), any(Date.class)); verify(mysqlCallableStatement, times(1)).setNull(anyInt(), anyInt()); verify(mysqlCallableStatement, times(1)).setNull(anyInt(), anyInt(), anyString()); verify(mysqlCallableStatement, times(1)).setBigDecimal(anyInt(), any(BigDecimal.class)); verify(mysqlCallableStatement, times(1)).setBlob(anyInt(), any(InputStream.class)); verify(mysqlCallableStatement, times(1)).setBlob(anyInt(), any(InputStream.class), anyLong()); verify(mysqlCallableStatement, times(1)).setClob(anyInt(), any(Clob.class)); verify(mysqlCallableStatement, times(1)).setClob(anyInt(), any(Reader.class)); verify(mysqlCallableStatement, times(1)).setClob(anyInt(), any(Reader.class), anyInt()); verify(mysqlCallableStatement, times(1)).setNString(anyInt(), anyString()); verify(mysqlCallableStatement, times(1)).setNCharacterStream(anyInt(), any(Reader.class)); verify(mysqlCallableStatement, times(1)).setNCharacterStream(anyInt(), any(Reader.class), anyInt()); verify(mysqlCallableStatement, times(1)).setNClob(27, nClob); verify(mysqlCallableStatement, times(1)).setNClob(28, reader, 1); verify(mysqlCallableStatement, times(1)).setObject(anyInt(), Matchers.anyObject()); verify(mysqlCallableStatement, times(1)).setObject(anyInt(), Matchers.anyObject(), anyInt()); verify(mysqlCallableStatement, times(1)).setObject(anyInt(), Matchers.anyObject(), anyInt(), anyInt()); verify(mysqlCallableStatement, times(1)).setRef(anyInt(), any(Ref.class)); verify(mysqlCallableStatement, times(1)).setRowId(anyInt(), any(RowId.class)); verify(mysqlCallableStatement, times(1)).setSQLXML(anyInt(), any(SQLXML.class)); verify(mysqlCallableStatement, times(1)).setTime(anyInt(), any(Time.class)); verify(mysqlCallableStatement, times(1)).setTimestamp(anyInt(), any(Timestamp.class)); verify(mysqlCallableStatement, times(1)).setTimestamp(anyInt(), any(Timestamp.class), any(Calendar.class)); verify(mysqlCallableStatement, times(1)).setURL(anyInt(), any(URL.class)); verify(mysqlCallableStatement, times(1)).setBinaryStream(anyInt(), any(InputStream.class)); verify(mysqlCallableStatement, times(1)).setBinaryStream(anyInt(), any(InputStream.class), anyInt()); verify(mysqlCallableStatement, times(1)).setBinaryStream(anyInt(), any(InputStream.class), anyLong()); verify(mysqlCallableStatement, times(1)).setNClob(42, reader); verify(mysqlCallableStatement, times(1)).setTime(anyInt(), any(Time.class), any(Calendar.class)); verify(mysqlCallableStatement, times(1)).setTimestamp(anyInt(), any(Timestamp.class), any(Calendar.class)); verify(mysqlCallableStatement, times(1)).setArray(anyInt(), any(Array.class)); verify(mysqlCallableStatement, times(1)).setBlob(anyInt(), any(Blob.class)); verify(mysqlCallableStatement, times(1)).setDate(anyInt(), any(Date.class), any(Calendar.class)); verify(mysqlCallableStatement, times(1)).clearParameters(); verify(mysqlCallableStatement, times(1)).executeQuery(); verify(mysqlCallableStatement, times(1)).close(); verify(mysqlCallableStatement, times(1)).setAsciiStream(anyString(), any(InputStream.class)); verify(mysqlCallableStatement, times(1)).setAsciiStream(anyString(), any(InputStream.class), anyInt()); verify(mysqlCallableStatement, times(1)).setAsciiStream(anyString(), any(InputStream.class), anyLong()); verify(mysqlCallableStatement, times(1)).setCharacterStream(anyString(), any(Reader.class)); verify(mysqlCallableStatement, times(1)).setCharacterStream(anyString(), any(Reader.class), anyInt()); verify(mysqlCallableStatement, times(1)).setCharacterStream(anyString(), any(Reader.class), anyLong()); verify(mysqlCallableStatement, times(1)).setShort(anyString(), anyShort()); verify(mysqlCallableStatement, times(1)).setInt(anyString(), anyInt()); verify(mysqlCallableStatement, times(1)).setString(anyString(), anyString()); verify(mysqlCallableStatement, times(1)).setBoolean(anyString(), anyBoolean()); verify(mysqlCallableStatement, times(1)).setLong(anyString(), anyLong()); verify(mysqlCallableStatement, times(1)).setDouble(anyString(), anyDouble()); verify(mysqlCallableStatement, times(1)).setFloat(anyString(), anyFloat()); verify(mysqlCallableStatement, times(1)).setByte(anyString(), anyByte()); verify(mysqlCallableStatement, times(1)).setBytes(14, bytesParam); verify(mysqlCallableStatement, times(1)).setDate(anyString(), any(Date.class)); verify(mysqlCallableStatement, times(1)).setNull(anyString(), anyInt()); verify(mysqlCallableStatement, times(1)).setNull(anyString(), anyInt(), anyString()); verify(mysqlCallableStatement, times(1)).setBigDecimal(anyString(), any(BigDecimal.class)); verify(mysqlCallableStatement, times(1)).setBlob(anyString(), any(InputStream.class)); verify(mysqlCallableStatement, times(1)).setBlob(anyString(), any(InputStream.class), anyLong()); verify(mysqlCallableStatement, times(1)).setClob(anyString(), any(Clob.class)); verify(mysqlCallableStatement, times(1)).setClob(anyString(), any(Reader.class)); verify(mysqlCallableStatement, times(1)).setClob(anyString(), any(Reader.class), anyInt()); verify(mysqlCallableStatement, times(1)).setNString(anyString(), anyString()); verify(mysqlCallableStatement, times(1)).setNCharacterStream(anyString(), any(Reader.class)); verify(mysqlCallableStatement, times(1)).setNCharacterStream(anyString(), any(Reader.class), anyInt()); verify(mysqlCallableStatement, times(1)).setNClob(27, nClob); verify(mysqlCallableStatement, times(1)).setNClob(28, reader, 1); verify(mysqlCallableStatement, times(1)).setObject(anyString(), Matchers.anyObject()); verify(mysqlCallableStatement, times(1)).setObject(anyString(), Matchers.anyObject(), anyInt()); verify(mysqlCallableStatement, times(1)).setObject(anyString(), Matchers.anyObject(), anyInt(), anyInt()); verify(mysqlCallableStatement, times(1)).setRowId(anyString(), any(RowId.class)); verify(mysqlCallableStatement, times(1)).setSQLXML(anyString(), any(SQLXML.class)); verify(mysqlCallableStatement, times(1)).setTime(anyString(), any(Time.class)); verify(mysqlCallableStatement, times(1)).setTimestamp(anyString(), any(Timestamp.class)); verify(mysqlCallableStatement, times(1)).setTimestamp(anyString(), any(Timestamp.class), any(Calendar.class)); verify(mysqlCallableStatement, times(1)).setURL(anyString(), any(URL.class)); verify(mysqlCallableStatement, times(1)).setBinaryStream(anyString(), any(InputStream.class)); verify(mysqlCallableStatement, times(1)).setBinaryStream(anyString(), any(InputStream.class), anyInt()); verify(mysqlCallableStatement, times(1)).setBinaryStream(anyString(), any(InputStream.class), anyLong()); verify(mysqlCallableStatement, times(1)).setNClob(42, reader); verify(mysqlCallableStatement, times(1)).setTime(anyString(), any(Time.class), any(Calendar.class)); verify(mysqlCallableStatement, times(1)).setTimestamp(anyString(), any(Timestamp.class), any(Calendar.class)); verify(mysqlCallableStatement, times(1)).setBlob(anyString(), any(Blob.class)); verify(mysqlCallableStatement, times(1)).setDate(anyString(), any(Date.class), any(Calendar.class)); } @Test public void testCallableStatementConfig() throws SQLException { CallableStatement callableStatement = swConnection.prepareCall("INSERT INTO test VALUES( ? , ?)", 1, 1); callableStatement.setInt(1, 1); callableStatement.setString(2, "a"); callableStatement.getUpdateCount(); callableStatement.setFetchDirection(1); callableStatement.getFetchDirection(); callableStatement.getResultSetConcurrency(); callableStatement.getResultSetType(); callableStatement.isClosed(); callableStatement.setPoolable(false); callableStatement.isPoolable(); callableStatement.getWarnings(); callableStatement.clearWarnings(); callableStatement.setCursorName("test"); callableStatement.setMaxFieldSize(11); callableStatement.getMaxFieldSize(); callableStatement.setMaxRows(10); callableStatement.getMaxRows(); callableStatement.getParameterMetaData(); callableStatement.setEscapeProcessing(true); callableStatement.setFetchSize(1); callableStatement.getFetchSize(); callableStatement.setQueryTimeout(1); callableStatement.getQueryTimeout(); Connection connection = callableStatement.getConnection(); callableStatement.execute(); callableStatement.getMoreResults(); callableStatement.getMoreResults(1); callableStatement.getResultSetHoldability(); callableStatement.getMetaData(); callableStatement.getResultSet(); callableStatement.close(); verify(mysqlCallableStatement, times(1)).getUpdateCount(); verify(mysqlCallableStatement, times(1)).getMoreResults(); verify(mysqlCallableStatement, times(1)).setFetchDirection(anyInt()); verify(mysqlCallableStatement, times(1)).getFetchDirection(); verify(mysqlCallableStatement, times(1)).getResultSetType(); verify(mysqlCallableStatement, times(1)).isClosed(); verify(mysqlCallableStatement, times(1)).setPoolable(anyBoolean()); verify(mysqlCallableStatement, times(1)).getWarnings(); verify(mysqlCallableStatement, times(1)).clearWarnings(); verify(mysqlCallableStatement, times(1)).setCursorName(anyString()); verify(mysqlCallableStatement, times(1)).setMaxFieldSize(anyInt()); verify(mysqlCallableStatement, times(1)).getMaxFieldSize(); verify(mysqlCallableStatement, times(1)).setMaxRows(anyInt()); verify(mysqlCallableStatement, times(1)).getMaxRows(); verify(mysqlCallableStatement, times(1)).setEscapeProcessing(anyBoolean()); verify(mysqlCallableStatement, times(1)).getResultSetConcurrency(); verify(mysqlCallableStatement, times(1)).getResultSetConcurrency(); verify(mysqlCallableStatement, times(1)).getResultSetType(); verify(mysqlCallableStatement, times(1)).getMetaData(); verify(mysqlCallableStatement, times(1)).getParameterMetaData(); verify(mysqlCallableStatement, times(1)).getMoreResults(anyInt()); verify(mysqlCallableStatement, times(1)).setFetchSize(anyInt()); verify(mysqlCallableStatement, times(1)).getFetchSize(); verify(mysqlCallableStatement, times(1)).getQueryTimeout(); verify(mysqlCallableStatement, times(1)).setQueryTimeout(anyInt()); verify(mysqlCallableStatement, times(1)).getResultSet(); assertThat(connection, CoreMatchers.is(swConnection)); } @Test public void testExecuteQuery() throws SQLException { CallableStatement callableStatement = swConnection.prepareCall("SELECT * FROM test", 1, 1, 1); ResultSet resultSet = callableStatement.executeQuery(); callableStatement.close(); verify(mysqlCallableStatement, times(1)).executeQuery(); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeQuery", "SELECT * FROM test"); } }); } @Test public void testQuerySqlWithSql() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("SELECT * FROM test", 1, 1); ResultSet resultSet = preparedStatement.executeQuery("SELECT * FROM test"); preparedStatement.getGeneratedKeys(); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).executeQuery(anyString()); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeQuery", "SELECT * FROM test"); } }); } @Test public void testInsertWithAutoGeneratedKey() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("INSERT INTO test VALUES(?)"); boolean insertCount = preparedStatement.execute("INSERT INTO test VALUES(1)", 1); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).execute(anyString(), anyInt()); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/execute", "INSERT INTO test VALUES(1)"); } }); } @Test public void testInsertWithIntColumnIndexes() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("INSERT INTO test VALUES(?)"); boolean insertCount = preparedStatement.execute("INSERT INTO test VALUES(1)", new int[] {1, 2}); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/execute", "INSERT INTO test VALUES(1)"); } }); } @Test public void testInsertWithStringColumnIndexes() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("INSERT INTO test VALUES(?)"); boolean insertCount = preparedStatement.execute("INSERT INTO test VALUES(1)", new String[] {"1", "2"}); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/execute", "INSERT INTO test VALUES(1)"); } }); } @Test public void testExecute() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("UPDATE test SET a = ?"); preparedStatement.setString(1, "a"); boolean updateCount = preparedStatement.execute("UPDATE test SET a = 1"); preparedStatement.cancel(); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).execute(anyString()); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/execute", "UPDATE test SET a = 1"); } }); } @Test public void testExecuteUpdate() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("UPDATE test SET a = ?"); preparedStatement.setString(1, "a"); int updateCount = preparedStatement.executeUpdate(); preparedStatement.cancel(); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).executeUpdate(); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeUpdate", "UPDATE test SET a = ?"); } }); } @Test public void testUpdateSql() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("UPDATE test SET a = ?"); int updateCount = preparedStatement.executeUpdate("UPDATE test SET a = 1"); preparedStatement.cancel(); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).executeUpdate(anyString()); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeUpdate", "UPDATE test SET a = 1"); } }); } @Test public void testUpdateWithAutoGeneratedKey() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("UPDATE test SET a = ?"); int updateCount = preparedStatement.executeUpdate("UPDATE test SET a = 1", 1); preparedStatement.cancel(); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeUpdate", "UPDATE test SET a = 1"); } }); } @Test public void testUpdateWithIntColumnIndexes() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("UPDATE test SET a = ?"); int updateCount = preparedStatement.executeUpdate("UPDATE test SET a = 1", new int[] {1}); preparedStatement.cancel(); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeUpdate", "UPDATE test SET a = 1"); } }); } @Test public void testUpdateWithStringColumnIndexes() throws SQLException { CallableStatement preparedStatement = swConnection.prepareCall("UPDATE test SET a = ?"); int updateCount = preparedStatement.executeUpdate("UPDATE test SET a = 1", new String[] {"1"}); preparedStatement.cancel(); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).close(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeUpdate", "UPDATE test SET a = 1"); } }); } @Test public void testBatch() throws SQLException, MalformedURLException { CallableStatement preparedStatement = multiHostConnection.prepareCall("UPDATE test SET a = ? WHERE b = ?"); preparedStatement.setShort(1, (short) 12); preparedStatement.setTime(2, new Time(System.currentTimeMillis())); preparedStatement.addBatch(); int[] resultSet = preparedStatement.executeBatch(); preparedStatement.clearBatch(); verify(mysqlCallableStatement, times(1)).executeBatch(); verify(mysqlCallableStatement, times(1)).addBatch(); verify(mysqlCallableStatement, times(1)).clearBatch(); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeBatch", ""); } }); } @Test public void testQueryWithMultiHost() throws SQLException { CallableStatement preparedStatement = multiHostConnection.prepareCall("SELECT * FROM test WHERE a = ? or b = ? or c=? or d = ?", 1, 1); preparedStatement.setAsciiStream(1, inputStream); preparedStatement.setAsciiStream(2, inputStream, 10); preparedStatement.setAsciiStream(3, inputStream, 1000000L); preparedStatement.setCharacterStream(4, reader); ResultSet resultSet = preparedStatement.executeQuery(); preparedStatement.close(); verify(mysqlCallableStatement, times(1)).executeQuery(); verify(mysqlCallableStatement, times(1)).close(); } @Test(expected = SQLException.class) public void testMultiHostWithException() throws SQLException { when(mysqlCallableStatement.executeQuery()).thenThrow(new SQLException()); try { CallableStatement preparedStatement = multiHostConnection.prepareCall("SELECT * FROM test WHERE a = ? or b = ? or c=? or d = ? or e=?"); preparedStatement.setBigDecimal(1, new BigDecimal(10000)); preparedStatement.setBlob(2, inputStream); preparedStatement.setBlob(3, inputStream, 1000000L); preparedStatement.setByte(3, (byte) 1); preparedStatement.setBytes(4, bytesParam); preparedStatement.setLong(5, 100L); ResultSet resultSet = preparedStatement.executeQuery(); preparedStatement.close(); } finally { verify(mysqlCallableStatement, times(1)).executeQuery(); verify(mysqlCallableStatement, times(0)).close(); verify(mysqlCallableStatement, times(1)).setBigDecimal(anyInt(), any(BigDecimal.class)); verify(mysqlCallableStatement, times(1)).setBlob(anyInt(), any(InputStream.class)); verify(mysqlCallableStatement, times(1)).setBlob(anyInt(), any(InputStream.class), anyLong()); verify(mysqlCallableStatement, times(1)).setByte(anyInt(), anyByte()); mockTracerContextListener.assertSize(1); mockTracerContextListener.assertTraceSegment(0, new SegmentAssert() { @Override public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertDBSpan(span, "Mysql/JDBI/CallableStatement/executeQuery", "SELECT * FROM test WHERE a = ? or b = ? or c=? or d = ? or e=?"); assertThat(span.getLogs().size(), is(1)); assertDBSpanLog(span.getLogs().get(0)); } }); } } @After public void tearDown() throws Exception { TracerContext.ListenerManager.remove(mockTracerContextListener); } }