public void setup()
        {
            _subscribeProjectionHandler = new TestHandler<ReaderSubscriptionManagement.Subscribe>();
            _writeEventHandler = new TestHandler<ClientMessage.WriteEvents>();
            _bus.Subscribe(_subscribeProjectionHandler);
            _bus.Subscribe(_writeEventHandler);


            _stateHandler = GivenProjectionStateHandler();
            _firstWriteCorrelationId = Guid.NewGuid();
            _workerId = Guid.NewGuid();
            var dispatcher = new ProjectionManagerMessageDispatcher(new Dictionary<Guid, IPublisher>{{_workerId, GetInputQueue()}});
            _projectionCorrelationId = Guid.NewGuid();
            _projectionConfig = GivenProjectionConfig();
            var projectionProcessingStrategy = GivenProjectionProcessingStrategy();
            _coreProjection = GivenCoreProjection(projectionProcessingStrategy);
            _bus.Subscribe<CoreProjectionProcessingMessage.CheckpointCompleted>(_coreProjection);
            _bus.Subscribe<CoreProjectionProcessingMessage.CheckpointLoaded>(_coreProjection);
            _bus.Subscribe<CoreProjectionProcessingMessage.PrerecordedEventsLoaded>(_coreProjection);
            _bus.Subscribe<CoreProjectionProcessingMessage.RestartRequested>(_coreProjection);
            _bus.Subscribe<CoreProjectionProcessingMessage.Failed>(_coreProjection);
            _bus.Subscribe(new AdHocHandler<ProjectionCoreServiceMessage.CoreTick>(tick => tick.Action()));
            _bus.Subscribe(new AdHocHandler<ReaderCoreServiceMessage.ReaderTick>(tick => tick.Action()));
            _bus.Subscribe<PartitionProcessingResultOutputBase>(dispatcher);
            PreWhen();
            When();
        }
