/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2013, 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.core.appender;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertNull;
import java.io.File;
import java.util.List;
import ch.qos.logback.core.recovery.ResilientFileOutputStream;
import ch.qos.logback.core.status.StatusChecker;
import org.junit.Test;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.NOPOutputStream;
import ch.qos.logback.core.encoder.DummyEncoder;
import ch.qos.logback.core.encoder.NopEncoder;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusManager;
import ch.qos.logback.core.testUtil.RandomUtil;
import ch.qos.logback.core.util.CoreTestConstants;
import ch.qos.logback.core.util.FileUtil;
public class FileAppenderTest extends AbstractAppenderTest<Object> {
private int diff = RandomUtil.getPositiveInt();
protected Appender<Object> getAppender() {
return new FileAppender<Object>();
}
protected Appender<Object> getConfiguredAppender() {
FileAppender<Object> appender = new FileAppender<Object>();
appender.setEncoder(new NopEncoder<Object>());
appender.setFile(CoreTestConstants.OUTPUT_DIR_PREFIX+"temp.log");
appender.setName("test");
appender.setContext(context);
appender.start();
return appender;
}
@Test
public void smoke() {
String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + "/fat-smoke.log";
FileAppender<Object> appender = new FileAppender<Object>();
appender.setEncoder(new DummyEncoder<Object>());
appender.setAppend(false);
appender.setFile(filename);
appender.setName("smoke");
appender.setContext(context);
appender.start();
appender.doAppend(new Object());
appender.stop();
File file = new File(filename);
assertTrue(file.exists());
assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
}
@Test
public void testCreateParentFolders() {
String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + "/fat-testCreateParentFolders-" + diff
+ "/testCreateParentFolders.txt";
File file = new File(filename);
FileAppender<Object> appender = new FileAppender<Object>();
appender.setEncoder(new DummyEncoder<Object>());
appender.setAppend(false);
appender.setFile(filename);
appender.setName("testCreateParentFolders");
appender.setContext(context);
appender.start();
appender.doAppend(new Object());
appender.stop();
assertFalse(FileUtil.isParentDirectoryCreationRequired(file));
assertTrue(file.exists());
// cleanup
assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
File parent = file.getParentFile();
assertTrue("failed to delete " + parent.getAbsolutePath(), parent.delete());
}
@Test
public void testPrudentModeLogicalImplications() {
String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "fat-testPrudentModeLogicalImplications.txt";
File file = new File(filename);
FileAppender<Object> appender = new FileAppender<Object>();
appender.setEncoder(new DummyEncoder<Object>());
appender.setFile(filename);
appender.setName("testPrudentModeLogicalImplications");
appender.setContext(context);
appender.setAppend(false);
appender.setPrudent(true);
appender.start();
assertTrue(appender.isAppend());
StatusManager sm = context.getStatusManager();
//StatusPrinter.print(context);
StatusChecker statusChecker = new StatusChecker(context);
assertEquals(Status.WARN, statusChecker.getHighestLevel(0));
List<Status> statusList = sm.getCopyOfStatusList();
assertTrue("Expecting status list size to be 2 or larger, but was "
+ statusList.size(), statusList.size() >= 2);
String msg1 = statusList.get(1).getMessage();
assertTrue("Got message [" + msg1 + "]", msg1
.startsWith("Setting \"Append\" property"));
appender.doAppend(new Object());
appender.stop();
assertTrue(file.exists());
assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
}
private FileAppenderFriend<Object> getFileAppender(String filename) {
FileAppenderFriend<Object> fa = new FileAppenderFriend<Object>();
fa.setEncoder(new DummyEncoder<Object>());
fa.setFile(filename);
fa.setName("testPrudentMode");
fa.setContext(context);
fa.setAppend(false);
fa.setPrudent(true);
return fa;
}
@Test
public void unlazyAppenderOpensFileAtStart() {
String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "testing.txt";
File file = new File(filename);
if (file.exists()) file.delete();
FileAppender<Object> fa = getFileAppender(filename);
fa.setLazy(false);
assertNull("stream is not null", fa.getOutputStream());
fa.start();
assertTrue("expected ResilientFileOutputStream; actual " + fa.getOutputStream().getClass().getSimpleName(), fa.getOutputStream() instanceof ResilientFileOutputStream);
assertTrue("file does not exist", file.exists());
}
@Test
public void lazyAppenderDoesNotOpenFileAtStart() {
String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "testing.txt";
File file = new File(filename);
if (file.exists()) file.delete();
FileAppender<Object> fa = getFileAppender(filename);
fa.setLazy(true);
assertNull("stream is not null", fa.getOutputStream());
fa.start();
assertTrue("expected NOPOutputStream; actual " + fa.getOutputStream().getClass().getSimpleName(), fa.getOutputStream() instanceof NOPOutputStream);
assertFalse("file does not exist", file.exists());
}
@Test
public void lazyAppenderOpensFileOnAppend() {
String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "testing.txt";
File file = new File(filename);
if (file.exists()) file.delete();
FileAppenderFriend<Object> fa = getFileAppender(filename);
fa.setLazy(true);
fa.start();
assertTrue("expected NOPOutputStream; actual " + fa.getOutputStream().getClass().getSimpleName(), fa.getOutputStream() instanceof NOPOutputStream);
fa.append(new Object());
assertTrue("expected ResilientFileOutputStream; actual " + fa.getOutputStream().getClass().getSimpleName(), fa.getOutputStream() instanceof ResilientFileOutputStream);
assertTrue("file does not exist", file.exists());
}
// helper class used to access protected fields
class FileAppenderFriend<E> extends FileAppender<E> {
public void append(E obj) {
this.subAppend(obj);
}
}
}