/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, 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.rolling;
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.After;
import org.junit.Before;
import org.junit.Test;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.appender.AbstractAppenderTest;
import ch.qos.logback.core.encoder.DummyEncoder;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusChecker;
import ch.qos.logback.core.testUtil.RandomUtil;
import ch.qos.logback.core.util.CoreTestConstants;
import ch.qos.logback.core.util.StatusPrinter;
public class RollingFileAppenderTest extends AbstractAppenderTest<Object> {
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
Context context = new ContextBase();
TimeBasedRollingPolicy<Object> tbrp = new TimeBasedRollingPolicy<Object>();
int diff = RandomUtil.getPositiveInt();
String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/";
@Before
public void setUp() throws Exception {
// noStartTest fails if the context is set in setUp
// rfa.setContext(context);
rfa.setEncoder(new DummyEncoder<Object>());
rfa.setName("test");
tbrp.setContext(context);
tbrp.setParent(rfa);
}
@After
public void tearDown() throws Exception {
}
@Override
protected Appender<Object> getAppender() {
return rfa;
}
@Override
protected Appender<Object> getConfiguredAppender() {
rfa.setContext(context);
tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log");
tbrp.start();
rfa.setRollingPolicy(tbrp);
rfa.start();
return rfa;
}
@Test
public void testPrudentModeLogicalImplications() {
rfa.setContext(context);
// prudent mode will force "file" property to be null
rfa.setFile("some non null value");
rfa.setAppend(false);
rfa.setPrudent(true);
tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log");
tbrp.start();
rfa.setRollingPolicy(tbrp);
rfa.start();
assertTrue(rfa.isAppend());
assertNull(rfa.rawFileProperty());
assertTrue(rfa.isStarted());
}
@Test
public void testPrudentModeLogicalImplicationsOnCompression() {
rfa.setContext(context);
rfa.setAppend(false);
rfa.setPrudent(true);
tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log.zip");
tbrp.start();
rfa.setRollingPolicy(tbrp);
rfa.start();
StatusChecker checker = new StatusChecker(context);
assertFalse(rfa.isStarted());
assertEquals(Status.ERROR, checker.getHighestLevel(0));
}
@Test
public void testFilePropertyAfterRollingPolicy() {
rfa.setContext(context);
rfa.setRollingPolicy(tbrp);
rfa.setFile("x");
StatusPrinter.print(context);
StatusChecker statusChecker = new StatusChecker(context.getStatusManager());
statusChecker.assertContainsMatch(Status.ERROR, "File property must be set before any triggeringPolicy ");
}
@Test
public void testFilePropertyAfterTriggeringPolicy() {
rfa.setContext(context);
rfa.setTriggeringPolicy(new SizeBasedTriggeringPolicy<Object>());
rfa.setFile("x");
StatusChecker statusChecker = new StatusChecker(context.getStatusManager());
statusChecker.assertContainsMatch(Status.ERROR, "File property must be set before any triggeringPolicy ");
}
@Test
public void testFileNameWithParenthesis() {
// if ')' is not escaped, the test throws
// java.lang.IllegalStateException: FileNamePattern [.../program(x86)/toto-%d.log] does not contain a valid
// DateToken
rfa.setContext(context);
tbrp.setFileNamePattern(randomOutputDir + "program(x86)/toto-%d.log");
tbrp.start();
rfa.setRollingPolicy(tbrp);
rfa.start();
rfa.doAppend("hello");
}
@Test
public void stopTimeBasedRollingPolicy() {
rfa.setContext(context);
tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log.zip");
tbrp.start();
rfa.setRollingPolicy(tbrp);
rfa.start();
StatusPrinter.print(context);
assertTrue(tbrp.isStarted());
assertTrue(rfa.isStarted());
rfa.stop();
assertFalse(rfa.isStarted());
assertFalse(tbrp.isStarted());
}
@Test
public void stopFixedWindowRollingPolicy() {
rfa.setContext(context);
rfa.setFile(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-.log");
FixedWindowRollingPolicy fwRollingPolicy = new FixedWindowRollingPolicy();
fwRollingPolicy.setContext(context);
fwRollingPolicy.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%i.log.zip");
fwRollingPolicy.setParent(rfa);
fwRollingPolicy.start();
SizeBasedTriggeringPolicy<Object> sbTriggeringPolicy = new SizeBasedTriggeringPolicy<Object>();
sbTriggeringPolicy.setContext(context);
sbTriggeringPolicy.start();
rfa.setRollingPolicy(fwRollingPolicy);
rfa.setTriggeringPolicy(sbTriggeringPolicy);
rfa.start();
StatusPrinter.print(context);
assertTrue(fwRollingPolicy.isStarted());
assertTrue(sbTriggeringPolicy.isStarted());
assertTrue(rfa.isStarted());
rfa.stop();
assertFalse(rfa.isStarted());
assertFalse(fwRollingPolicy.isStarted());
assertFalse(sbTriggeringPolicy.isStarted());
}
/**
* Test for http://jira.qos.ch/browse/LOGBACK-796
*/
@Test
public void testFileShouldNotMatchFileNamePattern() {
rfa.setContext(context);
rfa.setFile(CoreTestConstants.OUTPUT_DIR_PREFIX + "x-2013-04.log");
tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "x-%d{yyyy-MM}.log");
tbrp.start();
rfa.setRollingPolicy(tbrp);
rfa.start();
StatusChecker statusChecker = new StatusChecker(context);
final String msg = "File property collides with fileNamePattern. Aborting.";
boolean containsMatch = statusChecker.containsMatch(Status.ERROR, msg);
assertTrue("Missing error: " + msg, containsMatch);
}
@Test
public void collidingTimeformat() {
rfa.setContext(context);
rfa.setAppend(false);
rfa.setPrudent(true);
tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d{dd}.log.zip");
tbrp.start();
rfa.setRollingPolicy(tbrp);
rfa.start();
StatusChecker checker = new StatusChecker(context);
assertFalse(rfa.isStarted());
assertEquals(Status.ERROR, checker.getHighestLevel(0));
StatusPrinter.print(context);
checker.assertContainsMatch("The date format in FileNamePattern will result");
}
@Test
public void collidingFileNamePattern() {
String filenamePattern = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "-collision-%d.log.zip";
RollingFileAppender<Object> appender0 = new RollingFileAppender<Object>();
appender0.setName("FA0");
appender0.setContext(context);
appender0.setEncoder(new DummyEncoder<Object>());
TimeBasedRollingPolicy<Object> tbrp0 = new TimeBasedRollingPolicy<Object>();
tbrp0.setContext(context);
tbrp0.setFileNamePattern(filenamePattern);
tbrp0.setParent(appender0);
tbrp0.start();
appender0.setRollingPolicy(tbrp0);
appender0.start();
assertTrue(appender0.isStarted());
RollingFileAppender<Object> appender1 = new RollingFileAppender<Object>();
appender1.setName("FA1");
appender1.setFile("X");
appender1.setContext(context);
appender1.setEncoder(new DummyEncoder<Object>());
TimeBasedRollingPolicy<Object> tbrp1 = new TimeBasedRollingPolicy<Object>();
tbrp1.setContext(context);
tbrp1.setFileNamePattern(filenamePattern);
tbrp1.setParent(appender1);
tbrp1.start();
appender1.setRollingPolicy(tbrp1);
appender1.start();
// StatusPrinter.print(context);
assertFalse(appender1.isStarted());
StatusChecker checker = new StatusChecker(context);
checker.assertContainsMatch(Status.ERROR, "'FileNamePattern' option has the same value");
}
}