public void GivenAMongoDbSagaRepository_WhenSendingAndInstanceNotReturnedFromPolicy()
        {
            _correlationId     = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            _context = new Mock <ConsumeContext <InitiateSimpleSaga> >();
            _context.Setup(x => x.CorrelationId).Returns(_correlationId);
            _context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _nullSimpleSaga = null;

            _policy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false);

            _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >();

            _simpleSaga = new SimpleSaga {
                CorrelationId = _correlationId
            };

            _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> >();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock <IMongoDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(
                m => m.Create(It.IsAny <IMongoCollection <SimpleSaga> >(), _context.Object, It.Is <SimpleSaga>(x => x.CorrelationId == _correlationId), true))
            .Returns(_sagaConsumeContext.Object);

            TaskUtil.Await(() => SagaRepository.InsertSaga(_simpleSaga));

            var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object);

            TaskUtil.Await(() => repository.Send(_context.Object, _policy.Object, _nextPipe.Object));
        }
Ejemplo n.º 2
0
        public async Task GivenAMongoDbSagaRepository_WhenSendingQuery()
        {
            _correlationId = Guid.NewGuid();
            var saga = new SimpleSaga {
                CorrelationId = _correlationId
            };

            await SagaRepository.InsertSaga(saga);

            _sagaQueryConsumeContext = new Mock <SagaQueryConsumeContext <SimpleSaga, InitiateSimpleSaga> >();
            _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == _correlationId);
            _sagaPolicy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >();
            _nextPipe   = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >();

            _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> >();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock <IMongoDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(
                m =>
                m.Create(It.IsAny <IMongoCollection <SimpleSaga> >(), _sagaQueryConsumeContext.Object,
                         It.Is <SimpleSaga>(x => x.CorrelationId == _correlationId), true)).Returns(_sagaConsumeContext.Object);

            var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object);

            await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object);
        }
Ejemplo n.º 3
0
        public async Task GivenAMongoDbSagaRepository_WhenSendingAndPolicyReturnsInstance()
        {
            _correlationId     = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            _context = new Mock <ConsumeContext <InitiateSimpleSaga> >();
            _context.Setup(x => x.CorrelationId).Returns(_correlationId);
            _context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _simpleSaga = new SimpleSaga {
                CorrelationId = _correlationId
            };

            _policy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _simpleSaga)).Returns(true);

            _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >();

            _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> >();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock <IMongoDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(m => m.Create(It.IsAny <IMongoCollection <SimpleSaga> >(), _context.Object, _simpleSaga, true)).Returns(
                _sagaConsumeContext.Object);


            var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object);

            await repository.Send(_context.Object, _policy.Object, _nextPipe.Object);
        }
        public void GivenAMongoDbSagaRespository_WhenSendingCompletedInstance()
        {
            _correlationId = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            var context = new Mock<ConsumeContext<CompleteSimpleSaga>>();
            context.Setup(x => x.CorrelationId).Returns(_correlationId);
            context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _simpleSaga = new SimpleSaga
            {
                CorrelationId = _correlationId,
                Version = 5
            };
            TaskUtil.Await(() => _simpleSaga.Consume(It.IsAny<ConsumeContext<CompleteSimpleSaga>>()));
            TaskUtil.Await(() => SagaRepository.InsertSaga(_simpleSaga));

            var sagaConsumeContext = new Mock<SagaConsumeContext<SimpleSaga, CompleteSimpleSaga>>();
            sagaConsumeContext.SetupGet(x => x.IsCompleted).Returns(true);
            var mongoDbSagaConsumeContextFactory = new Mock<IMongoDbSagaConsumeContextFactory>();
            mongoDbSagaConsumeContextFactory.Setup(x => x.Create(It.IsAny<IMongoCollection<SimpleSaga>>(), context.Object, It.IsAny<SimpleSaga>(), true)).Returns(sagaConsumeContext.Object);
            var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, mongoDbSagaConsumeContextFactory.Object);

            TaskUtil.Await(() => repository.Send(context.Object, Mock.Of<ISagaPolicy<SimpleSaga, CompleteSimpleSaga>>(), null));
        }
