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 TestMessage(); var msg2 = new TestMessage(); mailbox.PostSystemMessage(msg1); mailbox.PostSystemMessage(msg2); Assert.True(systemMessages.HasMessages, "Mailbox should not have processed msg2 because processing of msg1 is not completed."); Action resumeMailboxTrigger = () => { // mailbox is waiting on msg1 to be completed before continuing // setting msg2 first guarantees that both messages will be processed msg2.TaskCompletionSource.SetResult(0); msg1.TaskCompletionSource.SetResult(0); }; await mailboxHandler.ResumeMailboxProcessingAndWaitAsync(resumeMailboxTrigger) .ConfigureAwait(false); Assert.False(systemMessages.HasMessages, "Mailbox should have processed msg2 because processing of msg1 is completed."); }
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 TestMessage(); mailbox.PostUserMessage(msg1); Action resumeMailboxTrigger = () => msg1.TaskCompletionSource.SetResult(0); await mailboxHandler.ResumeMailboxProcessingAndWaitAsync(resumeMailboxTrigger) .ConfigureAwait(false); Assert.True(mailbox.Status == MailboxStatus.Idle, "Mailbox should be set back to Idle after completion of message."); }
public async Task GivenNonCompletedSystemMessageThrewException_ShouldNotInvokeMessageReceived() { var mailboxHandler = new TestMailboxHandler(); var userMailbox = new UnboundedMailboxQueue(); var systemMessages = new UnboundedMailboxQueue(); var mailboxStatistics = new TestMailboxStatistics(); var mailbox = new DefaultMailbox(systemMessages, userMailbox, mailboxStatistics); mailbox.RegisterHandlers(mailboxHandler, mailboxHandler); var msg1 = new TestMessage(); mailbox.PostSystemMessage(msg1); Action resumeMailboxTrigger = () => msg1.TaskCompletionSource.SetException(new Exception()); await mailboxHandler.ResumeMailboxProcessingAndWaitAsync(resumeMailboxTrigger) .ConfigureAwait(false); Assert.DoesNotContain(msg1, mailboxStatistics.Received); }
public async Task GivenNonCompletedSystemMessageTaskThrewException_ShouldEscalateFailure() { var mailboxHandler = new TestMailboxHandler(); var mailbox = UnboundedMailbox.Create(); mailbox.RegisterHandlers(mailboxHandler, mailboxHandler); var msg1 = new TestMessage(); mailbox.PostSystemMessage(msg1); var taskException = new Exception(); Action resumeMailboxTrigger = () => msg1.TaskCompletionSource.SetException(taskException); await mailboxHandler.ResumeMailboxProcessingAndWaitAsync(resumeMailboxTrigger) .ConfigureAwait(false); Assert.Equal(1, mailboxHandler.EscalatedFailures.Count); var e = Assert.IsType <AggregateException>(mailboxHandler.EscalatedFailures[0]); Assert.Equal(taskException, e.InnerException); }