package org.graylog2.log;
import junit.framework.TestCase;
import org.apache.log4j.Category;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.graylog2.GelfMessage;
import org.graylog2.GelfSender;
import org.graylog2.GelfSenderResult;
import org.graylog2.GelfUDPSender;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
public class GelfJsonAppenderTest {
private static final String CLASS_NAME = GelfJsonAppenderTest.class.getCanonicalName();
private TestGelfSender gelfSender;
private GelfAppender gelfAppender;
@Before
public void setUp() throws IOException {
gelfSender = new TestGelfSender("localhost");
gelfAppender = new GelfJsonAppender() {
@Override
public GelfSender getGelfSender() {
return gelfSender;
}
@Override
public void append(LoggingEvent event) {
super.append(event);
}
@Override
public Object transformExtendedField(String field, Object object) {
return super.transformExtendedField(field, object);
}
};
}
@Test
public void testAppend() throws Exception {
String message = "{\"simpleProperty\":\"hello gelf\", \"message\":\"test\"}";
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(this.getClass()), 123L, Level.INFO, message, new RuntimeException("LOL"));
gelfAppender.append(event);
assertThat("simpleProperty property exists in additional fields", (String) gelfSender.getLastMessage().getAdditonalFields().get("simpleProperty"), is("hello gelf"));
assertThat("message property exists in additional fields", (String) gelfSender.getLastMessage().getAdditonalFields().get("message"), is("test"));
assertThat("Full message is still JSON", (String) gelfSender.getLastMessage().getFullMessage(), is(message));
}
@Test
public void testBrokenJasom() throws Exception {
String message = "{\"simpleProperty\":\"hello gelf, \"message\":\"test}";
LoggingEvent event = new LoggingEvent(CLASS_NAME, Category.getInstance(this.getClass()), 123L, Level.INFO, message, new RuntimeException("LOL"));
gelfAppender.append(event);
assertThat("No additional fields are created", gelfSender.getLastMessage().getAdditonalFields().size(), is(0));
assertThat("Full message is the same", (String) gelfSender.getLastMessage().getFullMessage(), is(message));
}
private class TestGelfSender extends GelfUDPSender {
private GelfMessage lastMessage;
public TestGelfSender(String host) throws IOException {
super(host);
}
@Override
public GelfSenderResult sendMessage(GelfMessage message) {
this.lastMessage = message;
return GelfSenderResult.OK;
}
public GelfMessage getLastMessage() {
return lastMessage;
}
}
}