// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.components;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import util.FileUtil;
public class LoggerTest {
private final String dirPath = "testLogs";
private Logger l;
private LogData ld;
private String filename = "fitnesse20030306134205.log";
private String logLine = "myHost - - [06/Mar/2003:13:42:05 -0100] \"request\" 42 666";
private Locale saveLocale;
@Before
public void setUp() throws Exception {
saveLocale = Locale.getDefault();
Locale.setDefault(Locale.US);
l = new Logger(dirPath);
TimeZone z = TimeZone.getTimeZone("GMT-1:00");
Calendar time = new GregorianCalendar(2003, 2, 6, 13, 42, 5);
time.setTimeZone(z);
ld = new LogData(
"myHost",
time,
"request",
42,
666,
null);
}
@After
public void tearDown() throws Exception {
l.close();
FileUtil.deleteFileSystemDirectory(dirPath);
Locale.setDefault(saveLocale);
}
@Test
public void testTimeZoneHandling() {
// let's figure out how this stuff works...
Calendar calendar = new GregorianCalendar(2003, 0, 2, 3, 4, 5);
calendar.setTimeZone(TimeZone.getTimeZone("GMT+2"));
DateFormat format = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss Z");
DateFormat format2 = (DateFormat) format.clone();
format2.setTimeZone(calendar.getTimeZone());
assertEquals("Jan 02, 2003 03:04:05 +0200", format2.format(calendar.getTime()));
}
@Test
public void testConstruction() throws Exception {
assertEquals(dirPath, l.getDirectory().getName());
File dir = new File(dirPath);
assertEquals(true, dir.exists());
assertEquals(true, dir.isDirectory());
}
@Test
public void testLogFormat() throws Exception {
String line = l.formatLogLine(ld);
assertEquals(logLine, line);
}
@Test
public void testLogFileName() throws Exception {
String logName = Logger.makeLogFileName(ld.time);
assertEquals(filename, logName);
}
@Test
public void testLoggingOneLineInNewFile() throws Exception {
l.log(ld);
l.close();
File dir = l.getDirectory();
File file = new File(dir, filename);
assertTrue(file.exists());
String contents = FileUtil.getFileContent(file);
assertEquals(logLine + System.getProperty("line.separator"), contents);
}
@Test
public void testLogSecondLineInSameFile() throws Exception {
l.log(ld);
LogData ld2 = new LogData(
"newHost",
ld.time,
ld.requestLine,
ld.status,
ld.size,
ld.username);
l.log(ld2);
File dir = l.getDirectory();
File file = new File(dir, filename);
BufferedReader br = new BufferedReader(new FileReader(file));
assertEquals(logLine, br.readLine());
assertEquals("newHost - - [06/Mar/2003:13:42:05 -0100] \"request\" 42 666", br.readLine());
assertTrue(br.readLine() == null);
br.close();
}
@Test
public void testLogLineInNewFile() throws Exception {
Calendar time = (Calendar) ld.time.clone();
time.add(Calendar.DATE, 1);
LogData nextDay = new LogData(
ld.host,
time,
ld.requestLine,
ld.status,
ld.size,
ld.username);
l.log(ld);
l.log(nextDay);
l.close();
File firstFile = getLogFileFor(ld);
File secondFile = getLogFileFor(nextDay);
assertTrue(firstFile.exists());
assertTrue(secondFile.exists());
String firstContent = FileUtil.getFileContent(firstFile);
assertEquals(l.formatLogLine(ld) + System.getProperty("line.separator"), firstContent);
String secondContent = FileUtil.getFileContent(secondFile);
assertEquals(l.formatLogLine(nextDay) + System.getProperty("line.separator"), secondContent);
}
@Test
public void testLoggingIncludesUsername() throws Exception {
ld = new LogData(
ld.host,
ld.time,
ld.requestLine,
ld.status,
ld.size,
"Joe");
l.log(ld);
l.close();
File dir = l.getDirectory();
File file = new File(dir, filename);
assertTrue(file.exists());
String contents = FileUtil.getFileContent(file);
logLine = "myHost - Joe [06/Mar/2003:13:42:05 -0100] \"request\" 42 666";
assertEquals(logLine + System.getProperty("line.separator"), contents);
}
private File getLogFileFor(LogData data) {
return new File(l.getDirectory(), Logger.makeLogFileName(data.time));
}
}