public void TestConnection() { var listenSettings = new SocketListenerSettings <IListenerStateData> { LocalEndPoint = new IPEndPoint(IPAddress.Any, TestPort), MaxConnections = 10, MaxPendingConnections = 1000, MaxSimultaneousAcceptOperations = 2, IoBufferSize = 4096, ExcessConnectionHandlers = 5, ConnectionTimeOut = 100000, WatchDogCheckDelay = 10 * 1000, // 5 seconds MaxTaskConcurrencyLevel = 10, MaxTaskDelay = 3000, }; var mockMessageHandler = new TestMessageHandler <TestingSocketStateData, IListenerStateData>(); using (var socketListener = new SocketListener <TestingSocketStateData, IListenerStateData>(listenSettings, mockMessageHandler)) { socketListener.StartListen(); using (var socket = new TcpClient()) { socket.Connect("localhost", TestPort); using (var stream = socket.GetStream()) { SendMessage(stream, "GET /process.aspx?data=351777047213077|OGeNuj4NrSR00cY96P5E3Rc04h120Qd-000O001n0c1x HTTP/1.1\r\n" + "Host: 10.1.224.2\r\n" + "\r\n"); WaitForResponse(stream); Assert.AreEqual(1, mockMessageHandler.HandledMessages); } } } }
public void ReusedBufferIsEmpty() { var listenSettings = new SocketListenerSettings <IListenerStateData> { LocalEndPoint = new IPEndPoint(IPAddress.Any, TestPort), MaxConnections = 2, ExcessConnectionHandlers = 10, MaxPendingConnections = 1000, MaxSimultaneousAcceptOperations = 1, IoBufferSize = 4096, ConnectionTimeOut = 5000, WatchDogCheckDelay = 2000, MaxTaskConcurrencyLevel = 10, MaxTaskDelay = 3000, }; const double ticksPerSecond = 10000000.0; var mockMessageHandler = new TestMessageHandler <TestingSocketStateData, IListenerStateData>(); Mock <IServerTrace <IListenerStateData> > tracer = new Mock <IServerTrace <IListenerStateData> >(); tracer.Setup(x => x.Sending(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>())) .Callback <IListenerStateData, IdentityUserToken, IPEndPoint, byte[], int, int>((f, a, b, c, d, e) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Sending {c} bytes")); tracer.Setup(x => x.Sent(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <int>())) .Callback <IListenerStateData, IdentityUserToken, IPEndPoint, int>((f, a, b, c) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Sent {c} bytes")); tracer.Setup(x => x.TimingOutConnection(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <double>(), It.IsAny <double>(), It.IsAny <double>(), It.IsAny <double>())) .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Timed out connection.")); tracer.Setup(x => x.StartListen(It.IsAny <SocketListenerSettings <IListenerStateData> >())) .Callback <SocketListenerSettings <IListenerStateData> >(a => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Listener started: {JsonConvert.SerializeObject(a)}")); tracer.Setup(x => x.Dispose(It.IsAny <IListenerStateData>())) .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Disposed.")); tracer.Setup(x => x.QueuedTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>())) .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Queued")); tracer.Setup(x => x.StartingTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <DateTime>())) .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Started")); tracer.Setup(x => x.FailedTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <Exception>())) .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Failed")); tracer.Setup(x => x.ExpiredTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>())) .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Expired")); tracer.Setup(x => x.CompletedTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>())) .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Completed")); tracer.Setup(x => x.Received(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>())) .Callback <IListenerStateData, IdentityUserToken, IPEndPoint, byte[], int, int>((f, a, b, c, d, e) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Data Received: {e}")); tracer.Setup(x => x.HandleAccept(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>())) .Callback <IListenerStateData, IdentityUserToken, IPEndPoint>((f, a, b) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Connection accepted")); tracer.Setup(x => x.HandleBadAccept(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <SocketError>())) .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Bad SocketAccept")); tracer.Setup(x => x.ClosingConnection(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <bool>(), It.IsAny <bool>(), It.IsAny <SocketError>())) .Callback <IListenerStateData, IdentityUserToken, IPEndPoint, bool, bool, SocketError>((f, a, b, c, d, e) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Closing Connection: ToldToClose: {c} ClosedByClient:{d} CloseReason:{e}")); using (var socketListener = new SocketListener <TestingSocketStateData, IListenerStateData>(listenSettings, mockMessageHandler, tracer.Object)) { socketListener.StartListen(); var socket1 = new TcpClient(); socket1.Connect("localhost", TestPort); var stream1 = socket1.GetStream(); SendMessage(stream1, "GET /process.aspx?data=351777047213077|OGeNuj4NrSR00cY96P5E3Rc04h120Qd-000O001n0c1x HTTP/1.1\r\n" + "Host: 10.1.224.2\r\n" + "\r\n"); Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Waiting for data."); WaitForResponse(stream1); Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Data received, checking that there is no data left."); WaitForNoResponse(stream1); Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]No data left."); Thread.Sleep(1000); Task.Delay(1000); Assert.AreEqual(1, mockMessageHandler.HandledMessages); stream1.Close(); socket1.Close(); Console.WriteLine(); Thread.Sleep(1000); using (var socket = new TcpClient()) { socket.Connect("localhost", TestPort); using (var stream = socket.GetStream()) { SendMessage(stream, ""); WaitForNoResponse(stream); Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Waiting for no response."); Assert.AreEqual(1, mockMessageHandler.HandledMessages); } } using (var socket = new TcpClient()) { socket.Connect("localhost", TestPort); using (var stream = socket.GetStream()) { SendMessage(stream, ""); WaitForNoResponse(stream); Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Waiting for no response."); Assert.AreEqual(1, mockMessageHandler.HandledMessages); } } using (var socket = new TcpClient()) { socket.Connect("localhost", TestPort); using (var stream = socket.GetStream()) { SendMessage(stream, "GET /process.aspx?data=351777047213077|OGeNuj4NrSR00cY96P5E3Rc04h120Qd-000O001n0c1x HTTP/1.1\r\n" + "Host: 10.1.224.2\r\n" + "\r\n"); Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Waiting for final data."); try { WaitForResponse(stream); } catch (Exception) { Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Final data exception thrown."); throw; } Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Final data received."); Assert.AreEqual(2, mockMessageHandler.HandledMessages); } } } }