public void EventListenerSettingsAreProperlyAppliedToReplyListener(string queueName, string topics)
        {
            // Arrange
            string[] topicNames = topics.Split(",");

            MicroserviceListener listener = new MicroserviceListener {
                Queue = queueName, TopicExpressions = topicNames
            };

            MicroserviceReplayListener replayListener = new MicroserviceReplayListener();

            // Act
            replayListener.ApplyListenerSettings(listener);

            // Assert
            string[] expectedTopicNames = topicNames.Select(e => $"{ReplayTopicNames.ReplayEventTopicPrefix}{e}").ToArray();

            Assert.AreEqual($"{ReplayTopicNames.ReplayEventTopicPrefix}{queueName}", replayListener.Queue);
            CollectionAssert.AreEqual(expectedTopicNames, replayListener.TopicExpressions.ToArray());
        }
        /// <summary>
        /// Publish a replay event command and initiate a replay
        /// </summary>
        public virtual void Initiate(ReplayEventsCommand command)
        {
            Logger.LogInformation($"Initiating replay from {command.FromTimeStamp} to {command.ToTimeStamp}, " +
                                  $"Topic {string.Join(',', command.Topics)}, " +
                                  $"Types {string.Join(',', command.Types)}, " +
                                  $"DestinationQueue {command.DestinationQueue}. " +
                                  $"Process ID {command.ProcessId} and Timestamp {command.Timestamp}");

            if (Host.IsListening && !Host.IsPaused)
            {
                Logger.LogDebug("Pausing host");
                Host.Pause();
            }

            Logger.LogTrace("Setting up manual reset events");
            ManualResetEvent startResetEvent = new ManualResetEvent(false);
            ManualResetEvent endResetEvent   = new ManualResetEvent(false);

            Logger.LogTrace("Setting up random queue names");
            string startQueue = Guid.NewGuid().ToString();
            string endQueue   = Guid.NewGuid().ToString();

            Logger.LogDebug($"Setting up replay startlistener with topic {ReplayTopicNames.ReplayStartEventTopic} " +
                            $"and queue {startQueue}");

            MicroserviceReplayListener startListener = new MicroserviceReplayListener
            {
                Callback = callbackResult =>
                {
                    Logger.LogDebug("Received replay start event, deserializing and checking process id...");
                    string      data        = Encoding.Unicode.GetString(callbackResult.Body);
                    DomainEvent domainEvent = JsonConvert.DeserializeObject <DomainEvent>(data);

                    if (domainEvent.ProcessId.ToString() != command.ProcessId.ToString())
                    {
                        return;
                    }

                    Logger.LogInformation($"Start event received with process id {command.ProcessId}");
                    startResetEvent.Set();
                },
                Queue            = startQueue,
                TopicExpressions = new [] { ReplayTopicNames.ReplayStartEventTopic }
            };

            Logger.LogDebug($"Setting up replay endlistener with topic {ReplayTopicNames.ReplayEndEventTopic} " +
                            $"and queue {endQueue}");

            MicroserviceReplayListener endListener = new MicroserviceReplayListener
            {
                Callback = callbackResult =>
                {
                    Logger.LogDebug("Received replay end event, deserializing and checking process id...");
                    string      data        = Encoding.Unicode.GetString(callbackResult.Body);
                    DomainEvent domainEvent = JsonConvert.DeserializeObject <DomainEvent>(data);

                    if (domainEvent.ProcessId.ToString() != command.ProcessId.ToString())
                    {
                        return;
                    }

                    Logger.LogInformation($"End event received with process id {command.ProcessId}");
                    endResetEvent.Set();
                },
                Queue            = endQueue,
                TopicExpressions = new [] { ReplayTopicNames.ReplayEndEventTopic }
            };

            Logger.LogTrace("Setting up start and end listeners in host");
            Host.StartListener = startListener;
            Host.EndListener   = endListener;

            Logger.LogTrace("Starting replay");
            Host.StartReplay();

            Logger.LogDebug("Publishing replay command to auditlogger");
            ReplayEventsResult result = CommandPublisher.PublishAsync <ReplayEventsResult>(command).Result;

            Logger.LogInformation($"{result.AmountOfEvents} event(s) will be replayed");
            Logger.LogDebug("Awaiting start event");

            startResetEvent.WaitOne();
            endResetEvent.WaitOne();

            Logger.LogDebug("End event received, ending replay");
            Host.StopReplay();

            if (!Host.IsListening)
            {
                return;
            }

            Logger.LogDebug("Resuming host");
            Host.Resume();
        }