Пример #1
0
 public void SetUp()
 {
     breaker    = new FakeBreaker();
     dispatcher = new RecordingFakeDispatcher();
     timeouts   = new InMemoryTimeoutPersister(() => currentTime);
     poller     = new ExpiredTimeoutsPoller(timeouts, dispatcher, "test", breaker, () => currentTime);
 }
 public async Task When_empty_NextTimeToRunQuery_is_1_minute()
 {
     var now = DateTime.UtcNow;
     var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
     var result = await persister.GetNextChunk(now);
     Assert.That(result.NextTimeToQuery, Is.EqualTo(now.AddMinutes(1)).Within(100).Milliseconds);
 }
 public void SetUp()
 {
     breaker = new FakeBreaker();
     dispatcher = new RecordingFakeDispatcher();
     timeouts = new InMemoryTimeoutPersister(() => currentTime);
     poller = new ExpiredTimeoutsPoller(timeouts, dispatcher, "test", breaker, () => currentTime);
 }
 void Add(InMemoryTimeoutPersister inMemoryTimeoutPersister)
 {
     inMemoryTimeoutPersister.Add(new TimeoutData
     {
         Time = DateTime.Now,
         Id   = Thread.CurrentThread.Name
     });
 }
 void GetNextChunk(InMemoryTimeoutPersister inMemoryTimeoutPersister)
 {
     for (var i = 0; i < 10; i++)
     {
         DateTime nextTimeToRunQuery;
         inMemoryTimeoutPersister.GetNextChunk(DateTime.MinValue, out nextTimeToRunQuery).ToList();
     }
 }
        public async Task When_empty_NextTimeToRunQuery_is_1_minute()
        {
            var now       = DateTime.UtcNow;
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var result    = await persister.GetNextChunk(now);

            Assert.That(result.NextTimeToQuery, Is.EqualTo(now.AddMinutes(1)).Within(100).Milliseconds);
        }
        public async Task Peek_when_timeout_exists_should_return_timeout()
        {
            var persister    = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var inputTimeout = new TimeoutData();
            await persister.Add(inputTimeout, new ContextBag());

            var result = await persister.Peek(inputTimeout.Id, new ContextBag());

            Assert.AreSame(inputTimeout, result);
        }
        public async Task TryRemove_when_non_existing_is_removed_should_return_false()
        {
            var persister    = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var inputTimeout = new TimeoutData();
            await persister.Add(inputTimeout, new ContextBag());

            var result = await persister.TryRemove(Guid.NewGuid().ToString(), new ContextBag());

            Assert.False(result);
        }
        public async Task TryRemove_when_existing_is_removed_should_return_true()
        {
            var persister    = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var inputTimeout = new TimeoutData();
            await persister.Add(inputTimeout, new ContextBag());

            var result = await persister.TryRemove(inputTimeout.Id, new ContextBag());

            Assert.IsTrue(result);
        }
        public async Task Peek_when_timeout_does_not_exist_should_return_null()
        {
            var persister    = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var inputTimeout = new TimeoutData();
            await persister.Add(inputTimeout, new ContextBag());

            var result = await persister.Peek(Guid.NewGuid().ToString(), new ContextBag());

            Assert.IsNull(result);
        }
