package biz.paluch.logging.gelf.intern.sender;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
import biz.paluch.logging.gelf.intern.ErrorReporter;
import biz.paluch.logging.gelf.intern.GelfMessage;
import biz.paluch.logging.gelf.netty.NettyLocalHTTPServer;
import external.MockitoExtension;
import io.netty.handler.codec.http.HttpResponseStatus;
/**
* @author Aleksandar Stojadinovic
* @author Patrick Brueckner
*/
@SuppressWarnings("unchecked")
@ExtendWith(MockitoExtension.class)
public class GelfHTTPSenderIntegrationTests {
private static final GelfMessage GELF_MESSAGE = new GelfMessage("shortMessage", "fullMessage", 12121L, "WARNING");
private NettyLocalHTTPServer server;
private GelfHTTPSender sender;
@Mock
ErrorReporter errorReporter;
@BeforeEach
public void setUp() throws Exception {
server = new NettyLocalHTTPServer();
server.run();
sender = new GelfHTTPSender(new URL("http://127.0.0.1:19393"), 1000, 1000, new ErrorReporter() {
@Override
public void reportError(String message, Exception e) {
System.out.println(message);
if (e != null) {
e.printStackTrace();
}
}
});
}
@AfterEach
public void tearDown() {
server.close();
sender.close();
}
@Test
public void sendMessageTestWithAcceptedResponse() throws IOException {
server.setReturnStatus(HttpResponseStatus.ACCEPTED);
GelfMessage gelfMessage = new GelfMessage("shortMessage", "fullMessage", 12121L, "WARNING");
boolean success = sender.sendMessage(gelfMessage);
assertThat(success).isTrue();
verifyZeroInteractions(errorReporter);
List<Object> jsonValues = server.getJsonValues();
assertThat(jsonValues).hasSize(1);
Map<String, Object> messageJson = (Map<String, Object>) jsonValues.get(0);
assertThat(messageJson.get("short_message")).isEqualTo(gelfMessage.getShortMessage());
assertThat(messageJson.get("full_message")).isEqualTo(gelfMessage.getFullMessage());
assertThat(messageJson.get("timestamp")).isEqualTo(gelfMessage.getTimestamp());
assertThat(messageJson.get("level")).isEqualTo(gelfMessage.getLevel());
}
@Test
public void sendMessageTestWithCreatedResponse() throws IOException {
server.setReturnStatus(HttpResponseStatus.CREATED);
GelfMessage gelfMessage = new GelfMessage("shortMessage", "fullMessage", 12121L, "WARNING");
boolean success = sender.sendMessage(gelfMessage);
assertThat(success).isTrue();
verifyZeroInteractions(errorReporter);
List<Object> jsonValues = server.getJsonValues();
assertThat(jsonValues).hasSize(1);
Map<String, Object> messageJson = (Map<String, Object>) jsonValues.get(0);
assertThat(messageJson.get("short_message")).isEqualTo(gelfMessage.getShortMessage());
assertThat(messageJson.get("full_message")).isEqualTo(gelfMessage.getFullMessage());
assertThat(messageJson.get("timestamp")).isEqualTo(gelfMessage.getTimestamp());
assertThat(messageJson.get("level")).isEqualTo(gelfMessage.getLevel());
}
@Test
public void shouldUsePostHttpMethod() throws IOException {
server.setReturnStatus(HttpResponseStatus.ACCEPTED);
boolean success = sender.sendMessage(GELF_MESSAGE);
assertThat(success).isTrue();
assertThat(server.getLastHttpRequest().name()).isEqualTo("POST");
}
@Test
public void shouldUseJsonContentType() throws IOException {
server.setReturnStatus(HttpResponseStatus.ACCEPTED);
boolean success = sender.sendMessage(GELF_MESSAGE);
assertThat(success).isTrue();
assertThat(server.getLastHttpHeaders().get("Content-type")).isEqualTo("application/json");
}
@Test
public void sendMessageFailureTest() throws IOException {
server.setReturnStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
String uri = "http://127.0.0.1:19393";
GelfHTTPSender sender = new GelfHTTPSender(new URL(uri), 1000, 1000, errorReporter);
boolean success = sender.sendMessage(GELF_MESSAGE);
assertThat(success).isFalse();
verify(errorReporter, times(1)).reportError(anyString(), ArgumentMatchers.<Exception> isNull());
}
}