[LOGBack-dev] svn commit: r580 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic/net test/java/ch/qos/logback/classic/net

noreply.seb at qos.ch noreply.seb at qos.ch
Wed Sep 13 19:54:25 CEST 2006


Author: seb
Date: Wed Sep 13 19:54:25 2006
New Revision: 580

Modified:
   logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAppender.java
   logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java

Log:
- code reformat in SocketAppender
- updated test so that it does not tests serialization but only appender behaviour.

Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAppender.java	(original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAppender.java	Wed Sep 13 19:54:25 2006
@@ -99,299 +99,299 @@
 
 public class SocketAppender extends AppenderBase {
 
-	/**
-	 * The default port number of remote logging server (4560).
-	 */
-	static final int DEFAULT_PORT = 4560;
-
-	/**
-	 * The default reconnection delay (30000 milliseconds or 30 seconds).
-	 */
-	static final int DEFAULT_RECONNECTION_DELAY = 30000;
-
-	/**
-	 * We remember host name as String in addition to the resolved InetAddress so
-	 * that it can be returned via getOption().
-	 */
-	String remoteHost;
-
-	InetAddress address;
-	int port = DEFAULT_PORT;
-	ObjectOutputStream oos;
-	int reconnectionDelay = DEFAULT_RECONNECTION_DELAY;
-
-	private Connector connector;
-
-	int counter = 0;
-
-	// reset the ObjectOutputStream every 70 calls
-	private static final int RESET_FREQUENCY = 70;
-
-	public SocketAppender() {
-	}
-
-	/**
-	 * Connects to remote server at <code>address</code> and <code>port</code>.
-	 */
-	public SocketAppender(InetAddress address, int port) {
-		this.address = address;
-		this.remoteHost = address.getHostName();
-		this.port = port;
-		// connect(address, port);
-	}
-
-	/**
-	 * Connects to remote server at <code>host</code> and <code>port</code>.
-	 */
-	public SocketAppender(String host, int port) {
-		this.port = port;
-		this.address = getAddressByName(host);
-		this.remoteHost = host;
-		// connect(address, port);
-	}
-
-	// /**
-	// * Connect to the specified <b>RemoteHost</b> and <b>Port</b>.
-	// */
-	// public void activateOptions() {
-	// connect(address, port);
-	// }
-
-	/**
-	 * Start this appender.
-	 */
-	public void start() {
-		int errorCount = 0;
-		if (port == 0) {
-			errorCount++;
-			addError("No port was configured for appender" + name);
-		}
-
-		if (address == null) {
-			errorCount++;
-			addError("No remote address was configured for appender" + name);
-		}
-
-		connect(address, port);
-
-		if (errorCount == 0) {
-			this.started = true;
-		}
-	}
-
-	/**
-	 * Strop this appender.
-	 * 
-	 * <p>
-	 * This will mark the appender as closed and call then {@link #cleanUp}
-	 * method.
-	 */
-	@Override
-	public void stop() {
-		if (!isStarted())
-			return;
-
-		this.started = false;
-		cleanUp();
-	}
-
-	/**
-	 * Drop the connection to the remote host and release the underlying connector
-	 * thread if it has been created
-	 */
-	public void cleanUp() {
-		if (oos != null) {
-			try {
-				oos.close();
-			} catch (IOException e) {
-				addError("Could not close oos.", e);
-			}
-			oos = null;
-		}
-		if (connector != null) {
-			addInfo("Interrupting the connector.");
-			connector.interrupted = true;
-			connector = null; // allow gc
-		}
-	}
-
-	void connect(InetAddress address, int port) {
-		if (this.address == null)
-			return;
-		try {
-			// First, close the previous connection if any.
-			cleanUp();
-			oos = new ObjectOutputStream(new Socket(address, port).getOutputStream());
-		} catch (IOException e) {
-
-			String msg = "Could not connect to remote logback server at ["
-					+ address.getHostName() + "].";
-			if (reconnectionDelay > 0) {
-				msg += " We will try again later.";
-				fireConnector(); // fire the connector thread
-			}
-			addError(msg, e);
-		}
-	}
-
-	@Override
-	protected void append(Object event) {
-
-		if (event == null)
-			return;
-
-		if (address == null) {
-			addError("No remote host is set for SocketAppender named \"" + this.name
-					+ "\".");
-			return;
-		}
-
-		if (oos != null) {
-			try {
-				oos.writeObject(event);
-				//addInfo("=========Flushing.");
-				oos.flush();
-				if (++counter >= RESET_FREQUENCY) {
-					counter = 0;
-					// Failing to reset the object output stream every now and
-					// then creates a serious memory leak.
-					// System.err.println("Doing oos.reset()");
-					oos.reset();
-				}
-			} catch (IOException e) {
-				oos = null;
-				addWarn("Detected problem with connection: " + e);
-				if (reconnectionDelay > 0) {
-					fireConnector();
-				}
-			}
-		}
-	}
-
-	void fireConnector() {
-		if (connector == null) {
-			addInfo("Starting a new connector thread.");
-			connector = new Connector();
-			connector.setDaemon(true);
-			connector.setPriority(Thread.MIN_PRIORITY);
-			connector.start();
-		}
-	}
-
-	static InetAddress getAddressByName(String host) {
-		try {
-			return InetAddress.getByName(host);
-		} catch (Exception e) {
-			// addError("Could not find address of [" + host + "].", e);
-			return null;
-		}
-	}
-
-	/**
-	 * The <b>RemoteHost</b> option takes a string value which should be the host
-	 * name of the server where a {@link SocketNode} is running.
-	 */
-	public void setRemoteHost(String host) {
-		address = getAddressByName(host);
-		remoteHost = host;
-	}
-
-	/**
-	 * Returns value of the <b>RemoteHost</b> option.
-	 */
-	public String getRemoteHost() {
-		return remoteHost;
-	}
-
-	/**
-	 * The <b>Port</b> option takes a positive integer representing the port
-	 * where the server is waiting for connections.
-	 */
-	public void setPort(int port) {
-		this.port = port;
-	}
-
-	/**
-	 * Returns value of the <b>Port</b> option.
-	 */
-	public int getPort() {
-		return port;
-	}
-
-	/**
-	 * The <b>ReconnectionDelay</b> option takes a positive integer representing
-	 * the number of milliseconds to wait between each failed connection attempt
-	 * to the server. The default value of this option is 30000 which corresponds
-	 * to 30 seconds.
-	 * 
-	 * <p>
-	 * Setting this option to zero turns off reconnection capability.
-	 */
-	public void setReconnectionDelay(int delay) {
-		this.reconnectionDelay = delay;
-	}
-
-	/**
-	 * Returns value of the <b>ReconnectionDelay</b> option.
-	 */
-	public int getReconnectionDelay() {
-		return reconnectionDelay;
-	}
-
-	public Layout getLayout() {
-		return null;
-	}
-
-	public void setLayout(Layout layout) {
-	}
-
-	/**
-	 * The Connector will reconnect when the server becomes available again. It
-	 * does this by attempting to open a new connection every
-	 * <code>reconnectionDelay</code> milliseconds.
-	 * 
-	 * <p>
-	 * It stops trying whenever a connection is established. It will restart to
-	 * try reconnect to the server when previpously open connection is droppped.
-	 * 
-	 * @author Ceki G&uuml;lc&uuml;
-	 * @since 0.8.4
-	 */
-	class Connector extends Thread {
-
-		boolean interrupted = false;
-
-		public void run() {
-			Socket socket;
-			while (!interrupted) {
-				try {
-					sleep(reconnectionDelay);
-					addInfo("Attempting connection to " + address.getHostName());
-					socket = new Socket(address, port);
-					synchronized (this) {
-						oos = new ObjectOutputStream(socket.getOutputStream());
-						connector = null;
-						addInfo("Connection established. Exiting connector thread.");
-						break;
-					}
-				} catch (InterruptedException e) {
-					addInfo("Connector interrupted. Leaving loop.");
-					return;
-				} catch (java.net.ConnectException e) {
-					addInfo("Remote host " + address.getHostName()
-							+ " refused connection.");
-				} catch (IOException e) {
-					addInfo("Could not connect to " + address.getHostName()
-							+ ". Exception is " + e);
-				}
-			}
-			// addInfo("Exiting Connector.run() method.");
-		}
-
-		/**
-		 * public void finalize() { LogLog.debug("Connector finalize() has been
-		 * called."); }
-		 */
-	}
+  /**
+   * The default port number of remote logging server (4560).
+   */
+  static final int DEFAULT_PORT = 4560;
+
+  /**
+   * The default reconnection delay (30000 milliseconds or 30 seconds).
+   */
+  static final int DEFAULT_RECONNECTION_DELAY = 30000;
+
+  /**
+   * We remember host name as String in addition to the resolved InetAddress so
+   * that it can be returned via getOption().
+   */
+  String remoteHost;
+
+  InetAddress address;
+  int port = DEFAULT_PORT;
+  ObjectOutputStream oos;
+  int reconnectionDelay = DEFAULT_RECONNECTION_DELAY;
+
+  private Connector connector;
+
+  int counter = 0;
+
+  // reset the ObjectOutputStream every 70 calls
+  private static final int RESET_FREQUENCY = 70;
+
+  public SocketAppender() {
+  }
+
+  /**
+   * Connects to remote server at <code>address</code> and <code>port</code>.
+   */
+  public SocketAppender(InetAddress address, int port) {
+    this.address = address;
+    this.remoteHost = address.getHostName();
+    this.port = port;
+    // connect(address, port);
+  }
+
+  /**
+   * Connects to remote server at <code>host</code> and <code>port</code>.
+   */
+  public SocketAppender(String host, int port) {
+    this.port = port;
+    this.address = getAddressByName(host);
+    this.remoteHost = host;
+    // connect(address, port);
+  }
+
+  // /**
+  // * Connect to the specified <b>RemoteHost</b> and <b>Port</b>.
+  // */
+  // public void activateOptions() {
+  // connect(address, port);
+  // }
+
+  /**
+   * Start this appender.
+   */
+  public void start() {
+    int errorCount = 0;
+    if (port == 0) {
+      errorCount++;
+      addError("No port was configured for appender" + name);
+    }
+
+    if (address == null) {
+      errorCount++;
+      addError("No remote address was configured for appender" + name);
+    }
+
+    connect(address, port);
+
+    if (errorCount == 0) {
+      this.started = true;
+    }
+  }
+
+  /**
+   * Strop this appender.
+   * 
+   * <p>
+   * This will mark the appender as closed and call then {@link #cleanUp}
+   * method.
+   */
+  @Override
+  public void stop() {
+    if (!isStarted())
+      return;
+
+    this.started = false;
+    cleanUp();
+  }
+
+  /**
+   * Drop the connection to the remote host and release the underlying connector
+   * thread if it has been created
+   */
+  public void cleanUp() {
+    if (oos != null) {
+      try {
+        oos.close();
+      } catch (IOException e) {
+        addError("Could not close oos.", e);
+      }
+      oos = null;
+    }
+    if (connector != null) {
+      addInfo("Interrupting the connector.");
+      connector.interrupted = true;
+      connector = null; // allow gc
+    }
+  }
+
+  void connect(InetAddress address, int port) {
+    if (this.address == null)
+      return;
+    try {
+      // First, close the previous connection if any.
+      cleanUp();
+      oos = new ObjectOutputStream(new Socket(address, port).getOutputStream());
+    } catch (IOException e) {
+
+      String msg = "Could not connect to remote logback server at ["
+          + address.getHostName() + "].";
+      if (reconnectionDelay > 0) {
+        msg += " We will try again later.";
+        fireConnector(); // fire the connector thread
+      }
+      addError(msg, e);
+    }
+  }
+
+  @Override
+  protected void append(Object event) {
+
+    if (event == null)
+      return;
+
+    if (address == null) {
+      addError("No remote host is set for SocketAppender named \"" + this.name
+          + "\".");
+      return;
+    }
+
+    if (oos != null) {
+      try {
+        oos.writeObject(event);
+        // addInfo("=========Flushing.");
+        oos.flush();
+        if (++counter >= RESET_FREQUENCY) {
+          counter = 0;
+          // Failing to reset the object output stream every now and
+          // then creates a serious memory leak.
+          // System.err.println("Doing oos.reset()");
+          oos.reset();
+        }
+      } catch (IOException e) {
+        oos = null;
+        addWarn("Detected problem with connection: " + e);
+        if (reconnectionDelay > 0) {
+          fireConnector();
+        }
+      }
+    }
+  }
+
+  void fireConnector() {
+    if (connector == null) {
+      addInfo("Starting a new connector thread.");
+      connector = new Connector();
+      connector.setDaemon(true);
+      connector.setPriority(Thread.MIN_PRIORITY);
+      connector.start();
+    }
+  }
+
+  static InetAddress getAddressByName(String host) {
+    try {
+      return InetAddress.getByName(host);
+    } catch (Exception e) {
+      // addError("Could not find address of [" + host + "].", e);
+      return null;
+    }
+  }
+
+  /**
+   * The <b>RemoteHost</b> option takes a string value which should be the host
+   * name of the server where a {@link SocketNode} is running.
+   */
+  public void setRemoteHost(String host) {
+    address = getAddressByName(host);
+    remoteHost = host;
+  }
+
+  /**
+   * Returns value of the <b>RemoteHost</b> option.
+   */
+  public String getRemoteHost() {
+    return remoteHost;
+  }
+
+  /**
+   * The <b>Port</b> option takes a positive integer representing the port
+   * where the server is waiting for connections.
+   */
+  public void setPort(int port) {
+    this.port = port;
+  }
+
+  /**
+   * Returns value of the <b>Port</b> option.
+   */
+  public int getPort() {
+    return port;
+  }
+
+  /**
+   * The <b>ReconnectionDelay</b> option takes a positive integer representing
+   * the number of milliseconds to wait between each failed connection attempt
+   * to the server. The default value of this option is 30000 which corresponds
+   * to 30 seconds.
+   * 
+   * <p>
+   * Setting this option to zero turns off reconnection capability.
+   */
+  public void setReconnectionDelay(int delay) {
+    this.reconnectionDelay = delay;
+  }
+
+  /**
+   * Returns value of the <b>ReconnectionDelay</b> option.
+   */
+  public int getReconnectionDelay() {
+    return reconnectionDelay;
+  }
+
+  public Layout getLayout() {
+    return null;
+  }
+
+  public void setLayout(Layout layout) {
+  }
+
+  /**
+   * The Connector will reconnect when the server becomes available again. It
+   * does this by attempting to open a new connection every
+   * <code>reconnectionDelay</code> milliseconds.
+   * 
+   * <p>
+   * It stops trying whenever a connection is established. It will restart to
+   * try reconnect to the server when previpously open connection is droppped.
+   * 
+   * @author Ceki G&uuml;lc&uuml;
+   * @since 0.8.4
+   */
+  class Connector extends Thread {
+
+    boolean interrupted = false;
+
+    public void run() {
+      Socket socket;
+      while (!interrupted) {
+        try {
+          sleep(reconnectionDelay);
+          addInfo("Attempting connection to " + address.getHostName());
+          socket = new Socket(address, port);
+          synchronized (this) {
+            oos = new ObjectOutputStream(socket.getOutputStream());
+            connector = null;
+            addInfo("Connection established. Exiting connector thread.");
+            break;
+          }
+        } catch (InterruptedException e) {
+          addInfo("Connector interrupted. Leaving loop.");
+          return;
+        } catch (java.net.ConnectException e) {
+          addInfo("Remote host " + address.getHostName()
+              + " refused connection.");
+        } catch (IOException e) {
+          addInfo("Could not connect to " + address.getHostName()
+              + ". Exception is " + e);
+        }
+      }
+      // addInfo("Exiting Connector.run() method.");
+    }
+
+    /**
+     * public void finalize() { LogLog.debug("Connector finalize() has been
+     * called."); }
+     */
+  }
 
 }

Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java	(original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java	Wed Sep 13 19:54:25 2006
@@ -1,5 +1,10 @@
 package ch.qos.logback.classic.net;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Map;
 
 import junit.framework.TestCase;
@@ -13,126 +18,130 @@
 
 public class SocketAppenderTest extends TestCase {
 
-	private LoggerContext lc;
-	private MockSocketServer mockSocketServer;
-	
-	public void testStartFailNoRemoteHost() {
-		lc = new LoggerContext();
-		SocketAppender appender = new SocketAppender();
-		appender.setContext(lc);
-		appender.setPort(123);
-		appender.start();
-		assertEquals(1, lc.getStatusManager().getCount());
-	}
-
-	public void testRecieveMessage() throws InterruptedException {
-		startServer(1);
-		configureClient();
-		
-		Logger logger = lc.getLogger(LoggerContext.ROOT_NAME);
-		logger.debug("test msg");
-
-    // Wait max 2 seconds for mock server to finish. However, it should
-    // finish much sooner than that.		
-		mockSocketServer.join(2000);
-		assertTrue(mockSocketServer.finished);
-		assertEquals(1, mockSocketServer.loggingEventList.size());
-		
-		LoggingEvent remoteEvent = mockSocketServer.loggingEventList.get(0);
-		assertEquals("test msg", remoteEvent.getMessage());
-		assertEquals(Level.DEBUG, remoteEvent.getLevel());
-	}
-	
-	public void testRecieveWithContext() throws InterruptedException {
-		startServer(1);
-		configureClient();
-		
-		Logger logger = lc.getLogger(LoggerContext.ROOT_NAME);
-		logger.debug("test msg");
-
-    // Wait max 2 seconds for mock server to finish. However, it should
-    // finish much sooner than that.		
-		mockSocketServer.join(2000);
-		assertTrue(mockSocketServer.finished);
-		assertEquals(1, mockSocketServer.loggingEventList.size());
-		
-		LoggingEvent remoteEvent = mockSocketServer.loggingEventList.get(0);
-		
-		LoggerRemoteView loggerRemoteView = remoteEvent.getLoggerRemoteView();
-		assertNotNull(loggerRemoteView);
-		assertEquals("root", loggerRemoteView.getName());
-
-		LoggerContextRemoteView loggerContextRemoteView = loggerRemoteView.getLoggerContextView();
-		assertNotNull(loggerContextRemoteView);
-		assertEquals("test", loggerContextRemoteView.getName());
-		Map<String, String> props = loggerContextRemoteView.getPropertyMap();
-		assertEquals("testValue", props.get("testKey"));
-	}
-	
-	
-	public void testMessageWithMDC() throws InterruptedException {
-		startServer(1);
-		configureClient();
-		
-		Logger logger = lc.getLogger(LoggerContext.ROOT_NAME);
-		
-		MDC.put("key", "testValue");
-		logger.debug("test msg");
-
-    // Wait max 2 seconds for mock server to finish. However, it should
-    // finish much sooner than that.		
-		mockSocketServer.join(2000);
-		assertTrue(mockSocketServer.finished);
-		assertEquals(1, mockSocketServer.loggingEventList.size());
-		
-		LoggingEvent remoteEvent = mockSocketServer.loggingEventList.get(0);
-		Map<String, String> MDCPropertyMap = remoteEvent.getMDCPropertyMap();
-		assertEquals("testValue", MDCPropertyMap.get("key"));
-	}
-	
-	public void testMessageWithUpdatedMDC() throws InterruptedException {
-		startServer(2);
-		configureClient();
-		
-		Logger logger = lc.getLogger(LoggerContext.ROOT_NAME);
-		
-		MDC.put("key", "testValue");
-		logger.debug("test msg");
-		
-		MDC.put("key", "updatedTestValue");
-		logger.debug("test msg 2");
-
-    // Wait max 2 seconds for mock server to finish. However, it should
-    // finish much sooner than that.		
-		mockSocketServer.join(2000);
-		assertTrue(mockSocketServer.finished);
-		assertEquals(2, mockSocketServer.loggingEventList.size());
-		
-		//We observe the second logging event. It should provide us with
-		//the updated MDC property.
-		LoggingEvent remoteEvent = mockSocketServer.loggingEventList.get(1);
-		Map<String, String> MDCPropertyMap = remoteEvent.getMDCPropertyMap();
-		assertEquals("updatedTestValue", MDCPropertyMap.get("key"));
-	}
-	
-	private void startServer(int expectedEventNumber) throws InterruptedException {
-		mockSocketServer = new MockSocketServer(expectedEventNumber);
-		mockSocketServer.start();
-		// give MockSocketServer head start
-		Thread.sleep(100);
-	}
-	
-	private void configureClient() {
-		lc = new LoggerContext();
-		lc.setName("test");
-		lc.setProperty("testKey", "testValue");
-		Logger root = lc.getLogger(LoggerContext.ROOT_NAME);
-		SocketAppender socketAppender = new SocketAppender();
-		socketAppender.setContext(lc);
-		socketAppender.setName("socket");
-		socketAppender.setPort(4560);
-		socketAppender.setRemoteHost("localhost");
-		root.addAppender(socketAppender);
-		socketAppender.start();
-	}
+  ByteArrayOutputStream bos;
+  ObjectInputStream inputStream;
+  SocketAppender appender;
+  Logger logger;
+
+  LoggerContext lc;
+  MockSocketServer mockSocketServer;
+
+  public void setUp() throws Exception {
+    lc = new LoggerContext();
+    lc.setName("test");
+    lc.setProperty("testKey", "testValue");
+    appender = new SocketAppender();
+    appender.setPort(123);
+    appender.setContext(lc);
+    appender.setRemoteHost("localhost");
+    appender.start();
+    logger = lc.getLogger(LoggerContext.ROOT_NAME);
+    logger.addAppender(appender);
+  }
+
+  public void testStartFailNoRemoteHost() {
+    lc = new LoggerContext();
+    SocketAppender appender = new SocketAppender();
+    appender.setContext(lc);
+    appender.setPort(123);
+    appender.start();
+    assertEquals(1, lc.getStatusManager().getCount());
+  }
+
+  public void testRecieveMessage() throws InterruptedException, IOException,
+      ClassNotFoundException {
+
+    //create the byte output stream
+    bos = new ByteArrayOutputStream() ;
+    appender.oos = new ObjectOutputStream(bos);
+    
+    LoggingEvent event = createLoggingEvent();
+    appender.append(event);
+
+    //create the input stream based on the ouput stream
+    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+    inputStream = new ObjectInputStream(bis);
+    
+    LoggingEvent remoteEvent = (LoggingEvent) inputStream.readObject();
+
+    assertEquals("test message", remoteEvent.getMessage());
+    assertEquals(Level.DEBUG, remoteEvent.getLevel());
+  }
+
+  public void testRecieveWithContext() throws InterruptedException, IOException, ClassNotFoundException {
+
+    //create the byte output stream
+    bos = new ByteArrayOutputStream() ;
+    appender.oos = new ObjectOutputStream(bos);
+    
+    LoggingEvent event = createLoggingEvent();
+    appender.append(event);
+
+    //create the input stream based on the ouput stream
+    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+    inputStream = new ObjectInputStream(bis);
+    
+    LoggingEvent remoteEvent = (LoggingEvent) inputStream.readObject();
+
+    LoggerRemoteView loggerRemoteView = remoteEvent.getLoggerRemoteView();
+    assertNotNull(loggerRemoteView);
+    assertEquals("root", loggerRemoteView.getName());
+
+    LoggerContextRemoteView loggerContextRemoteView = loggerRemoteView
+        .getLoggerContextView();
+    assertNotNull(loggerContextRemoteView);
+    assertEquals("test", loggerContextRemoteView.getName());
+    Map<String, String> props = loggerContextRemoteView.getPropertyMap();
+    assertEquals("testValue", props.get("testKey"));
+  }
+
+  public void testMessageWithMDC() throws InterruptedException, IOException, ClassNotFoundException {
+    //create the byte output stream
+    bos = new ByteArrayOutputStream() ;
+    appender.oos = new ObjectOutputStream(bos);
+
+    MDC.put("key", "testValue");
+    LoggingEvent event = createLoggingEvent();
+    appender.append(event);
+
+    //create the input stream based on the ouput stream
+    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+    inputStream = new ObjectInputStream(bis);
+    
+    LoggingEvent remoteEvent = (LoggingEvent) inputStream.readObject();
+    
+    Map<String, String> MDCPropertyMap = remoteEvent.getMDCPropertyMap();
+    assertEquals("testValue", MDCPropertyMap.get("key"));
+  }
+
+  public void testMessageWithUpdatedMDC() throws InterruptedException, IOException, ClassNotFoundException {
+    //create the byte output stream
+    bos = new ByteArrayOutputStream() ;
+    appender.oos = new ObjectOutputStream(bos);
+
+    MDC.put("key", "testValue");
+    LoggingEvent event = createLoggingEvent();
+    appender.append(event);
+
+    MDC.put("key", "updatedTestValue");
+    event = createLoggingEvent();
+    appender.append(event);
+
+    //create the input stream based on the ouput stream
+    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+    inputStream = new ObjectInputStream(bis);
+    
+    @SuppressWarnings("unused")
+    LoggingEvent remoteEvent1 = (LoggingEvent) inputStream.readObject();
+    LoggingEvent remoteEvent2 = (LoggingEvent) inputStream.readObject();
+
+    Map<String, String> MDCPropertyMap = remoteEvent2.getMDCPropertyMap();
+    assertEquals("updatedTestValue", MDCPropertyMap.get("key"));
+  }
+
+  private LoggingEvent createLoggingEvent() {
+    LoggingEvent le = new LoggingEvent(this.getClass().getName(), logger,
+        Level.DEBUG, "test message", null, null);
+    return le;
+  }
 }



More information about the logback-dev mailing list