/// <summary>
        /// Decorates transport to save messages into an outbox instead of sending them directly
        /// </summary>
        /// <param name="configurer"></param>
        /// <param name="outboxStorageConfigurer"></param>
        /// <param name="configureOptions"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public static RebusConfigurer Outbox(this RebusConfigurer configurer,
                                             Action <StandardConfigurer <IOutboxStorage> > outboxStorageConfigurer, Action <OutboxOptions> configureOptions = null)
        {
            configurer.Transport(t =>
            {
                if (outboxStorageConfigurer == null)
                {
                    throw new ArgumentNullException(nameof(outboxStorageConfigurer));
                }

                outboxStorageConfigurer(t.OtherService <IOutboxStorage>());
                var outboxOptions = new OutboxOptions();
                configureOptions?.Invoke(outboxOptions);

                t.Decorate(c =>
                {
                    var transport     = c.Get <ITransport>();
                    var outboxStorage = c.Get <IOutboxStorage>();
                    if (outboxOptions.RunMessagesProcessor)
                    {
                        var outboxMessagesProcessor = new OutboxMessagesProcessor(
                            outboxOptions.MaxMessagesToRetrieve,
                            transport,
                            outboxStorage,
                            c.Get <IBackoffStrategy>(),
                            c.Get <IRebusLoggerFactory>(),
                            c.Get <CancellationToken>());

                        outboxMessagesProcessor.Run();
                    }
                    return(new OutboxTransportDecorator(transport, outboxStorage));
                });
            });
            return(configurer);
        }
 public OutboxMessageProcessorTests()
 {
     _transport       = Substitute.For <ITransport>();
     _outboxStorage   = Substitute.For <IOutboxStorage>();
     _backoffStrategy = Substitute.For <IBackoffStrategy>();
     _busDisposalCancellationTokenSource = new CancellationTokenSource();
     _processor = new OutboxMessagesProcessor(TopMessagesToRetrieve, _transport, _outboxStorage,
                                              _backoffStrategy, new NullLoggerFactory(), _busDisposalCancellationTokenSource.Token);
 }