SLING-7174 - implement getReader in MockRequest

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1810562 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/servlethelpers/MockSlingHttpServletRequest.java b/src/main/java/org/apache/sling/servlethelpers/MockSlingHttpServletRequest.java
index 94a2ba6..128db0c 100644
--- a/src/main/java/org/apache/sling/servlethelpers/MockSlingHttpServletRequest.java
+++ b/src/main/java/org/apache/sling/servlethelpers/MockSlingHttpServletRequest.java
@@ -24,9 +24,11 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
+import java.nio.charset.Charset;
 import java.security.Principal;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -101,6 +103,8 @@
     private String remoteHost;
     private int remotePort;
     private Locale locale = Locale.US;
+    private boolean getInputStreamCalled;
+    private boolean getReaderCalled;
 
     private MockRequestDispatcherFactory requestDispatcherFactory;
     
@@ -540,11 +544,12 @@
 
     @Override
     public ServletInputStream getInputStream() {
-        if (content == null) {
-            return null;
+        if (getReaderCalled) {
+            throw new IllegalArgumentException();
         }
+        getInputStreamCalled = true;
         return new ServletInputStream() {
-            private final InputStream is = new ByteArrayInputStream(content);
+            private final InputStream is = content == null ? new ByteArrayInputStream(new byte[0]) : new ByteArrayInputStream(content);
             @Override
             public int read() throws IOException {
                 return is.read();
@@ -823,7 +828,26 @@
 
     @Override
     public BufferedReader getReader() {
-        throw new UnsupportedOperationException();
+        if (getInputStreamCalled) {
+            throw new IllegalArgumentException();
+        }
+        getReaderCalled = true;
+        if (this.content == null) {
+            return new BufferedReader(new StringReader(""));
+        } else {
+            String content;
+            try {
+                if (characterEncoding == null) {
+                    content = new String(this.content, Charset.defaultCharset());
+                } else {
+                    content = new String(this.content, characterEncoding);
+                }
+            } catch (UnsupportedEncodingException e) {
+                content = new String(this.content, Charset.defaultCharset());
+            }
+            return new BufferedReader(new StringReader(content));
+        }
+
     }
 
     @Override
diff --git a/src/test/java/org/apache/sling/servlethelpers/MockSlingHttpServletRequestTest.java b/src/test/java/org/apache/sling/servlethelpers/MockSlingHttpServletRequestTest.java
index 26e5f51..f3f9c00 100644
--- a/src/test/java/org/apache/sling/servlethelpers/MockSlingHttpServletRequestTest.java
+++ b/src/test/java/org/apache/sling/servlethelpers/MockSlingHttpServletRequestTest.java
@@ -29,8 +29,10 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.io.BufferedReader;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.nio.charset.Charset;
 import java.util.Calendar;
 import java.util.Enumeration;
 import java.util.LinkedHashMap;
@@ -326,7 +328,8 @@
     @Test
     public void testContent() throws Exception {
         assertEquals(0, request.getContentLength());
-        assertNull(request.getInputStream());
+        assertNotNull(request.getInputStream());
+        assertArrayEquals(new byte[0], IOUtils.toByteArray(request.getInputStream()));
         
         byte[] data = new byte[] { 0x01,0x02,0x03 };
         request.setContent(data);
@@ -336,6 +339,41 @@
     }
 
     @Test
+    public void testContentFromReader() throws Exception {
+        Charset utf8 = Charset.forName("UTF-8");
+        request.setContent("hello".getBytes(utf8));
+        assertEquals(5, request.getContentLength());
+        BufferedReader reader = request.getReader();
+        String content = IOUtils.toString(reader);
+        assertEquals("hello", content);
+    }
+
+    @Test
+    public void testGetReaderAfterGetInputStream() {
+        boolean thrown = false;
+        request.getInputStream();
+        try {
+            request.getReader();
+        } catch (IllegalArgumentException e) {
+            thrown = true;
+        }
+        assertTrue(thrown);
+    }
+
+    @Test
+    public void testGetInputStreamAfterGetReader() {
+        boolean thrown = false;
+        request.getReader();
+        try {
+            request.getInputStream();
+        } catch (IllegalArgumentException e) {
+            thrown = true;
+        }
+        assertTrue(thrown);
+    }
+
+
+    @Test
     public void testGetRequestDispatcher() {
         MockRequestDispatcherFactory requestDispatcherFactory = mock(MockRequestDispatcherFactory.class);
         RequestDispatcher requestDispatcher = mock(RequestDispatcher.class);