
Author: ceki Date: Thu Nov 6 18:16:37 2008 New Revision: 1948 Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java - copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/DynamicLoggerContextTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioAction.java - copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlAction.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioRandomUtil.java - copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtil.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/TestScenario.java - copied, changed from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java Removed: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/DynamicLoggerContextTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlAction.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtil.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMakerTest.java 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/control/ControlLoggerContext.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtilTest.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java Log: Refactoring test cases in relation to LBCLASSIC-83. 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 18:16:37 2008 @@ -17,7 +17,7 @@ TestSuite suite = new TestSuite(); suite.addTest(new JUnit4TestAdapter(LoggerContextTest.class)); suite.addTest(new JUnit4TestAdapter(LoggerPerfTest.class)); - suite.addTest(new JUnit4TestAdapter(DynamicLoggerContextTest.class)); + suite.addTest(new JUnit4TestAdapter(ScenarioBasedLoggerContextTest.class)); suite.addTest(new JUnit4TestAdapter(PatternLayoutTest.class)); suite.addTest(new JUnit4TestAdapter(LoggerTest.class)); suite.addTest(new JUnit4TestAdapter(LoggerSerializationTest.class)); Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/DynamicLoggerContextTest.java) ============================================================================== --- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/DynamicLoggerContextTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java Thu Nov 6 18:16:37 2008 @@ -12,57 +12,57 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; -import java.util.Iterator; import java.util.List; import java.util.Map; import org.junit.Test; -import ch.qos.logback.classic.control.ControlAction; import ch.qos.logback.classic.control.ControlLogger; import ch.qos.logback.classic.control.ControlLoggerContext; import ch.qos.logback.classic.control.CreateLogger; -import ch.qos.logback.classic.control.Scenario; +import ch.qos.logback.classic.control.ScenarioAction; import ch.qos.logback.classic.control.ScenarioMaker; import ch.qos.logback.classic.control.SetLevel; +import ch.qos.logback.classic.control.TestScenario; -public class DynamicLoggerContextTest { +public class ScenarioBasedLoggerContextTest { LoggerContext lc; @Test - public void test3() { - dynaTest(3); + public void testLen3() { + doScenarioedTest(3); } @Test - public void test30() { - dynaTest(30); + public void testLength_30() { + doScenarioedTest(30); } @Test - public void test1000() { - dynaTest(1000); + public void testLength_20000() { + doScenarioedTest(20*1000); } - //public void test50000() { - //dynaTest(50000); - //} + @Test + public void testLengthLong() { + doScenarioedTest(500*1000); + } - private void dynaTest(int len) { + private void doScenarioedTest(int len) { LoggerContext lc = new LoggerContext(); ControlLoggerContext controlContext = new ControlLoggerContext(); - Scenario s = ScenarioMaker.makeTypeBScenario(len); + TestScenario s = ScenarioMaker.makeRealisticCreationScenario(len); List actionList = s.getActionList(); int size = actionList.size(); for (int i = 0; i < size; i++) { - ControlAction action = (ControlAction) actionList.get(i); + ScenarioAction action = (ScenarioAction) actionList.get(i); if (action instanceof CreateLogger) { CreateLogger cl = (CreateLogger) action; lc.getLogger(cl.getLoggerName()); controlContext.getLogger(cl.getLoggerName()); - } else { + } else if (action instanceof SetLevel) { SetLevel sl = (SetLevel) action; Logger l = lc.getLogger(sl.getLoggerName()); ControlLogger controlLogger = controlContext.getLogger(sl.getLoggerName()); @@ -71,29 +71,29 @@ } } - compare(controlContext, lc); + compareLoggerContexts(controlContext, lc); } - void compare(ControlLoggerContext controlLC, LoggerContext lc) { - Map controlLoggerMap = controlLC.getLoggerMap(); + void compareLoggerContexts(ControlLoggerContext controlLC, LoggerContext lc) { + Map<String, ControlLogger> controlLoggerMap = controlLC.getLoggerMap(); assertEquals(controlLoggerMap.size()+1, lc.size()); - for (Iterator i = controlLoggerMap.keySet().iterator(); i.hasNext();) { - String loggerName = (String) i.next(); + for (String loggerName: controlLoggerMap.keySet()) { + Logger logger = lc.exists(loggerName); ControlLogger controlLogger = (ControlLogger) controlLoggerMap.get(loggerName); if (logger == null) { - throw new IllegalStateException("HLoggerr" + loggerName + " should exist"); + throw new IllegalStateException("logger" + loggerName + " should exist"); } assertEquals(loggerName, logger.getName()); assertEquals(loggerName, controlLogger.getName()); - assertCompare(controlLogger, logger); + compareLoggers(controlLogger, logger); } } - void assertCompare(ControlLogger controlLogger, Logger logger) { + void compareLoggers(ControlLogger controlLogger, Logger logger) { assertEquals(controlLogger.getName(), logger.getName()); assertEquals(controlLogger.getEffectiveLevel(), logger.getEffectiveLevel()); Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.java Thu Nov 6 18:16:37 2008 @@ -16,15 +16,18 @@ import ch.qos.logback.classic.Level; /** - * LoggerContext quite optimized for logger retrieval. + * This logger context quite optimized for logger retrieval. * - * It uses a single loggerMap where the key is the logger name and - * the value is the logger. + * <p>It uses a single loggerMap where the key is the logger name and the value + * is the logger. * - * This approach acts a lower limit for what is acheivable for low memory usage - * as well as low creation/retreival times. However, this simplicity also results - * in slow effective level evaluation, the most frequently exercised part of the API. + * <p>This approach acts a lower limit for what is achievable for low memory + * usage as well as low creation/retrieval times. However, this simplicity also + * results in slow effective level evaluation, the most frequently exercised + * part of the API. * + * <p>This class is expected to contain correct results, and serve to verify + * the correctness of a more sophisticated implementation. * * @author ceki */ @@ -33,8 +36,8 @@ private ControlLogger root; // // Hashtable loggerMap = new Hashtable(); - Map<String, ControlLogger> loggerMap = new HashMap<String, ControlLogger>(); - + Map<String, ControlLogger> loggerMap = new HashMap<String, ControlLogger>(); + public ControlLoggerContext() { this.root = new ControlLogger("root", null); this.root.setLevel(Level.DEBUG); @@ -42,7 +45,7 @@ /** * Return this contexts root logger - * + * * @return */ public ControlLogger getRootLogger() { @@ -75,7 +78,8 @@ while (true) { i = name.indexOf(ClassicGlobal.LOGGER_SEPARATOR, i); if (i == -1) { - //System.out.println("FINAL-Creating logger named [" + name + "] with parent " + parent.getName()); + // System.out.println("FINAL-Creating logger named [" + name + "] with + // parent " + parent.getName()); cl = new ControlLogger(name, parent); loggerMap.put(name, cl); return cl; @@ -83,7 +87,8 @@ String parentName = name.substring(0, i); ControlLogger p = (ControlLogger) loggerMap.get(parentName); if (p == null) { - //System.out.println("INTERMEDIARY-Creating logger [" + parentName + "] with parent " + parent.getName()); + // System.out.println("INTERMEDIARY-Creating logger [" + parentName + // + "] with parent " + parent.getName()); p = new ControlLogger(parentName, parent); loggerMap.put(parentName, p); } @@ -95,7 +100,7 @@ } } - public Map getLoggerMap() { + public Map<String, ControlLogger> getLoggerMap() { return loggerMap; } } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java Thu Nov 6 18:16:37 2008 @@ -10,7 +10,7 @@ package ch.qos.logback.classic.control; -public class CreateLogger extends ControlAction { +public class CreateLogger extends ScenarioAction { final String loggerName; Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtilTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtilTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtilTest.java Thu Nov 6 18:16:37 2008 @@ -21,7 +21,7 @@ int len = 100000; int AVERAGE = 5; for(int i = 0; i < len; i++) { - sum += RandomUtil.gaussianAsPositiveInt(AVERAGE, 2); + sum += ScenarioRandomUtil.gaussianAsPositiveInt(AVERAGE, 2); } double resultingAverage = sum/(1.0*len); Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioAction.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlAction.java) ============================================================================== --- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlAction.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioAction.java Thu Nov 6 18:16:37 2008 @@ -1,14 +1,14 @@ /** - * LOGBack: the generic, reliable, fast and flexible logging framework. - * - * Copyright (C) 1999-2006, QOS.ch - * - * This library is free software, you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation. + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. */ package ch.qos.logback.classic.control; -public class ControlAction { +public class ScenarioAction { } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java Thu Nov 6 18:16:37 2008 @@ -1,80 +1,92 @@ -/** - * LOGBack: the reliable, fast and flexible logging library for Java. - * - * Copyright (C) 1999-2005, QOS.ch, LOGBack.com - * - * This library is free software, you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation. +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2008, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. */ package ch.qos.logback.classic.control; import java.util.LinkedList; import ch.qos.logback.classic.ClassicGlobal; +import ch.qos.logback.classic.Level; public class ScenarioMaker { - private final static int AVERAGE_LOGGER_DEPTH = 4; private final static int LOGGER_DEPT_DEV = 2; - + // the frequency of a set levelInt event for every create logger event + private final static int CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY = 5; + private final static int SECOND_SET_LEVEL_FREQUENCY = 3; + + /** - * Makes a scenario with len logger creations. Logger names are generated independently such that the overwhelming - * majority of logger names will unrelated to each other. Each logger creation may be followed with a randomly - * generated set levelInt action on that logger. - * + * Makes a scenario with len logger creations. Logger names are generated + * independently such that the overwhelming majority of logger names will be + * unrelated to each other. Each logger creation may be followed with a + * randomly generated set levelInt action on that logger. + * * @param len * @return */ - static public Scenario makeTypeAScenario(int len) { - Scenario scenario = new Scenario(); + static public TestScenario makeTypeAScenario(int len) { + TestScenario scenario = new TestScenario(); ; for (int i = 0; i < len; i++) { - String loggerName = RandomUtil.randomLoggerName(AVERAGE_LOGGER_DEPTH, LOGGER_DEPT_DEV); - scenario.addAction(new CreateLogger(loggerName)); + String loggerName = ScenarioRandomUtil.randomLoggerName(AVERAGE_LOGGER_DEPTH, + LOGGER_DEPT_DEV); + scenario.add(new CreateLogger(loggerName)); } return scenario; } - static public Scenario makeTypeBScenario(int len) { - Scenario scenario = new Scenario(); + static public TestScenario makeRealisticCreationScenario(int len) { + TestScenario scenario = new TestScenario(); LinkedList<String> queue = new LinkedList<String>(); int loggerCreationCount = 0; // add an empty string to get going queue.add(""); - // add another string to reduce the probability of having an - // empty queue (this happens when we create several leaf nodes - // successively - queue.add("xxxx"); - while (loggerCreationCount < len) { - if (queue.isEmpty()) { - throw new IllegalStateException("Queue cannot be empty."); - } - String loggerName = (String) queue.removeFirst(); - //System.out.println("logger name is [" + loggerName + "]"); - int childrenCount = RandomUtil.randomChildrenCount(loggerName); - //System.out.println("children count is " + childrenCount); - // add only leaf loggers - if (childrenCount == 0) { - scenario.addAction(new CreateLogger(loggerName)); + int randomChildrenCount = ScenarioRandomUtil.randomChildrenCount(loggerName); + + if (randomChildrenCount == 0) { + scenario.add(new CreateLogger(loggerName)); + addSetLevelSubScenario(scenario, loggerName); loggerCreationCount++; } else { - for (int i = 0; i < childrenCount; i++) { + for (int i = 0; i < randomChildrenCount; i++) { String childName; if (loggerName.equals("")) { - childName = RandomUtil.randomId(); + childName = ScenarioRandomUtil.randomId(); } else { - childName = loggerName + ClassicGlobal.LOGGER_SEPARATOR + RandomUtil.randomId(); + childName = loggerName + ClassicGlobal.LOGGER_SEPARATOR + + ScenarioRandomUtil.randomId(); } queue.add(childName); + addSetLevelSubScenario(scenario, loggerName); + loggerCreationCount++; } } } return scenario; } + + static void addSetLevelSubScenario(TestScenario scenario, String loggerName) { + if(ScenarioRandomUtil.oneInFreq(CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY)) { + Level l = ScenarioRandomUtil.randomLevel(); + scenario.add(new SetLevel(l, loggerName)); + if(ScenarioRandomUtil.oneInFreq(SECOND_SET_LEVEL_FREQUENCY)) { + l = ScenarioRandomUtil.randomLevel(); + scenario.add(new SetLevel(l, loggerName)); + } + } + } + + } \ No newline at end of file Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioRandomUtil.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtil.java) ============================================================================== --- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/RandomUtil.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioRandomUtil.java Thu Nov 6 18:16:37 2008 @@ -13,7 +13,7 @@ import ch.qos.logback.classic.Level; -public class RandomUtil { +public class ScenarioRandomUtil { private final static long SEED = 74130; private final static Random random = new Random(SEED); @@ -28,18 +28,23 @@ } public static Level randomLevel() { - int rl = random.nextInt(4); + int rl = random.nextInt(6); switch (rl) { - case 0: - return Level.DEBUG; - case 1: - return Level.INFO; - case 2: - return Level.WARN; - case 3: - return Level.ERROR; - default: - throw new IllegalStateException("rl should have been a value between 0 to 3, but it is " + rl); + case 0: + return null; + case 1: + return Level.TRACE; + case 2: + return Level.DEBUG; + case 3: + return Level.INFO; + case 4: + return Level.WARN; + case 5: + return Level.ERROR; + default: + throw new IllegalStateException( + "rl should have been a value between 0 to 5, but it is " + rl); } } @@ -69,18 +74,20 @@ /** * Approximate a gaussian distrib with only only positive integer values - * + * * @param average * @param stdDeviation * @return */ public static int gaussianAsPositiveInt(int average, int stdDeviation) { if (average < 1) { - throw new IllegalArgumentException("The average must not be smaller than 1."); + throw new IllegalArgumentException( + "The average must not be smaller than 1."); } if (stdDeviation < 1) { - throw new IllegalArgumentException("The stdDeviation must not be smaller than 1."); + throw new IllegalArgumentException( + "The stdDeviation must not be smaller than 1."); } double d = random.nextGaussian() * stdDeviation + average; @@ -92,23 +99,21 @@ } /** - * Returns 3 for root, 3 for children of root, 9 for offspring of generation 2 and 3, and for generations 4 - * and later, return 0 wuth probabbility 0.5 and a guassion (average=AVERAGE_CHILDREN_COUNT) with probability 0.5. - * + * Returns 3 for root, 3 for children of root, 9 for offspring of generation 2 + * and 3, and for generations 4 and later, return 0 with probability 0.5 and a + * gaussian (average=AVERAGE_CHILDREN_COUNT) with probability 0.5. + * * @param name * @return */ public static int randomChildrenCount(String name) { - if ("".equals(name)) { - return 3; - } int dots = dotCount(name); - if (dots == 1) { + if (dots <= 1) { return 3; } else if (dots == 2 || dots == 3) { return 9; } else { - if (hasChildren(0.5)) { + if (shouldHaveChildrenWithProbabilitz(0.5)) { return gaussianAsPositiveInt(AVERAGE_CHILDREN_COUNT, CHILDREN_COUNT_VAR); } else { return 0; @@ -119,13 +124,14 @@ /** * Returns true with probability p. - * + * * @param p * @return */ - static boolean hasChildren(double p) { + static boolean shouldHaveChildrenWithProbabilitz(double p) { if (p < 0 || p > 1.0) { - throw new IllegalArgumentException("p must be a value between 0 and 1.0, it was " + p + " instead."); + throw new IllegalArgumentException( + "p must be a value between 0 and 1.0, it was " + p + " instead."); } double r = random.nextDouble(); if (r < p) { Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java Thu Nov 6 18:16:37 2008 @@ -11,7 +11,7 @@ import ch.qos.logback.classic.Level; -public class SetLevel extends ControlAction { +public class SetLevel extends ScenarioAction { final String loggerName; final Level level; Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/TestScenario.java (from r1899, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java) ============================================================================== --- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/control/TestScenario.java Thu Nov 6 18:16:37 2008 @@ -13,31 +13,23 @@ import java.util.List; import java.util.Vector; -import ch.qos.logback.classic.Level; +public class TestScenario { -public class Scenario { - // the frequency of a set levelInt event for every create logger event - private final static int CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY = 5; + private List<ScenarioAction> actionList = new Vector<ScenarioAction>(); - private List<ControlAction> actionList = new Vector<ControlAction>(); - - public void addAction(CreateLogger action) { + public void add(ScenarioAction action) { actionList.add(action); - if(RandomUtil.oneInFreq(CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY)) { - Level l = RandomUtil.randomLevel(); - actionList.add(new SetLevel(l, action.getLoggerName())); - } } - public List<ControlAction> getActionList() { - return new ArrayList<ControlAction>(actionList); + public List<ScenarioAction> getActionList() { + return new ArrayList<ScenarioAction>(actionList); } public int size() { return actionList.size(); } - public ControlAction get(int i) { - return (ControlAction) actionList.get(i); + public ScenarioAction get(int i) { + return (ScenarioAction) actionList.get(i); } } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java Thu Nov 6 18:16:37 2008 @@ -2,6 +2,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.lang.management.ManagementFactory; @@ -13,8 +14,9 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; +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; @@ -86,13 +88,31 @@ } @Test - public void getLoggerLevel() { + 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); - configurator.getLoggerLevel(testLogger.getName()); + 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); } }