Ejemplo n.º 5
0
        public async Task StartAsync()
        {
            var repository = new MongoDbSagaRepository <GameSaga>(mongoDbConfig.Endpoint, mongoDbConfig.Database, Collections.GameSagas);

            busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                var rabbitMqHost = cfg.Host(new Uri(rabbitMqConfig.Endpoint), host =>
                {
                    host.Username(rabbitMqConfig.Username);
                    host.Password(rabbitMqConfig.Password);
                });

                cfg.ReceiveEndpoint(rabbitMqHost, rabbitMqConfig.GetQueueName(Queues.GameSaga), e =>
                {
                    // Specify the maximum number of concurrent messages that are consumed
                    e.PrefetchCount = (ushort)Environment.ProcessorCount;
                    // Defer publish of messages until saga is persisted
                    // Required for PrefetchCount > 1
                    // https://stackoverflow.com/questions/38716143/masstransit-saga-running-with-prefetch-1
                    e.UseInMemoryOutbox();
                    e.StateMachineSaga(stateMachine, repository);
                });

                // In-memory quartz do not provide persistence
                // For production use separate quartz service or rabbitmq scheduling plugin
                cfg.UseInMemoryScheduler();
            });

            logger.LogInformation("Starting MT bus");
            await busControl.StartAsync();

            logger.LogInformation("Started MT bus");
        }
        public void GivenAMongoDbSagaRespository_WhenSendingCompletedInstance()
        {
            _correlationId     = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            var context = new Mock <ConsumeContext <CompleteSimpleSaga> >();

            context.Setup(x => x.CorrelationId).Returns(_correlationId);
            context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _simpleSaga = new SimpleSaga
            {
                CorrelationId = _correlationId,
                Version       = 5
            };
            TaskUtil.Await(() => _simpleSaga.Consume(It.IsAny <ConsumeContext <CompleteSimpleSaga> >()));
            TaskUtil.Await(() => SagaRepository.InsertSaga(_simpleSaga));

            var sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, CompleteSimpleSaga> >();

            sagaConsumeContext.SetupGet(x => x.IsCompleted).Returns(true);
            var mongoDbSagaConsumeContextFactory = new Mock <IMongoDbSagaConsumeContextFactory>();

            mongoDbSagaConsumeContextFactory.Setup(x => x.Create(It.IsAny <IMongoCollection <SimpleSaga> >(), context.Object, It.IsAny <SimpleSaga>(), true)).Returns(sagaConsumeContext.Object);
            var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, mongoDbSagaConsumeContextFactory.Object);

            TaskUtil.Await(() => repository.Send(context.Object, Mock.Of <ISagaPolicy <SimpleSaga, CompleteSimpleSaga> >(), null));
        }
        public async Task GivenAMongoDbSagaRepository_WhenSendingQuery()
        {
            _correlationId = Guid.NewGuid();
            var saga = new SimpleSaga {CorrelationId = _correlationId};

            await SagaRepository.InsertSaga(saga);

            _sagaQueryConsumeContext = new Mock<SagaQueryConsumeContext<SimpleSaga, InitiateSimpleSaga>>();
            _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == _correlationId);
            _sagaPolicy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>();
            _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>();

            _sagaConsumeContext = new Mock<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock<IMongoDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(
                m =>
                    m.Create(It.IsAny<IMongoCollection<SimpleSaga>>(), _sagaQueryConsumeContext.Object,
                        It.Is<SimpleSaga>(x => x.CorrelationId == _correlationId), true)).Returns(_sagaConsumeContext.Object);

            var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object);

            await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object);
        }
        public async Task GivenAMongoDbSagaRepository_WhenSendingQueryAndSagaNotFound()
        {
            _sagaQueryConsumeContext = new Mock<SagaQueryConsumeContext<SimpleSaga, InitiateSimpleSaga>>();
            _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == Guid.NewGuid());
            _sagaPolicy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>();
            _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>();

            var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, null);

            await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object);
        }
        public async Task GivenAMongoDbSagaRepository_WhenSendingQueryAndSagaNotFound()
        {
            _sagaQueryConsumeContext = new Mock <SagaQueryConsumeContext <SimpleSaga, InitiateSimpleSaga> >();
            _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == Guid.NewGuid());
            _sagaPolicy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >();
            _nextPipe   = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >();

            var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, null);

            await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object);
        }
        public void GivenAMongoDbSagaRepository_WhenProbing()
        {
            _scope = new Mock<ProbeContext>();

            _probeContext = new Mock<ProbeContext>();
            _probeContext.Setup(m => m.CreateScope("sagaRepository")).Returns(_scope.Object);

            var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, null);

            repository.Probe(_probeContext.Object);
        }