Пример #11
0
        public async Task Invoke_when_timeout_not_in_storage_should_process_successfully()
        {
            var messageDispatcher = new FakeMessageDispatcher();
            var timeoutPersister  = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var behavior          = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);

            await behavior.Invoke(CreateContext(Guid.NewGuid().ToString()));

            Assert.AreEqual(0, messageDispatcher.OutgoingTransportOperations.UnicastTransportOperations.Count());
        }
        public async Task TryRemove_when_existing_is_removed_should_return_true()
        {
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var inputTimeout = new TimeoutData();
            await persister.Add(inputTimeout, new ContextBag());

            var result = await persister.TryRemove(inputTimeout.Id, new ContextBag());

            Assert.IsTrue(result);
        }
        public async Task Invoke_when_timeout_not_in_storage_should_process_successfully()
        {
            var messageDispatcher = new FakeMessageDispatcher();
            var timeoutPersister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var behavior = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);

            await behavior.Invoke(CreateContext(Guid.NewGuid().ToString()));

            Assert.AreEqual(0, messageDispatcher.OutgoingTransportOperations.UnicastTransportOperations.Count());
        }
        public async Task TryRemove_when_non_existing_is_removed_should_return_false()
        {
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var inputTimeout = new TimeoutData();
            await persister.Add(inputTimeout, new ContextBag());

            var result = await persister.TryRemove(Guid.NewGuid().ToString(), new ContextBag());

            Assert.False(result);
        }
        public void When_existing_is_removed_existing_is_outted()
        {
            var persister    = new InMemoryTimeoutPersister();
            var inputTimeout = new TimeoutData();

            persister.Add(inputTimeout);
            TimeoutData removedTimeout;
            var         removed = persister.TryRemove(inputTimeout.Id, out removedTimeout);

            Assert.IsTrue(removed);
            Assert.AreSame(inputTimeout, removedTimeout);
        }
        public async Task Invoke_when_message_dispatched_should_remove_timeout_from_timeout_storage()
        {
            var messageDispatcher = new FakeMessageDispatcher();
            var timeoutPersister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var behavior = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);
            var timeoutData = CreateTimeout();
            await timeoutPersister.Add(timeoutData, null);

            await behavior.Invoke(CreateContext(timeoutData.Id));

            var result = await timeoutPersister.Peek(timeoutData.Id, null);
            Assert.Null(result);
        }
        public void Run()
        {
            var stopwatch = Stopwatch.StartNew();
            var inMemoryTimeoutPersister = new InMemoryTimeoutPersister();

            for (var i = 0; i < 10; i++)
            {
                var thread = new Thread(() => Runner(inMemoryTimeoutPersister));
                thread.Start();
                thread.Join();
            }
            Debug.WriteLine(stopwatch.ElapsedMilliseconds);
        }
        public async Task Invoke_when_dispatching_message_fails_should_keep_timeout_in_storage()
        {
            var messageDispatcher = new FailingMessageDispatcher();
            var timeoutPersister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var behavior = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);
            var timeoutData = CreateTimeout();
            await timeoutPersister.Add(timeoutData, null);

            Assert.That(async () => await behavior.Invoke(CreateContext(timeoutData.Id)), Throws.InstanceOf<Exception>());

            var result = await timeoutPersister.Peek(timeoutData.Id, null);
            Assert.NotNull(result);
        }
        public async Task Invoke_when_using_dtc_should_enlist_dispatch_in_transaction()
        {
            var messageDispatcher = new FakeMessageDispatcher();
            var timeoutPersister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var behavior = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);
            var timeoutData = CreateTimeout();
            await timeoutPersister.Add(timeoutData, null);

            await behavior.Invoke(CreateContext(timeoutData.Id));

            var transportOperation = messageDispatcher.OutgoingTransportOperations.UnicastTransportOperations.Single();
            Assert.AreEqual(DispatchConsistency.Default, transportOperation.RequiredDispatchConsistency);
        }
 void Runner(InMemoryTimeoutPersister inMemoryTimeoutPersister)
 {
     for (var i = 0; i < 10000; i++)
     {
         GetNextChunk(inMemoryTimeoutPersister);
         Add(inMemoryTimeoutPersister);
         GetNextChunk(inMemoryTimeoutPersister);
         TryRemove(inMemoryTimeoutPersister);
         GetNextChunk(inMemoryTimeoutPersister);
         RemoveTimeoutBy(inMemoryTimeoutPersister);
         GetNextChunk(inMemoryTimeoutPersister);
     }
 }
Пример #21
0
 async Task Runner(InMemoryTimeoutPersister inMemoryTimeoutPersister, ContextBag context)
 {
     for (var i = 0; i < 10000; i++)
     {
         await GetNextChunk(inMemoryTimeoutPersister);
         await Add(inMemoryTimeoutPersister, context);
         await GetNextChunk(inMemoryTimeoutPersister);
         await TryRemove(inMemoryTimeoutPersister, context);
         await GetNextChunk(inMemoryTimeoutPersister);
         await RemoveTimeoutBy(inMemoryTimeoutPersister, context);
         await GetNextChunk(inMemoryTimeoutPersister);
     }
 }
Пример #22
0
        public void Run()
        {
            var stopwatch = Stopwatch.StartNew();
            var inMemoryTimeoutPersister = new InMemoryTimeoutPersister();

            for (var i = 0; i < 10; i++)
            {
                var thread = new Thread(() => Runner(inMemoryTimeoutPersister, new ContextBag()).Wait());
                thread.Start();
                thread.Join();
            }

            Console.Out.WriteLine(stopwatch.ElapsedMilliseconds);
        }
Пример #23
0
        public async Task Invoke_when_using_dtc_should_enlist_dispatch_in_transaction()
        {
            var messageDispatcher = new FakeMessageDispatcher();
            var timeoutPersister  = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var behavior          = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);
            var timeoutData       = CreateTimeout();
            await timeoutPersister.Add(timeoutData, null);

            await behavior.Invoke(CreateContext(timeoutData.Id));

            var transportOperation = messageDispatcher.OutgoingTransportOperations.UnicastTransportOperations.Single();

            Assert.AreEqual(DispatchConsistency.Default, transportOperation.RequiredDispatchConsistency);
        }
