public void TcpTrickleReceiveTest() { TaskCompletionSource <bool> testComplete = new TaskCompletionSource <bool>(); IPEndPoint listenEP = new IPEndPoint(IPAddress.Loopback, 9066); var transport = new SIPTransport(); var tcpChannel = new SIPTCPChannel(new IPEndPoint(IPAddress.Loopback, 9067)); tcpChannel.DisableLocalTCPSocketsCheck = true; transport.AddSIPChannel(tcpChannel); int requestCount = 10; int recvdReqCount = 0; Task.Run(() => { TcpListener listener = new TcpListener(listenEP); listener.Start(); var tcpClient = listener.AcceptTcpClient(); logger.LogDebug($"TCP listener accepted client with remote end point {tcpClient.Client.RemoteEndPoint}."); for (int i = 0; i < requestCount; i++) { logger.LogDebug($"Sending request {i}."); var req = transport.GetRequest(SIPMethodsEnum.OPTIONS, SIPURI.ParseSIPURIRelaxed($"{i}@sipsorcery.com")); byte[] reqBytes = Encoding.UTF8.GetBytes(req.ToString()); tcpClient.GetStream().Write(reqBytes, 0, reqBytes.Length); tcpClient.GetStream().Flush(); Task.Delay(30).Wait(); } tcpClient.GetStream().Close(); }); transport.SIPTransportRequestReceived += (SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPRequest sipRequest) => { logger.LogDebug($"Request received {localSIPEndPoint.ToString()}<-{remoteEndPoint.ToString()}: {sipRequest.StatusLine}"); logger.LogDebug(sipRequest.ToString()); Interlocked.Increment(ref recvdReqCount); if (recvdReqCount == requestCount) { testComplete.SetResult(true); } }; transport.SIPTransportResponseReceived += (SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPResponse sipResponse) => { logger.LogDebug($"Response received {localSIPEndPoint.ToString()}<-{remoteEndPoint.ToString()}: {sipResponse.ShortDescription}"); logger.LogDebug(sipResponse.ToString()); }; tcpChannel.ConnectClientAsync(listenEP, null, null).Wait(); Task.WhenAny(new Task[] { testComplete.Task, Task.Delay(5000) }).Wait(); transport.Shutdown(); Assert.IsTrue(testComplete.Task.IsCompleted); Assert.IsTrue(testComplete.Task.Result); Assert.AreEqual(requestCount, recvdReqCount, $"The count of {recvdReqCount} for the requests received did not match what was expected."); }
public void TcpTrickleReceiveTest() { logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name); logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name); TaskCompletionSource <bool> testComplete = new TaskCompletionSource <bool>(); // TCP server. TcpListener listener = new TcpListener(IPAddress.Loopback, 0); listener.Start(); var actualEP = listener.LocalEndpoint as IPEndPoint; // SIP TCP Channel var transport = new SIPTransport(); var tcpChannel = new SIPTCPChannel(new IPEndPoint(IPAddress.Loopback, 0)); tcpChannel.DisableLocalTCPSocketsCheck = true; transport.AddSIPChannel(tcpChannel); int requestCount = 10; int recvdReqCount = 0; Task.Run(() => { try { var tcpClient = listener.AcceptTcpClient(); logger.LogDebug($"Dummy TCP listener accepted client with remote end point {tcpClient.Client.RemoteEndPoint}."); for (int i = 0; i < requestCount; i++) { logger.LogDebug($"Sending request {i}."); var req = SIPRequest.GetRequest(SIPMethodsEnum.OPTIONS, new SIPURI(SIPSchemesEnum.sip, tcpChannel.ListeningSIPEndPoint)); byte[] reqBytes = Encoding.UTF8.GetBytes(req.ToString()); tcpClient.GetStream().Write(reqBytes, 0, reqBytes.Length); tcpClient.GetStream().Flush(); Task.Delay(30).Wait(); } tcpClient.GetStream().Close(); } catch (Exception excp) { logger.LogError($"Exception on dummy TCP listener task. {excp.Message}"); testComplete.SetResult(false); } }); transport.SIPTransportRequestReceived += (SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPRequest sipRequest) => { logger.LogDebug($"Request received {localSIPEndPoint.ToString()}<-{remoteEndPoint.ToString()}: {sipRequest.StatusLine}"); logger.LogDebug(sipRequest.ToString()); Interlocked.Increment(ref recvdReqCount); if (recvdReqCount == requestCount) { if (!testComplete.TrySetResult(true)) { logger.LogWarning($"TcpTrickleReceiveTest: FAILED to set result on CompletionSource."); } } return(Task.FromResult(0)); }; transport.SIPTransportResponseReceived += (SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPResponse sipResponse) => { logger.LogDebug($"Response received {localSIPEndPoint.ToString()}<-{remoteEndPoint.ToString()}: {sipResponse.ShortDescription}"); logger.LogDebug(sipResponse.ToString()); return(Task.FromResult(0)); }; if (!tcpChannel.ConnectClientAsync(actualEP, null, null).Wait(TimeSpan.FromMilliseconds(TRANSPORT_TEST_TIMEOUT))) { logger.LogWarning($"ConnectClientAsync timed out"); } logger.LogDebug("Test client connected."); if (!Task.WhenAny(new Task[] { testComplete.Task }).Wait(TRANSPORT_TEST_TIMEOUT)) { logger.LogWarning($"Tasks timed out"); } logger.LogDebug("Test completed, shutting down SIP transport layer."); transport.Shutdown(); logger.LogDebug("SIP transport layer shutdown."); // Give the SIP transport time to shutdown. Keeps exception messages out of the logs. Task.Delay(500).Wait(); Assert.True(testComplete.Task.IsCompleted); Assert.True(testComplete.Task.Result); Assert.True(requestCount == recvdReqCount, $"The count of {recvdReqCount} for the requests received did not match what was expected."); }
public void TcpTrickleReceiveTest() { TaskCompletionSource <bool> testComplete = new TaskCompletionSource <bool>(); IPEndPoint listenEP = new IPEndPoint(IPAddress.Loopback, 9067); var transport = new SIPTransport(); var tcpChannel = new SIPTCPChannel(new IPEndPoint(IPAddress.Loopback, 9066)); tcpChannel.DisableLocalTCPSocketsCheck = true; transport.AddSIPChannel(tcpChannel); int requestCount = 10; int recvdReqCount = 0; Task.Run(() => { try { TcpListener listener = new TcpListener(listenEP); listener.Start(); var tcpClient = listener.AcceptTcpClient(); logger.LogDebug($"Dummy TCP listener accepted client with remote end point {tcpClient.Client.RemoteEndPoint}."); for (int i = 0; i < requestCount; i++) { logger.LogDebug($"Sending request {i}."); var req = transport.GetRequest(SIPMethodsEnum.OPTIONS, tcpChannel.GetContactURI(SIPSchemesEnum.sip, listenEP.Address)); byte[] reqBytes = Encoding.UTF8.GetBytes(req.ToString()); tcpClient.GetStream().Write(reqBytes, 0, reqBytes.Length); tcpClient.GetStream().Flush(); Task.Delay(30).Wait(); } tcpClient.GetStream().Close(); } catch (Exception excp) { logger.LogError($"Exception on dummy TCP listener task. {excp.Message}"); testComplete.SetResult(false); } }); transport.SIPTransportRequestReceived += (SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPRequest sipRequest) => { logger.LogDebug($"Request received {localSIPEndPoint.ToString()}<-{remoteEndPoint.ToString()}: {sipRequest.StatusLine}"); logger.LogDebug(sipRequest.ToString()); Interlocked.Increment(ref recvdReqCount); if (recvdReqCount == requestCount) { testComplete.SetResult(true); } }; transport.SIPTransportResponseReceived += (SIPEndPoint localSIPEndPoint, SIPEndPoint remoteEndPoint, SIPResponse sipResponse) => { logger.LogDebug($"Response received {localSIPEndPoint.ToString()}<-{remoteEndPoint.ToString()}: {sipResponse.ShortDescription}"); logger.LogDebug(sipResponse.ToString()); }; tcpChannel.ConnectClientAsync(listenEP, null, null).Wait(); Task.WhenAny(new Task[] { testComplete.Task, Task.Delay(TRANSPORT_TEST_TIMEOUT) }).Wait(); transport.Shutdown(); // Give the SIP transport time to shutdown. Keeps exception messages out of the logs. Task.Delay(500).Wait(); Assert.True(testComplete.Task.IsCompleted); Assert.True(testComplete.Task.Result); Assert.True(requestCount == recvdReqCount, $"The count of {recvdReqCount} for the requests received did not match what was expected."); }