Files
JIMRI/java/test/jmri/util/JUnitAppenderTest.java
2026-06-17 14:00:51 +02:00

364 lines
12 KiB
Java

package jmri.util;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.junit.jupiter.api.*;
import org.slf4j.event.Level;
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.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Tests for the jmri.util.JUnitAppender class.
*
* @author Bob Jacobsen Copyright 2007
*/
public class JUnitAppenderTest {
/**
* If this constant is true, some tests will run that are expected to log
* output; this output has to be checked by hand.
*/
boolean allTests = false;
@Test
public void testInstance() {
assertNotNull( JUnitAppender.instance(), "Instance exists, e.g. initialization for tests OK");
}
@Test
public void testExpectedErrorMessage() {
String msg = "Message for testing";
log.error(msg);
JUnitAppender.assertErrorMessage(msg);
}
@Test
public void testCheckForMessageError() {
String msg = "Message for testing to find";
log.error("Dummy");
assertNull(JUnitAppender.checkForMessage(msg));
log.error(msg);
assertNotNull(JUnitAppender.checkForMessage(msg));
// second not match
assertNull(JUnitAppender.checkForMessage(msg));
}
@Test
public void testCheckForMessageWarn() {
String msg = "Message for testing to find";
log.error("Dummy");
assertNull(JUnitAppender.checkForMessage(msg));
log.warn(msg);
assertNotNull(JUnitAppender.checkForMessage(msg));
assertNull(JUnitAppender.checkForMessage(msg));
}
@Test
public void testCheckForMessageInfo() {
String msg = "Message for testing to find";
log.error("Dummy");
assertNull(JUnitAppender.checkForMessage(msg));
log.info(msg);
assertNotNull(JUnitAppender.checkForMessage(msg));
assertNull(JUnitAppender.checkForMessage(msg));
}
@Test
public void testCheckForMessageStartError() {
String msg = "Message for testing to find";
log.error("Dummy");
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
log.error("{} foo", msg);
assertNotNull(JUnitAppender.checkForMessageStartingWith(msg));
// second not match
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
// check exact match
log.warn(msg);
assertNotNull(JUnitAppender.checkForMessageStartingWith(msg));
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
}
@Test
public void testCheckForMessageStartWarn() {
String msg = "Message for testing to find";
log.error("Dummy");
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
log.warn("{} foo", msg);
assertNotNull(JUnitAppender.checkForMessageStartingWith(msg));
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
log.warn(msg);
assertNotNull(JUnitAppender.checkForMessageStartingWith(msg));
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
}
@Test
public void testCheckForMessageStartInfo() {
String msg = "Message for testing to find";
log.error("Dummy");
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
log.info("{} foo", msg);
assertNotNull(JUnitAppender.checkForMessageStartingWith(msg));
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
log.info(msg);
assertNotNull(JUnitAppender.checkForMessageStartingWith(msg));
assertNull(JUnitAppender.checkForMessageStartingWith(msg));
}
// this is testing how the end of a test works, so continues
// into the tearDown routine
private boolean testingUnexpected = false;
private boolean cacheFatal;
private boolean cacheError;
private boolean cacheWarn;
private boolean cacheInfo;
@Test
public void testUnexpectedCheck() {
testingUnexpected = true;
// cache values
cacheFatal = JUnitAppender.unexpectedFatalSeen;
cacheError = JUnitAppender.unexpectedErrorSeen;
cacheWarn = JUnitAppender.unexpectedWarnSeen;
cacheInfo = JUnitAppender.unexpectedInfoSeen;
JUnitAppender.setUnexpectedFatalSeen(false);
JUnitAppender.setUnexpectedErrorSeen(false);
JUnitAppender.setUnexpectedWarnSeen(false);
JUnitAppender.setUnexpectedInfoSeen(false);
assertFalse( JUnitAppender.unexpectedMessageSeen(Level.ERROR), "initial ERROR");
assertFalse( JUnitAppender.unexpectedMessageSeen(Level.WARN), "initial WARN");
assertFalse( JUnitAppender.unexpectedMessageSeen(Level.INFO), "initial INFO");
String msg = "Expected WARN message for testing";
log.warn(msg);
JUnitAppender.assertWarnMessage(msg);
msg = "This INFO message was emitted to test the entire logging chain, please don't remove";
log.info(msg);
}
@Test
public void testExpectedWarnMessage() {
String msg = "Message for testing";
log.warn(msg);
JUnitAppender.assertWarnMessage(msg);
}
@Test
public void testExpectedMessageAsError() {
String msg = "Message for testing";
log.error(msg);
JUnitAppender.assertMessage(msg);
}
@Test
public void testExpectedMessageAsWarn() {
String msg = "Message for testing";
log.warn(msg);
JUnitAppender.assertMessage(msg);
}
@Test
public void testExpectedMessageAsInfo() {
setLogLevelTo( org.apache.logging.log4j.Level.INFO);
assertTrue(log.isInfoEnabled(), "log set to INFO level");
String msg = "Message for testing";
log.info(msg);
JUnitAppender.assertMessage(msg);
}
@Test
public void testExpectedMessageAsDebug() {
setLogLevelTo(org.apache.logging.log4j.Level.DEBUG);
assertTrue(log.isDebugEnabled(), "log set to DEBUG level");
String msg = "testExpectedMessageAsDebug";
log.debug(msg);
JUnitAppender.assertMessage(msg);
}
@Test
public void testIgnoreLowerBeforeExpectedWarnMessage() {
log.debug("this is a DEBUG, should still pass");
log.info("this is an INFO, should still pass");
log.trace("this is a TRACE, should still pass");
String msg = "Message for testing";
log.warn(msg);
JUnitAppender.assertWarnMessage(msg);
}
@Test
public void testExpectedWarnAfterDebugMessage() {
String msg = "Message for testing";
log.debug("debug to skip");
log.warn(msg);
JUnitAppender.assertWarnMessage(msg);
}
@Test
public void testUnexpectedMessage() {
if (allTests) {
String msg = "Message should appear in log";
log.warn(msg);
}
}
@Test
public void testClearBacklogDefaultNone() {
assertEquals(0,JUnitAppender.clearBacklog());
}
@Test
public void testClearBacklogDefaultWarn() {
log.warn("warn message");
assertEquals(1,JUnitAppender.clearBacklog());
assertEquals(0,JUnitAppender.clearBacklog());
}
@Test
public void testClearBacklogDefaultError() {
log.error("error message");
assertEquals(1,JUnitAppender.clearBacklog());
assertEquals(0,JUnitAppender.clearBacklog());
}
@Test
public void testClearBacklogDefaultInfo() {
log.info("info message");
assertEquals(0,JUnitAppender.clearBacklog());
}
@Test
public void testClearBacklogDefaultMultiple() {
log.info("info 1");
log.warn("warn 1");
log.info("info 2");
assertEquals(1,JUnitAppender.clearBacklog());
assertEquals(0,JUnitAppender.clearBacklog());
}
@Test
public void testClearBacklogAtInfoWithInfo() {
setLogLevelTo( org.apache.logging.log4j.Level.INFO);
Assertions.assertTrue(log.isInfoEnabled());
log.info("info message");
assertEquals(1,JUnitAppender.clearBacklog(Level.INFO));
assertEquals(0,JUnitAppender.clearBacklog(Level.INFO));
}
@Test
public void testClearBacklogAtInfoWithWarn() {
log.warn("warn message");
assertEquals(1,JUnitAppender.clearBacklog(Level.INFO));
assertEquals(0,JUnitAppender.clearBacklog(Level.INFO));
}
@Test
@Disabled("Test requires further development")
public void testSuppressErrorMessage() {
String msg = "Message for testing to find";
log.warn("Dummy");
log.warn(msg);
assertFalse(JUnitAppender.verifyNoBacklog());
JUnitAppender.suppressErrorMessage(msg);
assertTrue(JUnitAppender.verifyNoBacklog());
log.warn("Dummy");
log.warn(msg);
log.warn("Dummy");
assertFalse(JUnitAppender.verifyNoBacklog());
JUnitAppender.suppressErrorMessage(msg);
assertFalse(JUnitAppender.verifyNoBacklog());
log.error("Dummy");
log.warn(msg);
log.warn("Dummy");
assertFalse(JUnitAppender.verifyNoBacklog());
JUnitAppender.suppressErrorMessage(msg);
assertFalse(JUnitAppender.verifyNoBacklog());
}
@Test
public void testAssertNoErrorMessage(){
log.warn("Warn Message");
JUnitAppender.assertNoErrorMessage();
JUnitAppender.assertWarnMessage("Warn Message");
}
@Test
public void testTestLogLevels(){
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
Configuration config = loggerContext.getConfiguration();
assertEquals(org.apache.logging.log4j.Level.WARN, config.getRootLogger().getLevel(),
"Test Root Logger set to WARN");
assertEquals(org.apache.logging.log4j.Level.INFO, originalLevel,
"JUnitAppenderTest set to INFO ( via tests_lcf.xml )");
}
private static void setLogLevelTo( org.apache.logging.log4j.Level newLevel) {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
LoggerConfig loggerConfig = config.getLoggerConfig(log.getName());
loggerConfig.setLevel(newLevel);
ctx.updateLoggers();
}
private org.apache.logging.log4j.Level originalLevel;
@BeforeEach
public void setUp() {
JUnitUtil.setUp();
LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
Configuration config = loggerContext.getConfiguration();
originalLevel = config.getLoggerConfig(log.getName()).getLevel();
}
@AfterEach
public void tearDown() {
setLogLevelTo(originalLevel);
JUnitUtil.tearDown();
// continue the testUnexpectedCheck test
if (testingUnexpected) {
assertFalse( JUnitAppender.unexpectedMessageSeen(Level.ERROR), "post ERROR");
assertFalse( JUnitAppender.unexpectedMessageSeen(Level.WARN), "post WARN");
assertTrue( JUnitAppender.unexpectedMessageSeen(Level.INFO), "post INFO");
assertEquals("This INFO message was emitted to test the entire logging chain, please don't remove", JUnitAppender.unexpectedMessageContent(Level.INFO));
JUnitAppender.setUnexpectedFatalSeen(cacheFatal);
JUnitAppender.setUnexpectedErrorSeen(cacheError);
JUnitAppender.setUnexpectedWarnSeen(cacheWarn);
JUnitAppender.setUnexpectedInfoSeen(cacheInfo);
testingUnexpected = false;
}
}
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(JUnitAppenderTest.class);
}