Expanded test cases, fixed a potential NPE.

This commit is contained in:
Harald Kuhr 2011-04-15 17:05:47 +02:00
parent 521c4e4bbc
commit c6d6a86343
3 changed files with 157 additions and 3 deletions

View File

@ -114,9 +114,7 @@ public abstract class ImageFilter extends GenericFilter {
// Make image available to other filters (avoid unnecessary serializing/deserializing)
imageResponse.setImage(image);
//System.out.println("Done.");
}
if (encode) {
//System.out.println("Encoding image...");
// Encode image to original response

View File

@ -189,7 +189,7 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima
String outputType = getOutputContentType();
// Force transcoding, if no other filtering is done
if (!outputType.equals(originalContentType)) {
if (outputType != null && !outputType.equals(originalContentType)) {
getImage();
}

View File

@ -88,6 +88,8 @@ public class ImageFilterTestCase {
// Verifications
verify(chain).doFilter(request, response);
verify(response, never()).getOutputStream();
verify(response, never()).getWriter();
}
@Test
@ -342,6 +344,160 @@ public class ImageFilterTestCase {
// decoded once, then encoded once
}
// TODO: Add various test cases where resource/upstream filter fails (response.sendError + exception)
@Test(expected = ServletException.class)
public void passThroughIfNotTriggerException() throws ServletException, IOException {
// Filter init & setup
ServletContext context = mock(ServletContext.class);
FilterConfig filterConfig = mock(FilterConfig.class);
when(filterConfig.getFilterName()).thenReturn("dummy");
when(filterConfig.getServletContext()).thenReturn(context);
when(filterConfig.getInitParameterNames()).thenReturn(new StringTokenIterator("foo, bar"));
DummyFilter filter = new DummyFilter() {
@Override
protected boolean trigger(ServletRequest pRequest) {
return false;
}
};
filter.init(filterConfig);
// Request/response setup
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
FilterChain chain = mock(FilterChain.class);
doThrow(new ServletException("Something went terribly wrong. Take shelter.")).when(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));
// Execute
try {
filter.doFilter(request, response, chain);
}
finally {
// Verifications
verify(chain).doFilter(request, response);
verify(response, never()).getOutputStream();
verify(response, never()).getWriter();
}
}
@Test(expected = ServletException.class)
public void normalFilterException() throws ServletException, IOException {
// Filter init & setup
ServletContext context = mock(ServletContext.class);
FilterConfig filterConfig = mock(FilterConfig.class);
when(filterConfig.getFilterName()).thenReturn("dummy");
when(filterConfig.getServletContext()).thenReturn(context);
when(filterConfig.getInitParameterNames()).thenReturn(new StringTokenIterator("foo, bar"));
DummyFilter filter = new DummyFilter();
filter.init(filterConfig);
// Request/response setup
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ServletOutputStream out = spy(new OutputStreamAdapter(stream));
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
when(response.getOutputStream()).thenReturn(out);
FilterChain chain = mock(FilterChain.class);
doThrow(new ServletException("Something went terribly wrong. Take shelter.")).when(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));
// Execute
try {
filter.doFilter(request, response, chain);
}
finally {
// Verifications
verify(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));
}
}
@Test
public void passThroughIfNotTriggerSendError() throws ServletException, IOException {
// Filter init & setup
ServletContext context = mock(ServletContext.class);
FilterConfig filterConfig = mock(FilterConfig.class);
when(filterConfig.getFilterName()).thenReturn("dummy");
when(filterConfig.getServletContext()).thenReturn(context);
when(filterConfig.getInitParameterNames()).thenReturn(new StringTokenIterator("foo, bar"));
DummyFilter filter = new DummyFilter() {
@Override
protected boolean trigger(ServletRequest pRequest) {
return false;
}
};
filter.init(filterConfig);
// Request/response setup
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
FilterChain chain = mock(FilterChain.class);
doAnswer(new Answer<Void>() {
public Void answer(InvocationOnMock invocation) throws Throwable {
HttpServletResponse response = (HttpServletResponse) invocation.getArguments()[1];
response.sendError(HttpServletResponse.SC_FORBIDDEN, "I'm afraid I can't do that.");
return null;
}
}).when(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));
// Execute
filter.doFilter(request, response, chain);
// Verifications
verify(chain).doFilter(request, response);
verify(response, never()).getOutputStream();
verify(response, never()).getWriter();
}
@Test
public void normalFilterSendError() throws ServletException, IOException {
// Filter init & setup
ServletContext context = mock(ServletContext.class);
FilterConfig filterConfig = mock(FilterConfig.class);
when(filterConfig.getFilterName()).thenReturn("dummy");
when(filterConfig.getServletContext()).thenReturn(context);
when(filterConfig.getInitParameterNames()).thenReturn(new StringTokenIterator("foo, bar"));
DummyFilter filter = new DummyFilter();
filter.init(filterConfig);
// Request/response setup
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ServletOutputStream out = spy(new OutputStreamAdapter(stream));
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
when(response.getOutputStream()).thenReturn(out);
FilterChain chain = mock(FilterChain.class);
doAnswer(new Answer<Void>() {
public Void answer(InvocationOnMock invocation) throws Throwable {
HttpServletResponse response = (HttpServletResponse) invocation.getArguments()[1];
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "I've just picked up a fault in the AE35 unit.");
return null;
}
}).when(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));
// Execute
filter.doFilter(request, response, chain);
// Verifications
verify(chain).doFilter(any(ServletRequest.class), any(ServletResponse.class));
verify(response, atMost(1)).setContentLength(stream.size()); // setContentLength not implemented, avoid future bugs
verify(out, atLeastOnce()).flush();
}
private static class DummyFilter extends ImageFilter {
@Override
protected RenderedImage doFilter(BufferedImage image, ServletRequest request, ImageServletResponse response) throws IOException {