package org.mockserver.streams; import org.apache.commons.io.IOUtils; import org.junit.Test; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.Socket; import java.nio.ByteBuffer; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; /** * @author jamesdbloom */ public class IOStreamUtilsTest { @Test public void shouldReadSocketInputStreamToString() throws IOException { // given Socket socket = mock(Socket.class); when(socket.getInputStream()).thenReturn(IOUtils.toInputStream("bytes")); // when String result = new IOStreamUtils().readInputStreamToString(socket); // then assertEquals("bytes\n", result); } @Test public void shouldReadHttpRequestOnSocketInputStreamToString() throws IOException { // given Socket socket = mock(Socket.class); when(socket.getInputStream()).thenReturn(IOUtils.toInputStream("" + "Cache-Control:public, max-age=60\r\n" + "Content-Length:10\r\n" + "Content-Type:text/html; charset=utf-8\r\n" + "Date:Sat, 04 Jan 2014 17:18:54 GMT\r\n" + "Expires:Sat, 04 Jan 2014 17:19:54 GMT\r\n" + "Last-Modified:Sat, 04 Jan 2014 17:18:54 GMT\r\n" + "Vary:*\n" + "\r\n" + "1234567890" )); // when String result = IOStreamUtils.readInputStreamToString(socket); // then assertEquals("" + "Cache-Control:public, max-age=60\n" + "Content-Length:10\n" + "Content-Type:text/html; charset=utf-8\n" + "Date:Sat, 04 Jan 2014 17:18:54 GMT\n" + "Expires:Sat, 04 Jan 2014 17:19:54 GMT\n" + "Last-Modified:Sat, 04 Jan 2014 17:18:54 GMT\n" + "Vary:*\n" + "\n" + "1234567890", result); } @Test public void shouldReadHttpRequestOnSocketInputStreamToStringLowerCaseHeaders() throws IOException { // given Socket socket = mock(Socket.class); when(socket.getInputStream()).thenReturn(IOUtils.toInputStream("" + "cache-control:public, max-age=60\r\n" + "content-length:10\r\n" + "content-type:text/html; charset=utf-8\r\n" + "date:Sat, 04 Jan 2014 17:18:54 GMT\r\n" + "expires:Sat, 04 Jan 2014 17:19:54 GMT\r\n" + "last-modified:Sat, 04 Jan 2014 17:18:54 GMT\r\n" + "vary:*\n" + "\r\n" + "1234567890" )); // when String result = IOStreamUtils.readInputStreamToString(socket); // then assertEquals("" + "cache-control:public, max-age=60\n" + "content-length:10\n" + "content-type:text/html; charset=utf-8\n" + "date:Sat, 04 Jan 2014 17:18:54 GMT\n" + "expires:Sat, 04 Jan 2014 17:19:54 GMT\n" + "last-modified:Sat, 04 Jan 2014 17:18:54 GMT\n" + "vary:*\n" + "\n" + "1234567890", result); } @Test public void shouldReadServletRequestInputStreamToString() throws IOException { // given ServletRequest servletRequest = mock(ServletRequest.class); when(servletRequest.getInputStream()).thenReturn(new DelegatingServletInputStream(IOUtils.toInputStream("bytes"))); // when String result = IOStreamUtils.readInputStreamToString(servletRequest); // then assertEquals("bytes", result); } @Test(expected = RuntimeException.class) public void shouldHandleExceptionWhenReadingServletRequestInputStreamToString() throws IOException { // given ServletRequest servletRequest = mock(ServletRequest.class); when(servletRequest.getInputStream()).thenThrow(new IOException("TEST EXCEPTION")); // when IOStreamUtils.readInputStreamToString(servletRequest); } @Test public void shouldReadInputStreamToByteArray() throws IOException { // given ServletRequest servletRequest = mock(ServletRequest.class); when(servletRequest.getInputStream()).thenReturn(new DelegatingServletInputStream(IOUtils.toInputStream("bytes"))); // when byte[] result = IOStreamUtils.readInputStreamToByteArray(servletRequest); // then assertEquals("bytes", new String(result)); } @Test(expected = RuntimeException.class) public void shouldHandleExceptionWhenReadInputStreamToByteArray() throws IOException { // given ServletRequest servletRequest = mock(ServletRequest.class); when(servletRequest.getInputStream()).thenThrow(new IOException("TEST EXCEPTION")); // when byte[] result = IOStreamUtils.readInputStreamToByteArray(servletRequest); // then assertEquals("bytes", new String(result)); } @Test public void shouldWriteToOutputStream() throws IOException { // given ServletResponse mockServletResponse = mock(ServletResponse.class); ServletOutputStream mockServletOutputStream = mock(ServletOutputStream.class); when(mockServletResponse.getOutputStream()).thenReturn(mockServletOutputStream); // when IOStreamUtils.writeToOutputStream("data".getBytes(), mockServletResponse); // then verify(mockServletOutputStream).write("data".getBytes()); verify(mockServletOutputStream).close(); } @Test(expected = RuntimeException.class) public void shouldHandleExceptionWriteToOutputStream() throws IOException { // given ServletResponse mockServletResponse = mock(ServletResponse.class); when(mockServletResponse.getOutputStream()).thenThrow(new IOException("TEST EXCEPTION")); // when IOStreamUtils.writeToOutputStream("data".getBytes(), mockServletResponse); } @Test public void shouldCreateBasicByteBuffer() { // when ByteBuffer byteBuffer = IOStreamUtils.createBasicByteBuffer("byte_buffer"); // then byte[] content = new byte[byteBuffer.limit()]; byteBuffer.get(content); assertEquals("byte_buffer", new String(content)); } class DelegatingServletInputStream extends ServletInputStream { private final InputStream inputStream; DelegatingServletInputStream(InputStream inputStream) { this.inputStream = inputStream; } public int read() throws IOException { return this.inputStream.read(); } public void close() throws IOException { super.close(); this.inputStream.close(); } } }