/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* .
*
*/
package org.apache.http.impl.nio;
import java.nio.ByteBuffer;
import java.nio.channels.ByteChannel;
import java.nio.channels.SelectionKey;
import java.util.LinkedList;
import org.apache.http.ByteChannelMock;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.ReadableByteChannelMock;
import org.apache.http.WritableByteChannelMock;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.nio.codecs.LengthDelimitedDecoder;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.nio.ContentDecoder;
import org.apache.http.nio.ContentEncoder;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.NHttpServerConnection;
import org.apache.http.nio.NHttpConnection;
import org.apache.http.nio.NHttpServerEventHandler;
import org.apache.http.nio.entity.HttpAsyncContentProducer;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.nio.reactor.IOSession;
import org.apache.http.nio.util.SimpleInputBuffer;
import org.apache.http.protocol.HTTP;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
public class TestDefaultNHttpServerConnection {
@Mock
private IOSession session;
@Mock
private ByteChannel byteChan;
@Mock
private NHttpServerEventHandler handler;
private DefaultNHttpServerConnection conn;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
conn = new DefaultNHttpServerConnection(session, 32);
}
@Test
public void testSubmitRequest() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
conn.submitResponse(response);
Assert.assertNull(conn.getHttpResponse());
Assert.assertTrue(conn.hasBufferedOutput());
Mockito.verify(session).setEvent(SelectionKey.OP_WRITE);
}
@Test
public void testSubmitEntityEnclosingRequest() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
response.setEntity(new StringEntity("stuff"));
Mockito.when(session.channel()).thenReturn(byteChan);
Assert.assertEquals(0, conn.getMetrics().getResponseCount());
conn.submitResponse(response);
Assert.assertSame(response, conn.getHttpResponse());
Assert.assertTrue(conn.hasBufferedOutput());
Assert.assertTrue(conn.isResponseSubmitted());
Assert.assertNotNull(conn.contentEncoder);
Assert.assertEquals(1, conn.getMetrics().getResponseCount());
Mockito.verify(session).setEvent(SelectionKey.OP_WRITE);
}
@Test
public void testOutputReset() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
response.setEntity(new StringEntity("stuff"));
Mockito.when(session.channel()).thenReturn(byteChan);
conn.submitResponse(response);
Assert.assertNotNull(conn.getHttpResponse());
Assert.assertNotNull(conn.contentEncoder);
conn.resetOutput();
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentEncoder);
}
static class ResponseReadyAnswer implements Answer {
private final HttpResponse response;
ResponseReadyAnswer(final HttpResponse response) {
super();
this.response = response;
}
@Override
public Void answer(final InvocationOnMock invocation) throws Throwable {
final Object[] args = invocation.getArguments();
final NHttpServerConnection conn = (NHttpServerConnection) args[0];
conn.submitResponse(response);
return null;
}
}
static class ProduceContentAnswer implements Answer {
private final HttpAsyncContentProducer contentProducer;
ProduceContentAnswer(final HttpAsyncContentProducer contentProducer) {
super();
this.contentProducer = contentProducer;
}
@Override
public Void answer(final InvocationOnMock invocation) throws Throwable {
final Object[] args = invocation.getArguments();
final IOControl ioctrl = (IOControl) args[0];
final ContentEncoder encoder = (ContentEncoder) args[1];
contentProducer.produceContent(encoder, ioctrl);
return null;
}
}
@Test
public void testProduceOutputShortMessageAfterSubmit() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
final NStringEntity entity = new NStringEntity("stuff");
response.setEntity(entity);
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
conn.submitResponse(response);
Assert.assertEquals(19, conn.outbuf.length());
Mockito.doAnswer(new ProduceContentAnswer(entity)).when(
handler).outputReady(Mockito.any(), Mockito.any());
conn.produceOutput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentEncoder);
Assert.assertEquals("HTTP/1.1 200 OK\r\n\r\nstuff", wchannel.dump(Consts.ASCII));
Mockito.verify(wchannel, Mockito.times(1)).write(Matchers.any());
}
@Test
public void testProduceOutputLongMessageAfterSubmit() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
final NStringEntity entity = new NStringEntity("a lot of various stuff");
response.setEntity(entity);
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
conn.submitResponse(response);
Assert.assertEquals(19, conn.outbuf.length());
Mockito.doAnswer(new ProduceContentAnswer(entity)).when(
handler).outputReady(Mockito.any(), Mockito.any());
conn.produceOutput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentEncoder);
Assert.assertEquals("HTTP/1.1 200 OK\r\n\r\na lot of various stuff", wchannel.dump(Consts.ASCII));
Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any());
}
@Test
public void testProduceOutputShortMessage() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
final NStringEntity entity = new NStringEntity("stuff");
response.setEntity(entity);
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.doAnswer(new ResponseReadyAnswer(response)).when(
handler).responseReady(Mockito.any());
Mockito.doAnswer(new ProduceContentAnswer(entity)).when(
handler).outputReady(Mockito.any(), Mockito.any());
conn.produceOutput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentEncoder);
Assert.assertEquals("HTTP/1.1 200 OK\r\n\r\nstuff", wchannel.dump(Consts.ASCII));
Mockito.verify(wchannel, Mockito.times(1)).write(Matchers.any());
}
@Test
public void testProduceOutputLongMessage() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
final NStringEntity entity = new NStringEntity("a lot of various stuff");
response.setEntity(entity);
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.doAnswer(new ResponseReadyAnswer(response)).when(
handler).responseReady(Mockito.any());
Mockito.doAnswer(new ProduceContentAnswer(entity)).when(
handler).outputReady(Mockito.any(), Mockito.any());
conn.produceOutput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentEncoder);
Assert.assertEquals("HTTP/1.1 200 OK\r\n\r\na lot of various stuff", wchannel.dump(Consts.ASCII));
Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any());
}
@Test
public void testProduceOutputLongMessageSaturatedChannel() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
final NStringEntity entity = new NStringEntity("a lot of various stuff");
response.setEntity(entity);
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64, 24));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.doAnswer(new ResponseReadyAnswer(response)).when(
handler).responseReady(Mockito.any());
Mockito.doAnswer(new ProduceContentAnswer(entity)).when(
handler).outputReady(Mockito.any(), Mockito.any());
conn.produceOutput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentEncoder);
Assert.assertEquals("HTTP/1.1 200 OK\r\n\r\na lot", wchannel.dump(Consts.ASCII));
Assert.assertEquals(17, conn.outbuf.length());
Mockito.verify(session, Mockito.never()).clearEvent(SelectionKey.OP_WRITE);
Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any());
}
@Test
public void testProduceOutputLongMessageSaturatedChannel2() throws Exception {
conn = new DefaultNHttpServerConnection(session, 24);
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
final NStringEntity entity = new NStringEntity("a loooooooooooooooooooooooot of various stuff");
response.setEntity(entity);
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64, 24));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.doAnswer(new ResponseReadyAnswer(response)).when(
handler).responseReady(Mockito.any());
Mockito.doAnswer(new ProduceContentAnswer(entity)).when(
handler).outputReady(Mockito.any(), Mockito.any());
conn.produceOutput(handler);
Assert.assertNotNull(conn.getHttpResponse());
Assert.assertNotNull(conn.contentEncoder);
Assert.assertEquals("HTTP/1.1 200 OK\r\n\r\na loo", wchannel.dump(Consts.ASCII));
Mockito.verify(session, Mockito.never()).clearEvent(SelectionKey.OP_WRITE);
Mockito.verify(wchannel, Mockito.times(3)).write(Matchers.any());
}
@Test
public void testProduceOutputLongChunkedMessage() throws Exception {
conn = new DefaultNHttpServerConnection(session, 64);
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
response.addHeader(HTTP.TRANSFER_ENCODING, HTTP.CHUNK_CODING);
final NStringEntity entity = new NStringEntity("a lot of various stuff");
entity.setChunked(true);
response.setEntity(entity);
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.doAnswer(new ResponseReadyAnswer(response)).when(
handler).responseReady(Mockito.any());
Mockito.doAnswer(new ProduceContentAnswer(entity)).when(
handler).outputReady(Mockito.any(), Mockito.any());
conn.produceOutput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentEncoder);
Assert.assertEquals("HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n" +
"5\r\na lot\r\n11\r\n of various stuff\r\n0\r\n\r\n", wchannel.dump(Consts.ASCII));
Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any());
}
@Test
public void testProduceOutputLongChunkedMessageSaturatedChannel() throws Exception {
conn = new DefaultNHttpServerConnection(session, 64);
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
response.addHeader(HTTP.TRANSFER_ENCODING, HTTP.CHUNK_CODING);
final NStringEntity entity = new NStringEntity("a lot of various stuff");
entity.setChunked(true);
response.setEntity(entity);
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64, 64));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.doAnswer(new ResponseReadyAnswer(response)).when(
handler).responseReady(Mockito.any());
Mockito.doAnswer(new ProduceContentAnswer(entity)).when(
handler).outputReady(Mockito.any(), Mockito.any());
conn.produceOutput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentEncoder);
Assert.assertEquals("HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n" +
"5\r\na lot\r\n11\r\n of", wchannel.dump(Consts.ASCII));
Assert.assertEquals(21, conn.outbuf.length());
Mockito.verify(session, Mockito.never()).clearEvent(SelectionKey.OP_WRITE);
Mockito.verify(wchannel, Mockito.times(2)).write(Matchers.any());
}
@Test
public void testProduceOutputClosingConnection() throws Exception {
final BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK");
final WritableByteChannelMock wchannel = Mockito.spy(new WritableByteChannelMock(64));
final ByteChannelMock channel = new ByteChannelMock(null, wchannel);
Mockito.when(session.channel()).thenReturn(channel);
conn.submitResponse(response);
conn.close();
Assert.assertEquals(NHttpConnection.CLOSING, conn.getStatus());
conn.produceOutput(handler);
Assert.assertEquals(NHttpConnection.CLOSED, conn.getStatus());
Mockito.verify(wchannel, Mockito.times(1)).write(Matchers.any());
Mockito.verify(session, Mockito.times(1)).close();
Mockito.verify(session, Mockito.never()).clearEvent(SelectionKey.OP_WRITE);
Mockito.verify(handler, Mockito.never()).responseReady(
Mockito.any());
Mockito.verify(handler, Mockito.never()).outputReady(
Mockito.any(), Mockito.any());
}
static class RequestCapturingAnswer implements Answer {
private final LinkedList requests;
RequestCapturingAnswer(final LinkedList requests) {
super();
this.requests = requests;
}
@Override
public Void answer(final InvocationOnMock invocation) throws Throwable {
final Object[] args = invocation.getArguments();
final NHttpServerConnection conn = (NHttpServerConnection) args[0];
if (conn != null) {
final HttpRequest request = conn.getHttpRequest();
if (request != null) {
requests.add(request);
}
}
return null;
}
}
static class ConsumeContentAnswer implements Answer {
private final SimpleInputBuffer buf;
ConsumeContentAnswer(final SimpleInputBuffer buf) {
super();
this.buf = buf;
}
@Override
public Void answer(final InvocationOnMock invocation) throws Throwable {
final Object[] args = invocation.getArguments();
final ContentDecoder decoder = (ContentDecoder) args[1];
buf.consumeContent(decoder);
return null;
}
}
@Test
public void testConsumeInputShortMessage() throws Exception {
final ReadableByteChannelMock rchannel = Mockito.spy(new ReadableByteChannelMock(
new String[] {"POST / HTTP/1.1\r\nContent-Length: 5\r\n\r\nstuff"}, Consts.ASCII));
final ByteChannelMock channel = new ByteChannelMock(rchannel, null);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.when(session.getEventMask()).thenReturn(SelectionKey.OP_READ);
final LinkedList requests = new LinkedList();
Mockito.doAnswer(new RequestCapturingAnswer(requests)).when(
handler).requestReceived(Mockito.any());
Mockito.doAnswer(new ConsumeContentAnswer(new SimpleInputBuffer(64))).when(
handler).inputReady(Mockito.any(), Mockito.any());
Assert.assertEquals(0, conn.getMetrics().getRequestCount());
conn.consumeInput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentDecoder);
Assert.assertEquals(1, conn.getMetrics().getRequestCount());
Assert.assertEquals(43, conn.getMetrics().getReceivedBytesCount());
Mockito.verify(handler, Mockito.times(1)).requestReceived(
Mockito.any());
Mockito.verify(handler, Mockito.times(1)).inputReady(
Mockito.any(), Mockito.any());
Mockito.verify(rchannel, Mockito.times(2)).read(Mockito.any());
Mockito.verify(handler, Mockito.never()).exception(
Mockito.any(), Mockito.any());
Assert.assertFalse(requests.isEmpty());
final HttpRequest request = requests.getFirst();
Assert.assertNotNull(request);
Assert.assertEquals(HttpVersion.HTTP_1_1, request.getRequestLine().getProtocolVersion());
Assert.assertEquals("POST", request.getRequestLine().getMethod());
Assert.assertEquals("/", request.getRequestLine().getUri());
Assert.assertTrue(request instanceof HttpEntityEnclosingRequest);
final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
Assert.assertNotNull(entity);
Assert.assertEquals(5, entity.getContentLength());
}
@Test
public void testConsumeInputLongMessage() throws Exception {
conn = new DefaultNHttpServerConnection(session, 1024);
final ReadableByteChannelMock rchannel = Mockito.spy(new ReadableByteChannelMock(
new String[] {"POST / HTTP/1.1\r\nContent-Length: 100\r\n\r\na lot of stuff",
"", ""}, Consts.ASCII));
final ByteChannelMock channel = new ByteChannelMock(rchannel, null);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.when(session.getEventMask()).thenReturn(SelectionKey.OP_READ);
final LinkedList requests = new LinkedList();
Mockito.doAnswer(new RequestCapturingAnswer(requests)).when(
handler).requestReceived(Mockito.any());
Mockito.doAnswer(new ConsumeContentAnswer(new SimpleInputBuffer(64))).when(
handler).inputReady(Mockito.any(), Mockito.any());
Assert.assertEquals(0, conn.getMetrics().getResponseCount());
conn.consumeInput(handler);
Assert.assertNotNull(conn.getHttpRequest());
Assert.assertNotNull(conn.contentDecoder);
Assert.assertEquals(1, conn.getMetrics().getRequestCount());
Assert.assertEquals(54, conn.getMetrics().getReceivedBytesCount());
Mockito.verify(handler, Mockito.times(1)).requestReceived(
Mockito.any());
Mockito.verify(handler, Mockito.times(1)).inputReady(
Mockito.any(), Mockito.any());
Mockito.verify(rchannel, Mockito.times(2)).read(Mockito.any());
Mockito.verify(handler, Mockito.never()).exception(
Mockito.any(), Mockito.any());
Assert.assertFalse(requests.isEmpty());
final HttpRequest request = requests.getFirst();
Assert.assertNotNull(request);
Assert.assertEquals(HttpVersion.HTTP_1_1, request.getRequestLine().getProtocolVersion());
Assert.assertEquals("POST", request.getRequestLine().getMethod());
Assert.assertEquals("/", request.getRequestLine().getUri());
Assert.assertTrue(request instanceof HttpEntityEnclosingRequest);
final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
Assert.assertNotNull(entity);
Assert.assertEquals(100, entity.getContentLength());
conn.consumeInput(handler);
Assert.assertEquals(1, conn.getMetrics().getRequestCount());
Assert.assertEquals(54, conn.getMetrics().getReceivedBytesCount());
Mockito.verify(rchannel, Mockito.times(3)).read(Mockito.any());
Mockito.verify(handler, Mockito.never()).exception(
Mockito.any(), Mockito.any());
}
@Test
public void testConsumeInputBasicMessageNoEntity() throws Exception {
final ReadableByteChannelMock rchannel = Mockito.spy(new ReadableByteChannelMock(
new String[] {"GET / HTTP/1.1\r\n\r\n"}, Consts.ASCII));
final ByteChannelMock channel = new ByteChannelMock(rchannel, null);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.when(session.getEventMask()).thenReturn(SelectionKey.OP_READ);
final LinkedList requests = new LinkedList();
Mockito.doAnswer(new RequestCapturingAnswer(requests)).when(
handler).requestReceived(Mockito.any());
Mockito.doAnswer(new ConsumeContentAnswer(new SimpleInputBuffer(64))).when(
handler).inputReady(Mockito.any(), Mockito.any());
conn.consumeInput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentDecoder);
Mockito.verify(handler, Mockito.times(1)).requestReceived(
Mockito.any());
Mockito.verify(handler, Mockito.never()).inputReady(
Mockito.any(), Mockito.any());
Mockito.verify(rchannel, Mockito.times(1)).read(Mockito.any());
Mockito.verify(handler, Mockito.never()).exception(
Mockito.any(), Mockito.any());
Assert.assertFalse(requests.isEmpty());
final HttpRequest request = requests.getFirst();
Assert.assertNotNull(request);
Assert.assertEquals(HttpVersion.HTTP_1_1, request.getRequestLine().getProtocolVersion());
Assert.assertEquals("GET", request.getRequestLine().getMethod());
Assert.assertEquals("/", request.getRequestLine().getUri());
Assert.assertFalse(request instanceof HttpEntityEnclosingRequest);
}
@Test
public void testConsumeInputNoData() throws Exception {
conn = new DefaultNHttpServerConnection(session, 1024);
final ReadableByteChannelMock rchannel = Mockito.spy(new ReadableByteChannelMock(
new String[] {"", ""}, Consts.ASCII));
final ByteChannelMock channel = new ByteChannelMock(rchannel, null);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.when(session.getEventMask()).thenReturn(SelectionKey.OP_READ);
final LinkedList requests = new LinkedList();
Mockito.doAnswer(new RequestCapturingAnswer(requests)).when(
handler).requestReceived(Mockito.any());
Mockito.doAnswer(new ConsumeContentAnswer(new SimpleInputBuffer(64))).when(
handler).inputReady(Mockito.any(), Mockito.any());
Assert.assertEquals(0, conn.getMetrics().getResponseCount());
conn.consumeInput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentDecoder);
Assert.assertEquals(0, conn.getMetrics().getResponseCount());
Assert.assertEquals(0, conn.getMetrics().getReceivedBytesCount());
Mockito.verify(handler, Mockito.never()).requestReceived(
Mockito.any());
Mockito.verify(handler, Mockito.never()).inputReady(
Mockito.any(), Mockito.any());
Mockito.verify(rchannel, Mockito.times(1)).read(Mockito.any());
Mockito.verify(handler, Mockito.never()).exception(
Mockito.any(), Mockito.any());
conn.consumeInput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentDecoder);
Assert.assertEquals(0, conn.getMetrics().getResponseCount());
Assert.assertEquals(0, conn.getMetrics().getReceivedBytesCount());
Mockito.verify(handler, Mockito.never()).requestReceived(
Mockito.any());
Mockito.verify(handler, Mockito.never()).inputReady(
Mockito.any(), Mockito.any());
Mockito.verify(rchannel, Mockito.times(2)).read(Mockito.any());
Mockito.verify(handler, Mockito.never()).exception(
Mockito.any(), Mockito.any());
conn.consumeInput(handler);
Assert.assertNull(conn.getHttpResponse());
Assert.assertNull(conn.contentDecoder);
Assert.assertEquals(0, conn.getMetrics().getResponseCount());
Assert.assertEquals(0, conn.getMetrics().getReceivedBytesCount());
Mockito.verify(handler, Mockito.never()).requestReceived(
Mockito.any());
Mockito.verify(handler, Mockito.never()).inputReady(
Mockito.any(), Mockito.any());
Mockito.verify(rchannel, Mockito.times(3)).read(Mockito.any());
Mockito.verify(handler, Mockito.times(1)).endOfInput(
Mockito.any());
Mockito.verify(handler, Mockito.never()).exception(
Mockito.any(), Mockito.any());
}
@Test
public void testConsumeInputConnectionClosed() throws Exception {
conn = new DefaultNHttpServerConnection(session, 1024);
final ReadableByteChannelMock rchannel = Mockito.spy(new ReadableByteChannelMock(
new String[] {"", ""}, Consts.ASCII));
final ByteChannelMock channel = new ByteChannelMock(rchannel, null);
Mockito.when(session.channel()).thenReturn(channel);
Mockito.when(session.getEventMask()).thenReturn(SelectionKey.OP_READ);
conn.close();
conn.consumeInput(handler);
Mockito.verify(rchannel, Mockito.never()).read(Mockito.any());
Mockito.verify(session, Mockito.times(1)).clearEvent(SelectionKey.OP_READ);
}
}