Esempio n. 1
0
 public void Close_IsIdempotent()
 {
     using (var dispatcher = new MessageDispatcher(new RequestHandlers(), _idGenerator))
     {
         dispatcher.Close();
         dispatcher.Close();
     }
 }
Esempio n. 2
0
        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);
                }
        }
Esempio n. 3
0
        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);
                    }
        }