package org.atomnuke.syslog.parser;
import org.atomnuke.syslog.SyslogMessage;
import org.jboss.netty.util.CharsetUtil;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
*
* @author zinic
*/
@RunWith(Enclosed.class)
public class FramingSyslogParserTest {
public static class WhenParsingMessages {
private static final String RFC_TEST = "254 <46>1 2012-12-05T16:17:37.456194-06:00 tohru rsyslogd - - [origin software=\"rsyslogd\" swVersion=\"7.2.2\" x-pid=\"6886\" x-info=\"http://www.rsyslog.com\"][testing software=\"rsyslogd\" swVersion=\"7.2.2\" x-pid=\"6886\" x-info=\"http://www.rsyslog.com\"] start";
private static final String ACTUAL_RSYSLOG = "159 <46>1 2012-12-11T15:48:23.217459-06:00 tohru rsyslogd - - - [origin software=\"rsyslogd\" swVersion=\"7.2.2\" x-pid=\"12297\" x-info=\"http://www.rsyslog.com\"] start";
@Test
public void shouldPerformWell() {
final FramingSyslogParser parser = new FramingSyslogParser();
final byte[] testBytes = RFC_TEST.getBytes(CharsetUtil.UTF_8);
final long then = System.nanoTime();
final int maxIterations = 100000;
for (int iterations = 0; iterations < maxIterations; iterations++) {
for (int index = 0; index < testBytes.length; index++) {
parser.next(testBytes[index]);
}
if (parser.getState() != SyslogParserState.STOP) {
fail("Parsing failed. Reason: " + parser.getErrorMessage());
}
parser.reset();
}
final double secondsTaken = (double) (System.nanoTime() - then) / 1000000000;
final double passesPerSecond = (double) maxIterations / secondsTaken;
System.out.println("Performed " + maxIterations + " parsing passes. Time taken: " + secondsTaken + " seconds. Average number of operations per second: " + passesPerSecond);
}
@Test
public void shouldParseValidMessage() {
final FramingSyslogParser parser = new FramingSyslogParser();
for (byte b : RFC_TEST.getBytes(CharsetUtil.UTF_8)) {
if (parser.getState() == SyslogParserState.ERROR) {
fail("Parsing failed. Reason: " + parser.getErrorMessage());
}
parser.next(b);
}
assertEquals(SyslogParserState.STOP, parser.getState());
final SyslogMessage message = parser.getResult();
assertEquals("tohru", message.originHostname());
assertEquals("rsyslogd", message.applicationName());
assertEquals("start", message.content());
assertEquals(1, message.version());
assertEquals(46, message.priority());
}
}
}