package org.jooby.servlet; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; import java.util.Arrays; import java.util.Collections; import java.util.Optional; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jooby.test.MockUnit; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.google.common.io.ByteStreams; @RunWith(PowerMockRunner.class) @PrepareForTest({ServletServletResponse.class, Channels.class, ByteStreams.class, FileChannel.class }) public class ServletServletResponseTest { @Test public void defaults() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class) .run(unit -> { new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)); }); } @Test public void close() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class) .run(unit -> { new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).close(); }); } @Test public void headers() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class) .expect(unit -> { HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getHeaders("h")).andReturn(Arrays.asList("v")); }) .run(unit -> { assertEquals(Arrays.asList("v"), new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).headers("h")); }); } @Test public void emptyHeaders() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class) .expect(unit -> { HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getHeaders("h")).andReturn(Collections.emptyList()); }) .run(unit -> { assertEquals(Collections.emptyList(), new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).headers("h")); }); } @Test public void noHeaders() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class) .expect(unit -> { HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getHeaders("h")).andReturn(null); }) .run(unit -> { assertEquals(Collections.emptyList(), new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).headers("h")); }); } @Test public void header() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class) .expect(unit -> { HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getHeader("h")).andReturn("v"); }) .run(unit -> { assertEquals(Optional.of("v"), new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).header("h")); }); } @Test public void emptyHeader() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class) .expect(unit -> { HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getHeader("h")).andReturn(""); }) .run(unit -> { assertEquals(Optional.empty(), new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).header("h")); }); } @Test public void noHeader() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class) .expect(unit -> { HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getHeader("h")).andReturn(null); }) .run(unit -> { assertEquals(Optional.empty(), new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).header("h")); }); } @Test public void sendBytes() throws Exception { byte[] bytes = "bytes".getBytes(); new MockUnit(HttpServletRequest.class, HttpServletResponse.class, ServletOutputStream.class) .expect(unit -> { ServletOutputStream output = unit.get(ServletOutputStream.class); output.write(bytes); output.close(); HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getOutputStream()).andReturn(output); }) .run(unit -> { new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).send(bytes); }); } @Test public void sendByteBuffer() throws Exception { byte[] bytes = "bytes".getBytes(); ByteBuffer buffer = ByteBuffer.wrap(bytes); new MockUnit(HttpServletRequest.class, HttpServletResponse.class, ServletOutputStream.class) .expect(unit -> { ServletOutputStream output = unit.get(ServletOutputStream.class); WritableByteChannel channel = unit.mock(WritableByteChannel.class); expect(channel.write(buffer)).andReturn(bytes.length); channel.close(); unit.mockStatic(Channels.class); expect(Channels.newChannel(output)).andReturn(channel); HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getOutputStream()).andReturn(output); }) .run(unit -> { new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).send(buffer); }); } @Test public void sendFileChannel() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class, ServletOutputStream.class) .expect(unit -> { FileChannel channel = unit.powerMock(FileChannel.class); unit.registerMock(FileChannel.class, channel); }) .expect(unit -> { FileChannel fchannel = unit.get(FileChannel.class); expect(fchannel.size()).andReturn(10L); ServletOutputStream output = unit.get(ServletOutputStream.class); WritableByteChannel channel = unit.mock(WritableByteChannel.class); unit.mockStatic(Channels.class); expect(Channels.newChannel(output)).andReturn(channel); expect(fchannel.transferTo(0L, 10L, channel)).andReturn(1L); fchannel.close(); channel.close(); HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getOutputStream()).andReturn(output); }) .run(unit -> { new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).send(unit.get(FileChannel.class)); }); } @Test public void sendInputStream() throws Exception { new MockUnit(HttpServletRequest.class, HttpServletResponse.class, InputStream.class, ServletOutputStream.class) .expect(unit -> { InputStream in = unit.get(InputStream.class); ServletOutputStream output = unit.get(ServletOutputStream.class); unit.mockStatic(ByteStreams.class); expect(ByteStreams.copy(in, output)).andReturn(0L); output.close(); in.close(); HttpServletResponse rsp = unit.get(HttpServletResponse.class); expect(rsp.getOutputStream()).andReturn(output); }) .run(unit -> { new ServletServletResponse(unit.get(HttpServletRequest.class), unit.get(HttpServletResponse.class)).send(unit.get(InputStream.class)); }); } }