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);