示例#2
0
        public void setup()
        {
            _subscribeProjectionHandler = new TestHandler <ReaderSubscriptionManagement.Subscribe>();
            _writeEventHandler          = new TestHandler <ClientMessage.WriteEvents>();
            _bus.Subscribe(_subscribeProjectionHandler);
            _bus.Subscribe(_writeEventHandler);


            _stateHandler            = GivenProjectionStateHandler();
            _firstWriteCorrelationId = Guid.NewGuid();
            _workerId = Guid.NewGuid();
            var dispatcher = new ProjectionManagerMessageDispatcher(new Dictionary <Guid, IPublisher> {
                { _workerId, GetInputQueue() }
            });

            _projectionCorrelationId = Guid.NewGuid();
            _projectionConfig        = GivenProjectionConfig();
            var projectionProcessingStrategy = GivenProjectionProcessingStrategy();

            _coreProjection = GivenCoreProjection(projectionProcessingStrategy);
            _bus.Subscribe <CoreProjectionProcessingMessage.CheckpointCompleted>(_coreProjection);
            _bus.Subscribe <CoreProjectionProcessingMessage.CheckpointLoaded>(_coreProjection);
            _bus.Subscribe <CoreProjectionProcessingMessage.PrerecordedEventsLoaded>(_coreProjection);
            _bus.Subscribe <CoreProjectionProcessingMessage.RestartRequested>(_coreProjection);
            _bus.Subscribe <CoreProjectionProcessingMessage.Failed>(_coreProjection);
            _bus.Subscribe(new AdHocHandler <ProjectionCoreServiceMessage.CoreTick>(tick => tick.Action()));
            _bus.Subscribe(new AdHocHandler <ReaderCoreServiceMessage.ReaderTick>(tick => tick.Action()));
            _bus.Subscribe <PartitionProcessingResultOutputBase>(dispatcher);
            PreWhen();
            When();
        }
        private static void SubscribeMainBus(
            ISubscriber mainBus,
            ProjectionManager projectionManager,
            ProjectionType runProjections,
            IODispatcher ioDispatcher,
            ProjectionManagerMessageDispatcher projectionManagerMessageDispatcher)
        {
            if (runProjections >= ProjectionType.System)
            {
                mainBus.Subscribe <ProjectionManagementMessage.Command.Post>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.PostBatch>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.UpdateQuery>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.GetQuery>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.Delete>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.GetStatistics>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.GetState>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.GetResult>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.Disable>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.Enable>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.Abort>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.SetRunAs>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.Reset>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.GetConfig>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Command.UpdateConfig>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Internal.CleanupExpired>(projectionManager);
                mainBus.Subscribe <ProjectionManagementMessage.Internal.Deleted>(projectionManager);
                mainBus.Subscribe <CoreProjectionStatusMessage.Started>(projectionManager);
                mainBus.Subscribe <CoreProjectionStatusMessage.Stopped>(projectionManager);
                mainBus.Subscribe <CoreProjectionStatusMessage.Faulted>(projectionManager);
                mainBus.Subscribe <CoreProjectionStatusMessage.Prepared>(projectionManager);
                mainBus.Subscribe <CoreProjectionStatusMessage.StateReport>(projectionManager);
                mainBus.Subscribe <CoreProjectionStatusMessage.ResultReport>(projectionManager);
                mainBus.Subscribe <CoreProjectionStatusMessage.StatisticsReport>(projectionManager);
                mainBus.Subscribe <ProjectionSubsystemMessage.StartComponents>(projectionManager);
                mainBus.Subscribe <ProjectionSubsystemMessage.StopComponents>(projectionManager);
            }

            mainBus.Subscribe <ClientMessage.WriteEventsCompleted>(projectionManager);
            mainBus.Subscribe <ClientMessage.DeleteStreamCompleted>(projectionManager);
            mainBus.Subscribe <ClientMessage.ReadStreamEventsBackwardCompleted>(projectionManager);
            mainBus.Subscribe <ClientMessage.ReadStreamEventsForwardCompleted>(projectionManager);

            mainBus.Subscribe(ioDispatcher.Awaker);
            mainBus.Subscribe(ioDispatcher.BackwardReader);
            mainBus.Subscribe(ioDispatcher.ForwardReader);
            mainBus.Subscribe(ioDispatcher.StreamDeleter);
            mainBus.Subscribe(ioDispatcher.Writer);
            mainBus.Subscribe(ioDispatcher.EventReader);
            mainBus.Subscribe <IODispatcherDelayedMessage>(ioDispatcher);
            mainBus.Subscribe <ClientMessage.NotHandled>(ioDispatcher);

            mainBus.Subscribe(projectionManagerMessageDispatcher);
        }
        public static void CreateManagerService(
            StandardComponents standardComponents,
            ProjectionsStandardComponents projectionsStandardComponents,
            IDictionary <Guid, IPublisher> queues,
            TimeSpan projectionQueryExpiry)
        {
            IQueuedHandler inputQueue   = projectionsStandardComponents.LeaderInputQueue;
            IBus           outputBus    = projectionsStandardComponents.LeaderOutputBus;
            var            ioDispatcher = new IODispatcher(outputBus, new PublishEnvelope(inputQueue), true);

            var projectionsController = new ProjectionsController(
                standardComponents.HttpForwarder,
                inputQueue,
                standardComponents.NetworkSendService);

            var forwarder = new RequestResponseQueueForwarder(
                inputQueue: projectionsStandardComponents.LeaderInputQueue,
                externalRequestQueue: standardComponents.MainQueue);

            if (projectionsStandardComponents.RunProjections != ProjectionType.None)
            {
                foreach (var httpService in standardComponents.HttpServices)
                {
                    httpService.SetupController(projectionsController);
                }
            }

            var projectionManagerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues);

            var projectionManager = new ProjectionManager(
                inputQueue,
                outputBus,
                queues,
                new RealTimeProvider(),
                projectionsStandardComponents.RunProjections,
                ioDispatcher,
                projectionQueryExpiry);

            SubscribeMainBus(
                projectionsStandardComponents.LeaderMainBus,
                projectionManager,
                projectionsStandardComponents.RunProjections,
                ioDispatcher,
                projectionManagerMessageDispatcher);


            SubscribeOutputBus(standardComponents, projectionsStandardComponents, forwarder, ioDispatcher);
        }
        public void Setup()
        {
            //TODO: this became an integration test - proper ProjectionCoreService and ProjectionManager testing is required as well
            _bus.Subscribe(_consumer);

            _processingQueues = GivenProcessingQueues();
            var queues = _processingQueues.ToDictionary(v => v.Item5, v => (IPublisher)v.Item1);
            _managerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues);
            _manager = new ProjectionManager(
                GetInputQueue(),
                GetInputQueue(),
                queues,
                _timeProvider,
                ProjectionType.All,
                _ioDispatcher,
                _initializeSystemProjections);

            _coordinator = new ProjectionCoreCoordinator(
                ProjectionType.All,
                ProjectionCoreWorkersNode.CreateTimeoutSchedulers(queues.Count),
                queues.Values.ToArray(),
                _bus,
                Envelope);

            _bus.Subscribe<ProjectionManagementMessage.Internal.CleanupExpired>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Internal.Deleted>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.Started>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.Stopped>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.Prepared>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.Faulted>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.StateReport>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.ResultReport>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.StatisticsReport>(_manager);
            _bus.Subscribe<CoreProjectionManagementMessage.SlaveProjectionReaderAssigned>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.ProjectionWorkerStarted>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Post>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.UpdateQuery>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.GetQuery>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Delete>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.GetStatistics>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.GetState>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.GetResult>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Disable>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Enable>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Abort>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.SetRunAs>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Reset>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.StartSlaveProjections>(_manager);
            _bus.Subscribe<ClientMessage.WriteEventsCompleted>(_manager);
            _bus.Subscribe<ClientMessage.ReadStreamEventsBackwardCompleted>(_manager);
            _bus.Subscribe<ClientMessage.DeleteStreamCompleted>(_manager);
            _bus.Subscribe<SystemMessage.StateChangeMessage>(_manager);
            _bus.Subscribe<SystemMessage.SystemCoreReady>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.ReaderReady>(_manager);
            _bus.Subscribe(
                CallbackSubscriber.Create<ProjectionManagementMessage.Starting>(
                    starting => _queue.Publish(new ProjectionManagementMessage.ReaderReady())));

            _bus.Subscribe<SystemMessage.StateChangeMessage>(_coordinator);
            _bus.Subscribe<SystemMessage.SystemCoreReady>(_coordinator);

            if (GetInputQueue() != _processingQueues.First().Item2)
            {
                _bus.Subscribe<PartitionProcessingResultBase>(_managerMessageDispatcher);
                _bus.Subscribe<CoreProjectionManagementControlMessage>(
                    _managerMessageDispatcher);
                _bus.Subscribe<PartitionProcessingResultOutputBase>(_managerMessageDispatcher);
                _bus.Subscribe<ReaderSubscriptionManagement.SpoolStreamReading>(_managerMessageDispatcher);
            }

            foreach(var q in _processingQueues)
                SetUpCoreServices(q.Item5, q.Item1, q.Item2, q.Item3, q.Item4);

            //Given();
            WhenLoop();
        }
        public void Setup()
        {
            //TODO: this became an integration test - proper ProjectionCoreService and ProjectionManager testing is required as well
            _bus.Subscribe(_consumer);

            _processingQueues = GivenProcessingQueues();
            var queues = _processingQueues.ToDictionary(v => v.Item5, v => (IPublisher)v.Item1);

            _managerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues);
            _manager = new ProjectionManager(
                GetInputQueue(),
                GetInputQueue(),
                queues,
                _timeProvider,
                ProjectionType.All,
                _ioDispatcher,
                TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault),
                _initializeSystemProjections);

            _coordinator = new ProjectionCoreCoordinator(
                ProjectionType.All,
                ProjectionCoreWorkersNode.CreateTimeoutSchedulers(queues.Count),
                queues.Values.ToArray(),
                _bus,
                Envelope);

            _bus.Subscribe <ProjectionManagementMessage.Internal.CleanupExpired>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Internal.Deleted>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Started>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Stopped>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Prepared>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Faulted>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.StateReport>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.ResultReport>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.StatisticsReport>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Post>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.PostBatch>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.UpdateQuery>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetQuery>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Delete>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetStatistics>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetState>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetResult>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Disable>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Enable>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Abort>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.SetRunAs>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Reset>(_manager);
            _bus.Subscribe <ClientMessage.WriteEventsCompleted>(_manager);
            _bus.Subscribe <ClientMessage.ReadStreamEventsForwardCompleted>(_manager);
            _bus.Subscribe <ClientMessage.ReadStreamEventsBackwardCompleted>(_manager);
            _bus.Subscribe <ClientMessage.DeleteStreamCompleted>(_manager);
            _bus.Subscribe <ProjectionSubsystemMessage.StartComponents>(_manager);
            _bus.Subscribe <ProjectionSubsystemMessage.StopComponents>(_manager);
            _bus.Subscribe <ProjectionSubsystemMessage.StartComponents>(_coordinator);
            _bus.Subscribe <ProjectionSubsystemMessage.StopComponents>(_coordinator);

            if (GetInputQueue() != _processingQueues.First().Item2)
            {
                _bus.Subscribe <CoreProjectionManagementControlMessage>(
                    _managerMessageDispatcher);
            }

            foreach (var q in _processingQueues)
            {
                SetUpCoreServices(q.Item5, q.Item1, q.Item2, q.Item3, q.Item4);
            }

            //Given();
            WhenLoop();
        }
        public void Setup()
        {
            //TODO: this became an integration test - proper ProjectionCoreService and ProjectionManager testing is required as well
            _bus.Subscribe(_consumer);

            var queues = GivenCoreQueues();

            _managerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues);
            _manager = new ProjectionManager(
                GetInputQueue(),
                GetInputQueue(),
                queues,
                _timeProvider,
                ProjectionType.All,
                _ioDispatcher,
                TimeSpan.FromMinutes(Opts.ProjectionsQueryExpiryDefault),
                _initializeSystemProjections);

            IPublisher inputQueue   = GetInputQueue();
            IPublisher publisher    = GetInputQueue();
            var        ioDispatcher = new IODispatcher(publisher, new PublishEnvelope(inputQueue));

            _bus.Subscribe <ProjectionManagementMessage.Internal.CleanupExpired>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Internal.Deleted>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Started>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Stopped>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Prepared>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Faulted>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.StateReport>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.ResultReport>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.StatisticsReport>(_manager);
            _bus.Subscribe <CoreProjectionManagementMessage.SlaveProjectionReaderAssigned>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.ProjectionWorkerStarted>(_manager);

            _bus.Subscribe <ProjectionManagementMessage.Command.Post>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.PostBatch>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.UpdateQuery>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetQuery>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Delete>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetStatistics>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetState>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetResult>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Disable>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Enable>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Abort>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.SetRunAs>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Reset>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.StartSlaveProjections>(_manager);
            _bus.Subscribe <ClientMessage.WriteEventsCompleted>(_manager);
            _bus.Subscribe <ClientMessage.ReadStreamEventsBackwardCompleted>(_manager);
            _bus.Subscribe <ClientMessage.WriteEventsCompleted>(_manager);
            _bus.Subscribe <ProjectionSubsystemMessage.StartComponents>(_manager);
            _bus.Subscribe <ProjectionSubsystemMessage.StopComponents>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.ReaderReady>(_manager);
            _bus.Subscribe(
                CallbackSubscriber.Create <ProjectionManagementMessage.Starting>(
                    starting => _queue.Publish(new ProjectionManagementMessage.ReaderReady())));
            _bus.Subscribe <PartitionProcessingResultBase>(_managerMessageDispatcher);
            _bus.Subscribe <CoreProjectionManagementControlMessage>(_managerMessageDispatcher);
            _bus.Subscribe <PartitionProcessingResultOutputBase>(_managerMessageDispatcher);

            _bus.Subscribe <ClientMessage.ReadStreamEventsForwardCompleted>(ioDispatcher.ForwardReader);
            _bus.Subscribe <ClientMessage.ReadStreamEventsBackwardCompleted>(ioDispatcher.BackwardReader);
            _bus.Subscribe <ClientMessage.WriteEventsCompleted>(ioDispatcher.Writer);
            _bus.Subscribe <ClientMessage.DeleteStreamCompleted>(ioDispatcher.StreamDeleter);
            _bus.Subscribe <IODispatcherDelayedMessage>(ioDispatcher.Awaker);
            _bus.Subscribe <IODispatcherDelayedMessage>(ioDispatcher);

            AwakeService = new AwakeService();
            _bus.Subscribe <StorageMessage.EventCommitted>(AwakeService);
            _bus.Subscribe <StorageMessage.TfEofAtNonCommitRecord>(AwakeService);
            _bus.Subscribe <AwakeServiceMessage.SubscribeAwake>(AwakeService);
            _bus.Subscribe <AwakeServiceMessage.UnsubscribeAwake>(AwakeService);


            Given();
            WhenLoop();
        }
        public void Setup()
        {
            //TODO: this became an integration test - proper ProjectionCoreService and ProjectionManager testing is required as well
            _bus.Subscribe(_consumer);

            var queues = GivenCoreQueues();
            _managerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues);
            _manager = new ProjectionManager(
                GetInputQueue(),
                GetInputQueue(),
                queues,
                _timeProvider,
                ProjectionType.All,
                _initializeSystemProjections);

            IPublisher inputQueue = GetInputQueue();
            IPublisher publisher = GetInputQueue();
            var ioDispatcher = new IODispatcher(publisher, new PublishEnvelope(inputQueue));
            _bus.Subscribe<ProjectionManagementMessage.Internal.CleanupExpired>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Internal.Deleted>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.Started>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.Stopped>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.Prepared>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.Faulted>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.StateReport>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.ResultReport>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.StatisticsReport>(_manager);
            _bus.Subscribe<CoreProjectionManagementMessage.SlaveProjectionReaderAssigned>(_manager);
            _bus.Subscribe<CoreProjectionStatusMessage.ProjectionWorkerStarted>(_manager);
            
            _bus.Subscribe<ProjectionManagementMessage.Command.Post>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.UpdateQuery>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.GetQuery>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Delete>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.GetStatistics>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.GetState>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.GetResult>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Disable>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Enable>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Abort>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.SetRunAs>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.Reset>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.Command.StartSlaveProjections>(_manager);
            _bus.Subscribe<ClientMessage.WriteEventsCompleted>(_manager);
            _bus.Subscribe<ClientMessage.ReadStreamEventsBackwardCompleted>(_manager);
            _bus.Subscribe<ClientMessage.WriteEventsCompleted>(_manager);
            _bus.Subscribe<SystemMessage.StateChangeMessage>(_manager);
            _bus.Subscribe<ProjectionManagementMessage.ReaderReady>(_manager);
            _bus.Subscribe(
                CallbackSubscriber.Create<ProjectionManagementMessage.Starting>(
                    starting => _queue.Publish(new ProjectionManagementMessage.ReaderReady())));
            _bus.Subscribe<PartitionProcessingResultBase>(_managerMessageDispatcher);
            _bus.Subscribe<CoreProjectionManagementControlMessage>(_managerMessageDispatcher);
            _bus.Subscribe<PartitionProcessingResultOutputBase>(_managerMessageDispatcher);

            _bus.Subscribe<ClientMessage.ReadStreamEventsForwardCompleted>(ioDispatcher.ForwardReader);
            _bus.Subscribe<ClientMessage.ReadStreamEventsBackwardCompleted>(ioDispatcher.BackwardReader);
            _bus.Subscribe<ClientMessage.WriteEventsCompleted>(ioDispatcher.Writer);
            _bus.Subscribe<ClientMessage.DeleteStreamCompleted>(ioDispatcher.StreamDeleter);
            _bus.Subscribe<IODispatcherDelayedMessage>(ioDispatcher.Awaker);
            _bus.Subscribe<IODispatcherDelayedMessage>(ioDispatcher);

            AwakeService = new AwakeService();
            _bus.Subscribe<StorageMessage.EventCommitted>(AwakeService);
            _bus.Subscribe<StorageMessage.TfEofAtNonCommitRecord>(AwakeService);
            _bus.Subscribe<AwakeServiceMessage.SubscribeAwake>(AwakeService);
            _bus.Subscribe<AwakeServiceMessage.UnsubscribeAwake>(AwakeService);


            Given();
            WhenLoop();
        }
        public void Setup()
        {
            //TODO: this became an integration test - proper ProjectionCoreService and ProjectionManager testing is required as well
            _bus.Subscribe(_consumer);

            _processingQueues = GivenProcessingQueues();
            var queues = _processingQueues.ToDictionary(v => v.Item5, v => (IPublisher)v.Item1);

            _managerMessageDispatcher = new ProjectionManagerMessageDispatcher(queues);
            _manager = new ProjectionManager(
                GetInputQueue(),
                GetInputQueue(),
                queues,
                _timeProvider,
                ProjectionType.All,
                _initializeSystemProjections);

            _coordinator = new ProjectionCoreCoordinator(
                ProjectionType.All,
                ProjectionCoreWorkersNode.CreateTimeoutSchedulers(queues.Count),
                queues.Values.ToArray(),
                _bus,
                Envelope);

            _bus.Subscribe <ProjectionManagementMessage.Internal.CleanupExpired>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Internal.Deleted>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Started>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Stopped>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Prepared>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.Faulted>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.StateReport>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.ResultReport>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.StatisticsReport>(_manager);
            _bus.Subscribe <CoreProjectionManagementMessage.SlaveProjectionReaderAssigned>(_manager);
            _bus.Subscribe <CoreProjectionStatusMessage.ProjectionWorkerStarted>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Post>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.UpdateQuery>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetQuery>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Delete>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetStatistics>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetState>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.GetResult>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Disable>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Enable>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Abort>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.SetRunAs>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.Reset>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.Command.StartSlaveProjections>(_manager);
            _bus.Subscribe <ClientMessage.WriteEventsCompleted>(_manager);
            _bus.Subscribe <ClientMessage.ReadStreamEventsBackwardCompleted>(_manager);
            _bus.Subscribe <SystemMessage.StateChangeMessage>(_manager);
            _bus.Subscribe <SystemMessage.SystemCoreReady>(_manager);
            _bus.Subscribe <ProjectionManagementMessage.ReaderReady>(_manager);
            _bus.Subscribe(
                CallbackSubscriber.Create <ProjectionManagementMessage.Starting>(
                    starting => _queue.Publish(new ProjectionManagementMessage.ReaderReady())));

            _bus.Subscribe <SystemMessage.StateChangeMessage>(_coordinator);
            _bus.Subscribe <SystemMessage.SystemCoreReady>(_coordinator);

            if (GetInputQueue() != _processingQueues.First().Item2)
            {
                _bus.Subscribe <PartitionProcessingResultBase>(_managerMessageDispatcher);
                _bus.Subscribe <CoreProjectionManagementControlMessage>(
                    _managerMessageDispatcher);
                _bus.Subscribe <PartitionProcessingResultOutputBase>(_managerMessageDispatcher);
                _bus.Subscribe <ReaderSubscriptionManagement.SpoolStreamReading>(_managerMessageDispatcher);
            }

            foreach (var q in _processingQueues)
            {
                SetUpCoreServices(q.Item5, q.Item1, q.Item2, q.Item3, q.Item4);
            }

            //Given();
            WhenLoop();
        }