package org.webpieces.httpfrontend.api;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.webpieces.asyncserver.api.AsyncServerManager;
import org.webpieces.asyncserver.api.AsyncServerMgrFactory;
import org.webpieces.data.api.BufferCreationPool;
import org.webpieces.frontend.api.FrontendConfig;
import org.webpieces.frontend.api.HttpFrontendFactory;
import org.webpieces.frontend.api.HttpFrontendManager;
import org.webpieces.frontend.api.HttpServer;
import org.webpieces.mock.ParametersPassedIn;
import org.webpieces.nio.api.handlers.ConnectionListener;
import org.webpieces.nio.api.handlers.DataListener;
public class TestBadClient {
private MockTcpChannel mockServerChannel = new MockTcpChannel();
private MockTcpServerChannel mockChannel = new MockTcpServerChannel();
private MockChannelManager mockChanMgr = new MockChannelManager();
private MockTimer timer = new MockTimer();
private RequestListenerForTest requestListenerForTest = new RequestListenerForTest();
private HttpFrontendManager mgr;
@Before
public void setup() {
mockChanMgr.addTcpSvrChannel(mockChannel);
AsyncServerManager svrManager = AsyncServerMgrFactory.createAsyncServer(mockChanMgr);
BufferCreationPool pool = new BufferCreationPool();
mgr = HttpFrontendFactory.createFrontEnd(svrManager, timer, pool);
}
@Test
public void testTimeoutTimerCancelled() throws InterruptedException, ExecutionException {
FrontendConfig config = new FrontendConfig("httpFrontend", new InetSocketAddress(80));
config.maxConnectToRequestTimeoutMs = 5000;
HttpServer server = mgr.createHttpServer(config , requestListenerForTest);
server.start();
ConnectionListener[] listeners = mockChanMgr.fetchTcpConnectionListeners();
Assert.assertEquals(1, listeners.length);
MockFuture<?> mockFuture = new MockFuture<>();
timer.addMockFuture(mockFuture);
ConnectionListener listener = listeners[0];
CompletableFuture<DataListener> future = listener.connected(mockServerChannel, true);
//expect timer task to be scheduled...
ParametersPassedIn[] methodCalls = timer.getScheduledTimers();
Assert.assertEquals("Expecting that timer.schedule is called once", 1, methodCalls.length);
DataListener dataListener = future.get();
ByteBuffer buffer = ByteBuffer.wrap("\r\n\r\nasdfsdf".getBytes());
dataListener.incomingData(mockServerChannel, buffer);
//verify our connection was not closed
Assert.assertTrue(mockServerChannel.isClosed());
//verify our timeout was cancelled..
Assert.assertTrue(mockFuture.isCancelled());
}
@Test
public void testMaxSizeExceeded() throws InterruptedException, ExecutionException {
FrontendConfig config = new FrontendConfig("httpFrontend", new InetSocketAddress(80));
config.maxConnectToRequestTimeoutMs = 5000;
HttpServer server = mgr.createHttpServer(config , requestListenerForTest);
server.start();
ConnectionListener[] listeners = mockChanMgr.fetchTcpConnectionListeners();
Assert.assertEquals(1, listeners.length);
MockFuture<?> mockFuture = new MockFuture<>();
timer.addMockFuture(mockFuture);
ConnectionListener listener = listeners[0];
CompletableFuture<DataListener> future = listener.connected(mockServerChannel, true);
//expect timer task to be scheduled...
ParametersPassedIn[] methodCalls = timer.getScheduledTimers();
Assert.assertEquals("Expecting that timer.schedule is called once", 1, methodCalls.length);
DataListener dataListener = future.get();
ByteBuffer buffer = ByteBuffer.wrap("\r\n\r\nasdfsdf".getBytes());
dataListener.incomingData(mockServerChannel, buffer);
//verify our connection was not closed
Assert.assertTrue(mockServerChannel.isClosed());
//verify our timeout was cancelled..
Assert.assertTrue(mockFuture.isCancelled());
}
}