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" />