package brave.mysql;
import brave.Span;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import zipkin.Endpoint;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class TracingStatementInterceptorTest {
@Mock Connection connection;
@Mock DatabaseMetaData metaData;
@Mock Span span;
String url = "jdbc:mysql://myhost:5555/mydatabase";
@Test public void parseServerAddress_ipFromHost_portFromUrl() throws SQLException {
setupAndReturnPropertiesForHost("127.0.0.1");
TracingStatementInterceptor.parseServerAddress(connection, span);
verify(span).remoteEndpoint(Endpoint.builder().serviceName("mysql")
.ipv4(127 << 24 | 1).port(5555).build());
}
@Test public void parseServerAddress_serviceNameFromDatabaseName() throws SQLException {
setupAndReturnPropertiesForHost("127.0.0.1");
when(connection.getCatalog()).thenReturn("mydatabase");
TracingStatementInterceptor.parseServerAddress(connection, span);
verify(span).remoteEndpoint(Endpoint.builder().serviceName("mysql-mydatabase")
.ipv4(127 << 24 | 1).port(5555).build());
}
@Test public void parseServerAddress_propertiesOverrideServiceName() throws SQLException {
setupAndReturnPropertiesForHost("127.0.0.1").setProperty("zipkinServiceName", "foo");
TracingStatementInterceptor.parseServerAddress(connection, span);
verify(span).remoteEndpoint(Endpoint.builder().serviceName("foo")
.ipv4(127 << 24 | 1).port(5555).build());
}
@Test public void parseServerAddress_emptyZipkinServiceNameIgnored() throws SQLException {
setupAndReturnPropertiesForHost("127.0.0.1").setProperty("zipkinServiceName", "");
TracingStatementInterceptor.parseServerAddress(connection, span);
verify(span).remoteEndpoint(Endpoint.builder().serviceName("mysql")
.ipv4(127 << 24 | 1).port(5555).build());
}
@Test public void parseServerAddress_doesntNsLookup() throws SQLException {
setupAndReturnPropertiesForHost("localhost");
TracingStatementInterceptor.parseServerAddress(connection, span);
verifyNoMoreInteractions(span);
}
@Test public void parseServerAddress_doesntCrash() throws SQLException {
when(connection.getMetaData()).thenThrow(new SQLException());
verifyNoMoreInteractions(span);
}
Properties setupAndReturnPropertiesForHost(String host) throws SQLException {
when(connection.getMetaData()).thenReturn(metaData);
when(metaData.getURL()).thenReturn(url);
Properties properties = new Properties();
when(connection.getProperties()).thenReturn(properties);
when(connection.getHost()).thenReturn(host);
return properties;
}
}