public void TestFixtureSetUp() { _container = new WindsorContainer(); String connectionString = ConfigurationManager.ConnectionStrings["log"].ConnectionString; var logUrl = new MongoUrl(connectionString); var logClient = logUrl.CreateClient(false); var logDb = logClient.GetDatabase(logUrl.DatabaseName); _messages = logDb.GetCollection <TrackedMessageModel>("messages"); JarvisRebusConfiguration configuration = new JarvisRebusConfiguration(connectionString, "test") { ErrorQueue = "jarvistest-errors", InputQueue = "jarvistest-input", MaxRetry = RebusMaxRetry, NumOfWorkers = 1, EndpointsMap = new System.Collections.Generic.Dictionary <string, string>() { ["Jarvis.Framework.Tests"] = "jarvistest-input" } }; configuration.AssembliesWithMessages = new List <System.Reflection.Assembly>() { typeof(SampleMessage).Assembly, }; MongoDbMessagesTracker tracker = new MongoDbMessagesTracker(logDb); JarvisTestBusBootstrapper bb = new JarvisTestBusBootstrapper( _container, configuration, tracker); bb.Start(); var rebusConfigurer = _container.Resolve <RebusConfigurer>(); rebusConfigurer.Start(); _bus = _container.Resolve <IBus>(); var handler = new AnotherSampleCommandHandler(); var commandExecutionExceptionHelper = new JarvisDefaultCommandExecutionExceptionHelper(NullLogger.Instance, 20, 10); var handlerAdapter = new MessageHandlerToCommandHandlerAdapter <AnotherSampleTestCommand>( handler, commandExecutionExceptionHelper, tracker, _bus); _container.Register( Component .For <IHandleMessages <AnotherSampleTestCommand> >() .Instance(handlerAdapter) ); }
public async Task Verify_retry_start_execution_tracking(Boolean wrapInAggregateException) { var tracks = _messages.FindAll().ToList(); Assert.That(tracks, Has.Count.EqualTo(0), "messages collection is not empty"); var sampleMessage = new AnotherSampleTestCommand(2, "verify_retry_start_execution_tracking"); AnotherSampleCommandHandler.SetFixtureData( sampleMessage.MessageId, 2, new ConcurrencyException("TEST_1", null), true, wrapInAggregateException: wrapInAggregateException); await _bus.Send(sampleMessage).ConfigureAwait(false); //cycle until we found handled message on tracking TrackedMessageModel track; DateTime startTime = DateTime.Now; { Thread.Sleep(200); track = _messages.AsQueryable().SingleOrDefault(t => t.MessageId == sampleMessage.MessageId.ToString() && t.Completed == true); } while ( track == null && DateTime.Now.Subtract(startTime).TotalSeconds < 5 ) { ; } if (track == null) { //failure, try to recover the message id to verify what was wrong track = _messages.AsQueryable().SingleOrDefault(t => t.MessageId == sampleMessage.MessageId.ToString()); } Assert.That(track.MessageId, Is.EqualTo(sampleMessage.MessageId.ToString())); Assert.That(track.Description, Is.EqualTo(sampleMessage.Describe())); Assert.That(track.StartedAt, Is.Not.Null); Assert.That(track.CompletedAt, Is.Not.Null); Assert.That(track.DispatchedAt, Is.Null); Assert.That(track.Completed, Is.True); Assert.That(track.Success, Is.True); Assert.That(track.LastExecutionStartTime, Is.Not.Null); Assert.That(track.ExecutionCount, Is.EqualTo(3)); Assert.That(track.ExecutionStartTimeList.Length, Is.EqualTo(3)); }
public async Task Verify_exceeding_retry(Boolean wrapInAggregateException) { var sampleMessage = new AnotherSampleTestCommand(3, "verify_exceeding_retry"); AnotherSampleCommandHandler.SetFixtureData( sampleMessage.MessageId, Int32.MaxValue, new ConcurrencyException("TEST_1", null), false, wrapInAggregateException: wrapInAggregateException); await _bus.Send(sampleMessage).ConfigureAwait(false); //cycle until we found handled message on tracking TrackedMessageModel track; DateTime startTime = DateTime.Now; do { Thread.Sleep(200); track = _messages.AsQueryable().SingleOrDefault(t => t.MessageId == sampleMessage.MessageId.ToString() && t.ExecutionCount == 10 && t.Completed == true); }while ( track == null && DateTime.Now.Subtract(startTime).TotalSeconds < 4 ); if (track == null) { //failure, try to recover the message id to verify what was wrong track = _messages.AsQueryable().SingleOrDefault(t => t.MessageId == sampleMessage.MessageId.ToString()); } if (track == null) { throw new AssertionException($"Message {sampleMessage.MessageId} did not generate tracking info"); } Assert.That(track.MessageId, Is.EqualTo(sampleMessage.MessageId.ToString())); Assert.That(track.Description, Is.EqualTo(sampleMessage.Describe())); Assert.That(track.StartedAt, Is.Not.Null); Assert.That(track.CompletedAt, Is.Not.Null); Assert.That(track.Completed, Is.True); Assert.That(track.Success, Is.False); Assert.That(track.ExecutionCount, Is.EqualTo(10), "Execution retry for conflict should do for 10 times"); }
public void TestFixtureSetUp() { _container = new WindsorContainer(); String connectionString = ConfigurationManager.ConnectionStrings["log"].ConnectionString; var logUrl = new MongoUrl(connectionString); var logClient = new MongoClient(logUrl); var logDb = logClient.GetDatabase(logUrl.DatabaseName); _messages = logDb.GetCollection<TrackedMessageModel>("messages"); MongoDbMessagesTracker tracker = new MongoDbMessagesTracker(logDb); BusBootstrapper bb = new BusBootstrapper( _container, connectionString, "test", tracker); JarvisRebusConfiguration configuration = new JarvisRebusConfiguration() { ErrorQueue = "jarvistest-errors", InputQueue = "jarvistest-input", MaxRetry = 3, NumOfWorkers = 1, EndpointsMap = new System.Collections.Generic.Dictionary<string, string>() { { "Jarvis.Framework.Tests" , "jarvistest-input"} } }; bb.Configuration = configuration; bb.Start(); var startableBus = _container.Resolve<IStartableBus>(); startableBus.Start(); _bus = _container.Resolve<IBus>(); _handler = new AnotherSampleCommandHandler(); _handlerAdapter = new MessageHandlerToCommandHandlerAdapter<AnotherSampleTestCommand>( _handler, tracker, _bus); _container.Register( Component .For<IHandleMessages<AnotherSampleTestCommand>>() .Instance(_handlerAdapter) ); }
public async Task Verify_failure_tracking_flatten_aggregate_exception(Boolean wrapInAggregateException) { var sampleMessage = new AnotherSampleTestCommand(1, "verify_failure_tracking_for_domain_exception"); AnotherSampleCommandHandler.SetFixtureData( sampleMessage.MessageId, 10, new DomainException("TEST_1", "Test Exception for verify_failure_tracking_for_domain_exception test", null), true, wrapInAggregateException: wrapInAggregateException); await _bus.Send(sampleMessage).ConfigureAwait(false); //cycle until we found handled message on tracking with specified condition TrackedMessageModel track; DateTime startTime = DateTime.Now; do { Thread.Sleep(200); track = _messages.AsQueryable().SingleOrDefault(t => t.MessageId == sampleMessage.MessageId.ToString() && t.ExecutionCount == 1 && t.Completed == true && t.Success == false); }while ( track == null && DateTime.Now.Subtract(startTime).TotalSeconds < 4 ); if (track == null) { //failure, try to recover the message id to verify what was wrong track = _messages.AsQueryable().SingleOrDefault(t => t.MessageId == sampleMessage.MessageId.ToString()); } Assert.That(track.ErrorMessage, Is.EqualTo("Test Exception for verify_failure_tracking_for_domain_exception test")); Assert.That(track.FullException, Is.Not.Null); Assert.That(track.FullException.IndexOf("aggregate", StringComparison.OrdinalIgnoreCase), Is.EqualTo(-1)); }
public async Task Verify_failure_tracking_for_domain_exception(Boolean wrapInAggregateException) { //We decide to fail only one time var sampleMessage = new AnotherSampleTestCommand(1, "verify_failure_tracking_for_domain_exception"); AnotherSampleCommandHandler.SetFixtureData( sampleMessage.MessageId, 10, new DomainException("TEST_1", "Test Exception for verify_failure_tracking_for_domain_exception test", null), true, wrapInAggregateException: wrapInAggregateException); await _bus.Send(sampleMessage).ConfigureAwait(false); //cycle until we found handled message on tracking with specified condition TrackedMessageModel track; DateTime startTime = DateTime.Now; do { Thread.Sleep(200); track = _messages.AsQueryable().SingleOrDefault(t => t.MessageId == sampleMessage.MessageId.ToString() && t.ExecutionCount == 1 && t.Completed == true && t.Success == false); }while ( track == null && DateTime.Now.Subtract(startTime).TotalSeconds < 4 ); if (track == null) { //failure, try to recover the message id to verify what was wrong track = _messages.AsQueryable().SingleOrDefault(t => t.MessageId == sampleMessage.MessageId.ToString()); } //donormal assertion if (track == null) { throw new AssertionException($"Message {sampleMessage.MessageId} did not generate tracking info"); } var allTracking = _messages.FindAll().ToList(); if (allTracking.Count != 1) { Console.WriteLine($"Too many tracking elements: {allTracking.Count}"); foreach (var t in allTracking) { Console.WriteLine(t.ToBsonDocument()); } } Assert.That(track.MessageId, Is.EqualTo(sampleMessage.MessageId.ToString())); Assert.That(track.Description, Is.EqualTo(sampleMessage.Describe())); Assert.That(track.StartedAt, Is.Not.Null); Assert.That(track.CompletedAt, Is.Not.Null); Assert.That(track.DispatchedAt, Is.Null); Assert.That(track.ErrorMessage, Is.Not.Empty); Assert.That(track.Completed, Is.True); Assert.That(track.Success, Is.False); Assert.That(track.ExecutionCount, Is.EqualTo(1)); }