diff --git a/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java b/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java index dc24d041..3a023428 100755 --- a/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java +++ b/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java @@ -131,9 +131,9 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima * @param pMimeType the content (MIME) type */ public void setContentType(final String pMimeType) { - // Throw exception is allready set + // Throw exception is already set if (mOriginalContentType != null) { - throw new IllegalStateException("ContentType allready set."); + throw new IllegalStateException("ContentType already set."); } mOriginalContentType = pMimeType; @@ -187,17 +187,13 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima getImage(); } - // This is stupid, but don't know how to work around... - // TODO: Test what types of images that work with JPEG, consider reporting it as a bug + // For known formats that don't support transparency, convert to opaque if (("image/jpeg".equals(outputType) || "image/jpg".equals(outputType) || "image/bmp".equals(outputType) || "image/x-bmp".equals(outputType)) && - mImage instanceof BufferedImage && ((BufferedImage) mImage).getType() == BufferedImage.TYPE_INT_ARGB) { + mImage.getColorModel().getTransparency() != Transparency.OPAQUE) { mImage = ImageUtil.toBuffered(mImage, BufferedImage.TYPE_INT_RGB); } - //System.out.println("Writing image, content-type: " + getContentType(outputType)); - //System.out.println("Writing image, outputType: " + outputType); - //System.out.println("Writing image: " + mImage); if (mImage != null) { Iterator writers = ImageIO.getImageWritersByMIMEType(outputType); if (writers.hasNext()) { @@ -218,10 +214,6 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima ImageOutputStream stream = ImageIO.createImageOutputStream(out); - //System.out.println("-ISR- Image: " + mImage); - //System.out.println("-ISR- ImageWriter: " + writer); - //System.out.println("-ISR- ImageOutputStream: " + stream); - writer.setOutput(stream); try { writer.write(null, new IIOImage(mImage, null, null), param); @@ -233,12 +225,10 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima finally { writer.dispose(); out.flush(); -// out.close(); } } else { mContext.log("ERROR: No writer for content-type: " + outputType); -// sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Unable to encode image: No writer for content-type " + outputType); throw new IIOException("Unable to transcode image: No suitable image writer found (content-type: " + outputType + ")."); } } @@ -365,8 +355,6 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima // Fill bgcolor behind image, if transparent extractAndSetBackgroundColor(image); - //System.out.println("-ISR- Image: " + image); - // Set image mImage = image; } diff --git a/twelvemonkeys-servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java b/twelvemonkeys-servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java index fe4fc100..231ec787 100755 --- a/twelvemonkeys-servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java +++ b/twelvemonkeys-servlet/src/test/java/com/twelvemonkeys/servlet/image/ImageServletResponseImplTestCase.java @@ -26,13 +26,17 @@ import java.util.Arrays; public class ImageServletResponseImplTestCase extends MockObjectTestCase { private static final String CONTENT_TYPE_BMP = "image/bmp"; private static final String CONTENT_TYPE_FOO = "foo/bar"; + private static final String CONTENT_TYPE_GIF = "image/gif"; private static final String CONTENT_TYPE_JPEG = "image/jpeg"; private static final String CONTENT_TYPE_PNG = "image/png"; private static final String CONTENT_TYPE_TEXT = "text/plain"; - private static final String IMAGE_NAME = "12monkeys-splash.png"; + private static final String IMAGE_NAME_PNG = "12monkeys-splash.png"; + private static final String IMAGE_NAME_GIF = "tux.gif"; + + private static final Dimension IMAGE_DIMENSION_PNG = new Dimension(300, 410); + private static final Dimension IMAGE_DIMENSION_GIF = new Dimension(250, 250); - private static final Dimension IMAGE_DIMENSION = new Dimension(300, 410); private HttpServletRequest mRequest; private ServletContext mContext; @@ -43,15 +47,17 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { Mock mockRequest = mock(HttpServletRequest.class); mockRequest.stubs().method("getAttribute").will(returnValue(null)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); mRequest = (HttpServletRequest) mockRequest.proxy(); Mock mockContext = mock(ServletContext.class); - mockContext.stubs().method("getResource").with(eq("/" + IMAGE_NAME)).will(returnValue(getClass().getResource(IMAGE_NAME))); - mockContext.stubs().method("log").withAnyArguments(); // Just supress the logging + mockContext.stubs().method("getResource").with(eq("/" + IMAGE_NAME_PNG)).will(returnValue(getClass().getResource(IMAGE_NAME_PNG))); + mockContext.stubs().method("getResource").with(eq("/" + IMAGE_NAME_GIF)).will(returnValue(getClass().getResource(IMAGE_NAME_GIF))); + mockContext.stubs().method("log").withAnyArguments(); // Just suppress the logging mockContext.stubs().method("getMimeType").with(eq("file.bmp")).will(returnValue(CONTENT_TYPE_BMP)); mockContext.stubs().method("getMimeType").with(eq("file.foo")).will(returnValue(CONTENT_TYPE_FOO)); + mockContext.stubs().method("getMimeType").with(eq("file.gif")).will(returnValue(CONTENT_TYPE_GIF)); mockContext.stubs().method("getMimeType").with(eq("file.jpeg")).will(returnValue(CONTENT_TYPE_JPEG)); mockContext.stubs().method("getMimeType").with(eq("file.png")).will(returnValue(CONTENT_TYPE_PNG)); mockContext.stubs().method("getMimeType").with(eq("file.txt")).will(returnValue(CONTENT_TYPE_TEXT)); @@ -98,11 +104,11 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(mRequest, response, mContext); fakeResponse(mRequest, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); - assertEquals(IMAGE_DIMENSION.width, image.getWidth()); - assertEquals(IMAGE_DIMENSION.height, image.getHeight()); + assertEquals(IMAGE_DIMENSION_PNG.width, image.getWidth()); + assertEquals(IMAGE_DIMENSION_PNG.height, image.getHeight()); // Flush image to wrapped response imageResponse.flush(); @@ -136,7 +142,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { assertTrue("Content has no data", out.size() > 0); // Test that image data is untouched - assertTrue("Data differs", Arrays.equals(FileUtil.read(getClass().getResourceAsStream(IMAGE_NAME)), out.toByteArray())); + assertTrue("Data differs", Arrays.equals(FileUtil.read(getClass().getResourceAsStream(IMAGE_NAME_PNG)), out.toByteArray())); } // Transcode original PNG to JPEG with no other changes @@ -161,8 +167,67 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { // Test that image data is still readable BufferedImage outImage = ImageIO.read(new ByteArrayInputStream(out.toByteArray())); assertNotNull(outImage); - assertEquals(IMAGE_DIMENSION.width, outImage.getWidth()); - assertEquals(IMAGE_DIMENSION.height, outImage.getHeight()); + assertEquals(IMAGE_DIMENSION_PNG.width, outImage.getWidth()); + assertEquals(IMAGE_DIMENSION_PNG.height, outImage.getHeight()); + assertSimilarImage(ImageIO.read(mContext.getResource("/" + IMAGE_NAME_PNG)), outImage, 96f); + } + + @Test + public void testTranscodeResponseIndexedCM() throws IOException { + // Custom setup + Mock mockRequest = mock(HttpServletRequest.class); + mockRequest.stubs().method("getAttribute").will(returnValue(null)); + mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_GIF)); + mockRequest.stubs().method("getParameter").will(returnValue(null)); + HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); + + Mock mockResponse = mock(HttpServletResponse.class); + mockResponse.expects(once()).method("setContentType").with(eq(CONTENT_TYPE_JPEG)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + mockResponse.expects(once()).method("getOutputStream").will(returnValue(new OutputStreamAdapter(out))); + HttpServletResponse response = (HttpServletResponse) mockResponse.proxy(); + + ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); + fakeResponse(request, imageResponse); + + // Force transcode to JPEG + imageResponse.setOutputContentType("image/jpeg"); + + // Flush image to wrapped response + imageResponse.flush(); + + assertTrue("Content has no data", out.size() > 0); + + // Test that image data is still readable + BufferedImage outImage = ImageIO.read(new ByteArrayInputStream(out.toByteArray())); + assertNotNull(outImage); + assertEquals(IMAGE_DIMENSION_GIF.width, outImage.getWidth()); + assertEquals(IMAGE_DIMENSION_GIF.height, outImage.getHeight()); + assertSimilarImage(ImageIO.read(mContext.getResource("/" + IMAGE_NAME_GIF)), outImage, 96f); + } + + /** + * Makes sure images are the same, taking JPEG artifacts into account. + * + * @param pExpected the expected image + * @param pActual the actual image + * @param pArtifactThreshold the maximum allowed difference between the expected and actual pixel value + */ + private void assertSimilarImage(final BufferedImage pExpected, final BufferedImage pActual, final float pArtifactThreshold) { + for (int y = 0; y < pExpected.getHeight(); y++) { + for (int x = 0; x < pExpected.getWidth(); x++) { + int original = pExpected.getRGB(x, y); + int actual = pActual.getRGB(x, y); + + // Multiply in the alpha component + float alpha = ((original >> 24) & 0xff) / 255f; + + assertEquals(alpha * ((original >> 16) & 0xff), (actual >> 16) & 0xff, pArtifactThreshold); + assertEquals(alpha * ((original >> 8) & 0xff), (actual >> 8) & 0xff, pArtifactThreshold); + assertEquals(alpha * ((original) & 0xff), actual & 0xff, pArtifactThreshold); + } + } } public void testReplaceResponse() throws IOException { @@ -175,7 +240,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(mRequest, response, mContext); fakeResponse(mRequest, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); @@ -298,7 +363,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").withAnyArguments().will(returnValue(null)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI)).will(returnValue(sourceRegion)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -311,7 +376,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); assertEquals(sourceRegion.width, image.getWidth()); @@ -337,7 +402,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").withAnyArguments().will(returnValue(null)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI)).will(returnValue(sourceRegion)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -350,7 +415,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); assertEquals(sourceRegion.width, image.getWidth()); @@ -379,7 +444,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI_UNIFORM)).will(returnValue(true)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI)).will(returnValue(sourceRegion)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -392,24 +457,24 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); assertEquals(sourceRegion.width, image.getWidth()); assertEquals(sourceRegion.height, image.getHeight()); - BufferedImage original = ImageIO.read(getClass().getResource(IMAGE_NAME)); + BufferedImage original = ImageIO.read(getClass().getResource(IMAGE_NAME_PNG)); // Sanity check assertNotNull(original); - assertEquals(IMAGE_DIMENSION.width, original.getWidth()); - assertEquals(IMAGE_DIMENSION.height, original.getHeight()); + assertEquals(IMAGE_DIMENSION_PNG.width, original.getWidth()); + assertEquals(IMAGE_DIMENSION_PNG.height, original.getHeight()); // Center sourceRegion.setLocation( - (int) Math.round((IMAGE_DIMENSION.width - sourceRegion.getWidth()) / 2.0), - (int) Math.round((IMAGE_DIMENSION.height - sourceRegion.getHeight()) / 2.0) + (int) Math.round((IMAGE_DIMENSION_PNG.width - sourceRegion.getWidth()) / 2.0), + (int) Math.round((IMAGE_DIMENSION_PNG.height - sourceRegion.getHeight()) / 2.0) ); // Test that we have exactly the pixels we should @@ -442,7 +507,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI_UNIFORM)).will(returnValue(true)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI)).will(returnValue(sourceRegion)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -455,49 +520,49 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); // Flush image to wrapped response - imageResponse.flush(); + imageResponse.flush(); - assertTrue("Image wider than bounding box", IMAGE_DIMENSION.width >= image.getWidth()); - assertTrue("Image taller than bounding box", IMAGE_DIMENSION.height >= image.getHeight()); - assertTrue("Image not maximized to bounding box", IMAGE_DIMENSION.width == image.getWidth() || IMAGE_DIMENSION.height == image.getHeight()); + assertTrue("Image wider than bounding box", IMAGE_DIMENSION_PNG.width >= image.getWidth()); + assertTrue("Image taller than bounding box", IMAGE_DIMENSION_PNG.height >= image.getHeight()); + assertTrue("Image not maximized to bounding box", IMAGE_DIMENSION_PNG.width == image.getWidth() || IMAGE_DIMENSION_PNG.height == image.getHeight()); // Above tests that one of the sides equal, we now need to test that the other follows aspect double destAspect = sourceRegion.getWidth() / sourceRegion.getHeight(); - double srcAspect = IMAGE_DIMENSION.getWidth() / IMAGE_DIMENSION.getHeight(); + double srcAspect = IMAGE_DIMENSION_PNG.getWidth() / IMAGE_DIMENSION_PNG.getHeight(); if (srcAspect >= destAspect) { // Dst is narrower than src - assertEquals(IMAGE_DIMENSION.height, image.getHeight()); + assertEquals(IMAGE_DIMENSION_PNG.height, image.getHeight()); assertEquals( "Image width does not follow aspect", - Math.round(IMAGE_DIMENSION.getHeight() * destAspect), image.getWidth() + Math.round(IMAGE_DIMENSION_PNG.getHeight() * destAspect), image.getWidth() ); } else { // Dst is wider than src - assertEquals(IMAGE_DIMENSION.width, image.getWidth()); + assertEquals(IMAGE_DIMENSION_PNG.width, image.getWidth()); assertEquals( "Image height does not follow aspect", - Math.round(IMAGE_DIMENSION.getWidth() / destAspect), image.getHeight() + Math.round(IMAGE_DIMENSION_PNG.getWidth() / destAspect), image.getHeight() ); } - BufferedImage original = ImageIO.read(getClass().getResource(IMAGE_NAME)); + BufferedImage original = ImageIO.read(getClass().getResource(IMAGE_NAME_PNG)); // Sanity check assertNotNull(original); - assertEquals(IMAGE_DIMENSION.width, original.getWidth()); - assertEquals(IMAGE_DIMENSION.height, original.getHeight()); + assertEquals(IMAGE_DIMENSION_PNG.width, original.getWidth()); + assertEquals(IMAGE_DIMENSION_PNG.height, original.getHeight()); // Center sourceRegion.setLocation( - (int) Math.round((IMAGE_DIMENSION.width - image.getWidth()) / 2.0), - (int) Math.round((IMAGE_DIMENSION.height - image.getHeight()) / 2.0) + (int) Math.round((IMAGE_DIMENSION_PNG.width - image.getWidth()) / 2.0), + (int) Math.round((IMAGE_DIMENSION_PNG.height - image.getHeight()) / 2.0) ); sourceRegion.setSize(image.getWidth(), image.getHeight()); @@ -526,7 +591,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").withAnyArguments().will(returnValue(null)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE)).will(returnValue(size)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -539,7 +604,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); @@ -549,10 +614,10 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { // Above tests that one of the sides equal, we now need to test that the other follows aspect if (size.width == image.getWidth()) { - assertEquals(Math.round(size.getWidth() * IMAGE_DIMENSION.getWidth() / IMAGE_DIMENSION.getHeight()), image.getHeight()); + assertEquals(Math.round(size.getWidth() * IMAGE_DIMENSION_PNG.getWidth() / IMAGE_DIMENSION_PNG.getHeight()), image.getHeight()); } else { - assertEquals(Math.round(size.getHeight() * IMAGE_DIMENSION.getWidth() / IMAGE_DIMENSION.getHeight()), image.getWidth()); + assertEquals(Math.round(size.getHeight() * IMAGE_DIMENSION_PNG.getWidth() / IMAGE_DIMENSION_PNG.getHeight()), image.getWidth()); } // Flush image to wrapped response @@ -576,7 +641,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE)).will(returnValue(size)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE_UNIFORM)).will(returnValue(false)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -589,7 +654,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); assertEquals(size.width, image.getWidth()); @@ -618,7 +683,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI)).will(returnValue(sourceRegion)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE)).will(returnValue(size)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -631,7 +696,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); @@ -658,7 +723,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { assertEquals(image.getWidth(), outImage.getWidth()); assertEquals(image.getHeight(), outImage.getHeight()); } - + @Test public void testReadWithSourceRegionAndNonUniformResize() throws IOException { Rectangle sourceRegion = new Rectangle(100, 100, 200, 200); @@ -670,7 +735,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE)).will(returnValue(size)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE_UNIFORM)).will(returnValue(false)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -683,7 +748,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); assertEquals(size.width, image.getWidth()); @@ -713,7 +778,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI)).will(returnValue(sourceRegion)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE)).will(returnValue(size)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -726,7 +791,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); @@ -774,7 +839,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI)).will(returnValue(sourceRegion)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE)).will(returnValue(size)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -787,7 +852,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); @@ -839,7 +904,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_AOI)).will(returnValue(sourceRegion)); mockRequest.stubs().method("getAttribute").with(eq(ImageServletResponse.ATTRIB_SIZE)).will(returnValue(size)); mockRequest.stubs().method("getContextPath").will(returnValue("/ape")); - mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME)); + mockRequest.stubs().method("getRequestURI").will(returnValue("/ape/" + IMAGE_NAME_PNG)); mockRequest.stubs().method("getParameter").will(returnValue(null)); HttpServletRequest request = (HttpServletRequest) mockRequest.proxy(); @@ -852,7 +917,7 @@ public class ImageServletResponseImplTestCase extends MockObjectTestCase { ImageServletResponseImpl imageResponse = new ImageServletResponseImpl(request, response, mContext); fakeResponse(request, imageResponse); - // Make sure image is correctly loaedd + // Make sure image is correctly loaded BufferedImage image = imageResponse.getImage(); assertNotNull(image); diff --git a/twelvemonkeys-servlet/src/test/resources/com/twelvemonkeys/servlet/image/tux.gif b/twelvemonkeys-servlet/src/test/resources/com/twelvemonkeys/servlet/image/tux.gif new file mode 100644 index 00000000..378cd229 Binary files /dev/null and b/twelvemonkeys-servlet/src/test/resources/com/twelvemonkeys/servlet/image/tux.gif differ