예제 #1
0
        public MessagePumpDispatchTests()
        {
            var subscriberRegistry = new SubscriberRegistry();

            subscriberRegistry.Register <MyEvent, MyEventHandler>();

            var handlerFactory = new TestHandlerFactorySync <MyEvent, MyEventHandler>(() => new MyEventHandler(_receivedMessages));

            var commandProcessor = new CommandProcessor(
                subscriberRegistry,
                handlerFactory,
                new InMemoryRequestContextFactory(),
                new PolicyRegistry());

            PipelineBuilder <MyEvent> .ClearPipelineCache();

            var channel = new FakeChannel();
            var mapper  = new MyEventMessageMapper();

            _messagePump = new MessagePumpBlocking <MyEvent>(commandProcessor, mapper)
            {
                Channel = channel, TimeoutInMilliseconds = 5000
            };

            var message = new Message(new MessageHeader(Guid.NewGuid(), "MyTopic", MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)));

            channel.Enqueue(message);
            var quitMessage = new Message(new MessageHeader(Guid.Empty, "", MessageType.MT_QUIT), new MessageBody(""));

            channel.Enqueue(quitMessage);
        }
예제 #2
0
        public CommandProcessorCallTestsNoTimeout()
        {
            _myRequest.RequestValue = "Hello World";

            var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((type) =>
            {
                if (type == typeof(MyRequestMessageMapper))
                {
                    return(new MyRequestMessageMapper());
                }
                if (type == typeof(MyResponseMessageMapper))
                {
                    return(new MyResponseMessageMapper());
                }

                throw new ConfigurationException($"No mapper found for {type.Name}");
            }));

            messageMapperRegistry.Register <MyRequest, MyRequestMessageMapper>();
            messageMapperRegistry.Register <MyResponse, MyResponseMessageMapper>();

            var subscriberRegistry = new SubscriberRegistry();

            subscriberRegistry.Register <MyResponse, MyResponseHandler>();
            var handlerFactory = new TestHandlerFactorySync <MyResponse, MyResponseHandler>(() => new MyResponseHandler());

            var retryPolicy = Policy
                              .Handle <Exception>()
                              .Retry();

            var circuitBreakerPolicy = Policy
                                       .Handle <Exception>()
                                       .CircuitBreaker(1, TimeSpan.FromMilliseconds(1));

            var replySubs = new List <Subscription>
            {
                new Subscription <MyResponse>()
            };

            _commandProcessor = new CommandProcessor(
                subscriberRegistry,
                handlerFactory,
                new InMemoryRequestContextFactory(),
                new PolicyRegistry
            {
                { CommandProcessor.RETRYPOLICY, retryPolicy },
                { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy }
            },
                messageMapperRegistry,
                new InMemoryOutbox(),
                new ProducerRegistry(new Dictionary <string, IAmAMessageProducer>()
            {
                { "MyRequest", new FakeMessageProducerWithPublishConfirmation() },
            }),
                replySubs,
                responseChannelFactory: new InMemoryChannelFactory());

            PipelineBuilder <MyRequest> .ClearPipelineCache();
        }
예제 #3
0
        public CommandProcessorNoMatchingSubcribersTests()
        {
            var registry       = new SubscriberRegistry();
            var handlerFactory = new TestHandlerFactorySync <MyEvent, MyEventHandler>(() => new MyEventHandler(_receivedMessages));

            _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry());
            PipelineBuilder <MyEvent> .ClearPipelineCache();
        }
예제 #4
0
        public PipelineBuildForCommandTests()
        {
            var registry = new SubscriberRegistry();

            registry.Register <MyCommand, MyCommandHandler>();
            var handlerFactory = new TestHandlerFactorySync <MyCommand, MyCommandHandler>(() => new MyCommandHandler());

            _pipelineBuilder = new PipelineBuilder <MyCommand>(registry, handlerFactory);
            PipelineBuilder <MyCommand> .ClearPipelineCache();
        }
        public CommandProcessorSendTests()
        {
            var registry = new SubscriberRegistry();

            registry.Register <MyCommand, MyCommandHandler>();
            _myCommandHandler = new MyCommandHandler();
            var handlerFactory = new TestHandlerFactorySync <MyCommand, MyCommandHandler>(() => _myCommandHandler);

            _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry());
            PipelineBuilder <MyCommand> .ClearPipelineCache();
        }
        public PipelineWithHandlerDependenciesTests()
        {
            var registry = new SubscriberRegistry();

            registry.Register <MyCommand, MyDependentCommandHandler>();
            var handlerFactory =
                new TestHandlerFactorySync <MyCommand, MyDependentCommandHandler>(
                    () => new MyDependentCommandHandler(new FakeRepository <MyAggregate>(new FakeSession())));

            _pipelineBuilder = new PipelineBuilder <MyCommand>(registry, handlerFactory);
            PipelineBuilder <MyCommand> .ClearPipelineCache();
        }
