/**
* 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.helper;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.Calendar;
import java.util.TimeZone;
import org.junit.Test;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
/**
* @author Ceki
*
*/
public class FileNamePatternTest {
Context context = new ContextBase();
@Test
public void testSmoke() {
FileNamePattern pp = new FileNamePattern("t", context);
assertEquals("t", pp.convertInt(3));
pp = new FileNamePattern("foo", context);
assertEquals("foo", pp.convertInt(3));
pp = new FileNamePattern("%i foo", context);
assertEquals("3 foo", pp.convertInt(3));
pp = new FileNamePattern("foo%i.xixo", context);
assertEquals("foo3.xixo", pp.convertInt(3));
pp = new FileNamePattern("foo%i.log", context);
assertEquals("foo3.log", pp.convertInt(3));
pp = new FileNamePattern("foo.%i.log", context);
assertEquals("foo.3.log", pp.convertInt(3));
// pp = new FileNamePattern("%i.foo\\%", context);
// assertEquals("3.foo%", pp.convertInt(3));
// pp = new FileNamePattern("\\%foo", context);
// assertEquals("%foo", pp.convertInt(3));
}
@Test
// test ways for dealing with flowing i converter, as in "foo%ix"
public void flowingI() {
{
FileNamePattern pp = new FileNamePattern("foo%i{}bar%i", context);
assertEquals("foo3bar3", pp.convertInt(3));
}
{
FileNamePattern pp = new FileNamePattern("foo%i{}bar%i", context);
assertEquals("foo3bar3", pp.convertInt(3));
}
}
@Test
public void date() {
Calendar cal = Calendar.getInstance();
cal.set(2003, 4, 20, 17, 55);
FileNamePattern pp = new FileNamePattern("foo%d{yyyy.MM.dd}", context);
assertEquals("foo2003.05.20", pp.convert(cal.getTime()));
pp = new FileNamePattern("foo%d{yyyy.MM.dd HH:mm}", context);
assertEquals("foo2003.05.20 17:55", pp.convert(cal.getTime()));
pp = new FileNamePattern("%d{yyyy.MM.dd HH:mm} foo", context);
assertEquals("2003.05.20 17:55 foo", pp.convert(cal.getTime()));
}
@Test
public void dateWithTimeZone() {
TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar cal = Calendar.getInstance(utc);
cal.set(2003, 4, 20, 10, 55);
FileNamePattern fnp = new FileNamePattern("foo%d{yyyy-MM-dd'T'HH:mm, Australia/Perth}", context);
// Perth is 8 hours ahead of UTC
assertEquals("foo2003-05-20T18:55", fnp.convert(cal.getTime()));
}
@Test
public void auxAndTimeZoneShouldNotConflict() {
TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar cal = Calendar.getInstance(utc);
cal.set(2003, 4, 20, 10, 55);
{
FileNamePattern fnp = new FileNamePattern("foo%d{yyyy-MM-dd'T'HH:mm, aux, Australia/Perth}", context);
// Perth is 8 hours ahead of UTC
assertEquals("foo2003-05-20T18:55", fnp.convert(cal.getTime()));
assertNull(fnp.getPrimaryDateTokenConverter());
}
{
FileNamePattern fnp = new FileNamePattern("folder/%d{yyyy/MM, aux, Australia/Perth}/test.%d{yyyy-MM-dd'T'HHmm, Australia/Perth}.log", context);
assertEquals("folder/2003/05/test.2003-05-20T1855.log", fnp.convert(cal.getTime()));
assertNotNull(fnp.getPrimaryDateTokenConverter());
}
}
@Test
public void withBackslash() {
FileNamePattern pp = new FileNamePattern("c:\\foo\\bar.%i", context);
assertEquals("c:/foo/bar.3", pp.convertInt(3));
}
@Test
public void objectListConverter() {
Calendar cal = Calendar.getInstance();
cal.set(2003, 4, 20, 17, 55);
FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd}-%i.txt", context);
assertEquals("foo-2003.05.20-79.txt", fnp.convertMultipleArguments(cal.getTime(), 79));
}
@Test
public void asRegexByDate() {
Calendar cal = Calendar.getInstance();
cal.set(2003, 4, 20, 17, 55);
{
FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd}-%i.txt", context);
String regex = fnp.toRegexForFixedDate(cal.getTime());
assertEquals("foo-2003.05.20-(\\d{1,3}).txt", regex);
}
{
FileNamePattern fnp = new FileNamePattern("\\toto\\foo-%d{yyyy\\MM\\dd}-%i.txt", context);
String regex = fnp.toRegexForFixedDate(cal.getTime());
assertEquals("/toto/foo-2003/05/20-(\\d{1,3}).txt", regex);
}
}
@Test
public void asRegex() {
{
FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd}-%i.txt", context);
String regex = fnp.toRegex();
assertEquals("foo-\\d{4}\\.\\d{2}\\.\\d{2}-\\d{1,2}.txt", regex);
}
{
FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd'T'}-%i.txt", context);
String regex = fnp.toRegex();
assertEquals("foo-\\d{4}\\.\\d{2}\\.\\d{2}T-\\d{1,2}.txt", regex);
}
}
@Test
public void convertMultipleDates() {
Calendar cal = Calendar.getInstance();
cal.set(2003, 4, 20, 17, 55);
FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM, aux}/%d{yyyy.MM.dd}.txt", context);
assertEquals("foo-2003.05/2003.05.20.txt", fnp.convert(cal.getTime()));
}
@Test
public void nullTimeZoneByDefault() {
FileNamePattern fnp = new FileNamePattern("%d{hh}", context);
assertNull(fnp.getPrimaryDateTokenConverter().getTimeZone());
}
@Test
public void settingTimeZoneOptionHasAnEffect() {
TimeZone tz = TimeZone.getTimeZone("Australia/Perth");
FileNamePattern fnp = new FileNamePattern("%d{hh, " + tz.getID() + "}", context);
assertEquals(tz, fnp.getPrimaryDateTokenConverter().getTimeZone());
}
}