
Author: ceki Date: Thu Nov 6 15:09:53 2008 New Revision: 1947 Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/LoggerTest.java - copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java Removed: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java Log: This commit is related to: LBCLASSIC-83 (Logger.setLevel(null) may throw an NPE) LBCLASSIC-61 (configurable ObjectName) LBCLASSIC-24 (better error messages after reload) LBCLASSIC-33 (JMX configurator unregisters itself) LBCLASSIC-78 (NPE in JMXConfigurator getLoggerLevel) LBCLASSIC-79 (NPE in JMXConfigurator setLoggerLevel) While testing LBCLASSIC 61,24 and 33, I wanted to correct LBCLASSIC-78 and LBCLASSIC-79 which are related to JMXConfigurator. It turns out that LBCLASSIC-79 has a much deeper cause identified in LBCLASSIC-83. Work on LBCLASSIC 61,24 and 33 is still ongoing. The present commit reflects the nature of that ongoing and incomplete work. Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java Thu Nov 6 15:09:53 2008 @@ -127,39 +127,8 @@ return parent == null; } - /** - * Get a child by its suffix. - * - * <p> IMPORTANT: Calls to this method must be within a synchronized block on - * this logger! - * - * @param suffix - * @return - */ - Logger getChildBySuffix(final String suffix) { - if (childrenList == null) { - return null; - } else { - int len = this.childrenList.size(); - int childNameOffset; - if (isRootLogger()) { - childNameOffset = 0; - } else { - childNameOffset = this.name.length() + 1; - } - - for (int i = 0; i < len; i++) { - final Logger childLogger = (Logger) childrenList.get(i); - final String childName = childLogger.getName(); - - if (suffix.equals(childName.substring(childNameOffset))) { - return childLogger; - } - } - // no child found - return null; - } - } + // Logger getChildBySuffix(final String suffix) method was here and got + // removed. Logger getChildByName(final String childName) { if (childrenList == null) { @@ -185,7 +154,15 @@ return; } level = newLevel; - effectiveLevelInt = newLevel.levelInt; + if (newLevel == null) { + if (isRootLogger()) { + throw new IllegalArgumentException("The level of the root logger cannot be set to null"); + } else { + effectiveLevelInt = parent.effectiveLevelInt; + } + } else { + effectiveLevelInt = newLevel.levelInt; + } if (childrenList != null) { int len = childrenList.size(); for (int i = 0; i < len; i++) { @@ -390,8 +367,9 @@ final Marker marker, final Level level, final String msg, final Object[] params, final Throwable t) { - final FilterReply decision = loggerContext.getTurboFilterChainDecision_0_3OrMore( - marker, this, level, msg, params, t); + final FilterReply decision = loggerContext + .getTurboFilterChainDecision_0_3OrMore(marker, this, level, msg, + params, t); if (decision == FilterReply.NEUTRAL) { if (effectiveLevelInt > level.levelInt) { @@ -403,7 +381,7 @@ buildLoggingEventAndAppend(localFQCN, marker, level, msg, params, t); } - + private final void filterAndLog_1(final String localFQCN, final Marker marker, final Level level, final String msg, final Object param, final Throwable t) { @@ -423,7 +401,6 @@ new Object[] { param }, t); } - private final void filterAndLog_2(final String localFQCN, final Marker marker, final Level level, final String msg, final Object param1, final Object param2, final Throwable t) { @@ -443,8 +420,6 @@ param1, param2 }, t); } - - private void buildLoggingEventAndAppend(final String localFQCN, final Marker marker, final Level level, final String msg, final Object[] params, final Throwable t) { @@ -493,7 +468,7 @@ filterAndLog_0_Or3Plus(FQCN, marker, Level.TRACE, msg, null, t); } - final public boolean isDebugEnabled() { + final public boolean isDebugEnabled() { return isDebugEnabled(null); } @@ -509,7 +484,7 @@ throw new IllegalStateException("Unknown FilterReply value: " + decision); } } - + final public void debug(String msg) { filterAndLog_0_Or3Plus(FQCN, null, Level.DEBUG, msg, null, null); } @@ -593,7 +568,7 @@ public boolean isInfoEnabled() { return isInfoEnabled(null); } - + public boolean isInfoEnabled(Marker marker) { FilterReply decision = callTurboFilters(marker, Level.INFO); if (decision == FilterReply.NEUTRAL) { @@ -606,7 +581,7 @@ throw new IllegalStateException("Unknown FilterReply value: " + decision); } } - + public void info(String msg) { filterAndLog_0_Or3Plus(FQCN, null, Level.INFO, msg, null, null); } @@ -664,8 +639,6 @@ } } - - public final boolean isErrorEnabled() { return isErrorEnabled(null); } @@ -683,7 +656,6 @@ } } - public boolean isWarnEnabled() { return isWarnEnabled(null); } @@ -783,8 +755,8 @@ * @return the reply given by the TurboFilters */ private FilterReply callTurboFilters(Marker marker, Level level) { - return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, level, null, - null, null); + return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, + level, null, null, null); } /** Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java Thu Nov 6 15:09:53 2008 @@ -65,6 +65,7 @@ public LoggerContext() { super(); + System.out.println(" LoggerContext()============================================================="); this.loggerCache = new Hashtable<String, Logger>(); this.loggerContextRemoteView = new LoggerContextRemoteView(this); this.root = new Logger(ROOT_NAME, null, this); @@ -128,7 +129,7 @@ // in between as well (if they don't already exist) String childName; while (true) { - int h = name.indexOf('.', i); + int h = name.indexOf(ClassicGlobal.LOGGER_SEPARATOR, i); if (h == -1) { childName = name; } else { @@ -189,6 +190,10 @@ return loggerContextRemoteView; } + @Override + protected void finalize() { + System.out.println("**************** LoggerContext finalized"); + } public void reset() { root.recursiveReset(); clearAllTurboFilters(); @@ -300,8 +305,8 @@ started = false; } - @Override - public String toString() { - return this.getClass().getName() + "[" + getName() + "]"; - } +// @Override +// public String toString() { +// return this.getClass().getName() + "[" + getName() + "]"; +// } } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java Thu Nov 6 15:09:53 2008 @@ -31,6 +31,7 @@ import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.spi.ContextAwareBase; import ch.qos.logback.core.status.Status; +import ch.qos.logback.core.status.StatusListener; import ch.qos.logback.core.status.StatusListenerAsList; import ch.qos.logback.core.status.StatusManager; import ch.qos.logback.core.util.StatusPrinter; @@ -55,6 +56,12 @@ final MBeanServer mbs; final ObjectName objectName; + + @Override + protected void finalize() { + System.out.println("**************** JMXConfigurator finalized"); + } + public JMXConfigurator(LoggerContext loggerContext, MBeanServer mbs, ObjectName objectName) { this.context = loggerContext; @@ -105,20 +112,27 @@ } } + void addStatusListener(StatusListener statusListener) { + StatusManager sm = loggerContext.getStatusManager(); + sm.add(statusListener); + } + public void reloadByURL(URL url) throws JoranException { StatusListenerAsList statusListenerAsList = new StatusListenerAsList(); - StatusManager sm = loggerContext.getStatusManager(); - sm.add(statusListenerAsList); + addStatusListener(statusListenerAsList); addInfo("Resetting context: " + loggerContext.getName()); loggerContext.reset(); + addStatusListener(statusListenerAsList); + try { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(loggerContext); configurator.doConfigure(url); addInfo("Context: " + loggerContext.getName() + " reloaded."); } finally { + System.out.println("*************** printing"); StatusPrinter.print(statusListenerAsList.getStatusList()); } } @@ -156,7 +170,7 @@ LoggerContext lc = (LoggerContext) context; Logger logger = lc.exists(loggerName); - if (logger != null) { + if (logger != null && logger.getLevel() != null) { return logger.getLevel().toString(); } else { return EMPTY; @@ -205,6 +219,7 @@ * unregistered */ public void onReset(LoggerContext context) { + System.out.println("Unregistering JMXConfigurator"); if (mbs.isRegistered(objectName)) { try { addInfo("Unregistering mbean [" + objectName + "]"); Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java Thu Nov 6 15:09:53 2008 @@ -34,7 +34,7 @@ ObjectName objectName = MBeanUtil.string2ObjectName(context, this, objectNameAsStr); - if (objectName == null) { + if (objectName != null) { MBeanUtil.register((LoggerContext) context, objectName, this); } Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/LoggerTest.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java) ============================================================================== --- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/BasicLoggerTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/LoggerTest.java Thu Nov 6 15:09:53 2008 @@ -9,54 +9,66 @@ */ package ch.qos.logback.classic; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import java.util.List; + +import org.junit.Test; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.read.ListAppender; -import ch.qos.logback.core.util.StatusPrinter; +import ch.qos.logback.core.status.Status; + +public class LoggerTest { -public class BasicLoggerTest extends TestCase { + LoggerContext lc = new LoggerContext(); + Logger root = lc.getLogger(LoggerContext.ROOT_NAME); + Logger loggerTest = lc.getLogger(LoggerTest.class); - public void testBasic() { - LoggerContext lc = new LoggerContext(); + ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>(); + + @Test + public void smoke() { ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>(); listAppender.start(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.addAppender(listAppender); - Logger logger = lc.getLogger(BasicLoggerTest.class); + Logger logger = lc.getLogger(LoggerTest.class); assertEquals(0, listAppender.list.size()); logger.debug("hello"); assertEquals(1, listAppender.list.size()); } + @Test public void testNoStart() { - LoggerContext lc = new LoggerContext(); - ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>(); // listAppender.start(); listAppender.setContext(lc); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.addAppender(listAppender); - Logger logger = lc.getLogger(BasicLoggerTest.class); + Logger logger = lc.getLogger(LoggerTest.class); logger.debug("hello"); - StatusPrinter.print(lc.getStatusManager()); + + List<Status> statusList = lc.getStatusManager().getCopyOfStatusList(); + Status s0 = statusList.get(0); + assertEquals(Status.WARN, s0.getLevel()); + assertTrue(s0.getMessage().startsWith("Attempted to append to non started")); } + @Test public void testAdditive() { - LoggerContext lc = new LoggerContext(); - ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>(); listAppender.start(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.addAppender(listAppender); - Logger logger = lc.getLogger(BasicLoggerTest.class); - logger.addAppender(listAppender); - logger.setAdditive(false); - logger.debug("hello"); + loggerTest.addAppender(listAppender); + loggerTest.setAdditive(false); + loggerTest.debug("hello"); // 1 instead of two, since logger is not additive assertEquals(1, listAppender.list.size()); } + @Test public void testRootLogger() { Logger logger = (Logger) LoggerFactory.getLogger(LoggerContext.ROOT_NAME); LoggerContext lc = logger.getLoggerContext(); @@ -66,112 +78,115 @@ LoggerContext.ROOT_NAME); assertTrue("logger instances should be indentical", logger == lc.root); } - + + @Test public void testBasicFiltering() throws Exception { - LoggerContext lc = new LoggerContext(); - ListAppender<LoggingEvent> listAppender = new ListAppender<LoggingEvent>(); listAppender.start(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.addAppender(listAppender); root.setLevel(Level.INFO); - Logger logger = lc.getLogger(BasicLoggerTest.class); - logger.debug("x"); + loggerTest.debug("x"); assertEquals(0, listAppender.list.size()); - logger.info("x"); - logger.warn("x"); - logger.error("x"); + loggerTest.info("x"); + loggerTest.warn("x"); + loggerTest.error("x"); assertEquals(3, listAppender.list.size()); } - public void testEnabledX_All() throws Exception { - LoggerContext lc = new LoggerContext(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); + void checkLevelThreshold(Logger logger, Level threshold) { + + if (Level.ERROR_INT >= threshold.levelInt) { + assertTrue(logger.isErrorEnabled()); + assertTrue(logger.isEnabledFor(Level.ERROR)); + } else { + assertFalse(logger.isErrorEnabled()); + assertFalse(logger.isEnabledFor(Level.ERROR)); + } + + if (Level.WARN_INT >= threshold.levelInt) { + assertTrue(logger.isWarnEnabled()); + assertTrue(logger.isEnabledFor(Level.WARN)); + } else { + assertFalse(logger.isWarnEnabled()); + assertFalse(logger.isEnabledFor(Level.WARN)); + } + if (Level.INFO_INT >= threshold.levelInt) { + assertTrue(logger.isInfoEnabled()); + assertTrue(logger.isEnabledFor(Level.INFO)); + } else { + assertFalse(logger.isInfoEnabled()); + assertFalse(logger.isEnabledFor(Level.INFO)); + } + if (Level.DEBUG_INT >= threshold.levelInt) { + assertTrue(logger.isDebugEnabled()); + assertTrue(logger.isEnabledFor(Level.DEBUG)); + } else { + assertFalse(logger.isDebugEnabled()); + assertFalse(logger.isEnabledFor(Level.DEBUG)); + } + if (Level.TRACE_INT >= threshold.levelInt) { + assertTrue(logger.isTraceEnabled()); + assertTrue(logger.isEnabledFor(Level.TRACE)); + } else { + assertFalse(logger.isTraceEnabled()); + assertFalse(logger.isEnabledFor(Level.TRACE)); + } + + } + + @Test + public void testEnabled_All() throws Exception { root.setLevel(Level.ALL); - Logger logger = lc.getLogger(BasicLoggerTest.class); - assertTrue(logger.isDebugEnabled()); - assertTrue(logger.isInfoEnabled()); - assertTrue(logger.isWarnEnabled()); - assertTrue(logger.isErrorEnabled()); - assertTrue(logger.isEnabledFor(Level.DEBUG)); - assertTrue(logger.isEnabledFor(Level.INFO)); - assertTrue(logger.isEnabledFor(Level.WARN)); - assertTrue(logger.isEnabledFor(Level.ERROR)); + checkLevelThreshold(loggerTest, Level.ALL); } - - public void testEnabledX_Debug() throws Exception { - LoggerContext lc = new LoggerContext(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); + + @Test + public void testEnabled_Debug() throws Exception { root.setLevel(Level.DEBUG); - Logger logger = lc.getLogger(BasicLoggerTest.class); - assertTrue(logger.isDebugEnabled()); - assertTrue(logger.isInfoEnabled()); - assertTrue(logger.isWarnEnabled()); - assertTrue(logger.isErrorEnabled()); - assertTrue(logger.isEnabledFor(Level.DEBUG)); - assertTrue(logger.isEnabledFor(Level.INFO)); - assertTrue(logger.isEnabledFor(Level.WARN)); - assertTrue(logger.isEnabledFor(Level.ERROR)); + checkLevelThreshold(loggerTest, Level.DEBUG); } - - - - public void testEnabledX_Info() throws Exception { - LoggerContext lc = new LoggerContext(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); + + @Test + public void testEnabled_Info() throws Exception { root.setLevel(Level.INFO); - Logger logger = lc.getLogger(BasicLoggerTest.class); - assertFalse(logger.isDebugEnabled()); - assertTrue(logger.isInfoEnabled()); - assertTrue(logger.isWarnEnabled()); - assertTrue(logger.isErrorEnabled()); - assertFalse(logger.isEnabledFor(Level.DEBUG)); - assertTrue(logger.isEnabledFor(Level.INFO)); - assertTrue(logger.isEnabledFor(Level.WARN)); - assertTrue(logger.isEnabledFor(Level.ERROR)); + checkLevelThreshold(loggerTest, Level.INFO); } - + + @Test public void testEnabledX_Warn() throws Exception { - LoggerContext lc = new LoggerContext(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.setLevel(Level.WARN); - Logger logger = lc.getLogger(BasicLoggerTest.class); - assertFalse(logger.isDebugEnabled()); - assertFalse(logger.isInfoEnabled()); - assertTrue(logger.isWarnEnabled()); - assertTrue(logger.isErrorEnabled()); - assertFalse(logger.isEnabledFor(Level.DEBUG)); - assertFalse(logger.isEnabledFor(Level.INFO)); - assertTrue(logger.isEnabledFor(Level.WARN)); - assertTrue(logger.isEnabledFor(Level.ERROR)); + checkLevelThreshold(loggerTest, Level.WARN); } - + public void testEnabledX_Errror() throws Exception { - LoggerContext lc = new LoggerContext(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.setLevel(Level.ERROR); - Logger logger = lc.getLogger(BasicLoggerTest.class); - assertFalse(logger.isDebugEnabled()); - assertFalse(logger.isInfoEnabled()); - assertFalse(logger.isWarnEnabled()); - assertTrue(logger.isErrorEnabled()); - assertFalse(logger.isEnabledFor(Level.DEBUG)); - assertFalse(logger.isEnabledFor(Level.INFO)); - assertFalse(logger.isEnabledFor(Level.WARN)); - assertTrue(logger.isEnabledFor(Level.ERROR)); + checkLevelThreshold(loggerTest, Level.ERROR); } + @Test public void testEnabledX_Off() throws Exception { - LoggerContext lc = new LoggerContext(); - Logger root = lc.getLogger(LoggerContext.ROOT_NAME); root.setLevel(Level.OFF); - Logger logger = lc.getLogger(BasicLoggerTest.class); - assertFalse(logger.isDebugEnabled()); - assertFalse(logger.isInfoEnabled()); - assertFalse(logger.isWarnEnabled()); - assertFalse(logger.isErrorEnabled()); - assertFalse(logger.isEnabledFor(Level.DEBUG)); - assertFalse(logger.isEnabledFor(Level.INFO)); - assertFalse(logger.isEnabledFor(Level.WARN)); - assertFalse(logger.isEnabledFor(Level.ERROR)); + checkLevelThreshold(loggerTest, Level.OFF); + } + + @Test + public void setRootLevelToNull() { + try { + root.setLevel(null); + fail("The level of the root logger should not be settable to null"); + } catch (IllegalArgumentException e) { + } + } + + @Test + public void setLevelToNull_A() { + loggerTest.setLevel(null); + assertEquals(root.getEffectiveLevel(), loggerTest.getEffectiveLevel()); + } + + @Test + public void setLevelToNull_B() { + loggerTest.setLevel(Level.DEBUG); + loggerTest.setLevel(null); + assertEquals(root.getEffectiveLevel(), loggerTest.getEffectiveLevel()); } } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java Thu Nov 6 15:09:53 2008 @@ -19,7 +19,7 @@ suite.addTest(new JUnit4TestAdapter(LoggerPerfTest.class)); suite.addTest(new JUnit4TestAdapter(DynamicLoggerContextTest.class)); suite.addTest(new JUnit4TestAdapter(PatternLayoutTest.class)); - suite.addTestSuite(BasicLoggerTest.class); + suite.addTest(new JUnit4TestAdapter(LoggerTest.class)); suite.addTest(new JUnit4TestAdapter(LoggerSerializationTest.class)); suite.addTestSuite(MessageFormattingTest.class); suite.addTestSuite(MDCTest.class); Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java Thu Nov 6 15:09:53 2008 @@ -0,0 +1,98 @@ +package ch.qos.logback.classic.jmx; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.lang.management.ManagementFactory; +import java.util.List; + +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggerContextListener; +import ch.qos.logback.core.testUtil.RandomUtil; + +public class JMXConfiguratorTest { + + static MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + LoggerContext lc = new LoggerContext(); + Logger testLogger = lc.getLogger(this.getClass()); + + List<LoggerContextListener> listenerList; + int diff = RandomUtil.getPositiveInt(); + + @Before + public void setUp() throws Exception { + lc.setName("context-" + diff); + } + + @After + public void tearDown() throws Exception { + lc.reset(); + } + + @Override + public String toString() { + return this.getClass().getName() + "(" + lc.getName() + ")"; + } + + @Test + public void contextListening() { + String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName() + + ",Type=" + this.getClass().getName(); + ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr); + + MBeanUtil.register(lc, on, this); + listenerList = lc.getCopyOfListenerList(); + assertEquals(1, listenerList.size()); + lc.reset(); + listenerList = lc.getCopyOfListenerList(); + assertEquals(0, listenerList.size()); + + MBeanUtil.register(lc, on, this); + listenerList = lc.getCopyOfListenerList(); + assertEquals(1, listenerList.size()); + + } + + @Test + public void testRemovalOfPreviousIntanceFromTheContextListenerList() { + String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName() + + ",Type=" + this.getClass().getName(); + + ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr); + JMXConfigurator jmxConfigurator0 = MBeanUtil.register(lc, on, this); + + listenerList = lc.getCopyOfListenerList(); + assertEquals(1, listenerList.size()); + assertTrue(listenerList.contains(jmxConfigurator0)); + + JMXConfigurator jmxConfigurator1 = MBeanUtil.register(lc, on, this); + listenerList = lc.getCopyOfListenerList(); + assertEquals(1, listenerList.size()); + assertFalse("old configurator should be absent", listenerList + .contains(jmxConfigurator0)); + assertTrue("new configurator should be present", listenerList + .contains(jmxConfigurator1)); + + // StatusPrinter.print(lc); + } + + @Test + public void getLoggerLevel() { + String objectNameAsStr = "ch.qos"+diff + ":Name=" + lc.getName() + + ",Type=" + this.getClass().getName(); + + ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr); + JMXConfigurator configurator = new JMXConfigurator(lc, mbs, on); + configurator.getLoggerLevel(testLogger.getName()); + } + +}