Ejemplo n.º 11
0
        public void GivenAMongoDbSagaRepository_WhenProbing()
        {
            _scope = new Mock <ProbeContext>();

            _probeContext = new Mock <ProbeContext>();
            _probeContext.Setup(m => m.CreateScope("sagaRepository")).Returns(_scope.Object);

            var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, null);

            repository.Probe(_probeContext.Object);
        }
Ejemplo n.º 12
0
        static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                         .WriteTo.Console()
                         .MinimumLevel.Debug()
                         .CreateLogger();


            var address    = new Uri("rabbitmq://localhost/exemplo3");
            var repository = MongoDbSagaRepository <ReservaCOEState> .Create("mongodb://*****:*****@localhost:27017", "ReservaCOE");

            var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                cfg.UseSerilog();

                cfg.Host(address, x =>
                {
                    x.Username("guest");
                    x.Password("guest");
                });


                cfg.ReceiveEndpoint("coe-commands",
                                    e =>
                {
                    e.Handler <CancelaCoe>(c => c.Publish(new COECancelado(c.Message.Codigo)));
                    e.Handler <ConcluiReservaCoe>(c => c.Publish(new PeriodoReservaCOEConcluido(c.Message.Codigo)));
                });


                cfg.ReceiveEndpoint(ReservasQueues.StateMachine, e =>
                {
                    e.StateMachineSaga(new ReservaCOEStateMachine(), repository);
                });
            });


            bus.Start();

            while (Console.ReadKey().KeyChar != 'q')
            {
                Console.WriteLine("Press q to continue");
            }


            bus.Stop();
        }
Ejemplo n.º 13
0
        public async Task GivenAMongoDbSagaRepository_WhenSendingWithNullCorrelationId()
        {
            var context = new Mock <ConsumeContext <InitiateSimpleSaga> >();

            context.Setup(x => x.CorrelationId).Returns(default(Guid?));

            var repository = new MongoDbSagaRepository <SimpleSaga>(Mock.Of <IMongoDatabase>(), null);

            try
            {
                await repository.Send(context.Object, Mock.Of <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >(), Mock.Of <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >());
            }
            catch (SagaException exception)
            {
                _exception = exception;
            }
        }
        public async Task GivenAMongoDbSagaRepository_WhenSendingAndInstanceNotFound()
        {
            _context = new Mock<ConsumeContext<InitiateSimpleSaga>>();
            _context.Setup(x => x.CorrelationId).Returns(It.IsAny<Guid>());
            _context.Setup(m => m.CancellationToken).Returns(It.IsAny<CancellationToken>());

            _nullSimpleSaga = null;

            _policy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false);

            _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>();

            var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, null);

            await repository.Send(_context.Object, _policy.Object, _nextPipe.Object);
        }
        public virtual void SetupContext()
        {
            var camelCasePack = new ConventionPack {
                new CamelCaseElementNameConvention()
            };

            ConventionRegistry.Register("CamelCase", camelCasePack, type => true);
            _camelCaseConventionSet = true;

            var connectionString = AppConfig.MongoDB;

            _client   = new MongoClient(connectionString);
            _database = _client.GetDatabase(_databaseName);
            _repo     = new MongoDbSagaRepository(_database);

            _sagaPersister = new SagaPersister(_repo);
        }
