This is an automated email from the ASF dual-hosted git repository.

dragonyliu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new f2447cfe0 RATIS-1742. Remove slf4j-log4j12 test dependency from 
ratis-common and ratis-server. (#781)
f2447cfe0 is described below

commit f2447cfe0b94ad5f9e72dff1623fa90b6f42f4f5
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Thu Nov 17 05:32:58 2022 -0800

    RATIS-1742. Remove slf4j-log4j12 test dependency from ratis-common and 
ratis-server. (#781)
---
 ratis-common/pom.xml                               |   5 -
 .../java/org/apache/ratis/util/Slf4jUtils.java     | 111 ++++++++++++++++++---
 ratis-server/pom.xml                               |   5 -
 ratis-test/pom.xml                                 |  17 +++-
 .../ratis/datastream/TestDataStreamDisabled.java   |  36 ++++---
 .../raftlog/segmented/TestSegmentedRaftLog.java    |   4 +-
 6 files changed, 126 insertions(+), 52 deletions(-)

diff --git a/ratis-common/pom.xml b/ratis-common/pom.xml
index e08454db9..fa3c06745 100644
--- a/ratis-common/pom.xml
+++ b/ratis-common/pom.xml
@@ -37,11 +37,6 @@
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
 
     <dependency>
       <groupId>junit</groupId>
diff --git a/ratis-common/src/test/java/org/apache/ratis/util/Slf4jUtils.java 
b/ratis-common/src/test/java/org/apache/ratis/util/Slf4jUtils.java
index dadbae352..f2fca961a 100644
--- a/ratis-common/src/test/java/org/apache/ratis/util/Slf4jUtils.java
+++ b/ratis-common/src/test/java/org/apache/ratis/util/Slf4jUtils.java
@@ -17,34 +17,113 @@
  */
 package org.apache.ratis.util;
 
-import org.apache.log4j.LogManager;
 import org.slf4j.Logger;
 import org.slf4j.event.Level;
 
-import java.util.Optional;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.function.Supplier;
 
 public interface Slf4jUtils {
-
   static void setLogLevel(Logger logger, Level level) {
     final String name = logger.getName();
+    final boolean set = Log4jUtils.setLevel(name, level.name());
+
+    final String prefix = set? "Successfully": "Failed to";
     if (LogUtils.LOG.isTraceEnabled()) {
-      LogUtils.LOG.trace("", new Throwable("Set " + name + " log level to " + 
level));
+      LogUtils.LOG.trace("", new Throwable(prefix + " set " + name + " log 
level to " + level));
     } else {
-      LogUtils.LOG.info("Set {} log level to {}", name, level);
+      LogUtils.LOG.info(prefix + " set {} log level to {}", name, level);
     }
-
-    Optional.ofNullable(LogManager.getLogger(name))
-        .ifPresent(log -> log.setLevel(getLog4jLevel(level)));
   }
 
-  static org.apache.log4j.Level getLog4jLevel(Level level) {
-    switch (level) {
-      case ERROR: return org.apache.log4j.Level.ERROR;
-      case WARN: return org.apache.log4j.Level.WARN;
-      case INFO: return org.apache.log4j.Level.INFO;
-      case DEBUG: return org.apache.log4j.Level.DEBUG;
-      case TRACE: return org.apache.log4j.Level.TRACE;
+  interface Log4jUtils {
+    String PACKAGE_NAME = "org.apache.log4j";
+
+    /**
+     * Use reflection to invoke setLevel.
+     *
+     * @param loggerName The logger name.
+     * @param levelName The level name.
+     * @return true iff the level is successfully set.
+     */
+    static boolean setLevel(String loggerName, String levelName) {
+      final Field level = Level.valueOf(levelName);
+      if (level == null) {
+        return false;
+      }
+
+      try {
+        final Object logger = LogManager.getLogger().invoke(null, loggerName);
+        Logger.setLevel().invoke(logger, level.get(null));
+      } catch (Exception ignored) {
+        return false;
+      }
+      return true;
+    }
+
+    interface LogManager {
+      String CLASS_NAME = PACKAGE_NAME + ".LogManager";
+      Supplier<Method> GET_LOGGER = 
MemoizedSupplier.valueOf(LogManager::getLoggerImpl);
+
+      static Method getLogger() {
+        return GET_LOGGER.get();
+      }
+
+      static Method getLoggerImpl() {
+        final Class<?> clazz = 
ReflectionUtils.getClassByNameOrNull(CLASS_NAME);
+        if (clazz == null) {
+          return null;
+        }
+        final Class<?>[] argClasses = {String.class};
+        try {
+          return clazz.getMethod("getLogger", argClasses);
+        } catch (Exception e) {
+          return null;
+        }
+      }
+    }
+
+    interface Level {
+      String CLASS_NAME = PACKAGE_NAME + ".Level";
+      ConcurrentMap<String, Field> LEVELS = new ConcurrentHashMap<>();
+
+      static Field valueOf(String level) {
+        return LEVELS.computeIfAbsent(level, Level::valueOfImpl);
+      }
+
+      static Field valueOfImpl(String level) {
+        try {
+          final Class<?> clazz = 
ReflectionUtils.getClassByNameOrNull(CLASS_NAME);
+          return clazz.getDeclaredField(level);
+        } catch (Exception e) {
+          return null;
+        }
+      }
+    }
+
+    interface Logger {
+      String CLASS_NAME = PACKAGE_NAME + ".Logger";
+      Supplier<Method> SET_LEVEL = 
MemoizedSupplier.valueOf(Logger::setLevelImpl);
+
+      static Method setLevel() {
+        return SET_LEVEL.get();
+      }
+
+      static Method setLevelImpl() {
+        final Class<?> clazz = 
ReflectionUtils.getClassByNameOrNull(CLASS_NAME);
+        if (clazz == null) {
+          return null;
+        }
+        final Class<?>[] argClasses = 
{ReflectionUtils.getClassByNameOrNull(Level.CLASS_NAME)};
+        try {
+          return clazz.getMethod("setLevel", argClasses);
+        } catch (Exception e) {
+          return null;
+        }
+      }
     }
-    throw new IllegalArgumentException("Unexpected level " + level);
   }
 }
diff --git a/ratis-server/pom.xml b/ratis-server/pom.xml
index c1a433e13..0acfa1e6a 100644
--- a/ratis-server/pom.xml
+++ b/ratis-server/pom.xml
@@ -64,11 +64,6 @@
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <scope>test</scope>
-    </dependency>
 
     <dependency>
       <groupId>junit</groupId>
diff --git a/ratis-test/pom.xml b/ratis-test/pom.xml
index fcc751049..99f4e21cc 100644
--- a/ratis-test/pom.xml
+++ b/ratis-test/pom.xml
@@ -84,6 +84,18 @@
       <type>test-jar</type>
     </dependency>
 
+    <dependency>
+      <groupId>org.apache.ratis</groupId>
+      <artifactId>ratis-shell</artifactId>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-simple</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
@@ -105,10 +117,5 @@
       <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.ratis</groupId>
-      <artifactId>ratis-shell</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 </project>
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/datastream/TestDataStreamDisabled.java
 
b/ratis-test/src/test/java/org/apache/ratis/datastream/TestDataStreamDisabled.java
index cc0c4d90c..168a1b02d 100644
--- 
a/ratis-test/src/test/java/org/apache/ratis/datastream/TestDataStreamDisabled.java
+++ 
b/ratis-test/src/test/java/org/apache/ratis/datastream/TestDataStreamDisabled.java
@@ -21,35 +21,33 @@ import org.apache.ratis.BaseTest;
 import org.apache.ratis.RaftConfigKeys;
 import org.apache.ratis.client.DisabledDataStreamClientFactory;
 import org.apache.ratis.client.RaftClient;
+import org.apache.ratis.client.api.DataStreamOutput;
 import org.apache.ratis.conf.RaftProperties;
 import org.apache.ratis.protocol.RaftGroup;
 import org.apache.ratis.protocol.RaftGroupId;
 import org.apache.ratis.protocol.RaftPeer;
 import org.junit.Assert;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 public class TestDataStreamDisabled extends BaseTest {
-  @Rule
-  public final ExpectedException exception = ExpectedException.none();
-
   @Test
-  public void testDataStreamDisabled() {
-      final RaftProperties properties = new RaftProperties();
-      Assert.assertEquals(SupportedDataStreamType.DISABLED, 
RaftConfigKeys.DataStream.type(properties, LOG::info));
+  public void testDataStreamDisabled() throws Exception {
+    final RaftProperties properties = new RaftProperties();
+    Assert.assertEquals(SupportedDataStreamType.DISABLED, 
RaftConfigKeys.DataStream.type(properties, LOG::info));
 
-      final RaftPeer server = RaftPeer.newBuilder().setId("s0").build();
-      final RaftClient client = RaftClient.newBuilder()
-        .setRaftGroup(RaftGroup.valueOf(RaftGroupId.randomId(), server))
-        .setProperties(properties)
-        .build();
+    final RaftPeer server = RaftPeer.newBuilder().setId("s0").build();
 
-      exception.expect(UnsupportedOperationException.class);
-      exception.expectMessage(DisabledDataStreamClientFactory.class.getName()
-          + "$1 does not support streamAsync");
-      // stream() will create a header request, thus it will hit 
UnsupportedOperationException due to
-      // DisabledDataStreamFactory.
-      client.getDataStreamApi().stream();
+    // stream() will create a header request, thus it will hit 
UnsupportedOperationException due to
+    // DisabledDataStreamFactory.
+    try (RaftClient client = RaftClient.newBuilder()
+            .setRaftGroup(RaftGroup.valueOf(RaftGroupId.randomId(), server))
+            .setProperties(properties)
+            .build();
+        DataStreamOutput out = client.getDataStreamApi().stream()) {
+      Assert.fail("Unexpected object: " + out);
+    } catch (UnsupportedOperationException e) {
+      Assert.assertTrue(e.getMessage().contains(
+          DisabledDataStreamClientFactory.class.getName() + "$1 does not 
support streamAsync"));
+    }
   }
 }
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
 
b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
index 92b6f7d3c..06f7ad30f 100644
--- 
a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
+++ 
b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
@@ -712,8 +712,8 @@ public class TestSegmentedRaftLog extends BaseTest {
       long start = System.nanoTime();
       for (int i = 0; i < entries.size(); i += 5) {
         // call append API
-        futures.add(raftLog.append(entries.get(i), entries.get(i + 1), 
entries.get(i + 2), entries.get(i + 3),
-            entries.get(i + 4)));
+        futures.add(raftLog.append(Arrays.asList(
+            entries.get(i), entries.get(i + 1), entries.get(i + 2), 
entries.get(i + 3), entries.get(i + 4))));
       }
       for (List<CompletableFuture<Long>> futureList: futures) {
         futureList.forEach(CompletableFuture::join);

Reply via email to