예제 #1
0
        public async Task GivenNonCompletedSystemMessage_ShouldHaltProcessingUntilCompletion()
        {
            var mailboxHandler = new TestMailboxHandler();
            var userMailbox    = new UnboundedMailboxQueue();
            var systemMessages = new UnboundedMailboxQueue();
            var mailbox        = new DefaultMailbox(systemMessages, userMailbox);

            mailbox.RegisterHandlers(mailboxHandler, mailboxHandler);

            var msg1 = new TestMessageWithTaskCompletionSource();
            var msg2 = new TestMessageWithTaskCompletionSource();

            mailbox.PostSystemMessage(msg1);
            mailbox.PostSystemMessage(msg2);

            Assert.True(systemMessages.HasMessages,
                        "Mailbox should not have processed msg2 because processing of msg1 is not completed."
                        );
            msg2.TaskCompletionSource.SetResult(0);
            msg1.TaskCompletionSource.SetResult(0);
            await Task.Delay(1000);

            Assert.False(systemMessages.HasMessages,
                         "Mailbox should have processed msg2 because processing of msg1 is completed."
                         );
        }
예제 #2
0
        public async Task GivenNonCompletedSystemMessageTaskThrewException_ShouldEscalateFailure()
        {
            var mailboxHandler = new TestMailboxHandler();
            var mailbox        = UnboundedMailbox.Create();

            mailbox.RegisterHandlers(mailboxHandler, mailboxHandler);

            var msg1 = new TestMessageWithTaskCompletionSource();

            mailbox.PostSystemMessage(msg1);

            //make sure the message is being processed by the mailboxHandler
            //e.g. await mailboxHandler.GotMessage()
            await Task.Delay(10);

            //fail the current task being processed
            var taskException = new Exception();

            msg1.TaskCompletionSource.SetException(taskException);

            await mailboxHandler.HasFailures;

            Assert.Single(mailboxHandler.EscalatedFailures);
            var e = Assert.IsType <Exception>(mailboxHandler.EscalatedFailures[0]);

            Assert.Equal(taskException, e);
        }
        public void GivenCompletedUserMessage_ShouldInvokeMessageReceivedImmediately()
        {
            var msg1 = new TestMessageWithTaskCompletionSource();

            msg1.TaskCompletionSource.SetResult(0);

            _mailbox.PostUserMessage(msg1);
            Assert.Contains(msg1, _mailboxStatistics.Posted);
        }
        public async Task GivenSystemMessage_ShouldInvokeMessagePosted()
        {
            var msg1 = new TestMessageWithTaskCompletionSource();

            _mailbox.PostSystemMessage(msg1);
            await Task.Delay(1000);

            Assert.Contains(msg1, _mailboxStatistics.Posted);
        }
        public void GivenCompletedUserMessageThrewException_ShouldNotInvokeMessageReceived()
        {
            var msg1 = new TestMessageWithTaskCompletionSource();

            msg1.TaskCompletionSource.SetException(new Exception());

            _mailbox.PostUserMessage(msg1);

            Assert.DoesNotContain(msg1, _mailboxStatistics.Received);
        }
        public async Task GivenNonCompletedSystemMessageThrewException_ShouldNotInvokeMessageReceived()
        {
            var msg1 = new TestMessageWithTaskCompletionSource();

            _mailbox.PostSystemMessage(msg1);
            msg1.TaskCompletionSource.SetException(new Exception());
            await Task.Delay(1000);

            Assert.DoesNotContain(msg1, _mailboxStatistics.Received);
        }
        public async Task GivenNonCompletedUserMessage_ShouldInvokeMessageReceivedAfterCompletion()
        {
            var msg1 = new TestMessageWithTaskCompletionSource();

            _mailbox.PostUserMessage(msg1);
            Assert.DoesNotContain(msg1, _mailboxStatistics.Received);
            msg1.TaskCompletionSource.SetResult(0);
            await Task.Delay(1000);

            Assert.Contains(msg1, _mailboxStatistics.Posted);
        }
예제 #8
0
        public async Task GivenCompletedSystemMessageTaskGotCancelled_ShouldEscalateFailure()
        {
            var mailboxHandler = new TestMailboxHandler();
            var mailbox        = UnboundedMailbox.Create();

            mailbox.RegisterHandlers(mailboxHandler, mailboxHandler);

            var msg1 = new TestMessageWithTaskCompletionSource();

            msg1.TaskCompletionSource.SetCanceled();

            mailbox.PostSystemMessage(msg1);
            await mailboxHandler.HasFailures;

            Assert.Single(mailboxHandler.EscalatedFailures);
            Assert.IsType <TaskCanceledException>(mailboxHandler.EscalatedFailures[0]);
        }
예제 #9
0
        public async Task GivenCompletedSystemMessageTaskThrewException_ShouldEscalateFailure()
        {
            var mailboxHandler = new TestMailboxHandler();
            var mailbox        = UnboundedMailbox.Create();

            mailbox.RegisterHandlers(mailboxHandler, mailboxHandler);

            var msg1          = new TestMessageWithTaskCompletionSource();
            var taskException = new Exception();

            msg1.TaskCompletionSource.SetException(taskException);

            mailbox.PostSystemMessage(msg1);
            await mailboxHandler.HasFailures;

            Assert.Single(mailboxHandler.EscalatedFailures);
            var e = Assert.IsType <Exception>(mailboxHandler.EscalatedFailures[0]);

            Assert.Equal(taskException, e);
        }
예제 #10
0
        public async Task GivenNonCompletedUserMessage_ShouldSetMailboxToIdleAfterCompletion()
        {
            var mailboxHandler = new TestMailboxHandler();
            var userMailbox    = new UnboundedMailboxQueue();
            var systemMessages = new UnboundedMailboxQueue();
            var mailbox        = new DefaultMailbox(systemMessages, userMailbox);

            mailbox.RegisterHandlers(mailboxHandler, mailboxHandler);

            var msg1 = new TestMessageWithTaskCompletionSource();

            mailbox.PostUserMessage(msg1);

            await Task.Delay(1000);

            msg1.TaskCompletionSource.SetResult(0);
            await Task.Delay(1000);

            Assert.True(mailbox.Status == MailboxStatus.Idle,
                        "Mailbox should be set back to Idle after completion of message."
                        );
        }
예제 #11
0
        public async Task GivenCompletedSystemMessage_ShouldContinueProcessing()
        {
            var mailboxHandler = new TestMailboxHandler();
            var userMailbox    = new UnboundedMailboxQueue();
            var systemMessages = new UnboundedMailboxQueue();
            var mailbox        = new DefaultMailbox(systemMessages, userMailbox);

            mailbox.RegisterHandlers(mailboxHandler, mailboxHandler);

            var msg1 = new TestMessageWithTaskCompletionSource();
            var msg2 = new TestMessageWithTaskCompletionSource();

            msg1.TaskCompletionSource.SetResult(0);
            msg2.TaskCompletionSource.SetResult(0);

            mailbox.PostSystemMessage(msg1);
            mailbox.PostSystemMessage(msg2);
            await Task.Delay(1000);

            Assert.False(systemMessages.HasMessages,
                         "Mailbox should have processed both messages because they were already completed."
                         );
        }