Exemplo n.º 1
0
        public async Task Saga_audit_trail_should_contain_the_state_change()
        {
            SagaHistory sagaHistory = null;

            var context = await Define <MyContext>()
                          .WithEndpoint <SagaEndpoint>(b => b.When((bus, c) => bus.SendLocal(new StartSagaMessage {
                Id = "Id"
            })))
                          .Done(async c =>
            {
                var result  = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}", sh => sh.Changes.Any(change => change.Status == SagaStateChangeStatus.Updated));
                sagaHistory = result;
                return(c.ReceivedTimeoutMessage && result);
            })
                          .Run();

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(MySaga).FullName, sagaHistory.SagaType);

            var updateChange = sagaHistory.Changes.Single(x => x.Status == SagaStateChangeStatus.Updated);

            Assert.AreEqual(typeof(TimeoutMessage).FullName, updateChange.InitiatingMessage.MessageType);
        }
Exemplo n.º 2
0
        public async Task Saga_audit_trail_should_contain_the_state_change()
        {
            var         context     = new MyContext();
            SagaHistory sagaHistory = null;

            await Define(context)
            .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.Given((bus, c) => bus.SendLocal(new StartSagaMessage())))
            .Done(async c =>
            {
                var result  = await TryGet <SagaHistory>($"/api/sagas/{c.SagaId}");
                sagaHistory = result;
                return(c.InitiatingMessageReceived && result);
            })
            .Run();

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(MySaga).FullName, sagaHistory.SagaType);

            var change = sagaHistory.Changes.Single();

            Assert.AreEqual(SagaStateChangeStatus.New, change.Status);
            Assert.AreEqual(typeof(StartSagaMessage).FullName, change.InitiatingMessage.MessageType);
        }
        public async Task Saga_history_can_be_fetched_from_main_instance()
        {
            SagaHistory sagaHistory = null;

            var context = await Define <MyContext>()
                          .WithEndpoint <SagaEndpoint>(b => b.When((bus, c) => bus.SendLocal(new MessageInitiatingSaga {
                Id = "Id"
            })))
                          .Done(async c =>
            {
                if (!c.SagaId.HasValue)
                {
                    return(false);
                }

                var result  = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}", instanceName: ServiceControlAuditInstanceName);
                sagaHistory = result;
                return(result);
            })
                          .Run();

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(SagaEndpoint.MySaga).FullName, sagaHistory.SagaType);

            var sagaStateChange = sagaHistory.Changes.First();

            Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent);
        }
Exemplo n.º 4
0
        public void All_outgoing_message_intents_should_be_captured()
        {
            var         context     = new MyContext();
            SagaHistory sagaHistory = null;

            Define(context)
            .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.Given((bus, c) => bus.SendLocal(new MessageInitiatingSaga())))
            .Done(c => c.Done && TryGet("/api/sagas/" + c.SagaId, out sagaHistory))
            .Run(TimeSpan.FromSeconds(40));

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(EndpointThatIsHostingTheSaga.MySaga).FullName, sagaHistory.SagaType);

            var sagaStateChange = sagaHistory.Changes.First();

            Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent);

            var outgoingIntents = new Dictionary <string, string>();

            foreach (var message in sagaStateChange.OutgoingMessages)
            {
                outgoingIntents[message.MessageType] = message.Intent;
            }

            Assert.AreEqual("Send", outgoingIntents[typeof(MessageReplyBySaga).FullName]);
            Assert.AreEqual("Send", outgoingIntents[typeof(MessageReplyToOriginatorBySaga).FullName]);
            Assert.AreEqual("Send", outgoingIntents[typeof(MessageSentBySaga).FullName]);
            Assert.AreEqual("Publish", outgoingIntents[typeof(MessagePublishedBySaga).FullName]);
        }
