public void AutomaticallyReplaysEventsIfViewIsPurged(int numberOfCommands) { var allPotatoesView = new MongoDbViewManager <AllPotatoesView>(_mongoDatabase); _dispatcher.AddViewManager(allPotatoesView); Console.WriteLine("Processing {0} commands....", numberOfCommands); Enumerable.Range(0, numberOfCommands - 1) .ToList() .ForEach(i => _commandProcessor.ProcessCommand(new BitePotato("someid1", .01m))); var lastResult = _commandProcessor.ProcessCommand(new BitePotato("someid2", .01m)); Console.WriteLine("Waiting until {0} has been dispatched to the view...", lastResult.GetNewPosition()); allPotatoesView.WaitUntilProcessed(lastResult, TimeSpan.FromSeconds(2)).Wait(); var viewOnFirstLoad = allPotatoesView.Load(GlobalInstanceLocator.GetViewInstanceId()); Assert.That(viewOnFirstLoad, Is.Not.Null); Console.WriteLine("Purging the view!"); allPotatoesView.Purge(); Console.WriteLine("Waiting until {0} has been dispatched to the view...", lastResult.GetNewPosition()); allPotatoesView.WaitUntilProcessed(lastResult, TimeSpan.FromSeconds(4)).Wait(); var viewOnNextLoad = allPotatoesView.Load(GlobalInstanceLocator.GetViewInstanceId()); Assert.That(viewOnNextLoad, Is.Not.Null); Assert.That(viewOnNextLoad.LastGlobalSequenceNumber, Is.EqualTo(viewOnFirstLoad.LastGlobalSequenceNumber)); }
public void AutomaticallyReplaysEventsIfViewIsPurged(int numberOfCommands) { var allPotatoesView = new MongoDbViewManager<AllPotatoesView>(_mongoDatabase); _dispatcher.AddViewManager(allPotatoesView); Console.WriteLine("Processing {0} commands....", numberOfCommands); Enumerable.Range(0, numberOfCommands - 1) .ToList() .ForEach(i => _commandProcessor.ProcessCommand(new BitePotato("someid1", .01m))); var lastResult = _commandProcessor.ProcessCommand(new BitePotato("someid2", .01m)); Console.WriteLine("Waiting until {0} has been dispatched to the view...", lastResult.GetNewPosition()); allPotatoesView.WaitUntilProcessed(lastResult, TimeSpan.FromSeconds(2)).Wait(); var viewOnFirstLoad = allPotatoesView.Load(GlobalInstanceLocator.GetViewInstanceId()); Assert.That(viewOnFirstLoad, Is.Not.Null); Console.WriteLine("Purging the view!"); allPotatoesView.Purge(); Console.WriteLine("Waiting until {0} has been dispatched to the view...", lastResult.GetNewPosition()); allPotatoesView.WaitUntilProcessed(lastResult, TimeSpan.FromSeconds(4)).Wait(); var viewOnNextLoad = allPotatoesView.Load(GlobalInstanceLocator.GetViewInstanceId()); Assert.That(viewOnNextLoad, Is.Not.Null); Assert.That(viewOnNextLoad.LastGlobalSequenceNumber, Is.EqualTo(viewOnFirstLoad.LastGlobalSequenceNumber)); }
public void BasicDispatchOfSomeEvents() { var allPotatoesView = new MongoDbViewManager <AllPotatoesView>(_mongoDatabase); var potatoTimeToBeConsumedView = new MongoDbViewManager <PotatoTimeToBeConsumedView>(_mongoDatabase); _dispatcher.AddViewManager(allPotatoesView); _dispatcher.AddViewManager(potatoTimeToBeConsumedView); // act var firstPointInTime = new DateTime(1979, 3, 1, 12, 0, 0, DateTimeKind.Utc); TimeMachine.FixCurrentTimeTo(firstPointInTime); _commandProcessor.ProcessCommand(new BitePotato("potato1", 0.5m)); _commandProcessor.ProcessCommand(new BitePotato("potato2", 0.3m)); _commandProcessor.ProcessCommand(new BitePotato("potato2", 0.3m)); _commandProcessor.ProcessCommand(new BitePotato("potato3", 0.3m)); var nextPointInTime = new DateTime(1981, 6, 9, 12, 0, 0, DateTimeKind.Utc); TimeMachine.FixCurrentTimeTo(nextPointInTime); _commandProcessor.ProcessCommand(new BitePotato("potato1", 0.5m)); _commandProcessor.ProcessCommand(new BitePotato("potato2", 0.5m)); var lastPointInTime = new DateTime(1981, 6, 9, 12, 0, 0, DateTimeKind.Utc); _commandProcessor.ProcessCommand(new BitePotato("potato3", 0.8m)); Thread.Sleep(1000); // assert var allPotatoes = allPotatoesView.Load(GlobalInstanceLocator.GetViewInstanceId()); Assert.That(allPotatoes, Is.Not.Null); var potato1View = potatoTimeToBeConsumedView.Load(InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("potato1")); var potato2View = potatoTimeToBeConsumedView.Load(InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("potato2")); var potato3View = potatoTimeToBeConsumedView.Load(InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("potato3")); Assert.That(potato1View, Is.Not.Null); Assert.That(potato2View, Is.Not.Null); Assert.That(potato3View, Is.Not.Null); Assert.That(allPotatoes.NamesOfPotatoes.Count, Is.EqualTo(3)); Assert.That(allPotatoes.NamesOfPotatoes["potato1"], Is.EqualTo("Jeff")); Assert.That(allPotatoes.NamesOfPotatoes["potato2"], Is.EqualTo("Bunny")); Assert.That(allPotatoes.NamesOfPotatoes["potato3"], Is.EqualTo("Walter")); Assert.That(potato1View.Name, Is.EqualTo("Jeff")); Assert.That(potato1View.TimeOfCreation.ToUniversalTime(), Is.EqualTo(firstPointInTime)); Assert.That(potato1View.TimeToBeEaten, Is.EqualTo(nextPointInTime - firstPointInTime)); Assert.That(potato2View.Name, Is.EqualTo("Bunny")); Assert.That(potato2View.TimeOfCreation.ToUniversalTime(), Is.EqualTo(firstPointInTime)); Assert.That(potato2View.TimeToBeEaten, Is.EqualTo(nextPointInTime - firstPointInTime)); Assert.That(potato3View.Name, Is.EqualTo("Walter")); Assert.That(potato3View.TimeOfCreation.ToUniversalTime(), Is.EqualTo(firstPointInTime)); Assert.That(potato3View.TimeToBeEaten, Is.EqualTo(lastPointInTime - firstPointInTime)); }
public void CanBlockUntilViewIsUpdated(BlockOption blockOption) { // arrange var slowView = new MongoDbViewManager <SlowView>(_mongoDatabase); _dispatcher.AddViewManager(slowView); _commandProcessor.ProcessCommand(new BitePotato("potato1", .1m)); _commandProcessor.ProcessCommand(new BitePotato("potato1", .1m)); _commandProcessor.ProcessCommand(new BitePotato("potato1", .1m)); _commandProcessor.ProcessCommand(new BitePotato("potato1", .1m)); var result = _commandProcessor.ProcessCommand(new BitePotato("potato1", 1)); // act switch (blockOption) { case BlockOption.BlockOnViewManager: Console.WriteLine("Waiting for {0} on the view...", result.GetNewPosition()); slowView.WaitUntilProcessed(result, TimeSpan.FromSeconds(2)).Wait(); break; case BlockOption.BlockOnEventDispatcher: Console.WriteLine("Waiting for {0} on the dispatcher...", result.GetNewPosition()); _dispatcher.WaitUntilProcessed <SlowView>(result, TimeSpan.FromSeconds(2)).Wait(); break; } // assert var instance = slowView.Load(InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("potato1")); if (blockOption == BlockOption.NoBlock) { Assert.That(instance, Is.Null); Console.WriteLine("View instance was null, just as expected"); } else { Assert.That(instance, Is.Not.Null); Console.WriteLine("View instance was properly updated, just as expected"); } }
public async Task YeyItWorks() { CirqusLoggerFactory.Current = new ConsoleLoggerFactory(); var mongoDatabase = MongoHelper.InitializeTestDatabase(); var firstView = new MongoDbViewManager <HeyCounter>(mongoDatabase); var secondView = new MongoDbViewManager <WordCounter>(mongoDatabase); /* ________.......------=====^^!^^=====------.......________ */ var dependentView = new MongoDbViewManager <HeyPercentageCalculator>(mongoDatabase); /* ________.......------=====^^!^^=====------.......________ */ var waitHandle = new ViewManagerWaitHandle(); var specialWaitHandle = new ViewManagerWaitHandle(); //Brett var commandProcessor = CreateCommandProcessor(config => config .EventStore(e => e.UseInMemoryEventStore()) .EventDispatcher(e => { e.UseViewManagerEventDispatcher(firstView) .WithWaitHandle(waitHandle); e.UseViewManagerEventDispatcher(secondView) .WithWaitHandle(waitHandle); e.UseDependentViewManagerEventDispatcher(dependentView) .WithWaitHandle(specialWaitHandle) .DependentOn(firstView, secondView) .WithViewContext(new Dictionary <string, object> { { "heys", mongoDatabase.GetCollection <HeyCounter>(typeof(HeyCounter).Name).AsQueryable() }, { "words", mongoDatabase.GetCollection <WordCounter>(typeof(WordCounter).Name).AsQueryable() }, }); })); //Orig //var commandProcessor = CommandProcessor.With() // .EventStore(e => e.UseInMemoryEventStore()) // .EventDispatcher(e => // { // e.UseViewManagerEventDispatcher(firstView) // .WithWaitHandle(waitHandle); // e.UseViewManagerEventDispatcher(secondView) // .WithWaitHandle(waitHandle); // e.UseDependentViewManagerEventDispatcher(dependentView) // .WithWaitHandle(specialWaitHandle) // .DependentOn(firstView, secondView) // .WithViewContext(new Dictionary<string, object> // { // {"heys", mongoDatabase.GetCollection<HeyCounter>(typeof (HeyCounter).Name).AsQueryable()}, // {"words", mongoDatabase.GetCollection<WordCounter>(typeof (WordCounter).Name).AsQueryable()}, // }); // }) // .Create(); RegisterForDisposal(commandProcessor); //Brett CommandProcessingResult result = null; Enumerable.Range(0, 100).ToList().ForEach(i => result = commandProcessor.ProcessCommand(new DoStuff("test", "hej meddig min ven " + i))); //orig //result = Enumerable.Range(0, 100) // .Select(i => commandProcessor.ProcessCommand(new DoStuff("test", "hej meddig min ven " + i))) // .Last(); await waitHandle.WaitForAll(result, TimeSpan.FromSeconds(5)); var viewId = InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("test"); var firstViewInstance = firstView.Load(viewId); var secondViewInstance = secondView.Load(viewId); Assert.That(firstViewInstance.Count, Is.EqualTo(100)); Assert.That(secondViewInstance.Count, Is.EqualTo(500)); Console.WriteLine("Waiting for dependent views to catch up..."); await specialWaitHandle.WaitForAll(result, TimeSpan.FromSeconds(5)); Console.WriteLine("DOne!"); var heyPercentageCalculator = dependentView.Load(viewId); Assert.That(heyPercentageCalculator.HeyPercentage, Is.EqualTo(20)); }
public void CanBlockUntilViewIsUpdated(BlockOption blockOption) { // arrange var slowView = new MongoDbViewManager<SlowView>(_mongoDatabase); _dispatcher.AddViewManager(slowView); _commandProcessor.ProcessCommand(new BitePotato("potato1", .1m)); _commandProcessor.ProcessCommand(new BitePotato("potato1", .1m)); _commandProcessor.ProcessCommand(new BitePotato("potato1", .1m)); _commandProcessor.ProcessCommand(new BitePotato("potato1", .1m)); var result = _commandProcessor.ProcessCommand(new BitePotato("potato1", 1)); // act switch (blockOption) { case BlockOption.BlockOnViewManager: Console.WriteLine("Waiting for {0} on the view...", result.GetNewPosition()); slowView.WaitUntilProcessed(result, TimeSpan.FromSeconds(2)).Wait(); break; case BlockOption.BlockOnEventDispatcher: Console.WriteLine("Waiting for {0} on the dispatcher...", result.GetNewPosition()); _dispatcher.WaitUntilProcessed<SlowView>(result, TimeSpan.FromSeconds(2)).Wait(); break; } // assert var instance = slowView.Load(InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("potato1")); if (blockOption == BlockOption.NoBlock) { Assert.That(instance, Is.Null); Console.WriteLine("View instance was null, just as expected"); } else { Assert.That(instance, Is.Not.Null); Console.WriteLine("View instance was properly updated, just as expected"); } }
public void BasicDispatchOfSomeEvents() { var allPotatoesView = new MongoDbViewManager<AllPotatoesView>(_mongoDatabase); var potatoTimeToBeConsumedView = new MongoDbViewManager<PotatoTimeToBeConsumedView>(_mongoDatabase); _dispatcher.AddViewManager(allPotatoesView); _dispatcher.AddViewManager(potatoTimeToBeConsumedView); // act var firstPointInTime = new DateTime(1979, 3, 1, 12, 0, 0, DateTimeKind.Utc); TimeMachine.FixCurrentTimeTo(firstPointInTime); _commandProcessor.ProcessCommand(new BitePotato("potato1", 0.5m)); _commandProcessor.ProcessCommand(new BitePotato("potato2", 0.3m)); _commandProcessor.ProcessCommand(new BitePotato("potato2", 0.3m)); _commandProcessor.ProcessCommand(new BitePotato("potato3", 0.3m)); var nextPointInTime = new DateTime(1981, 6, 9, 12, 0, 0, DateTimeKind.Utc); TimeMachine.FixCurrentTimeTo(nextPointInTime); _commandProcessor.ProcessCommand(new BitePotato("potato1", 0.5m)); _commandProcessor.ProcessCommand(new BitePotato("potato2", 0.5m)); var lastPointInTime = new DateTime(1981, 6, 9, 12, 0, 0, DateTimeKind.Utc); _commandProcessor.ProcessCommand(new BitePotato("potato3", 0.8m)); Thread.Sleep(1000); // assert var allPotatoes = allPotatoesView.Load(GlobalInstanceLocator.GetViewInstanceId()); Assert.That(allPotatoes, Is.Not.Null); var potato1View = potatoTimeToBeConsumedView.Load(InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("potato1")); var potato2View = potatoTimeToBeConsumedView.Load(InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("potato2")); var potato3View = potatoTimeToBeConsumedView.Load(InstancePerAggregateRootLocator.GetViewIdFromAggregateRootId("potato3")); Assert.That(potato1View, Is.Not.Null); Assert.That(potato2View, Is.Not.Null); Assert.That(potato3View, Is.Not.Null); Assert.That(allPotatoes.NamesOfPotatoes.Count, Is.EqualTo(3)); Assert.That(allPotatoes.NamesOfPotatoes["potato1"], Is.EqualTo("Jeff")); Assert.That(allPotatoes.NamesOfPotatoes["potato2"], Is.EqualTo("Bunny")); Assert.That(allPotatoes.NamesOfPotatoes["potato3"], Is.EqualTo("Walter")); Assert.That(potato1View.Name, Is.EqualTo("Jeff")); Assert.That(potato1View.TimeOfCreation.ToUniversalTime(), Is.EqualTo(firstPointInTime)); Assert.That(potato1View.TimeToBeEaten, Is.EqualTo(nextPointInTime - firstPointInTime)); Assert.That(potato2View.Name, Is.EqualTo("Bunny")); Assert.That(potato2View.TimeOfCreation.ToUniversalTime(), Is.EqualTo(firstPointInTime)); Assert.That(potato2View.TimeToBeEaten, Is.EqualTo(nextPointInTime - firstPointInTime)); Assert.That(potato3View.Name, Is.EqualTo("Walter")); Assert.That(potato3View.TimeOfCreation.ToUniversalTime(), Is.EqualTo(firstPointInTime)); Assert.That(potato3View.TimeToBeEaten, Is.EqualTo(lastPointInTime - firstPointInTime)); }