From 667393d020fd1f9336328f7be570b388e2d9053e Mon Sep 17 00:00:00 2001 From: Jeremy Norris Date: Thu, 5 Jan 2023 10:51:30 -0600 Subject: [PATCH] Use slfj4-test instead of logback for unit & integration tests. --- pom.xml | 8 +- .../java/com/jcraft/jsch/Algorithms2IT.java | 65 +++----- .../java/com/jcraft/jsch/Algorithms3IT.java | 56 +++---- .../java/com/jcraft/jsch/AlgorithmsIT.java | 66 +++----- .../java/com/jcraft/jsch/ListAppender2.java | 15 -- .../jcraft/jsch/OpenSSH74ServerSigAlgsIT.java | 71 ++++----- src/test/java/com/jcraft/jsch/SSHAgentIT.java | 78 ++++------ .../java/com/jcraft/jsch/ServerSigAlgsIT.java | 74 ++++----- .../java/com/jcraft/jsch/Slf4jLoggerTest.java | 146 ++++++++---------- 9 files changed, 219 insertions(+), 360 deletions(-) delete mode 100644 src/test/java/com/jcraft/jsch/ListAppender2.java diff --git a/pom.xml b/pom.xml index b2a9b915..de9cd662 100644 --- a/pom.xml +++ b/pom.xml @@ -163,9 +163,9 @@ test - ch.qos.logback - logback-classic - 1.3.4 + com.github.valfirst + slf4j-test + 2.8.1 test @@ -639,4 +639,4 @@ - \ No newline at end of file + diff --git a/src/test/java/com/jcraft/jsch/Algorithms2IT.java b/src/test/java/com/jcraft/jsch/Algorithms2IT.java index b04b85b0..7b78c898 100644 --- a/src/test/java/com/jcraft/jsch/Algorithms2IT.java +++ b/src/test/java/com/jcraft/jsch/Algorithms2IT.java @@ -7,9 +7,9 @@ import static org.junit.jupiter.api.condition.JRE.JAVA_11; import static org.junit.jupiter.api.condition.JRE.JAVA_15; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; @@ -19,7 +19,6 @@ import java.util.Optional; import java.util.Random; import org.apache.commons.codec.digest.DigestUtils; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -28,7 +27,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; -import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -41,15 +39,14 @@ public class Algorithms2IT { // Python can be slow for DH group 18 private static final int timeout = 10000; private static final DigestUtils sha256sum = new DigestUtils(DigestUtils.getSha256Digest()); - private static final ListAppender jschAppender = getListAppender(JSch.class); - private static final ListAppender sshdAppender = - getListAppender(AlgorithmsIT.class); @TempDir public Path tmpDir; private Path in; private Path out; private String hash; private Slf4jLogConsumer sshdLogConsumer; + private TestLogger jschLogger = TestLoggerFactory.getTestLogger(JSch.class); + private TestLogger sshdLogger = TestLoggerFactory.getTestLogger(getClass()); @Container public GenericContainer sshd = @@ -86,7 +83,7 @@ public static void beforeAll() { @BeforeEach public void beforeEach() throws IOException { if (sshdLogConsumer == null) { - sshdLogConsumer = new Slf4jLogConsumer(LoggerFactory.getLogger(Algorithms2IT.class)); + sshdLogConsumer = new Slf4jLogConsumer(sshdLogger); sshd.followOutput(sshdLogConsumer); } @@ -102,18 +99,8 @@ public void beforeEach() throws IOException { } hash = sha256sum.digestAsHex(in); - jschAppender.list.clear(); - sshdAppender.list.clear(); - jschAppender.start(); - sshdAppender.start(); - } - - @AfterEach - public void afterEach() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.clear(); - sshdAppender.list.clear(); + jschLogger.clearAll(); + sshdLogger.clearAll(); } @Test @@ -199,7 +186,8 @@ public void testDHGEXSizes(String kex, String size) throws Exception { doSftp(session, true); String expectedKex = String.format("kex: algorithm: %s.*", kex); - String expectedSizes = String.format("SSH_MSG_KEX_DH_GEX_REQUEST\\(%s<%s<%s\\) sent", size, size, size); + String expectedSizes = + String.format("SSH_MSG_KEX_DH_GEX_REQUEST\\(%s<%s<%s\\) sent", size, size, size); checkLogs(expectedKex); checkLogs(expectedSizes); } @@ -265,11 +253,7 @@ public void testRSA(String keyType) throws Exception { } @ParameterizedTest - @CsvSource( - value = { - "seed-cbc@ssh.com,none", - "seed-cbc@ssh.com,zlib@openssh.com" - }) + @CsvSource(value = {"seed-cbc@ssh.com,none", "seed-cbc@ssh.com,zlib@openssh.com"}) public void testCiphers(String cipher, String compression) throws Exception { JSch ssh = createRSAIdentity(); Session session = createSession(ssh); @@ -390,8 +374,6 @@ private void doSftp(Session session, boolean debugException) throws Exception { sftp.get("/root/test", out.toString()); sftp.disconnect(); session.disconnect(); - jschAppender.stop(); - sshdAppender.stop(); } catch (Exception e) { if (debugException) { printInfo(); @@ -403,20 +385,22 @@ private void doSftp(Session session, boolean debugException) throws Exception { assertEquals(hash, sha256sum.digestAsHex(out)); } - private static void printInfo() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); - sshdAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); + private void printInfo() { + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); + sshdLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); System.out.println(""); System.out.println(""); System.out.println(""); } - private static void checkLogs(String expected) { + private void checkLogs(String expected) { Optional actualJsch = - jschAppender.list.stream() - .map(ILoggingEvent::getFormattedMessage) + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) .filter(msg -> msg.matches(expected)) .findFirst(); try { @@ -430,11 +414,4 @@ private static void checkLogs(String expected) { private String getResourceFile(String fileName) { return ResourceUtil.getResourceFile(getClass(), fileName); } - - private static ListAppender getListAppender(Class clazz) { - Logger logger = (Logger) LoggerFactory.getLogger(clazz); - ListAppender listAppender = new ListAppender2<>(); - logger.addAppender(listAppender); - return listAppender; - } } diff --git a/src/test/java/com/jcraft/jsch/Algorithms3IT.java b/src/test/java/com/jcraft/jsch/Algorithms3IT.java index a2560e88..68f24943 100644 --- a/src/test/java/com/jcraft/jsch/Algorithms3IT.java +++ b/src/test/java/com/jcraft/jsch/Algorithms3IT.java @@ -5,9 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; @@ -17,13 +17,11 @@ import java.util.Optional; import java.util.Random; import org.apache.commons.codec.digest.DigestUtils; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -35,15 +33,14 @@ public class Algorithms3IT { private static final int timeout = 2000; private static final DigestUtils sha256sum = new DigestUtils(DigestUtils.getSha256Digest()); - private static final ListAppender jschAppender = getListAppender(JSch.class); - private static final ListAppender sshdAppender = - getListAppender(AlgorithmsIT.class); @TempDir public Path tmpDir; private Path in; private Path out; private String hash; private Slf4jLogConsumer sshdLogConsumer; + private TestLogger jschLogger = TestLoggerFactory.getTestLogger(JSch.class); + private TestLogger sshdLogger = TestLoggerFactory.getTestLogger(getClass()); @Container public GenericContainer sshd = @@ -62,7 +59,7 @@ public static void beforeAll() { @BeforeEach public void beforeEach() throws IOException { if (sshdLogConsumer == null) { - sshdLogConsumer = new Slf4jLogConsumer(LoggerFactory.getLogger(Algorithms3IT.class)); + sshdLogConsumer = new Slf4jLogConsumer(sshdLogger); sshd.followOutput(sshdLogConsumer); } @@ -78,18 +75,8 @@ public void beforeEach() throws IOException { } hash = sha256sum.digestAsHex(in); - jschAppender.list.clear(); - sshdAppender.list.clear(); - jschAppender.start(); - sshdAppender.start(); - } - - @AfterEach - public void afterEach() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.clear(); - sshdAppender.list.clear(); + jschLogger.clearAll(); + sshdLogger.clearAll(); } @ParameterizedTest @@ -146,8 +133,6 @@ private void doSftp(Session session, boolean debugException) throws Exception { sftp.get("/root/test", out.toString()); sftp.disconnect(); session.disconnect(); - jschAppender.stop(); - sshdAppender.stop(); } catch (Exception e) { if (debugException) { printInfo(); @@ -159,20 +144,22 @@ private void doSftp(Session session, boolean debugException) throws Exception { assertEquals(hash, sha256sum.digestAsHex(out)); } - private static void printInfo() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); - sshdAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); + private void printInfo() { + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); + sshdLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); System.out.println(""); System.out.println(""); System.out.println(""); } - private static void checkLogs(String expected) { + private void checkLogs(String expected) { Optional actualJsch = - jschAppender.list.stream() - .map(ILoggingEvent::getFormattedMessage) + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) .filter(msg -> msg.matches(expected)) .findFirst(); try { @@ -186,11 +173,4 @@ private static void checkLogs(String expected) { private String getResourceFile(String fileName) { return ResourceUtil.getResourceFile(getClass(), fileName); } - - private static ListAppender getListAppender(Class clazz) { - Logger logger = (Logger) LoggerFactory.getLogger(clazz); - ListAppender listAppender = new ListAppender2<>(); - logger.addAppender(listAppender); - return listAppender; - } } diff --git a/src/test/java/com/jcraft/jsch/AlgorithmsIT.java b/src/test/java/com/jcraft/jsch/AlgorithmsIT.java index 09292f0c..26dd9f04 100644 --- a/src/test/java/com/jcraft/jsch/AlgorithmsIT.java +++ b/src/test/java/com/jcraft/jsch/AlgorithmsIT.java @@ -8,9 +8,9 @@ import static org.junit.jupiter.api.condition.JRE.JAVA_11; import static org.junit.jupiter.api.condition.JRE.JAVA_15; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; @@ -21,7 +21,6 @@ import java.util.Optional; import java.util.Random; import org.apache.commons.codec.digest.DigestUtils; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -30,7 +29,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; -import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -42,15 +40,14 @@ public class AlgorithmsIT { private static final int timeout = 2000; private static final DigestUtils sha256sum = new DigestUtils(DigestUtils.getSha256Digest()); - private static final ListAppender jschAppender = getListAppender(JSch.class); - private static final ListAppender sshdAppender = - getListAppender(AlgorithmsIT.class); @TempDir public Path tmpDir; private Path in; private Path out; private String hash; private Slf4jLogConsumer sshdLogConsumer; + private TestLogger jschLogger = TestLoggerFactory.getTestLogger(JSch.class); + private TestLogger sshdLogger = TestLoggerFactory.getTestLogger(getClass()); @Container public GenericContainer sshd = @@ -85,7 +82,7 @@ public static void beforeAll() { @BeforeEach public void beforeEach() throws IOException { if (sshdLogConsumer == null) { - sshdLogConsumer = new Slf4jLogConsumer(LoggerFactory.getLogger(AlgorithmsIT.class)); + sshdLogConsumer = new Slf4jLogConsumer(sshdLogger); sshd.followOutput(sshdLogConsumer); } @@ -101,18 +98,8 @@ public void beforeEach() throws IOException { } hash = sha256sum.digestAsHex(in); - jschAppender.list.clear(); - sshdAppender.list.clear(); - jschAppender.start(); - sshdAppender.start(); - } - - @AfterEach - public void afterEach() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.clear(); - sshdAppender.list.clear(); + jschLogger.clearAll(); + sshdLogger.clearAll(); } @ParameterizedTest @@ -192,7 +179,8 @@ public void testDHGEXSizes(String kex, String size) throws Exception { doSftp(session, true); String expectedKex = String.format("kex: algorithm: %s.*", kex); - String expectedSizes = String.format("SSH_MSG_KEX_DH_GEX_REQUEST\\(%s<%s<%s\\) sent", size, size, size); + String expectedSizes = + String.format("SSH_MSG_KEX_DH_GEX_REQUEST\\(%s<%s<%s\\) sent", size, size, size); checkLogs(expectedKex); checkLogs(expectedSizes); } @@ -554,8 +542,6 @@ private void doSftp(Session session, boolean debugException) throws Exception { sftp.get("/root/test", out.toString()); sftp.disconnect(); session.disconnect(); - jschAppender.stop(); - sshdAppender.stop(); } catch (Exception e) { if (debugException) { printInfo(); @@ -567,26 +553,29 @@ private void doSftp(Session session, boolean debugException) throws Exception { assertEquals(hash, sha256sum.digestAsHex(out)); } - private static void printInfo() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); - sshdAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); + private void printInfo() { + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); + sshdLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); System.out.println(""); System.out.println(""); System.out.println(""); } - private static void checkLogs(String expected) { + private void checkLogs(String expected) { Optional actualJsch = - jschAppender.list.stream() - .map(ILoggingEvent::getFormattedMessage) + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) .filter(msg -> msg.matches(expected)) .findFirst(); - // Skip OpenSSH log checks, as log output from Docker falls behind and these assertions frequently run before they are output + // Skip OpenSSH log checks, as log output from Docker falls behind and these assertions + // frequently run before they are output // Optional actualSshd = - // sshdAppender.list.stream() - // .map(ILoggingEvent::getFormattedMessage) + // sshdLogger.getAllLoggingEvents().stream() + // .map(LoggingEvent::getFormattedMessage) // .filter(msg -> msg.matches("STDERR: debug1: " + expected)) // .findFirst(); try { @@ -601,11 +590,4 @@ private static void checkLogs(String expected) { private String getResourceFile(String fileName) { return ResourceUtil.getResourceFile(getClass(), fileName); } - - private static ListAppender getListAppender(Class clazz) { - Logger logger = (Logger) LoggerFactory.getLogger(clazz); - ListAppender listAppender = new ListAppender2<>(); - logger.addAppender(listAppender); - return listAppender; - } } diff --git a/src/test/java/com/jcraft/jsch/ListAppender2.java b/src/test/java/com/jcraft/jsch/ListAppender2.java deleted file mode 100644 index 2d72b8a2..00000000 --- a/src/test/java/com/jcraft/jsch/ListAppender2.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.jcraft.jsch; - -import ch.qos.logback.core.read.ListAppender; - -public class ListAppender2 extends ListAppender { - - @Override - protected void append(E e) { - // Avoid append messages after appender is stopped to avoid ConcurrentModificationException's - // when examining the List of events. - if (super.started) { - super.append(e); - } - } -} diff --git a/src/test/java/com/jcraft/jsch/OpenSSH74ServerSigAlgsIT.java b/src/test/java/com/jcraft/jsch/OpenSSH74ServerSigAlgsIT.java index f4b83046..cd324dac 100644 --- a/src/test/java/com/jcraft/jsch/OpenSSH74ServerSigAlgsIT.java +++ b/src/test/java/com/jcraft/jsch/OpenSSH74ServerSigAlgsIT.java @@ -5,9 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; @@ -17,13 +17,11 @@ import java.util.Optional; import java.util.Random; import org.apache.commons.codec.digest.DigestUtils; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.io.TempDir; -import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -36,15 +34,14 @@ public class OpenSSH74ServerSigAlgsIT { private static final int timeout = 2000; private static final DigestUtils sha256sum = new DigestUtils(DigestUtils.getSha256Digest()); - private static final ListAppender jschAppender = getListAppender(JSch.class); - private static final ListAppender sshdAppender = - getListAppender(OpenSSH74ServerSigAlgsIT.class); @TempDir public Path tmpDir; private Path in; private Path out; private String hash; private Slf4jLogConsumer sshdLogConsumer; + private TestLogger jschLogger = TestLoggerFactory.getTestLogger(JSch.class); + private TestLogger sshdLogger = TestLoggerFactory.getTestLogger(getClass()); @Container public GenericContainer sshd = @@ -79,7 +76,7 @@ public static void beforeAll() { @BeforeEach public void beforeEach() throws IOException { if (sshdLogConsumer == null) { - sshdLogConsumer = new Slf4jLogConsumer(LoggerFactory.getLogger(OpenSSH74ServerSigAlgsIT.class)); + sshdLogConsumer = new Slf4jLogConsumer(sshdLogger); sshd.followOutput(sshdLogConsumer); } @@ -95,23 +92,14 @@ public void beforeEach() throws IOException { } hash = sha256sum.digestAsHex(in); - jschAppender.list.clear(); - sshdAppender.list.clear(); - jschAppender.start(); - sshdAppender.start(); - } - - @AfterEach - public void afterEach() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.clear(); - sshdAppender.list.clear(); + jschLogger.clearAll(); + sshdLogger.clearAll(); } @Test public void testServerSigAlgs() throws Exception { - String algos = "ssh-rsa-sha512@ssh.com,ssh-rsa-sha384@ssh.com,ssh-rsa-sha256@ssh.com,ssh-rsa-sha224@ssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa"; + String algos = + "ssh-rsa-sha512@ssh.com,ssh-rsa-sha384@ssh.com,ssh-rsa-sha256@ssh.com,ssh-rsa-sha224@ssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa"; JSch ssh = createRSAIdentity(); Session session = createSession(ssh); session.setConfig("PubkeyAcceptedAlgorithms", algos); @@ -120,10 +108,14 @@ public void testServerSigAlgs() throws Exception { String expectedKex = "kex: host key algorithm: rsa-sha2-512"; String expectedExtInfo = "SSH_MSG_EXT_INFO received"; - String expectedServerSigAlgs = "server-sig-algs="; - String expectedOpenSSH74Bug = "OpenSSH 7.4 detected: adding rsa-sha2-256 & rsa-sha2-512 to server-sig-algs"; - String expectedPubkeysKnown = "PubkeyAcceptedAlgorithms in server-sig-algs = \\[rsa-sha2-512, rsa-sha2-256, ssh-rsa\\]"; - String expectedPubkeysUnknown = "PubkeyAcceptedAlgorithms not in server-sig-algs = \\[ssh-rsa-sha512@ssh.com, ssh-rsa-sha384@ssh.com, ssh-rsa-sha256@ssh.com, ssh-rsa-sha224@ssh.com\\]"; + String expectedServerSigAlgs = + "server-sig-algs="; + String expectedOpenSSH74Bug = + "OpenSSH 7.4 detected: adding rsa-sha2-256 & rsa-sha2-512 to server-sig-algs"; + String expectedPubkeysKnown = + "PubkeyAcceptedAlgorithms in server-sig-algs = \\[rsa-sha2-512, rsa-sha2-256, ssh-rsa\\]"; + String expectedPubkeysUnknown = + "PubkeyAcceptedAlgorithms not in server-sig-algs = \\[ssh-rsa-sha512@ssh.com, ssh-rsa-sha384@ssh.com, ssh-rsa-sha256@ssh.com, ssh-rsa-sha224@ssh.com\\]"; String expectedPreauth = "rsa-sha2-512 preauth success"; String expectedAuth = "rsa-sha2-512 auth success"; checkLogs(expectedKex); @@ -168,8 +160,6 @@ private void doSftp(Session session, boolean debugException) throws Exception { sftp.get("/root/test", out.toString()); sftp.disconnect(); session.disconnect(); - jschAppender.stop(); - sshdAppender.stop(); } catch (Exception e) { if (debugException) { printInfo(); @@ -181,20 +171,22 @@ private void doSftp(Session session, boolean debugException) throws Exception { assertEquals(hash, sha256sum.digestAsHex(out)); } - private static void printInfo() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); - sshdAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); + private void printInfo() { + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); + sshdLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); System.out.println(""); System.out.println(""); System.out.println(""); } - private static void checkLogs(String expected) { + private void checkLogs(String expected) { Optional actualJsch = - jschAppender.list.stream() - .map(ILoggingEvent::getFormattedMessage) + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) .filter(msg -> msg.matches(expected)) .findFirst(); try { @@ -208,11 +200,4 @@ private static void checkLogs(String expected) { private String getResourceFile(String fileName) { return ResourceUtil.getResourceFile(getClass(), fileName); } - - private static ListAppender getListAppender(Class clazz) { - Logger logger = (Logger) LoggerFactory.getLogger(clazz); - ListAppender listAppender = new ListAppender2<>(); - logger.addAppender(listAppender); - return listAppender; - } } diff --git a/src/test/java/com/jcraft/jsch/SSHAgentIT.java b/src/test/java/com/jcraft/jsch/SSHAgentIT.java index 31daa774..7b56e332 100644 --- a/src/test/java/com/jcraft/jsch/SSHAgentIT.java +++ b/src/test/java/com/jcraft/jsch/SSHAgentIT.java @@ -8,9 +8,9 @@ import static org.junit.jupiter.api.condition.OS.LINUX; import static org.testcontainers.containers.BindMode.READ_WRITE; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; import com.sun.jna.platform.unix.LibC; import java.io.IOException; import java.io.OutputStream; @@ -30,7 +30,6 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -43,9 +42,6 @@ public class SSHAgentIT { private static final int timeout = 2000; private static final DigestUtils sha256sum = new DigestUtils(DigestUtils.getSha256Digest()); - private static final ListAppender jschAppender = getListAppender(JSch.class); - private static final ListAppender sshdAppender = getListAppender(SSHAgentIT.class); - private static final ListAppender sshAgentAppender = getListAppender(AgentProxy.class); @TempDir public static Path tmpDir; private static String testuid; private static String testgid; @@ -56,6 +52,9 @@ public class SSHAgentIT { private String hash; private Slf4jLogConsumer sshdLogConsumer; private Slf4jLogConsumer sshAgentLogConsumer; + private TestLogger jschLogger = TestLoggerFactory.getTestLogger(JSch.class); + private TestLogger sshdLogger = TestLoggerFactory.getTestLogger(getClass()); + private TestLogger sshAgentLogger = TestLoggerFactory.getTestLogger(AgentProxy.class); @Container public GenericContainer sshd = @@ -104,12 +103,12 @@ public static void beforeAll() throws IOException { @BeforeEach public void beforeEach() throws IOException { if (sshdLogConsumer == null) { - sshdLogConsumer = new Slf4jLogConsumer(LoggerFactory.getLogger(SSHAgentIT.class)); + sshdLogConsumer = new Slf4jLogConsumer(sshdLogger); sshd.followOutput(sshdLogConsumer); } if (sshAgentLogConsumer == null) { - sshAgentLogConsumer = new Slf4jLogConsumer(LoggerFactory.getLogger(AgentProxy.class)); + sshAgentLogConsumer = new Slf4jLogConsumer(sshAgentLogger); sshAgent.followOutput(sshAgentLogConsumer); } @@ -126,23 +125,13 @@ public void beforeEach() throws IOException { } hash = sha256sum.digestAsHex(in); - jschAppender.list.clear(); - sshdAppender.list.clear(); - sshAgentAppender.list.clear(); - jschAppender.start(); - sshdAppender.start(); - sshAgentAppender.start(); + jschLogger.clearAll(); + sshdLogger.clearAll(); + sshAgentLogger.clearAll(); } @AfterEach public void afterEach() { - jschAppender.stop(); - sshdAppender.stop(); - sshAgentAppender.stop(); - jschAppender.list.clear(); - sshdAppender.list.clear(); - sshAgentAppender.list.clear(); - try { Files.deleteIfExists(sshAgentSock); } catch (IOException ignore) { @@ -277,7 +266,8 @@ public void testDSAUnixDomainSocketFactory() throws Exception { } private JSch createRSAIdentity(USocketFactory factory) throws Exception { - IdentityRepository ir = new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); + IdentityRepository ir = + new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); assertTrue(ir.getIdentities().isEmpty(), "ssh-agent empty"); HostKey hostKey = readHostKey(getResourceFile("docker/ssh_host_rsa_key.pub")); @@ -290,7 +280,8 @@ private JSch createRSAIdentity(USocketFactory factory) throws Exception { } private JSch createECDSA256Identity(USocketFactory factory) throws Exception { - IdentityRepository ir = new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); + IdentityRepository ir = + new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); assertTrue(ir.getIdentities().isEmpty(), "ssh-agent empty"); HostKey hostKey = readHostKey(getResourceFile("docker/ssh_host_rsa_key.pub")); @@ -303,7 +294,8 @@ private JSch createECDSA256Identity(USocketFactory factory) throws Exception { } private JSch createECDSA384Identity(USocketFactory factory) throws Exception { - IdentityRepository ir = new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); + IdentityRepository ir = + new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); assertTrue(ir.getIdentities().isEmpty(), "ssh-agent empty"); HostKey hostKey = readHostKey(getResourceFile("docker/ssh_host_rsa_key.pub")); @@ -317,7 +309,8 @@ private JSch createECDSA384Identity(USocketFactory factory) throws Exception { } private JSch createECDSA521Identity(USocketFactory factory) throws Exception { - IdentityRepository ir = new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); + IdentityRepository ir = + new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); assertTrue(ir.getIdentities().isEmpty(), "ssh-agent empty"); HostKey hostKey = readHostKey(getResourceFile("docker/ssh_host_rsa_key.pub")); @@ -331,7 +324,8 @@ private JSch createECDSA521Identity(USocketFactory factory) throws Exception { } private JSch createDSAIdentity(USocketFactory factory) throws Exception { - IdentityRepository ir = new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); + IdentityRepository ir = + new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); assertTrue(ir.getIdentities().isEmpty(), "ssh-agent empty"); HostKey hostKey = readHostKey(getResourceFile("docker/ssh_host_rsa_key.pub")); @@ -344,7 +338,8 @@ private JSch createDSAIdentity(USocketFactory factory) throws Exception { } private JSch createEd25519Identity(USocketFactory factory) throws Exception { - IdentityRepository ir = new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); + IdentityRepository ir = + new AgentIdentityRepository(new SSHAgentConnector(factory, sshAgentSock)); assertTrue(ir.getIdentities().isEmpty(), "ssh-agent empty"); HostKey hostKey = readHostKey(getResourceFile("docker/ssh_host_rsa_key.pub")); @@ -381,9 +376,6 @@ private void doSftp(Session session, boolean debugException) throws Exception { sftp.get("/root/test", out.toString()); sftp.disconnect(); session.disconnect(); - jschAppender.stop(); - sshdAppender.stop(); - sshAgentAppender.stop(); } catch (Exception e) { if (debugException) { printInfo(); @@ -395,13 +387,16 @@ private void doSftp(Session session, boolean debugException) throws Exception { assertEquals(hash, sha256sum.digestAsHex(out)); } - private static void printInfo() { - jschAppender.stop(); - sshdAppender.stop(); - sshAgentAppender.stop(); - jschAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); - sshdAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); - sshAgentAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); + private void printInfo() { + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); + sshdLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); + sshAgentLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); System.out.println(""); System.out.println(""); System.out.println(""); @@ -410,11 +405,4 @@ private static void printInfo() { private String getResourceFile(String fileName) { return ResourceUtil.getResourceFile(getClass(), fileName); } - - private static ListAppender getListAppender(Class clazz) { - Logger logger = (Logger) LoggerFactory.getLogger(clazz); - ListAppender listAppender = new ListAppender2<>(); - logger.addAppender(listAppender); - return listAppender; - } } diff --git a/src/test/java/com/jcraft/jsch/ServerSigAlgsIT.java b/src/test/java/com/jcraft/jsch/ServerSigAlgsIT.java index 095d9789..13e5392a 100644 --- a/src/test/java/com/jcraft/jsch/ServerSigAlgsIT.java +++ b/src/test/java/com/jcraft/jsch/ServerSigAlgsIT.java @@ -5,9 +5,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.read.ListAppender; +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; @@ -17,12 +17,10 @@ import java.util.Optional; import java.util.Random; import org.apache.commons.codec.digest.DigestUtils; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -34,15 +32,14 @@ public class ServerSigAlgsIT { private static final int timeout = 2000; private static final DigestUtils sha256sum = new DigestUtils(DigestUtils.getSha256Digest()); - private static final ListAppender jschAppender = getListAppender(JSch.class); - private static final ListAppender sshdAppender = - getListAppender(ServerSigAlgsIT.class); @TempDir public Path tmpDir; private Path in; private Path out; private String hash; private Slf4jLogConsumer sshdLogConsumer; + private TestLogger jschLogger = TestLoggerFactory.getTestLogger(JSch.class); + private TestLogger sshdLogger = TestLoggerFactory.getTestLogger(getClass()); @Container public GenericContainer sshd = @@ -77,7 +74,7 @@ public static void beforeAll() { @BeforeEach public void beforeEach() throws IOException { if (sshdLogConsumer == null) { - sshdLogConsumer = new Slf4jLogConsumer(LoggerFactory.getLogger(ServerSigAlgsIT.class)); + sshdLogConsumer = new Slf4jLogConsumer(sshdLogger); sshd.followOutput(sshdLogConsumer); } @@ -93,23 +90,14 @@ public void beforeEach() throws IOException { } hash = sha256sum.digestAsHex(in); - jschAppender.list.clear(); - sshdAppender.list.clear(); - jschAppender.start(); - sshdAppender.start(); - } - - @AfterEach - public void afterEach() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.clear(); - sshdAppender.list.clear(); + jschLogger.clearAll(); + sshdLogger.clearAll(); } @Test public void testServerSigAlgs() throws Exception { - String algos = "ssh-rsa-sha512@ssh.com,ssh-rsa-sha384@ssh.com,ssh-rsa-sha256@ssh.com,ssh-rsa-sha224@ssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa"; + String algos = + "ssh-rsa-sha512@ssh.com,ssh-rsa-sha384@ssh.com,ssh-rsa-sha256@ssh.com,ssh-rsa-sha224@ssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa"; JSch ssh = createRSAIdentity(); Session session = createSession(ssh); session.setConfig("PubkeyAcceptedAlgorithms", algos); @@ -118,9 +106,12 @@ public void testServerSigAlgs() throws Exception { String expectedKex = "kex: host key algorithm: rsa-sha2-512"; String expectedExtInfo = "SSH_MSG_EXT_INFO received"; - String expectedServerSigAlgs = "server-sig-algs="; - String expectedPubkeysKnown = "PubkeyAcceptedAlgorithms in server-sig-algs = \\[rsa-sha2-512, rsa-sha2-256, ssh-rsa\\]"; - String expectedPubkeysUnknown = "PubkeyAcceptedAlgorithms not in server-sig-algs = \\[ssh-rsa-sha512@ssh.com, ssh-rsa-sha384@ssh.com, ssh-rsa-sha256@ssh.com, ssh-rsa-sha224@ssh.com\\]"; + String expectedServerSigAlgs = + "server-sig-algs="; + String expectedPubkeysKnown = + "PubkeyAcceptedAlgorithms in server-sig-algs = \\[rsa-sha2-512, rsa-sha2-256, ssh-rsa\\]"; + String expectedPubkeysUnknown = + "PubkeyAcceptedAlgorithms not in server-sig-algs = \\[ssh-rsa-sha512@ssh.com, ssh-rsa-sha384@ssh.com, ssh-rsa-sha256@ssh.com, ssh-rsa-sha224@ssh.com\\]"; String expectedPreauth = "rsa-sha2-512 preauth success"; String expectedAuth = "rsa-sha2-512 auth success"; checkLogs(expectedKex); @@ -134,7 +125,8 @@ public void testServerSigAlgs() throws Exception { @Test public void testNoServerSigAlgs() throws Exception { - String algos = "ssh-rsa-sha512@ssh.com,ssh-rsa-sha384@ssh.com,ssh-rsa-sha256@ssh.com,ssh-rsa-sha224@ssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa"; + String algos = + "ssh-rsa-sha512@ssh.com,ssh-rsa-sha384@ssh.com,ssh-rsa-sha256@ssh.com,ssh-rsa-sha224@ssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa"; JSch ssh = createRSAIdentity(); Session session = createSession(ssh); session.setConfig("enable_server_sig_algs", "no"); @@ -143,7 +135,8 @@ public void testNoServerSigAlgs() throws Exception { doSftp(session, true); String expectedKex = "kex: host key algorithm: rsa-sha2-512"; - String expectedPubkeysNoServerSigs = String.format("No server-sig-algs found, using PubkeyAcceptedAlgorithms = %s", algos); + String expectedPubkeysNoServerSigs = + String.format("No server-sig-algs found, using PubkeyAcceptedAlgorithms = %s", algos); String expectedPreauthFail1 = "ssh-rsa-sha512@ssh.com preauth failure"; String expectedPreauthFail2 = "ssh-rsa-sha384@ssh.com preauth failure"; String expectedPreauthFail3 = "ssh-rsa-sha256@ssh.com preauth failure"; @@ -191,8 +184,6 @@ private void doSftp(Session session, boolean debugException) throws Exception { sftp.get("/root/test", out.toString()); sftp.disconnect(); session.disconnect(); - jschAppender.stop(); - sshdAppender.stop(); } catch (Exception e) { if (debugException) { printInfo(); @@ -204,20 +195,22 @@ private void doSftp(Session session, boolean debugException) throws Exception { assertEquals(hash, sha256sum.digestAsHex(out)); } - private static void printInfo() { - jschAppender.stop(); - sshdAppender.stop(); - jschAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); - sshdAppender.list.stream().map(ILoggingEvent::getFormattedMessage).forEach(System.out::println); + private void printInfo() { + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); + sshdLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) + .forEach(System.out::println); System.out.println(""); System.out.println(""); System.out.println(""); } - private static void checkLogs(String expected) { + private void checkLogs(String expected) { Optional actualJsch = - jschAppender.list.stream() - .map(ILoggingEvent::getFormattedMessage) + jschLogger.getAllLoggingEvents().stream() + .map(LoggingEvent::getFormattedMessage) .filter(msg -> msg.matches(expected)) .findFirst(); try { @@ -231,11 +224,4 @@ private static void checkLogs(String expected) { private String getResourceFile(String fileName) { return ResourceUtil.getResourceFile(getClass(), fileName); } - - private static ListAppender getListAppender(Class clazz) { - Logger logger = (Logger) LoggerFactory.getLogger(clazz); - ListAppender listAppender = new ListAppender2<>(); - logger.addAppender(listAppender); - return listAppender; - } } diff --git a/src/test/java/com/jcraft/jsch/Slf4jLoggerTest.java b/src/test/java/com/jcraft/jsch/Slf4jLoggerTest.java index 1e410b9a..d06ad8c8 100644 --- a/src/test/java/com/jcraft/jsch/Slf4jLoggerTest.java +++ b/src/test/java/com/jcraft/jsch/Slf4jLoggerTest.java @@ -2,93 +2,79 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.LinkedList; +import static uk.org.lidalia.slf4jext.ConventionalLevelHierarchy.DEBUG_LEVELS; +import static uk.org.lidalia.slf4jext.ConventionalLevelHierarchy.ERROR_LEVELS; +import static uk.org.lidalia.slf4jext.ConventionalLevelHierarchy.INFO_LEVELS; +import static uk.org.lidalia.slf4jext.ConventionalLevelHierarchy.OFF_LEVELS; +import static uk.org.lidalia.slf4jext.ConventionalLevelHierarchy.TRACE_LEVELS; +import static uk.org.lidalia.slf4jext.ConventionalLevelHierarchy.WARN_LEVELS; + +import com.github.valfirst.slf4jtest.LoggingEvent; +import com.github.valfirst.slf4jtest.TestLogger; +import com.github.valfirst.slf4jtest.TestLoggerFactory; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.pattern.ThrowableProxyConverter; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.classic.spi.IThrowableProxy; -import ch.qos.logback.core.AppenderBase; class Slf4jLoggerTest { - private LinkedList messages; private Exception testException = new Exception("dummy exception"); - private ThrowableProxyConverter tpc = new ThrowableProxyConverter(); + private TestLogger logger = TestLoggerFactory.getTestLogger(getClass()); @BeforeEach void resetLogger() { - Logger logger = LoggerFactory.getLogger(getClass()); - assertNotNull(logger, "logger should not be null"); - assertEquals("ch.qos.logback.classic.Logger", logger.getClass().getName(), "we need logback as backend for slf4j to test"); - ch.qos.logback.classic.Logger lbLogger = (ch.qos.logback.classic.Logger) logger; - lbLogger.iteratorForAppenders().forEachRemaining(lbLogger::detachAppender); - messages = new LinkedList<>(); - - tpc.start(); + logger.clearAll(); } - + @Test void testIsEnabled() { - LoggerContext ct = (LoggerContext) LoggerFactory.getILoggerFactory(); - ch.qos.logback.classic.Logger lbLogger = ct.getLogger(getClass()); - lbLogger.addAppender(new TestAppender(messages)); - lbLogger.setLevel(Level.ALL); - Slf4jLogger sl = new Slf4jLogger(lbLogger); - - assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.DEBUG), "debug should be enabled"); - assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.ERROR), "error should be enabled"); - assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.FATAL), "fatal should be enabled"); - assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.INFO), "info should be enabled"); - assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.WARN), "warn should be enabled"); - assertTrue(sl.isEnabled(-1), "trace should be enabled"); - - lbLogger.setLevel(Level.DEBUG); + Slf4jLogger sl = new Slf4jLogger(logger); + + logger.setEnabledLevelsForAllThreads(DEBUG_LEVELS); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.DEBUG), "debug should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.ERROR), "error should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.FATAL), "fatal should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.INFO), "info should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.WARN), "warn should be enabled"); assertFalse(sl.isEnabled(-1), "trace should not be enabled"); - - lbLogger.setLevel(Level.ERROR); + + logger.setEnabledLevelsForAllThreads(ERROR_LEVELS); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.DEBUG), "debug should not be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.ERROR), "error should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.FATAL), "fatal should be enabled"); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.INFO), "info should not be enabled"); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.WARN), "warn should not be enabled"); assertFalse(sl.isEnabled(-1), "trace should not be enabled"); - - lbLogger.setLevel(Level.INFO); + + logger.setEnabledLevelsForAllThreads(INFO_LEVELS); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.DEBUG), "debug should not be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.ERROR), "error should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.FATAL), "fatal should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.INFO), "info should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.WARN), "warn should be enabled"); assertFalse(sl.isEnabled(-1), "trace should not be enabled"); - - lbLogger.setLevel(Level.OFF); + + logger.setEnabledLevelsForAllThreads(OFF_LEVELS); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.DEBUG), "debug should not be enabled"); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.ERROR), "error should not be enabled"); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.FATAL), "fatal should not be enabled"); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.INFO), "info should not be enabled"); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.WARN), "warn should not be enabled"); assertFalse(sl.isEnabled(-1), "trace should not be enabled"); - - lbLogger.setLevel(Level.TRACE); + + logger.setEnabledLevelsForAllThreads(TRACE_LEVELS); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.DEBUG), "debug should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.ERROR), "error should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.FATAL), "fatal should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.INFO), "info should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.WARN), "warn should be enabled"); assertTrue(sl.isEnabled(-1), "trace should be enabled"); - - lbLogger.setLevel(Level.WARN); + + logger.setEnabledLevelsForAllThreads(WARN_LEVELS); assertFalse(sl.isEnabled(com.jcraft.jsch.Logger.DEBUG), "debug should not be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.ERROR), "error should be enabled"); assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.FATAL), "fatal should be enabled"); @@ -96,60 +82,50 @@ void testIsEnabled() { assertTrue(sl.isEnabled(com.jcraft.jsch.Logger.WARN), "warn should be enabled"); assertFalse(sl.isEnabled(-1), "trace should not be enabled"); } - + @Test void testLogging() { - LoggerContext ct = (LoggerContext) LoggerFactory.getILoggerFactory(); - ch.qos.logback.classic.Logger lbLogger = ct.getLogger(getClass()); - TestAppender app = new TestAppender(messages); - app.setContext(ct); - app.start(); - lbLogger.addAppender(app); - lbLogger.setAdditive(false); - lbLogger.setLevel(Level.ALL); - Slf4jLogger sl = new Slf4jLogger(lbLogger); - + Slf4jLogger sl = new Slf4jLogger(logger); + + List expectedMessages = + Arrays.asList("debug message", "debug message with null cause", "debug message with cause"); + List> expectedExceptions = + Arrays.asList(Optional.empty(), Optional.ofNullable(null), Optional.of(testException)); + + logger.setEnabledLevelsForAllThreads(TRACE_LEVELS); sl.log(-1, "debug message"); sl.log(-1, "debug message with null cause", null); sl.log(-1, "debug message with cause", testException); - assertEquals("TRACE: debug message (without cause)\r\n" + - "TRACE: debug message with null cause (without cause)\r\n" + - "TRACE: debug message with cause (with cause java.lang.Exception, dummy exception)", LoggerTest.getMessageLines(messages), "mismatch in logged messages"); + checkMessages(expectedMessages, expectedExceptions); + + logger.setEnabledLevelsForAllThreads(TRACE_LEVELS); sl.log(com.jcraft.jsch.Logger.FATAL, "debug message"); sl.log(com.jcraft.jsch.Logger.FATAL, "debug message with null cause", null); sl.log(com.jcraft.jsch.Logger.FATAL, "debug message with cause", testException); - assertEquals("ERROR: debug message (without cause)\r\n" + - "ERROR: debug message with null cause (without cause)\r\n" + - "ERROR: debug message with cause (with cause java.lang.Exception, dummy exception)", LoggerTest.getMessageLines(messages), "mismatch in logged messages"); - - lbLogger.setLevel(Level.ERROR); + checkMessages(expectedMessages, expectedExceptions); + + logger.setEnabledLevelsForAllThreads(ERROR_LEVELS); sl.log(-1, "debug message"); sl.log(-1, "debug message with null cause", null); sl.log(-1, "debug message with cause", testException); - assertEquals("", LoggerTest.getMessageLines(messages), "mismatch in logged messages"); + checkMessages(Collections.emptyList(), Collections.emptyList()); + + logger.setEnabledLevelsForAllThreads(ERROR_LEVELS); sl.log(com.jcraft.jsch.Logger.FATAL, "debug message"); sl.log(com.jcraft.jsch.Logger.FATAL, "debug message with null cause", null); sl.log(com.jcraft.jsch.Logger.FATAL, "debug message with cause", testException); - assertEquals("ERROR: debug message (without cause)\r\n" + - "ERROR: debug message with null cause (without cause)\r\n" + - "ERROR: debug message with cause (with cause java.lang.Exception, dummy exception)", LoggerTest.getMessageLines(messages), "mismatch in logged messages"); + checkMessages(expectedMessages, expectedExceptions); } - - static class TestAppender extends AppenderBase { - private LinkedList messages; - TestAppender(LinkedList messages) { - this.messages = messages; - } - @Override - protected void append(ILoggingEvent eventObject) { - try { - IThrowableProxy thp = eventObject.getThrowableProxy(); - - messages.add(eventObject.getLevel()+ ": " + eventObject.getMessage() + (thp == null ? " (without cause)" : " (with cause " + thp.getClassName() + ", " + thp.getMessage() + ")")); - } - catch(Exception e) { - e.printStackTrace(); - } - } + + private void checkMessages( + List expectedMessages, List> expectedExceptions) { + List events = logger.getAllLoggingEvents(); + logger.clearAll(); + List actualMessages = + events.stream().map(LoggingEvent::getFormattedMessage).collect(Collectors.toList()); + List> actualExceptions = + events.stream().map(LoggingEvent::getThrowable).collect(Collectors.toList()); + assertEquals(expectedMessages, actualMessages, "mismatch in logged messages"); + assertEquals(expectedExceptions, actualExceptions, "mismatch in logged exceptions"); } }