Ejemplo n.º 16
0
        public void GivenAMongoDbSagaRepository_WhenSendingAndInstanceNotFound()
        {
            _context = new Mock <ConsumeContext <InitiateSimpleSaga> >();
            _context.Setup(x => x.CorrelationId).Returns(It.IsAny <Guid>());
            _context.Setup(m => m.CancellationToken).Returns(It.IsAny <CancellationToken>());

            _nullSimpleSaga = null;

            _policy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false);

            _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >();

            var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, null);

            TaskUtil.Await(() => repository.Send(_context.Object, _policy.Object, _nextPipe.Object));
        }
        public async Task GivenAMongoDbSagaRepository_WhenSendingWithNullCorrelationId()
        {
            var context = new Mock<ConsumeContext<InitiateSimpleSaga>>();
            context.Setup(x => x.CorrelationId).Returns(default(Guid?));

            var repository = new MongoDbSagaRepository<SimpleSaga>(Mock.Of<IMongoDatabase>(), null);

            try
            {
                await repository.Send(context.Object, Mock.Of<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>(),
                    Mock.Of<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>());
            }
            catch (SagaException exception)
            {
                _exception = exception;
            }
        }
Ejemplo n.º 18
0
        static void Main(string[] args)
        {
            var logger = new LoggerConfiguration()
                         .MinimumLevel.Verbose()
                         .WriteTo.ColoredConsole()
                         .CreateLogger();

            var repository   = new MongoDbSagaRepository <SagaInstance>("mongodb://test-host", "TST");
            var stateMachine = new TestStateMachine();

            var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                cfg.UseSerilog(logger);

                var host = cfg.Host(new Uri("rabbitmq://test-host"), h =>
                {
                    h.Username("test");
                    h.Password("test");
                });

                cfg.ReceiveEndpoint(host, "test_flow", e =>
                {
                    e.PrefetchCount = 8;
                    e.UseRetry(Retry.Interval(5, 1000));
                    e.StateMachineSaga(stateMachine, repository);
                });


                cfg.ReceiveEndpoint(host, "test_services", e =>
                {
                    e.Consumer <FastOperationConsumer>();
                });
            });

            bus.Start();

            Console.WriteLine("Press any key to stop tracker");
            Console.ReadKey();

            bus.Stop();
        }
        public void GivenAMongoDbSagaRepository_WhenSendingAndInstanceNotReturnedFromPolicy()
        {
            _correlationId = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            _context = new Mock<ConsumeContext<InitiateSimpleSaga>>();
            _context.Setup(x => x.CorrelationId).Returns(_correlationId);
            _context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _nullSimpleSaga = null;

            _policy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false);

            _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>();

            _simpleSaga = new SimpleSaga {CorrelationId = _correlationId};

            _sagaConsumeContext = new Mock<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock<IMongoDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(
                m => m.Create(It.IsAny<IMongoCollection<SimpleSaga>>(), _context.Object, It.Is<SimpleSaga>(x => x.CorrelationId == _correlationId), true))
                .Returns(_sagaConsumeContext.Object);

            TaskUtil.Await(() => SagaRepository.InsertSaga(_simpleSaga));

            var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object);

            TaskUtil.Await(() => repository.Send(_context.Object, _policy.Object, _nextPipe.Object));
        }
        public async Task GivenAMongoDbSagaRepository_WhenSendingAndPolicyReturnsInstance()
        {
            _correlationId = Guid.NewGuid();
            _cancellationToken = new CancellationToken();

            _context = new Mock<ConsumeContext<InitiateSimpleSaga>>();
            _context.Setup(x => x.CorrelationId).Returns(_correlationId);
            _context.Setup(m => m.CancellationToken).Returns(_cancellationToken);

            _simpleSaga = new SimpleSaga {CorrelationId = _correlationId};

            _policy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>();
            _policy.Setup(x => x.PreInsertInstance(_context.Object, out _simpleSaga)).Returns(true);

            _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>();

            _sagaConsumeContext = new Mock<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>();
            _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId);

            _sagaConsumeContextFactory = new Mock<IMongoDbSagaConsumeContextFactory>();
            _sagaConsumeContextFactory.Setup(m => m.Create(It.IsAny<IMongoCollection<SimpleSaga>>(), _context.Object, _simpleSaga, true)).Returns(
                _sagaConsumeContext.Object);


            var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object);

            await repository.Send(_context.Object, _policy.Object, _nextPipe.Object);
        }