/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.log4j.varia; import junit.framework.TestCase; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.RFATestCase; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.net.Socket; /** * Test of ExternallyRolledFileAppender. * * @author Curt Arnold */ public class ERFATestCase extends TestCase { /** * Create new instance of test. * @param name test name. */ public ERFATestCase(final String name) { super(name); } /** * Reset configuration after test. */ public void tearDown() { LogManager.resetConfiguration(); } /** * Test ExternallyRolledFileAppender constructor. */ public void testConstructor() { ExternallyRolledFileAppender appender = new ExternallyRolledFileAppender(); assertEquals(0, appender.getPort()); } /** * Send a message to the ERFA. * @param port port number. * @param msg message, may not be null. * @param expectedResponse expected response, may not be null. * @throws IOException thrown on IO error. */ void sendMessage(int port, final String msg, final String expectedResponse) throws IOException { Socket socket = new Socket((String) null, port); DataInputStream reader = new DataInputStream(socket.getInputStream()); DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); writer.writeUTF(msg); String response = reader.readUTF(); assertEquals(expectedResponse, response); reader.close(); writer.close(); socket.close(); } /** * Test externally triggered rollover. * @throws IOException thrown on IO error. */ public void testRollover() throws IOException { ExternallyRolledFileAppender erfa = new ExternallyRolledFileAppender(); int port = 5500; Logger logger = Logger.getLogger(RFATestCase.class); Logger root = Logger.getRootLogger(); PatternLayout layout = new PatternLayout("%m\n"); erfa.setLayout(layout); erfa.setAppend(false); erfa.setMaxBackupIndex(2); erfa.setPort(port); erfa.setFile("output/ERFA-test2.log"); try { erfa.activateOptions(); } catch(SecurityException ex) { return; } try { Thread.sleep(100); } catch(InterruptedException ex) { } root.addAppender(erfa); // Write exactly 10 bytes with each log for (int i = 0; i < 55; i++) { if (i < 10) { logger.debug("Hello---" + i); } else if (i < 100) { logger.debug("Hello--" + i); } if ((i % 10) == 9) { try { sendMessage(port, "RollOver", "OK"); } catch(SecurityException ex) { return; } } } try { sendMessage(port, "That's all folks.", "Expecting [RollOver] string."); } catch(SecurityException ex) { return; } assertTrue(new File("output/ERFA-test2.log").exists()); assertTrue(new File("output/ERFA-test2.log.1").exists()); assertTrue(new File("output/ERFA-test2.log.2").exists()); assertFalse(new File("output/ERFA-test2.log.3").exists()); } }