public void Close_IsIdempotent() { using (var dispatcher = new MessageDispatcher(new RequestHandlers(), _idGenerator)) { dispatcher.Close(); dispatcher.Close(); } }
public async Task Close_DisposesAllActiveOutboundRequests() { using (var dispatcher = new MessageDispatcher(new RequestHandlers(), _idGenerator)) using (var sentEvent = new ManualResetEventSlim(initialState: false)) { var connection = new Mock <IConnection>(MockBehavior.Strict); connection.SetupGet(x => x.Options) .Returns(ConnectionOptions.CreateDefault()); connection.Setup(x => x.SendAsync(It.IsNotNull <Message>(), It.IsAny <CancellationToken>())) .Callback <Message, CancellationToken>( (message, cancellationToken) => { sentEvent.Set(); }) .Returns(Task.FromResult(0)); dispatcher.SetConnection(connection.Object); var outboundRequestTask = Task.Run(() => dispatcher.DispatchRequestAsync <HandshakeRequest, HandshakeResponse>( MessageMethod.Handshake, new HandshakeRequest(ProtocolConstants.CurrentVersion, ProtocolConstants.CurrentVersion), CancellationToken.None)); sentEvent.Wait(); dispatcher.Close(); await Assert.ThrowsAsync <TaskCanceledException>(() => outboundRequestTask); connection.Verify(x => x.SendAsync(It.IsNotNull <Message>(), It.IsAny <CancellationToken>()), Times.Once); } }
public void Close_DisposesAllActiveInboundRequests() { using (var dispatcher = new MessageDispatcher(new RequestHandlers(), _idGenerator)) using (var handlingEvent = new ManualResetEventSlim(initialState: false)) using (var blockingEvent = new ManualResetEventSlim(initialState: false)) { var requestHandler = new RequestHandler(); Assert.True(dispatcher.RequestHandlers.TryAdd(MessageMethod.Handshake, requestHandler)); var connection = new Mock <IConnection>(MockBehavior.Strict); var payload = new HandshakeRequest(ProtocolConstants.CurrentVersion, ProtocolConstants.CurrentVersion); var request = dispatcher.CreateMessage(MessageType.Request, MessageMethod.Handshake, payload); dispatcher.SetConnection(connection.Object); CancellationToken actualCancellationToken; requestHandler.HandleResponseAsyncFunc = (conn, message, responseHandler, cancellationToken) => { handlingEvent.Set(); actualCancellationToken = cancellationToken; blockingEvent.Set(); return(Task.FromResult(0)); }; connection.Raise(x => x.MessageReceived += null, new MessageEventArgs(request)); handlingEvent.Wait(); dispatcher.Close(); blockingEvent.Wait(); Assert.True(actualCancellationToken.IsCancellationRequested); } }