public async Task StartsMessageProcessing()
        {
            var runner = CreateRunner();
            await runner.RunOrchestrationAsync();

            SubscriptionProcessorMock.Verify(o => o.Start(), Times.Once());
        }
        public async Task WaitsOrchestratorToShutDown()
        {
            SetupOptionsAccessorMock(TimeSpan.Zero, TimeSpan.FromSeconds(3));

            int numberOfRequestsInProgress = 2;

            SubscriptionProcessorMock
            .SetupGet(o => o.NumberOfMessagesInProgress)
            .Returns(() => numberOfRequestsInProgress--);

            var runner = CreateRunner();
            await runner.RunOrchestrationAsync();

            SubscriptionProcessorMock.Verify(o => o.NumberOfMessagesInProgress, Times.AtLeast(3));
        }
        public async Task DoesNotBlockOnWaitingForSubscriptionProcessorToInitiateShutdown()
        {
            SubscriptionProcessorMock
            .Setup(sp => sp.StartShutdownAsync())
            .Returns(Task.Delay(TimeSpan.FromDays(1)));     // veeeery long shutdown

            var runner            = CreateRunner();
            var orchestrationTask = runner.RunOrchestrationAsync();
            var delayTask         = Task.Delay(TimeSpan.FromSeconds(5));

            var didNotWait = await Task.WhenAny(orchestrationTask, delayTask) == orchestrationTask;

            Assert.True(didNotWait);
            SubscriptionProcessorMock
            .Verify(sp => sp.StartShutdownAsync(), Times.AtLeastOnce());
        }
        public async Task ShutsDownMessageProcessing()
        {
            var startCalled = false;

            SubscriptionProcessorMock
            .Setup(o => o.Start())
            .Callback(() => startCalled = true);

            SubscriptionProcessorMock
            .Setup(o => o.ShutdownAsync(It.IsAny <TimeSpan>()))
            .Callback(() => Assert.True(startCalled))
            .Returns(Task.FromResult(true));
            var runner = CreateRunner();
            await runner.RunOrchestrationAsync();

            SubscriptionProcessorMock.Verify(o => o.ShutdownAsync(It.IsAny <TimeSpan>()), Times.Once());
        }
        public async Task SendsShutdownNotificationAfterRunningValidations()
        {
            bool startedProcessing = false;

            SubscriptionProcessorMock
            .Setup(sp => sp.Start())
            .Callback(() => startedProcessing = true);

            ShutdownNotificationProviderMock
            .Setup(snp => snp.NotifyShutdownInitiated())
            .Callback(() => Assert.True(startedProcessing));

            var runner = CreateRunner();
            await runner.RunOrchestrationAsync();

            ShutdownNotificationProviderMock
            .Verify(snp => snp.NotifyShutdownInitiated());
        }