public void TestMaxPendingLimit() { TaskCompletionSource <bool> serverBlocker = new TaskCompletionSource <bool>(); var serverMessages = 0; LeanIPC.RequestHandler serverHandler = async(message) => { System.Threading.Interlocked.Increment(ref serverMessages); await serverBlocker.Task; if (message.Arguments == null || message.Arguments.Length == 0) { return(RequestHandlerResponse.FromResult((object)null)); } return(new RequestHandlerResponse(message.Types, message.Arguments)); }; using (var setup = new ClientServerTester(serverHandler, EchoMethod)) { setup.Client.MaxPendingRequests = 10; var sendTasks = Enumerable .Range(0, 20) .Select(x => setup.GuardedOperationAsync(() => setup.Client.SendAndWaitAsync <int, int>(x)) ) .ToArray(); // Make sure the requests have propagated System.Threading.Thread.Sleep(1000); if (serverMessages != setup.Client.MaxPendingRequests) { throw new Exception($"Server got {serverMessages} messages but the pending limit is {setup.Client.MaxPendingRequests}"); } // Trigger a resend setup.Client.MaxPendingRequests = 15; System.Threading.Thread.Sleep(1000); if (serverMessages != setup.Client.MaxPendingRequests) { throw new Exception($"Server got {serverMessages} messages but the pending limit is {setup.Client.MaxPendingRequests}"); } // Trigger a no-op resend setup.Client.MaxPendingRequests = 10; System.Threading.Thread.Sleep(1000); if (serverMessages != 15) { throw new Exception($"Server got {serverMessages} messages but the pending limit is {15}"); } serverBlocker.TrySetResult(true); Task.WhenAll(sendTasks).Wait(); if (serverMessages != 20) { throw new Exception($"Server got {serverMessages} messages but should have {12}"); } } }
private static Task <RequestHandlerResponse> EchoMethod(ParsedMessage message) { if (message.Arguments == null || message.Arguments.Length == 0) { return(Task.FromResult(RequestHandlerResponse.FromResult((object)null))); } return(Task.FromResult(new RequestHandlerResponse(message.Types, message.Arguments))); }