/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2016, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.classic.jmx; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; 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 ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.LoggerContextListener; import ch.qos.logback.core.testUtil.RandomUtil; import static org.slf4j.Logger.ROOT_LOGGER_NAME; public class JMXConfiguratorTest { 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); assertNotNull(mbs); } @After public void tearDown() throws Exception { lc.stop(); } @Override public String toString() { return this.getClass().getName() + "(" + lc.getName() + ")"; } @Test public void contextReset() throws Exception { String randomizedObjectNameAsStr = "ch.qos.logback." + diff + ":Name=" + lc.getName() + ",Type=" + this.getClass().getName(); ObjectName objectName = MBeanUtil.string2ObjectName(lc, this, randomizedObjectNameAsStr); JMXConfigurator jmxConfigurator = new JMXConfigurator(lc, mbs, objectName); mbs.registerMBean(jmxConfigurator, objectName); listenerList = lc.getCopyOfListenerList(); assertEquals(1, listenerList.size()); lc.reset(); // check that after lc.reset, jmxConfigurator should still be // registered as a listener in the loggerContext and also as an // MBean in mbs listenerList = lc.getCopyOfListenerList(); assertEquals(1, listenerList.size()); assertTrue(listenerList.contains(jmxConfigurator)); assertTrue(mbs.isRegistered(objectName)); } @Test public void contextStop() throws Exception { String randomizedObjectNameAsStr = "ch.qos.logback." + diff + ":Name=" + lc.getName() + ",Type=" + this.getClass().getName(); ObjectName objectName = MBeanUtil.string2ObjectName(lc, this, randomizedObjectNameAsStr); JMXConfigurator jmxConfigurator = new JMXConfigurator(lc, mbs, objectName); mbs.registerMBean(jmxConfigurator, objectName); listenerList = lc.getCopyOfListenerList(); assertEquals(1, listenerList.size()); lc.stop(); // check that after lc.processPriorToRemoval, jmxConfigurator is no longer // registered as a listener in the loggerContext nor as an // MBean in mbs listenerList = lc.getCopyOfListenerList(); assertEquals(0, listenerList.size()); assertFalse(mbs.isRegistered(objectName)); } @Test public void testNonRemovalOfPreviousIntanceFromTheContextListenerList() { String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName() + ",Type=" + this.getClass().getName(); ObjectName objectName = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr); JMXConfigurator jmxConfigurator0 = new JMXConfigurator(lc, mbs, objectName); listenerList = lc.getCopyOfListenerList(); assertTrue(listenerList.contains(jmxConfigurator0)); JMXConfigurator jmxConfigurator1 = new JMXConfigurator(lc, mbs, objectName); listenerList = lc.getCopyOfListenerList(); assertEquals(1, listenerList.size()); assertTrue("old configurator should be present", listenerList.contains(jmxConfigurator0)); assertFalse("new configurator should be absent", listenerList.contains(jmxConfigurator1)); } @Test public void getLoggerLevel_LBCLASSIC_78() { 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); assertEquals("", configurator.getLoggerLevel(testLogger.getName())); MBeanUtil.unregister(lc, mbs, on, this); } @Test public void setLoggerLevel_LBCLASSIC_79() { 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.setLoggerLevel(testLogger.getName(), "DEBUG"); assertEquals(Level.DEBUG, testLogger.getLevel()); configurator.setLoggerLevel(testLogger.getName(), "null"); assertNull(testLogger.getLevel()); MBeanUtil.unregister(lc, mbs, on, this); } @Test public void testReloadDefaultConfiguration() throws Exception { 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.setLoggerLevel(testLogger.getName(), "DEBUG"); assertEquals(Level.DEBUG, testLogger.getLevel()); configurator.reloadDefaultConfiguration(); assertNull(testLogger.getLevel()); assertEquals(Level.DEBUG, lc.getLogger(ROOT_LOGGER_NAME).getLevel()); MBeanUtil.unregister(lc, mbs, on, this); } }