package ch.qos.logback.core.rolling;
import static ch.qos.logback.core.CoreConstants.FA_FILENAME_COLLISION_MAP;
import static ch.qos.logback.core.util.CoreTestConstants.OUTPUT_DIR_PREFIX;
import java.util.Map;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.encoder.NopEncoder;
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.StatusPrinter;
public class CollisionDetectionTest {
Context context = new ContextBase();
StatusChecker statusChecker = new StatusChecker(context);
int diff = RandomUtil.getPositiveInt();
protected String randomOutputDir = OUTPUT_DIR_PREFIX + diff + "/";
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
FileAppender<String> buildFileAppender(String name, String filenameSuffix) {
FileAppender<String> fileAppender = new FileAppender<String>();
fileAppender.setName(name);
fileAppender.setContext(context);
fileAppender.setFile(randomOutputDir+filenameSuffix);
fileAppender.setEncoder(new NopEncoder<String>());
return fileAppender;
}
RollingFileAppender<String> buildRollingFileAppender(String name, String filenameSuffix, String patternSuffix) {
RollingFileAppender<String> rollingFileAppender = new RollingFileAppender<String>();
rollingFileAppender.setName(name);
rollingFileAppender.setContext(context);
rollingFileAppender.setFile(randomOutputDir+filenameSuffix);
rollingFileAppender.setEncoder(new NopEncoder<String>());
TimeBasedRollingPolicy<String> tbrp = new TimeBasedRollingPolicy<String>();
tbrp.setContext(context);
tbrp.setFileNamePattern(randomOutputDir+patternSuffix);
tbrp.setParent(rollingFileAppender);
//tbrp.timeBasedFileNamingAndTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<Object>();
//tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(givenTime);
rollingFileAppender.setRollingPolicy(tbrp);
tbrp.start();
return rollingFileAppender;
}
@Test
public void collisionImpossibleForSingleAppender() {
FileAppender<String> fileAppender = buildFileAppender("FA", "collisionImpossibleForSingleAppender");
fileAppender.start();
statusChecker.assertIsErrorFree();
}
@Test
public void appenderStopShouldClearEntryInCollisionMap() {
String key = "FA";
FileAppender<String> fileAppender = buildFileAppender(key, "collisionImpossibleForSingleAppender");
fileAppender.start();
assertCollisionMapHasEntry(FA_FILENAME_COLLISION_MAP, key);
fileAppender.stop();
assertCollisionMapHasNoEntry(FA_FILENAME_COLLISION_MAP, key);
statusChecker.assertIsErrorFree();
}
private void assertCollisionMapHasEntry(String mapName, String key) {
@SuppressWarnings("unchecked")
Map<String, ?> map = (Map<String, ?>) context.getObject(mapName);
Assert.assertNotNull(map);
Assert.assertNotNull(map.get(key));
}
private void assertCollisionMapHasNoEntry(String mapName, String key) {
@SuppressWarnings("unchecked")
Map<String, ?> map = (Map<String, ?>) context.getObject(mapName);
Assert.assertNotNull(map);
Assert.assertNull(map.get(key));
}
@Test
public void collisionWithTwoFileAppenders() {
String suffix = "collisionWithToFileAppenders";
FileAppender<String> fileAppender1 = buildFileAppender("FA1", suffix);
fileAppender1.start();
FileAppender<String> fileAppender2 = buildFileAppender("FA2", suffix);
fileAppender2.start();
statusChecker.assertContainsMatch(Status.ERROR, "'File' option has the same value");
//StatusPrinter.print(context);
}
@Test
public void collisionWith_FA_RFA() {
String suffix = "collisionWith_FA_RFA";
FileAppender<String> fileAppender1 = buildFileAppender("FA", suffix);
fileAppender1.start();
RollingFileAppender<String> rollingfileAppender = buildRollingFileAppender("RFA", suffix, "bla-%d.log");
rollingfileAppender.start();
StatusPrinter.print(context);
statusChecker.assertContainsMatch(Status.ERROR, "'File' option has the same value");
}
@Test
public void collisionWith_2RFA() {
String suffix = "collisionWith_2RFA";
RollingFileAppender<String> rollingfileAppender1 = buildRollingFileAppender("RFA1", suffix, "bla-%d.log");
rollingfileAppender1.start();
RollingFileAppender<String> rollingfileAppender2 = buildRollingFileAppender("RFA1", suffix, "bla-%d.log");
rollingfileAppender2.start();
StatusPrinter.print(context);
statusChecker.assertContainsMatch(Status.ERROR, "'FileNamePattern' option has the same value");
}
}