You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2022/07/18 08:51:13 UTC
[shardingsphere] branch master updated: Fix SQLLoggerTest failed in Java 18 (#19318)
This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 9c7b14f22fd Fix SQLLoggerTest failed in Java 18 (#19318)
9c7b14f22fd is described below
commit 9c7b14f22fd5c00881fa408d0181c2a745bb865a
Author: 吴伟杰 <wu...@apache.org>
AuthorDate: Mon Jul 18 16:50:58 2022 +0800
Fix SQLLoggerTest failed in Java 18 (#19318)
* Replace mock logger with ListAppender in SQLLoggerTest
* Bump jacoco-maven-plugin to 0.8.8
* Enable Java 18 CI
---
.github/workflows/ci.yml | 4 +
pom.xml | 2 +-
.../infra/executor/sql/log/SQLLoggerTest.java | 107 +++++++++------------
.../src/test/resources/logback-test.xml | 5 +
4 files changed, 53 insertions(+), 65 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e9abfc6bf66..51fe759d8b9 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -131,6 +131,10 @@ jobs:
version: 17,
maven_args: "-Dmaven.javadoc.skip=true -Drat.skip=true -Djacoco.skip=true -Dspotless.apply.skip=true"
}
+ - {
+ version: 18,
+ maven_args: "-Dmaven.javadoc.skip=true -Drat.skip=true -Djacoco.skip=true -Dspotless.apply.skip=true"
+ }
steps:
- uses: actions/checkout@v2
- name: Maven resolve ranges
diff --git a/pom.xml b/pom.xml
index 4491ca52621..498df9cf7e7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -138,7 +138,7 @@
<lifecycle-mapping.version>1.0.0</lifecycle-mapping.version>
<coveralls-maven-plugin.version>4.3.0</coveralls-maven-plugin.version>
<cobertura-maven-plugin.version>2.7</cobertura-maven-plugin.version>
- <jacoco-maven-plugin.version>0.8.7</jacoco-maven-plugin.version>
+ <jacoco-maven-plugin.version>0.8.8</jacoco-maven-plugin.version>
<findbugs-maven-plugin.version>3.0.2</findbugs-maven-plugin.version>
<maven-checkstyle-plugin.version>3.1.0</maven-checkstyle-plugin.version>
<maven-pmd-plugin.version>3.5</maven-pmd-plugin.version>
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/log/SQLLoggerTest.java b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/log/SQLLoggerTest.java
index 94d0d609233..08c2baf5be3 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/log/SQLLoggerTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/log/SQLLoggerTest.java
@@ -17,113 +17,92 @@
package org.apache.shardingsphere.infra.executor.sql.log;
-import lombok.SneakyThrows;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
+import org.apache.shardingsphere.infra.binder.LogicSQL;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.binder.LogicSQL;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InOrder;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
-import static org.mockito.Mockito.inOrder;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
-@RunWith(MockitoJUnitRunner.class)
public final class SQLLoggerTest {
private static final String SQL = "SELECT * FROM t_user";
+ private static List<LoggingEvent> appenderList;
+
private final LogicSQL logicSQL = new LogicSQL(mock(SQLStatementContext.class), SQL, Collections.emptyList());
private Collection<ExecutionUnit> executionUnits;
- @Mock
- private Logger logger;
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ @BeforeClass
+ public static void setupLogger() {
+ ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("ShardingSphere-SQL");
+ ListAppender<LoggingEvent> appender = (ListAppender) log.getAppender("SQLLoggerTestAppender");
+ appenderList = appender.list;
+ }
@Before
- public void setUp() throws NoSuchFieldException {
- executionUnits = mockExecutionUnits(Arrays.asList("db1", "db2", "db3"), SQL);
- setFinalStatic(SQLLogger.class.getDeclaredField("log"), logger);
+ public void setUp() {
+ executionUnits = prepareExecutionUnits(Arrays.asList("db1", "db2", "db3"));
+ appenderList.clear();
}
- private Collection<ExecutionUnit> mockExecutionUnits(final Collection<String> dataSourceNames, final String sql) {
- return dataSourceNames.stream().map(each -> new ExecutionUnit(each, new SQLUnit(sql, new ArrayList<>()))).collect(Collectors.toList());
+ private Collection<ExecutionUnit> prepareExecutionUnits(final Collection<String> dataSourceNames) {
+ return dataSourceNames.stream().map(each -> new ExecutionUnit(each, new SQLUnit(SQL, new ArrayList<>()))).collect(Collectors.toList());
}
@Test
public void assertLogNormalSQLWithoutParameter() {
SQLLogger.logSQL(logicSQL, false, new ExecutionContext(logicSQL, executionUnits, mock(RouteContext.class)));
- InOrder inOrder = inOrder(logger);
- inOrder.verify(logger).info("Logic SQL: {}", new Object[]{SQL});
- inOrder.verify(logger).info("SQLStatement: {}", new Object[]{null});
- inOrder.verify(logger).info("Actual SQL: {} ::: {}", new Object[]{"db1", SQL});
- inOrder.verify(logger).info("Actual SQL: {} ::: {}", new Object[]{"db2", SQL});
- inOrder.verify(logger).info("Actual SQL: {} ::: {}", new Object[]{"db3", SQL});
+ assertThat(appenderList.size(), is(5));
+ assertTrue(appenderList.stream().allMatch(loggingEvent -> Level.INFO == loggingEvent.getLevel()));
+ assertThat(appenderList.get(0).getFormattedMessage(), is("Logic SQL: SELECT * FROM t_user"));
+ assertThat(appenderList.get(1).getFormattedMessage(), is("SQLStatement: null"));
+ assertThat(appenderList.get(2).getFormattedMessage(), is("Actual SQL: db1 ::: SELECT * FROM t_user"));
+ assertThat(appenderList.get(3).getFormattedMessage(), is("Actual SQL: db2 ::: SELECT * FROM t_user"));
+ assertThat(appenderList.get(4).getFormattedMessage(), is("Actual SQL: db3 ::: SELECT * FROM t_user"));
}
@Test
public void assertLogNormalSQLWithParameters() {
- List<Object> parameters = executionUnits.iterator().next().getSqlUnit().getParameters();
- parameters.add("parameter");
+ executionUnits.forEach(each -> each.getSqlUnit().getParameters().add("parameter"));
SQLLogger.logSQL(logicSQL, false, new ExecutionContext(logicSQL, executionUnits, mock(RouteContext.class)));
- InOrder inOrder = inOrder(logger);
- inOrder.verify(logger).info("Logic SQL: {}", new Object[]{SQL});
- inOrder.verify(logger).info("SQLStatement: {}", new Object[]{null});
- inOrder.verify(logger).info("Actual SQL: {} ::: {} ::: {}", new Object[]{"db1", SQL, parameters});
- inOrder.verify(logger).info("Actual SQL: {} ::: {}", new Object[]{"db2", SQL});
- inOrder.verify(logger).info("Actual SQL: {} ::: {}", new Object[]{"db3", SQL});
+ assertThat(appenderList.size(), is(5));
+ assertTrue(appenderList.stream().allMatch(loggingEvent -> Level.INFO == loggingEvent.getLevel()));
+ assertThat(appenderList.get(0).getFormattedMessage(), is("Logic SQL: SELECT * FROM t_user"));
+ assertThat(appenderList.get(1).getFormattedMessage(), is("SQLStatement: null"));
+ assertThat(appenderList.get(2).getFormattedMessage(), is("Actual SQL: db1 ::: SELECT * FROM t_user ::: [parameter]"));
+ assertThat(appenderList.get(3).getFormattedMessage(), is("Actual SQL: db2 ::: SELECT * FROM t_user ::: [parameter]"));
+ assertThat(appenderList.get(4).getFormattedMessage(), is("Actual SQL: db3 ::: SELECT * FROM t_user ::: [parameter]"));
}
@Test
public void assertLogSimpleSQL() {
SQLLogger.logSQL(logicSQL, true, new ExecutionContext(logicSQL, executionUnits, mock(RouteContext.class)));
- InOrder inOrder = inOrder(logger);
- inOrder.verify(logger).info("Logic SQL: {}", new Object[]{SQL});
- inOrder.verify(logger).info("SQLStatement: {}", new Object[]{null});
- inOrder.verify(logger).info("Actual SQL(simple): {} ::: {}", new Object[]{buildDataSourceNames(), executionUnits.size()});
- }
-
- private Collection<String> buildDataSourceNames() {
- return executionUnits.stream().map(ExecutionUnit::getDataSourceName).collect(Collectors.toCollection(() -> new HashSet<>(executionUnits.size())));
- }
-
- @SneakyThrows
- private static void setFinalStatic(final Field field, final Object newValue) {
- field.setAccessible(true);
- Field modifiersField = getModifiersField();
- modifiersField.setAccessible(true);
- modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
- field.set(null, newValue);
- }
-
- @SneakyThrows
- private static Field getModifiersField() {
- Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
- getDeclaredFields0.setAccessible(true);
- Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false);
- for (Field each : fields) {
- if ("modifiers".equals(each.getName())) {
- return each;
- }
- }
- throw new UnsupportedOperationException();
+ assertThat(appenderList.size(), is(3));
+ assertTrue(appenderList.stream().allMatch(loggingEvent -> Level.INFO == loggingEvent.getLevel()));
+ assertThat(appenderList.get(0).getFormattedMessage(), is("Logic SQL: SELECT * FROM t_user"));
+ assertThat(appenderList.get(1).getFormattedMessage(), is("SQLStatement: null"));
+ assertThat(appenderList.get(2).getFormattedMessage(), is("Actual SQL(simple): [db3, db2, db1] ::: 3"));
}
}
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/test/resources/logback-test.xml b/shardingsphere-infra/shardingsphere-infra-executor/src/test/resources/logback-test.xml
index dc172427e06..0ce29c15ddb 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/test/resources/logback-test.xml
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/test/resources/logback-test.xml
@@ -27,6 +27,11 @@
</logger>
<logger name="org.apache.shardingsphere.infra.executor.sql.execute.engine.SQLExecutorExceptionHandler" level="off" />
+ <appender name="SQLLoggerTestAppender" class="ch.qos.logback.core.read.ListAppender" />
+ <logger name="ShardingSphere-SQL" level="info" additivity="false">
+ <appender-ref ref="SQLLoggerTestAppender" />
+ </logger>
+
<root>
<level value="error" />
<appender-ref ref="console" />