package net.ttddyy.dsproxy.support; import net.ttddyy.dsproxy.listener.ChainListener; import net.ttddyy.dsproxy.listener.QueryExecutionListener; import net.ttddyy.dsproxy.listener.logging.AbstractQueryLoggingListener; import net.ttddyy.dsproxy.listener.logging.AbstractSlowQueryLoggingListener; import net.ttddyy.dsproxy.listener.logging.CommonsLogLevel; import net.ttddyy.dsproxy.listener.logging.CommonsQueryLoggingListener; import net.ttddyy.dsproxy.listener.logging.CommonsSlowQueryListener; import net.ttddyy.dsproxy.listener.logging.DefaultQueryLogEntryCreator; import net.ttddyy.dsproxy.listener.logging.JULQueryLoggingListener; import net.ttddyy.dsproxy.listener.logging.JULSlowQueryListener; import net.ttddyy.dsproxy.listener.logging.QueryLogEntryCreator; import net.ttddyy.dsproxy.listener.logging.SLF4JLogLevel; import net.ttddyy.dsproxy.listener.logging.SLF4JQueryLoggingListener; import net.ttddyy.dsproxy.listener.logging.SLF4JSlowQueryListener; import net.ttddyy.dsproxy.listener.logging.SystemOutQueryLoggingListener; import net.ttddyy.dsproxy.listener.logging.SystemOutSlowQueryListener; import org.junit.Test; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import static org.assertj.core.api.Assertions.assertThat; /** * @author Tadaya Tsuyukubo */ public class ProxyDataSourceBuilderTest { @Test public void buildCommonsQueryLoggingListener() { ProxyDataSource ds; CommonsQueryLoggingListener listener; ds = ProxyDataSourceBuilder.create().logQueryByCommons().build(); listener = getAndVerifyListener(ds, CommonsQueryLoggingListener.class); assertThat(listener.getLogLevel()).as("default log level").isEqualTo(CommonsLogLevel.DEBUG); // with logLevel ds = ProxyDataSourceBuilder.create().logQueryByCommons(CommonsLogLevel.ERROR).build(); listener = getAndVerifyListener(ds, CommonsQueryLoggingListener.class); assertThat(listener.getLogLevel()).as("log level").isEqualTo(CommonsLogLevel.ERROR); // with name and logLevel ds = ProxyDataSourceBuilder.create().logQueryByCommons(CommonsLogLevel.FATAL, "my.log").build(); listener = getAndVerifyListener(ds, CommonsQueryLoggingListener.class); assertThat(listener.getLogLevel()).as("log level").isEqualTo(CommonsLogLevel.FATAL); } @Test public void buildSLF4JQueryLoggingListener() { ProxyDataSource ds; SLF4JQueryLoggingListener listener; org.slf4j.Logger logger; // default ds = ProxyDataSourceBuilder.create().logQueryBySlf4j().build(); listener = getAndVerifyListener(ds, SLF4JQueryLoggingListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("net.ttddyy.dsproxy.listener.logging.SLF4JQueryLoggingListener"); assertThat(listener.getLogLevel()).as("default log level").isEqualTo(SLF4JLogLevel.DEBUG); // with level ds = ProxyDataSourceBuilder.create().logQueryBySlf4j(SLF4JLogLevel.TRACE).build(); listener = getAndVerifyListener(ds, SLF4JQueryLoggingListener.class); assertThat(listener.getLogLevel()).as("log level").isEqualTo(SLF4JLogLevel.TRACE); // with logger name ds = ProxyDataSourceBuilder.create().logQueryBySlf4j("my.logger").build(); listener = getAndVerifyListener(ds, SLF4JQueryLoggingListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("my.logger"); // with level and logger name ds = ProxyDataSourceBuilder.create().logQueryBySlf4j(SLF4JLogLevel.ERROR, "my.logger").build(); listener = getAndVerifyListener(ds, SLF4JQueryLoggingListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("my.logger"); assertThat(listener.getLogLevel()).as("log level").isEqualTo(SLF4JLogLevel.ERROR); } @Test public void buildJULQueryLoggingListener() { ProxyDataSource ds; JULQueryLoggingListener listener; java.util.logging.Logger logger; // default ds = ProxyDataSourceBuilder.create().logQueryByJUL().build(); listener = getAndVerifyListener(ds, JULQueryLoggingListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("net.ttddyy.dsproxy.listener.logging.JULQueryLoggingListener"); assertThat(listener.getLogLevel()).as("default log level").isEqualTo(Level.FINE); // with level ds = ProxyDataSourceBuilder.create().logQueryByJUL(Level.WARNING).build(); listener = getAndVerifyListener(ds, JULQueryLoggingListener.class); assertThat(listener.getLogLevel()).as("log level").isEqualTo(Level.WARNING); // with logger name ds = ProxyDataSourceBuilder.create().logQueryByJUL("my.logger").build(); listener = getAndVerifyListener(ds, JULQueryLoggingListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("my.logger"); // with level and logger name ds = ProxyDataSourceBuilder.create().logQueryByJUL(Level.SEVERE, "my.logger").build(); listener = getAndVerifyListener(ds, JULQueryLoggingListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("my.logger"); assertThat(listener.getLogLevel()).as("log level").isEqualTo(Level.SEVERE); } @Test public void buildSysOutQueryLoggingListener() { ProxyDataSource ds = ProxyDataSourceBuilder.create().logQueryToSysOut().build(); getAndVerifyListener(ds, SystemOutQueryLoggingListener.class); } @Test public void buildCommonsSlowQueryListener() { ProxyDataSource ds; CommonsSlowQueryListener listener; // default ds = ProxyDataSourceBuilder.create().logSlowQueryByCommons(10, TimeUnit.SECONDS).build(); listener = getAndVerifyListener(ds, CommonsSlowQueryListener.class); assertThat(listener.getThreshold()).isEqualTo(10); assertThat(listener.getThresholdTimeUnit()).isEqualTo(TimeUnit.SECONDS); assertThat(listener.getLogLevel()).as("default log level").isEqualTo(CommonsLogLevel.WARN); // with logLevel ds = ProxyDataSourceBuilder.create().logSlowQueryByCommons(10, TimeUnit.SECONDS, CommonsLogLevel.INFO).build(); listener = getAndVerifyListener(ds, CommonsSlowQueryListener.class); assertThat(listener.getLogLevel()).as("log level").isEqualTo(CommonsLogLevel.INFO); // with logLevel and logger name ds = ProxyDataSourceBuilder.create().logSlowQueryByCommons(10, TimeUnit.SECONDS, CommonsLogLevel.FATAL, "my.logger").build(); listener = getAndVerifyListener(ds, CommonsSlowQueryListener.class); assertThat(listener.getLogLevel()).as("log level").isEqualTo(CommonsLogLevel.FATAL); } @Test public void buildSLF4JSlowQueryListener() { ProxyDataSource ds; SLF4JSlowQueryListener listener; org.slf4j.Logger logger; // default ds = ProxyDataSourceBuilder.create().logSlowQueryBySlf4j(10, TimeUnit.SECONDS).build(); listener = getAndVerifyListener(ds, SLF4JSlowQueryListener.class); assertThat(listener.getThreshold()).isEqualTo(10); assertThat(listener.getThresholdTimeUnit()).isEqualTo(TimeUnit.SECONDS); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("net.ttddyy.dsproxy.listener.logging.SLF4JSlowQueryListener"); assertThat(listener.getLogLevel()).as("default log level").isEqualTo(SLF4JLogLevel.WARN); // with logLevel ds = ProxyDataSourceBuilder.create().logSlowQueryBySlf4j(10, TimeUnit.SECONDS, SLF4JLogLevel.TRACE).build(); listener = getAndVerifyListener(ds, SLF4JSlowQueryListener.class); assertThat(listener.getLogLevel()).as("log level").isEqualTo(SLF4JLogLevel.TRACE); // with logger name ds = ProxyDataSourceBuilder.create().logSlowQueryBySlf4j(10, TimeUnit.SECONDS, "my.logger").build(); listener = getAndVerifyListener(ds, SLF4JSlowQueryListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("my.logger"); // with logLevel and logger name ds = ProxyDataSourceBuilder.create().logSlowQueryBySlf4j(10, TimeUnit.SECONDS, SLF4JLogLevel.INFO, "my.logger").build(); listener = getAndVerifyListener(ds, SLF4JSlowQueryListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("my.logger"); assertThat(listener.getLogLevel()).as("log level").isEqualTo(SLF4JLogLevel.INFO); } @Test public void buildJULJSlowQueryListener() { ProxyDataSource ds; JULSlowQueryListener listener; java.util.logging.Logger logger; // default ds = ProxyDataSourceBuilder.create().logSlowQueryByJUL(10, TimeUnit.SECONDS).build(); listener = getAndVerifyListener(ds, JULSlowQueryListener.class); assertThat(listener.getThreshold()).isEqualTo(10); assertThat(listener.getThresholdTimeUnit()).isEqualTo(TimeUnit.SECONDS); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("net.ttddyy.dsproxy.listener.logging.JULSlowQueryListener"); assertThat(listener.getLogLevel()).as("default log level").isEqualTo(Level.WARNING); // with logLevel ds = ProxyDataSourceBuilder.create().logSlowQueryByJUL(10, TimeUnit.SECONDS, Level.FINE).build(); listener = getAndVerifyListener(ds, JULSlowQueryListener.class); assertThat(listener.getLogLevel()).as("ølog level").isEqualTo(Level.FINE); // with logger name ds = ProxyDataSourceBuilder.create().logSlowQueryByJUL(10, TimeUnit.SECONDS, "my.logger").build(); listener = getAndVerifyListener(ds, JULSlowQueryListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("my.logger"); // with logLevel and logger name ds = ProxyDataSourceBuilder.create().logSlowQueryByJUL(10, TimeUnit.SECONDS, Level.INFO, "my.logger").build(); listener = getAndVerifyListener(ds, JULSlowQueryListener.class); logger = listener.getLogger(); assertThat(logger.getName()).isEqualTo("my.logger"); assertThat(listener.getLogLevel()).as("log level").isEqualTo(Level.INFO); } @Test public void buildSysOutSlowQueryListener() { ProxyDataSource ds = ProxyDataSourceBuilder.create().logSlowQueryToSysOut(10, TimeUnit.SECONDS).build(); getAndVerifyListener(ds, SystemOutSlowQueryListener.class); } @Test public void multiline() { ProxyDataSource ds; ds = ProxyDataSourceBuilder.create().multiline().logQueryByCommons().build(); verifyMultiline(ds, CommonsQueryLoggingListener.class); ds = ProxyDataSourceBuilder.create().multiline().logQueryBySlf4j().build(); verifyMultiline(ds, SLF4JQueryLoggingListener.class); ds = ProxyDataSourceBuilder.create().multiline().logQueryByJUL().build(); verifyMultiline(ds, JULQueryLoggingListener.class); ds = ProxyDataSourceBuilder.create().multiline().logQueryToSysOut().build(); verifyMultiline(ds, SystemOutQueryLoggingListener.class); long threshold = 10; TimeUnit timeUnit = TimeUnit.SECONDS; ds = ProxyDataSourceBuilder.create().multiline().logSlowQueryByCommons(threshold, timeUnit).build(); verifyMultiline(ds, CommonsSlowQueryListener.class); ds = ProxyDataSourceBuilder.create().multiline().logSlowQueryBySlf4j(threshold, timeUnit).build(); verifyMultiline(ds, SLF4JSlowQueryListener.class); ds = ProxyDataSourceBuilder.create().multiline().logSlowQueryByJUL(threshold, timeUnit).build(); verifyMultiline(ds, JULSlowQueryListener.class); ds = ProxyDataSourceBuilder.create().multiline().logSlowQueryToSysOut(threshold, timeUnit).build(); verifyMultiline(ds, SystemOutSlowQueryListener.class); } private void verifyMultiline(ProxyDataSource ds, Class<? extends QueryExecutionListener> listenerClass) { QueryExecutionListener listener = getAndVerifyListener(ds, listenerClass); QueryLogEntryCreator entryCreator; if (listener instanceof AbstractQueryLoggingListener) { entryCreator = ((AbstractQueryLoggingListener) listener).getQueryLogEntryCreator(); } else { entryCreator = ((AbstractSlowQueryLoggingListener) listener).getQueryLogEntryCreator(); } assertThat(entryCreator).isInstanceOf(DefaultQueryLogEntryCreator.class); assertThat(((DefaultQueryLogEntryCreator) entryCreator).isMultiline()).as("multiline output").isTrue(); } @SuppressWarnings("unchecked") private <T extends QueryExecutionListener> T getAndVerifyListener(ProxyDataSource ds, Class<T> listenerClass) { QueryExecutionListener listener = ds.getInterceptorHolder().getListener(); assertThat(listener).isInstanceOf(ChainListener.class); List<QueryExecutionListener> listeners = ((ChainListener) listener).getListeners(); assertThat(listeners).hasSize(1); QueryExecutionListener target = listeners.get(0); assertThat(target).isInstanceOf(listenerClass); return (T) target; } }