Пример #24
0
        public async Task Invoke_should_pass_transport_transaction_from_message_context()
        {
            var messageDispatcher = new FakeMessageDispatcher();
            var timeoutPersister  = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var timeoutData       = CreateTimeout();
            await timeoutPersister.Add(timeoutData, null);

            var context = CreateContext(timeoutData.Id);

            var behavior = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);
            await behavior.Invoke(context);

            Assert.AreSame(context.TransportTransaction, messageDispatcher.TransportTransactionUsed, "Wrong transport transaction passed to the dispatcher");
        }
Пример #25
0
        public async Task Invoke_when_dispatching_message_fails_should_keep_timeout_in_storage()
        {
            var messageDispatcher = new FailingMessageDispatcher();
            var timeoutPersister  = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var behavior          = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);
            var timeoutData       = CreateTimeout();
            await timeoutPersister.Add(timeoutData, null);

            Assert.That(async() => await behavior.Invoke(CreateContext(timeoutData.Id)), Throws.InstanceOf <Exception>());

            var result = await timeoutPersister.Peek(timeoutData.Id, null);

            Assert.NotNull(result);
        }
Пример #26
0
        public async Task Invoke_when_message_dispatched_should_remove_timeout_from_timeout_storage()
        {
            var messageDispatcher = new FakeMessageDispatcher();
            var timeoutPersister  = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var behavior          = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);
            var timeoutData       = CreateTimeout();
            await timeoutPersister.Add(timeoutData, null);

            await behavior.Invoke(CreateContext(timeoutData.Id));

            var result = await timeoutPersister.Peek(timeoutData.Id, null);

            Assert.Null(result);
        }
        public void When_existing_is_removed_by_saga_id()
        {
            var persister    = new InMemoryTimeoutPersister();
            var newGuid      = Guid.NewGuid();
            var inputTimeout = new TimeoutData
            {
                SagaId = newGuid
            };

            persister.Add(inputTimeout);

            persister.RemoveTimeoutBy(newGuid);
            TimeoutData removedTimeout;
            var         removed = persister.TryRemove(inputTimeout.Id, out removedTimeout);

            Assert.False(removed);
        }
        public async Task When_existing_is_removed_by_saga_id()
        {
            var persister    = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var newGuid      = Guid.NewGuid();
            var inputTimeout = new TimeoutData
            {
                SagaId = newGuid
            };

            await persister.Add(inputTimeout, new ContextBag());

            await persister.RemoveTimeoutBy(newGuid, new ContextBag());

            var result = await persister.TryRemove(inputTimeout.Id, new ContextBag());

            Assert.IsFalse(result);
        }
        public async Task When_multiple_NextTimeToRunQuery_is_min_date()
        {
            var now = DateTime.UtcNow;
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            await persister.Add(new TimeoutData
                          {
                              Time = DateTime.Now.AddDays(2)
                          }, new ContextBag());
            var expectedDate = DateTime.Now.AddDays(1);
            await persister.Add(new TimeoutData
                          {
                              Time = expectedDate
                          }, new ContextBag());

            var result = await persister.GetNextChunk(now);

            Assert.AreEqual(expectedDate, result.NextTimeToQuery);
        }
        public void When_multiple_NextTimeToRunQuery_is_min_date()
        {
            DateTime nextTimeToRunQuery;
            var      now       = DateTime.UtcNow;
            var      persister = new InMemoryTimeoutPersister();

            persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(2)
            });
            var expectedDate = DateTime.Now.AddDays(1);

            persister.Add(new TimeoutData
            {
                Time = expectedDate
            });
            persister.GetNextChunk(now, out nextTimeToRunQuery);
            Assert.AreEqual(expectedDate, nextTimeToRunQuery);
        }
        public async Task When_multiple_NextTimeToRunQuery_is_min_date()
        {
            var now       = DateTime.UtcNow;
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            await persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(2)
            }, new ContextBag());

            var expectedDate = DateTime.Now.AddDays(1);
            await persister.Add(new TimeoutData
            {
                Time = expectedDate
            }, new ContextBag());

            var result = await persister.GetNextChunk(now);

            Assert.AreEqual(expectedDate, result.NextTimeToQuery);
        }
        public async Task When_multiple_future_are_returned()
        {
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            await persister.Add(new TimeoutData
                          {
                              Time = DateTime.Now.AddDays(-2)
                          }, new ContextBag());
            await persister.Add(new TimeoutData
                          {
                              Time = DateTime.Now.AddDays(-4)
                          }, new ContextBag());
            await persister.Add(new TimeoutData
                          {
                              Time = DateTime.Now.AddDays(-1)
                          }, new ContextBag());

            var result = await persister.GetNextChunk(DateTime.Now.AddDays(-3));

            Assert.AreEqual(2, result.DueTimeouts.Count());
        }
        public void When_all_in_past_NextTimeToRunQuery_is_1_minute()
        {
            DateTime nextTimeToRunQuery;
            var      now       = DateTime.UtcNow;
            var      persister = new InMemoryTimeoutPersister();

            persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-1)
            });
            persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-3)
            });
            persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-2)
            });
            persister.GetNextChunk(now, out nextTimeToRunQuery);
            Assert.That(nextTimeToRunQuery, Is.EqualTo(now.AddMinutes(1)).Within(100).Milliseconds);
        }
        public void When_multiple_future_are_returned()
        {
            DateTime nextTime;
            var      persister = new InMemoryTimeoutPersister();

            persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-2)
            });
            persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-4)
            });
            persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-1)
            });
            var nextChunk = persister.GetNextChunk(DateTime.Now.AddDays(-3), out nextTime);

            Assert.AreEqual(2, nextChunk.Count());
        }
        public async Task When_multiple_future_are_returned()
        {
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            await persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-2)
            }, new ContextBag());

            await persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-4)
            }, new ContextBag());

            await persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-1)
            }, new ContextBag());

            var result = await persister.GetNextChunk(DateTime.Now.AddDays(-3));

            Assert.AreEqual(2, result.DueTimeouts.Count());
        }
        public async Task When_all_in_past_NextTimeToRunQuery_is_1_minute()
        {
            var now       = DateTime.UtcNow;
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            await persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-1)
            }, new ContextBag());

            await persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-3)
            }, new ContextBag());

            await persister.Add(new TimeoutData
            {
                Time = DateTime.Now.AddDays(-2)
            }, new ContextBag());

            var result = await persister.GetNextChunk(now);

            Assert.That(result.NextTimeToQuery, Is.EqualTo(now.AddMinutes(1)).Within(100).Milliseconds);
        }
        public async Task Peek_when_timeout_exists_should_return_timeout()
        {
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var inputTimeout = new TimeoutData();
            await persister.Add(inputTimeout, new ContextBag());

            var result = await persister.Peek(inputTimeout.Id, new ContextBag());

            Assert.AreSame(inputTimeout, result);
        }
        public async Task Invoke_should_pass_transport_transaction_from_message_context()
        {
            var messageDispatcher = new FakeMessageDispatcher();
            var timeoutPersister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var timeoutData = CreateTimeout();
            await timeoutPersister.Add(timeoutData, null);
            var context = CreateContext(timeoutData.Id);

            var behavior = new DispatchTimeoutBehavior(messageDispatcher, timeoutPersister, TransportTransactionMode.TransactionScope);
            await behavior.Invoke(context);

            Assert.AreSame(context.TransportTransaction, messageDispatcher.TransportTransactionUsed, "Wrong transport transaction passed to the dispatcher");
        }
        public async Task Peek_when_timeout_does_not_exist_should_return_null()
        {
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var inputTimeout = new TimeoutData();
            await persister.Add(inputTimeout, new ContextBag());

            var result = await persister.Peek(Guid.NewGuid().ToString(), new ContextBag());

            Assert.IsNull(result);
        }
        public async Task When_existing_is_removed_by_saga_id()
        {
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            var newGuid = Guid.NewGuid();
            var inputTimeout = new TimeoutData
                               {
                                   SagaId = newGuid
                               };

            await persister.Add(inputTimeout, new ContextBag());
            await persister.RemoveTimeoutBy(newGuid, new ContextBag());
            var result = await persister.TryRemove(inputTimeout.Id, new ContextBag());

            Assert.IsFalse(result);
        }
        public async Task When_all_in_past_NextTimeToRunQuery_is_1_minute()
        {
            var now = DateTime.UtcNow;
            var persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
            await persister.Add(new TimeoutData
                          {
                              Time = DateTime.Now.AddDays(-1)
                          }, new ContextBag());
            await persister.Add(new TimeoutData
                          {
                              Time = DateTime.Now.AddDays(-3)
                          }, new ContextBag());
            await persister.Add(new TimeoutData
                          {
                              Time = DateTime.Now.AddDays(-2)
                          }, new ContextBag());

            var result = await persister.GetNextChunk(now);

            Assert.That(result.NextTimeToQuery, Is.EqualTo(now.AddMinutes(1)).Within(100).Milliseconds);
        }
 public void Setup()
 {
      persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
 }
        void RemoveTimeoutBy(InMemoryTimeoutPersister inMemoryTimeoutPersister)
        {
            var sagaId = sagaIdGuids.GetOrAdd(Thread.CurrentThread.ManagedThreadId, new Guid());

            inMemoryTimeoutPersister.RemoveTimeoutBy(sagaId);
        }
        void TryRemove(InMemoryTimeoutPersister inMemoryTimeoutPersister)
        {
            TimeoutData timeout;

            inMemoryTimeoutPersister.TryRemove(Thread.CurrentThread.Name, out timeout);
        }
 public void Setup()
 {
     persister = new InMemoryTimeoutPersister(() => DateTime.UtcNow);
 }