svn commit: r2089 - logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift

Author: ceki Date: Thu Dec 18 22:13:35 2008 New Revision: 2089 Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/AppenderTrackerTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/PackageTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/ScenarioBasedAppenderTrackerTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/SiftingAppenderTest.java logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java Log: Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/AppenderTrackerTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/AppenderTrackerTest.java Thu Dec 18 22:13:35 2008 @@ -0,0 +1,63 @@ +package ch.qos.logback.core.sift; + +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 org.junit.Before; +import org.junit.Test; + +import ch.qos.logback.classic.sift.AppenderTracker; +import ch.qos.logback.classic.sift.AppenderTrackerImpl; +import ch.qos.logback.core.Context; +import ch.qos.logback.core.ContextBase; +import ch.qos.logback.core.read.ListAppender; + +public class AppenderTrackerTest { + + + Context context = new ContextBase(); + AppenderTracker<Object, String> appenderTracker = new AppenderTrackerImpl<Object, String>(); + ListAppender<Object> la = new ListAppender<Object>(); + + @Before + public void setUp() { + la.setContext(context); + la.start(); + } + + + @Test + public void empty0() { + long now = 3000; + appenderTracker.stopStaleAppenders(now); + assertEquals(0, appenderTracker.keyList().size()); + } + + @Test + public void empty1() { + long now = 3000; + assertNull(appenderTracker.get("a", now++)); + now += AppenderTrackerImpl.THRESHOLD+1000; + appenderTracker.stopStaleAppenders(now); + assertNull(appenderTracker.get("a", now++)); + } + + @Test + public void smoke() { + assertTrue(la.isStarted()); + long now = 3000; + appenderTracker.put("a", la, now); + assertEquals(la, appenderTracker.get("a", now++)); + now += AppenderTrackerImpl.THRESHOLD+1000; + appenderTracker.stopStaleAppenders(now); + assertFalse(la.isStarted()); + assertNull(appenderTracker.get("a", now++)); + } + + @Test + public void scenarioBased() { + + } +} Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/PackageTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/PackageTest.java Thu Dec 18 22:13:35 2008 @@ -0,0 +1,19 @@ +/** + * 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.core.sift; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({SiftingAppenderTest.class}) +public class PackageTest { +} \ No newline at end of file Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/ScenarioBasedAppenderTrackerTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/ScenarioBasedAppenderTrackerTest.java Thu Dec 18 22:13:35 2008 @@ -0,0 +1,55 @@ +/** + * 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.core.sift; + +import static org.junit.Assert.assertEquals; + +import org.junit.Ignore; +import org.junit.Test; + +import ch.qos.logback.classic.sift.AppenderTracker; + +public class ScenarioBasedAppenderTrackerTest { + + Simulator simulator; + + void verify() { + AppenderTracker at = simulator.appenderTracker; + AppenderTracker t_at = simulator.t_appenderTracker; + //List<String> resultKeys = at.keyList(); + //List<String> witnessKeys = t_at.keyList(); + assertEquals(t_at.keyList(), at.keyList()); + } + + @Test + public void shortTest() { + simulator = new Simulator(20, AppenderTracker.THRESHOLD / 2); + simulator.buildScenario(200); + simulator.simulate(); + verify(); + } + + @Test + public void mediumTest() { + simulator = new Simulator(100, AppenderTracker.THRESHOLD / 2); + simulator.buildScenario(20000); + simulator.simulate(); + verify(); + } + + @Test + @Ignore + public void longetTest() { + simulator = new Simulator(100, AppenderTracker.THRESHOLD / 200); + simulator.buildScenario(2000000); + simulator.simulate(); + verify(); + } +} Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/SiftingAppenderTest.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/SiftingAppenderTest.java Thu Dec 18 22:13:35 2008 @@ -0,0 +1,96 @@ +/** + * 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.core.sift; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import java.util.List; + +import org.junit.Test; +import org.slf4j.MDC; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.classic.sift.AppenderTracker; +import ch.qos.logback.classic.sift.HoardingAppender; +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.classic.util.TeztConstants; +import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.read.ListAppender; +import ch.qos.logback.core.util.StatusPrinter; + +public class SiftingAppenderTest { + + static String PREFIX = TeztConstants.TEST_DIR_PREFIX + "input/joran/hoard/"; + + LoggerContext loggerContext = new LoggerContext(); + Logger logger = loggerContext.getLogger(this.getClass().getName()); + Logger root = loggerContext.getLogger(LoggerContext.ROOT_NAME); + + void configure(String file) throws JoranException { + JoranConfigurator jc = new JoranConfigurator(); + jc.setContext(loggerContext); + jc.doConfigure(file); + } + + @Test + public void unsetDefaultValueProperty() throws JoranException { + configure(PREFIX + "unsetDefaultValueProperty.xml"); + logger.debug("hello"); + HoardingAppender ha = (HoardingAppender) root.getAppender("HOARD"); + assertFalse(ha.isStarted()); + + } + + @Test + public void smoke() throws JoranException { + configure(PREFIX + "smoke.xml"); + logger.debug("smoke"); + long timestamp = 0; + HoardingAppender ha = (HoardingAppender) root.getAppender("HOARD"); + ListAppender<LoggingEvent> listAppender = (ListAppender<LoggingEvent>) ha.appenderTracker.get("smoke", timestamp); + + StatusPrinter.print(loggerContext); + assertNotNull(listAppender); + List<LoggingEvent> eventList = listAppender.list; + assertEquals(1, listAppender.list.size()); + assertEquals("smoke", eventList.get(0).getMessage()); + } + + @Test + public void testWholeCycle() throws JoranException { + String mdcKey = "cycle"; + configure(PREFIX + "completeCycle.xml"); + MDC.put(mdcKey, "a"); + logger.debug("smoke"); + long timestamp = System.currentTimeMillis(); + HoardingAppender ha = (HoardingAppender) root.getAppender("HOARD"); + ListAppender<LoggingEvent> listAppender = (ListAppender<LoggingEvent>) ha.appenderTracker.get("a", timestamp); + StatusPrinter.print(loggerContext); + + assertNotNull(listAppender); + List<LoggingEvent> eventList = listAppender.list; + assertEquals(1, listAppender.list.size()); + assertEquals("smoke", eventList.get(0).getMessage()); + + MDC.remove(mdcKey); + LoggingEvent le = new LoggingEvent("x", logger, Level.INFO, "hello", null, null); + le.setTimeStamp(timestamp+AppenderTracker.THRESHOLD*2); + ha.doAppend(le); + assertFalse(listAppender.isStarted()); + assertEquals(1, ha.appenderTracker.keyList().size()); + assertEquals("cycleDefault", ha.appenderTracker.keyList().get(0)); + + } +} Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java ============================================================================== --- (empty file) +++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/sift/Simulator.java Thu Dec 18 22:13:35 2008 @@ -0,0 +1,92 @@ +/** + * 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.core.sift; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import ch.qos.logback.core.Appender; +import ch.qos.logback.core.appender.NOPAppender; +import ch.qos.logback.core.sift.tracker.AppenderTrackerTImpl; +import ch.qos.logback.core.sift.tracker.SimulationEvent; + +/** + * Simulate use of AppenderTracker by HoardAppender. + * + * @author ceki + * + */ +public class Simulator { + + AppenderTrackerImpl<Object, String> appenderTracker = new AppenderTrackerImpl<Object, String>(); + AppenderTrackerTImpl t_appenderTracker = new AppenderTrackerTImpl(); + + List<String> keySpace = new ArrayList<String>(); + List<SimulationEvent> scenario = new ArrayList<SimulationEvent>(); + Random randomKeyGen = new Random(100); + + Random random = new Random(11234); + + final int maxTimestampInc; + long timestamp = 30000; + + Simulator(int keySpaceLen, int maxTimestampInc) { + this.maxTimestampInc = maxTimestampInc; + Map<String, String> checkMap = new HashMap<String, String>(); + for (int i = 0; i < keySpaceLen; i++) { + String k = getRandomKeyStr(); + if (checkMap.containsKey(k)) { + System.out.println("random key collision occured"); + k += "" + i; + } + keySpace.add(k); + checkMap.put(k, k); + } + + } + + private String getRandomKeyStr() { + int ri = randomKeyGen.nextInt(); + String s = String.format("%X", ri); + return s; + } + + void buildScenario(int simLen) { + int keySpaceLen = keySpace.size(); + for (int i = 0; i < simLen; i++) { + int index = random.nextInt(keySpaceLen); + timestamp += random.nextInt(maxTimestampInc); + String key = keySpace.get(index); + scenario.add(new SimulationEvent(key, timestamp)); + } + } + + public void simulate() { + for (SimulationEvent simeEvent : scenario) { + play(simeEvent, appenderTracker); + play(simeEvent, t_appenderTracker); + } + } + + void play(SimulationEvent simulationEvent, + AppenderTracker<Object, String> appenderTracker) { + String mdcValue = simulationEvent.key; + long timestamp = simulationEvent.timestamp; + Appender<Object> appender = appenderTracker.get(mdcValue, timestamp); + if (appender == null) { + appender = new NOPAppender<Object>(); + appenderTracker.put(mdcValue, appender, timestamp); + } + appenderTracker.stopStaleAppenders(timestamp); + } +}
participants (1)
-
noreply.ceki@qos.ch