예제 #7
0
        public ContextBagVisibilityTests()
        {
            var registry = new SubscriberRegistry();

            registry.Register <MyCommand, MyContextAwareCommandHandler>();
            var handlerFactory = new TestHandlerFactorySync <MyCommand, MyContextAwareCommandHandler>(() => new MyContextAwareCommandHandler());

            _request_context = new RequestContext();
            _myCommand       = new MyCommand();
            MyContextAwareCommandHandler.TestString = null;

            var requestContextFactory = A.Fake <IAmARequestContextFactory>();

            A.CallTo(() => requestContextFactory.Create()).Returns(_request_context);

            _commandProcessor = new CommandProcessor(registry, handlerFactory, requestContextFactory, new PolicyRegistry());
            PipelineBuilder <MyCommand> .ClearPipelineCache();

            _request_context.Bag["TestString"] = I_AM_A_TEST_OF_THE_CONTEXT_BAG;
        }
        public CommandProcessorCallTests()
        {
            _myRequest.RequestValue = "Hello World";

            _fakeMessageProducerWithPublishConfirmation = new FakeMessageProducerWithPublishConfirmation();

            const string topic  = "MyRequest";
            var          header = new MessageHeader(
                messageId: _myRequest.Id,
                topic: topic,
                messageType: MessageType.MT_COMMAND,
                correlationId: _myRequest.ReplyAddress.CorrelationId,
                replyTo: _myRequest.ReplyAddress.Topic);

            var body = new MessageBody(JsonSerializer.Serialize(new MyRequestDTO(_myRequest.Id.ToString(), _myRequest.RequestValue), JsonSerialisationOptions.Options));

            _message = new Message(header, body);

            var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((type) =>
            {
                if (type == typeof(MyRequestMessageMapper))
                {
                    return(new MyRequestMessageMapper());
                }
                if (type == typeof(MyResponseMessageMapper))
                {
                    return(new MyResponseMessageMapper());
                }

                throw new ConfigurationException($"No mapper found for {type.Name}");
            }));

            messageMapperRegistry.Register <MyRequest, MyRequestMessageMapper>();
            messageMapperRegistry.Register <MyResponse, MyResponseMessageMapper>();

            var subscriberRegistry = new SubscriberRegistry();

            subscriberRegistry.Register <MyResponse, MyResponseHandler>();
            var handlerFactory = new TestHandlerFactorySync <MyResponse, MyResponseHandler>(() => new MyResponseHandler());

            var retryPolicy = Policy
                              .Handle <Exception>()
                              .Retry();

            var circuitBreakerPolicy = Policy
                                       .Handle <Exception>()
                                       .CircuitBreaker(1, TimeSpan.FromMilliseconds(1));

            InMemoryChannelFactory inMemoryChannelFactory = new InMemoryChannelFactory();

            //we need to seed the response as the fake producer does not actually send across the wire
            inMemoryChannelFactory.SeedChannel(new[] { _message });

            var replySubs = new List <Subscription>
            {
                new Subscription <MyResponse>()
            };

            _commandProcessor = new CommandProcessor(
                subscriberRegistry,
                handlerFactory,
                new InMemoryRequestContextFactory(),
                new PolicyRegistry {
                { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy }
            },
                messageMapperRegistry,
                new InMemoryOutbox(),
                new ProducerRegistry(new Dictionary <string, IAmAMessageProducer>()
            {
                { topic, _fakeMessageProducerWithPublishConfirmation },
            }),
                replySubs,
                responseChannelFactory: inMemoryChannelFactory);

            PipelineBuilder <MyRequest> .ClearPipelineCache();
        }