protected override async Task When()
        {
            var overallConcurrentHandlerLimit = Math.Min(Instance.Configuration.ConcurrentHandlerLimit.Value, Instance.Configuration.GlobalConcurrentHandlerLimit.Value);

            _totalCommandsToSend = overallConcurrentHandlerLimit * 2;
            _expectedNumberOfCommandsToBeSeenBeforeTheBusStops = overallConcurrentHandlerLimit;

            SlowCommandHandler.Reset();

            await Enumerable.Range(0, _totalCommandsToSend)
            .Select(i => Bus.Send(new SlowCommand()))
            .WhenAll();

            await TimeSpan.FromSeconds(TimeoutSeconds)
            .WaitUntil(() => MethodCallCounter.AllReceivedMessages.OfType <SlowCommand>().Count() >= _expectedNumberOfCommandsToBeSeenBeforeTheBusStops);

            _messagesReceivedBeforeTheBusWasStopped = MethodCallCounter.AllReceivedMessages.OfType <SlowCommand>().Count();
            await Bus.Stop();

            MethodCallCounter.Clear();
            SlowCommandHandler.HandlerSemaphore.Release(_totalCommandsToSend);
            await Task.Delay(TimeSpan.FromSeconds(0.25));

            _messagesReceivedAfterTheBusWasStopped = MethodCallCounter.AllReceivedMessages.OfType <SlowCommand>().Count();
        }
        protected override async Task <LongRunningTaskWrapper> Given()
        {
            _slowCommand                = new SlowCommand();
            _handler                    = new SlowCommandHandler();
            _brokeredMessage            = new BrokeredMessage(_slowCommand);
            _clock                      = new SystemClock();
            _logger                     = new ConsoleLogger();
            _defaultMessageLockDuration = new DefaultMessageLockDurationSetting();
            _taskFactory                = new NimbusTaskFactory(new MaximumThreadPoolThreadsSetting(), new MinimumThreadPoolThreadsSetting(), _logger);

            _renewLockCalled = false;
            _handlerTask     = _handler.Handle(_slowCommand);

            LongRunningTaskWrapperBase.RenewLockStrategy = async m =>
            {
                _renewLockCalled = true;
                _lockedUntil     = _clock.UtcNow.AddSeconds(1);
                _handler.PretendToBeWorkingSemaphore.Release();
            };
            LongRunningTaskWrapperBase.LockedUntilUtcStrategy = m => _lockedUntil;

            _lockedUntil = DateTimeOffset.UtcNow.AddSeconds(1);
            return(new LongRunningTaskWrapper(_handlerTask, _handler, _brokeredMessage, _clock, _logger, _defaultMessageLockDuration, _taskFactory));
        }