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); }
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); } }
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); } }
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); }
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); }
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 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_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); }