package org.krakenapps.logfile;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.junit.Test;
import static org.junit.Assert.*;
public class ApacheWebLogParserTest {
private Date parseDate(String s) {
SimpleDateFormat dateFormat = new SimpleDateFormat(
"dd/MMM/yyyy:HH:mm:ss Z", Locale.ENGLISH);
try {
return dateFormat.parse(s);
} catch (ParseException e) {
return null;
}
}
private InetAddress parseAddress(String s) {
try {
return InetAddress.getByName(s);
} catch (UnknownHostException e) {
return null;
}
}
@Test
public void testTimeAndMethod() {
String line = "[29/Dec/2010:16:26:20 +0900] \"GET\"";
ApacheWebLogParser l = new ApacheWebLogParser("%t \"%m\"");
Map<String, Object> m = l.parse(line);
assertEquals("GET", m.get("method"));
assertEquals(parseDate("29/Dec/2010:16:26:20 +0900"), m.get("date"));
}
@Test
public void testTextAndDescriptors() {
String line = "ab 10.0.1.17 -";
ApacheWebLogParser l = new ApacheWebLogParser("ab %h %l");
Map<String, Object> m = l.parse(line);
assertEquals(parseAddress("10.0.1.17"), m.get("remote_host"));
assertNull(m.get("login"));
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidTextAndDescriptors() {
String line = "cb 10.0.1.17 -";
ApacheWebLogParser l = new ApacheWebLogParser("ab %h %l");
l.parse(line);
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidDescriptor() {
// There is no %Z descriptor in specification
new ApacheWebLogParser("%Z %h %l \"%m\"");
}
@Test
public void testPrintableDelimiter() {
String line = " 10.0.1.17|\"GET\" [29/Dec/2010:16:26:20 +0900]-10.0.1.17";
ApacheWebLogParser l = new ApacheWebLogParser(" %h|\"%m\" %t-%a");
Map<String, Object> m = l.parse(line);
assertEquals(parseAddress("10.0.1.17"), m.get("remote_host"));
assertEquals("GET", m.get("method"));
assertEquals(parseDate("29/Dec/2010:16:26:20 +0900"), m.get("date"));
assertEquals(parseAddress("10.0.1.17"), m.get("client_ip"));
}
@Test(expected = IllegalArgumentException.class)
public void testNoDelimiter() {
new ApacheWebLogParser("%h% %l");
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidLogFormat() {
new ApacheWebLogParser("%h%l");
}
@Test
public void testAllDescriptors() {
String logFormat = "%h %l %u %t \"%r\"" +
" %s %b %a %A %B %C %D \"%f\"" +
" %H \"%{SSL_CLIENT_DN}e\"" +
" \"%{Accept-Encoding}i\"" +
" %m \"%{error-notes}n\" \"%{User-Agent}o\" %P %p %q %T %u %U %v %V %X %I %O";
String line = "127.0.0.1 - - [03/Jan/2011:18:59:04 +0900] \"GET /favicon.ico HTTP/1.1\"" +
" 404 209 127.0.0.1 127.0.0.1 209 - 1000 \"C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/favicon.ico\"" +
" HTTP/1.1 \"-\" \"gzip,deflate,sdch\"" +
" GET \"-\" \"-\" 2980 80 0 - /favicon.ico ryusei-PC.office.nchovy.net localhost + 355 424";
ApacheWebLogParser l = new ApacheWebLogParser(logFormat);
Map<String, Object> m = new HashMap<String, Object>();
m = l.parse(line);
assertEquals(parseAddress("127.0.0.1"), m.get("remote_host"));
assertNull(m.get("login"));
assertNull(m.get("user"));
assertEquals(parseDate("03/Jan/2011:18:59:04 +0900"), m.get("date"));
assertEquals("GET /favicon.ico HTTP/1.1", m.get("request"));
assertEquals(404, m.get("status"));
assertEquals(209, m.get("resp_bytes_clf"));
assertEquals(parseAddress("127.0.0.1"), m.get("client_ip"));
assertEquals(parseAddress("127.0.0.1"), m.get("server_ip"));
assertEquals(209, m.get("resp_bytes"));
assertNull(m.get("cookie"));
assertEquals(1000, m.get("duration_msec"));
assertEquals("C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/favicon.ico", m.get("file"));
assertEquals("HTTP/1.1", m.get("protocol"));
assertNull(m.get("ssl_client_dn"));
assertEquals("gzip,deflate,sdch", m.get("accept_encoding"));
assertNull(m.get("user_agent"));
assertEquals("GET", m.get("method"));
assertNull(m.get("note"));
assertNull(m.get("resp_header"));
assertEquals(2980, m.get("pid"));
assertEquals(80, m.get("server_port"));
assertEquals(0, m.get("duration_sec"));
assertNull(m.get("user"));
assertEquals("/favicon.ico", m.get("url"));
assertEquals("ryusei-PC.office.nchovy.net", m.get("canonical_name"));
assertEquals("localhost", m.get("server_name"));
assertEquals("+", m.get("connection"));
assertEquals(355, m.get("rcvd"));
assertEquals(424, m.get("sent"));
}
}