Exemplo n.º 5
0
        public async Task Should_capture_all_outgoing_message_intents()
        {
            SagaHistory sagaHistory = null;

            var context = await Define <MyContext>()
                          .WithEndpoint <SagaEndpoint>(b => b.When(async(bus, c) =>
            {
                await bus.SendLocal(new MessageInitiatingSaga {
                    Id = "Id"
                });
            }))
                          .Done(async c =>
            {
                if (!c.SagaId.HasValue)
                {
                    return(false);
                }

                var result  = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}");
                sagaHistory = result;
                return(result);
            })
                          .Run();

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(SagaEndpoint.MySaga).FullName, sagaHistory.SagaType);

            var sagaStateChange = sagaHistory.Changes.First();

            Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent);

            var outgoingIntents = new Dictionary <string, string>();

            foreach (var message in sagaStateChange.OutgoingMessages)
            {
                Trace.WriteLine($"{message.MessageType} - {message.Intent}");
                outgoingIntents[message.MessageType] = message.Intent;
            }

            Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyBySaga).FullName], "MessageReplyBySaga was not present");
            Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyToOriginatorBySaga).FullName], "MessageReplyToOriginatorBySaga was not present");
            Assert.AreEqual("Send", outgoingIntents[typeof(MessageSentBySaga).FullName], "MessageSentBySaga was not present");
            Assert.AreEqual("Publish", outgoingIntents[typeof(MessagePublishedBySaga).FullName], "MessagePublishedBySaga was not present");
        }
        public void Saga_audit_trail_should_contain_the_state_change()
        {
            var         context     = new MyContext();
            SagaHistory sagaHistory = null;

            Define(context)
            .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.Given((bus, c) => bus.SendLocal(new StartSagaMessage())))
            .Done(c => c.InitiatingMessageReceived && TryGet("/api/sagas/" + c.SagaId, out sagaHistory))
            .Run();

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(MySaga).FullName, sagaHistory.SagaType);

            var change = sagaHistory.Changes.Single();

            Assert.AreEqual(SagaStateChangeStatus.New, change.Status);
            Assert.AreEqual(typeof(StartSagaMessage).FullName, change.InitiatingMessage.MessageType);
        }
Exemplo n.º 7
0
        public void Saga_audit_trail_should_contain_the_state_change()
        {
            var         context     = new MyContext();
            SagaHistory sagaHistory = null;

            Scenario.Define(context)
            .WithEndpoint <ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
            .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.Given((bus, c) => bus.SendLocal(new StartSagaMessage())))
            .Done(c => c.ReceivedTimeoutMessage &&
                  TryGet("/api/sagas/" + c.SagaId, out sagaHistory,
                         sh => sh.Changes.Any(change => change.Status == SagaStateChangeStatus.Updated)))
            .Run();

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(MySaga).FullName, sagaHistory.SagaType);

            var updateChange = sagaHistory.Changes.Single(x => x.Status == SagaStateChangeStatus.Updated);

            Assert.AreEqual(typeof(TimeoutMessage).FullName, updateChange.InitiatingMessage.MessageType);
        }
Exemplo n.º 8
0
        public async Task Saga_history_can_be_fetched_on_master()
        {
            SetInstanceSettings = ConfigureRemoteInstanceForMasterAsWellAsAuditAndErrorQueues;

            SagaHistory sagaHistory = null;

            var context = await Define <MyContext>(Remote1, Master)
                          .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.When((bus, c) => bus.SendLocal(new MessageInitiatingSaga {
                Id = "Id"
            })))
                          .Done(async c =>
            {
                var result  = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}", instanceName: Master);
                sagaHistory = result;
                return(c.Done && result);
            })
                          .Run();

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(EndpointThatIsHostingTheSaga.MySaga).FullName, sagaHistory.SagaType);

            var sagaStateChange = sagaHistory.Changes.First();

            Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent);

            var outgoingIntents = new Dictionary <string, string>();

            foreach (var message in sagaStateChange.OutgoingMessages)
            {
                outgoingIntents[message.MessageType] = message.Intent;
            }

            Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyBySaga).FullName]);
            Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyToOriginatorBySaga).FullName]);
            Assert.AreEqual("Send", outgoingIntents[typeof(MessageSentBySaga).FullName]);
            Assert.AreEqual("Publish", outgoingIntents[typeof(MessagePublishedBySaga).FullName]);
        }
        public async Task All_outgoing_message_intents_should_be_captured()
        {
            SagaHistory sagaHistory = null;

            var context = await Define <MyContext>()
                          .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.When((bus, c) => bus.SendLocal(new MessageInitiatingSaga {
                Id = "Id"
            })))
                          .Done(async c =>
            {
                var result  = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}");
                sagaHistory = result;
                return(c.Done && result);
            })
                          .Run();

            Assert.NotNull(sagaHistory);

            Assert.AreEqual(context.SagaId, sagaHistory.SagaId);
            Assert.AreEqual(typeof(EndpointThatIsHostingTheSaga.MySaga).FullName, sagaHistory.SagaType);

            var sagaStateChange = sagaHistory.Changes.First();

            Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent);

            var outgoingIntents = new Dictionary <string, string>();

            foreach (var message in sagaStateChange.OutgoingMessages)
            {
                outgoingIntents[message.MessageType] = message.Intent;
            }

            Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyBySaga).FullName]);
            Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyToOriginatorBySaga).FullName]);
            Assert.AreEqual("Send", outgoingIntents[typeof(MessageSentBySaga).FullName]);
            Assert.AreEqual("Publish", outgoingIntents[typeof(MessagePublishedBySaga).FullName]);
        }
 public SagaExecutionState()
 {
     History     = new SagaHistory();
     ExecutionID = ExecutionID.Empty();
 }
Exemplo n.º 11
0
 public SagaExecutionState()
 {
     History      = new SagaHistory();
     ExecutionID  = ExecutionID.Empty();
     CanBeResumed = true;
 }