package org.esigate.servlet.impl;
import java.util.Properties;
import junit.framework.TestCase;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;
import org.esigate.http.ContentTypeHelper;
import org.esigate.http.IncomingRequest;
import org.esigate.servlet.MockHttpServletResponse;
public class ResponseCapturingWrapperTest extends TestCase {
private static final int BUFFER_SIZE = 1024;
private static final String SMALL_STRING = "test";
private static final String BIG_STRING;
private ContentTypeHelper contentTypeHelper;
private MockHttpServletResponse httpServletResponse;
private ResponseSender responseSender;
private IncomingRequest incomingRequest;
static {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 300; i++) {
stringBuilder.append(SMALL_STRING);
}
BIG_STRING = stringBuilder.toString();
}
@Override
protected void setUp() throws Exception {
super.setUp();
Properties properties = new Properties();
contentTypeHelper = new ContentTypeHelper(properties);
httpServletResponse = new MockHttpServletResponse();
httpServletResponse.setBufferSize(BUFFER_SIZE);
responseSender = new ResponseSender();
incomingRequest = IncomingRequest.builder("http://test.mydomain.fr/foobar/").build();
}
public void testSmallHtmlResponse() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, false, BUFFER_SIZE,
responseSender, incomingRequest);
tested.setContentType("text/html;charset=UTF-8");
tested.getWriter().write(SMALL_STRING);
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
assertEquals(SMALL_STRING, EntityUtils.toString(entity));
assertNull("Nothing should have been written to the response yet", httpServletResponse.getWriterContent());
assertNull("Nothing should have been written to the response yet",
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
}
public void testSmallHtmlResponseWrittenToOutputStream() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, false, BUFFER_SIZE,
responseSender, incomingRequest);
tested.setContentType("text/html;charset=UTF-8");
tested.getOutputStream().write(SMALL_STRING.getBytes("UTF-8"));
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
assertEquals(SMALL_STRING, EntityUtils.toString(entity));
assertNull("Nothing should have been written to the response yet", httpServletResponse.getWriterContent());
assertNull("Nothing should have been written to the response yet",
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
}
public void testSmallHtmlResponseWrittenToOutputStreamAndClose() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, false, BUFFER_SIZE,
responseSender, incomingRequest);
tested.setContentType("text/html;charset=UTF-8");
tested.getOutputStream().write(SMALL_STRING.getBytes("UTF-8"));
tested.getOutputStream().close();
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
assertEquals(SMALL_STRING, EntityUtils.toString(entity));
assertNull("Nothing should have been written to the response yet", httpServletResponse.getWriterContent());
assertNull("Nothing should have been written to the response yet",
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
}
public void testSmallNonParseableResponse() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, true, BUFFER_SIZE, responseSender,
incomingRequest);
tested.setContentType("binary/octet-stream");
tested.getOutputStream().print(SMALL_STRING);
assertNull("Nothing should have been written to the response yet", httpServletResponse.getWriterContent());
assertNull("Nothing should have been written to the response yet",
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
assertEquals(SMALL_STRING, EntityUtils.toString(entity));
}
public void testSmallNonParseableResponseWrittenToWriter() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, true, BUFFER_SIZE, responseSender,
incomingRequest);
tested.setContentType("binary/octet-stream");
tested.getWriter().print(SMALL_STRING);
assertFalse(httpServletResponse.isCommitted());
tested.getWriter().flush();
tested.getCloseableHttpResponse();
assertTrue(httpServletResponse.isCommitted());
try {
httpServletResponse.getOutputStream();
fail("Response should be already closed");
} catch (IllegalStateException e) {
// Just what we expect
}
}
public void testSmallNonParseableResponseForwardsHeaders() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, true, BUFFER_SIZE, responseSender,
incomingRequest);
tested.setContentType("binary/octet-stream");
tested.setHeader("titi", "toto");
tested.getWriter().print(SMALL_STRING);
tested.getWriter().flush();
tested.getCloseableHttpResponse();
assertTrue(httpServletResponse.isCommitted());
assertEquals("toto", httpServletResponse.getHeader("TiTi"));
}
public void testBigHtmlResponse() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, false, BUFFER_SIZE,
responseSender, incomingRequest);
tested.setContentType("text/html;charset=UTF-8");
tested.getWriter().write(BIG_STRING);
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
assertEquals(BIG_STRING, EntityUtils.toString(entity));
assertNull("Nothing should have been written to the response yet", httpServletResponse.getWriterContent());
assertNull("Nothing should have been written to the response yet",
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
}
public void testBigHtmlResponseWrittenToOutpustream() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, false, BUFFER_SIZE,
responseSender, incomingRequest);
tested.setContentType("text/html;charset=UTF-8");
tested.getOutputStream().write(BIG_STRING.getBytes("UTF-8"));
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
assertEquals(BIG_STRING, EntityUtils.toString(entity));
assertNull("Nothing should have been written to the response yet", httpServletResponse.getWriterContent());
assertNull("Nothing should have been written to the response yet",
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
}
public void testBigNonParseableResponse() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, true, BUFFER_SIZE, responseSender,
incomingRequest);
tested.setContentType("binary/octet-stream");
tested.getOutputStream().print(BIG_STRING);
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
// Should be truncated to the buffer size as the rest did not need to be
// captured
assertEquals(BIG_STRING.substring(0, BUFFER_SIZE), EntityUtils.toString(entity));
assertNull("Nothing should have been written using the writer", httpServletResponse.getWriterContent());
assertEquals("The response should have been sent entirely to the outputStream", BIG_STRING,
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
}
public void testParseableResponseNoCharset() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, true, BUFFER_SIZE, responseSender,
incomingRequest);
tested.setContentType("text/html");
tested.getWriter().write(SMALL_STRING);
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
assertEquals(SMALL_STRING, EntityUtils.toString(entity));
assertNull("Nothing should have been written to the response yet", httpServletResponse.getWriterContent());
assertNull("Nothing should have been written to the response yet",
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
}
public void testParseableResponseNoContentType() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, true, BUFFER_SIZE, responseSender,
incomingRequest);
tested.getWriter().write(SMALL_STRING);
HttpEntity entity = tested.getCloseableHttpResponse().getEntity();
assertNotNull(entity);
assertEquals(SMALL_STRING, EntityUtils.toString(entity));
assertNull("Nothing should have been written to the response yet", httpServletResponse.getWriterContent());
assertNull("Nothing should have been written to the response yet",
httpServletResponse.getOutputStreamContentAsString("UTF-8"));
}
public void testSendRedirect() throws Exception {
ResponseCapturingWrapper tested =
new ResponseCapturingWrapper(httpServletResponse, contentTypeHelper, true, BUFFER_SIZE, responseSender,
incomingRequest);
tested.sendRedirect("http://dummy/");
CloseableHttpResponse response = tested.getCloseableHttpResponse();
assertEquals(302, response.getStatusLine().getStatusCode());
assertEquals("http://dummy/", response.getFirstHeader("Location").getValue());
}
}