/**
* This file is part of the source code and related artifacts for eGym Application.
*
* Copyright © 2013 eGym GmbH
*/
package de.egym.logqueue;
import static org.testng.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
import de.egym.logqueue.config.EgymLogPipelineModule;
import de.egym.logqueue.formatter.EgymLogPlainTextFormatter;
/**
* Ensures that the framework handles internal exceptions properly.
*/
@Test
public class ExceptionHandlingTest {
/**
* The test configuration.
*/
private static class EgymTestLogPipelineModule extends EgymLogPipelineModule {
@Override
protected void configure() {
skipDecoration().formatWith(EgymLogPlainTextFormatter.class).writeTo(FaultyWriter.class);
}
}
private static final Logger log = LoggerFactory.getLogger(EgymLogQueueImpl.class);
private EgymLogQueueImpl logQueue;
private ByteArrayOutputStream stdErrStream;
private ByteArrayOutputStream stdOutStream;
/**
* Redirect stdout/stderr to our own streams.
*/
@BeforeMethod
private void init() {
stdErrStream = new ByteArrayOutputStream();
stdOutStream = new ByteArrayOutputStream();
System.setErr(new PrintStream(stdErrStream));
System.setOut(new PrintStream(stdOutStream));
}
/**
* Reset stdout/stderr.
*/
@AfterMethod
public void cleanup() {
System.setErr(null);
System.setOut(null);
}
@Test
public void testExceptionHandling() {
givenPipelineConfiguration();
whenLoggingRequest("Fizz", "Buzz");
thenEnsureExceptionGetsLoggedToStdErr();
}
private void thenEnsureExceptionGetsLoggedToStdErr() {
final String stdErrContent = stdErrStream.toString();
final String stdOutContent = stdOutStream.toString();
// Print for diagnostic purposes.
System.err.println(stdErrContent);
System.out.println(stdOutContent);
assertTrue(stdErrContent.length() > 0);
assertTrue(stdErrContent.contains("RuntimeException"));
assertEquals(stdOutContent, "");
}
private void givenPipelineConfiguration() {
final Injector injector = Guice.createInjector(new EgymLogModule(), new EgymTestLogPipelineModule());
logQueue = (EgymLogQueueImpl) injector.getInstance(EgymLogQueue.class);
}
private void whenLoggingRequest(String... logMessages) {
logQueue.startRequest();
for (String logMessage : logMessages) {
log.info(logMessage);
}
logQueue.endRequest();
}
}