public void CanFlushWithInjectedDataAndNoLongRunningFlushing() { // arrange var injectedRepository = new MemoryRepository <string, string>(); var hybridRepository = new HybridRepository <string, string>(injectedRepository); injectedRepository.AddOrUpdate(Update, "update"); injectedRepository.AddOrUpdate(Remove, "remove"); // act hybridRepository.AddOrUpdate(Add, "add"); hybridRepository.AddOrUpdate(Update, "update_changed"); hybridRepository.Remove(Remove); hybridRepository.TakeSnapshot(); hybridRepository.FlushSnapshot(); var add = injectedRepository.Get(Add); var update = injectedRepository.Get(Update); var remove = injectedRepository.Get(Remove); // assert add.Should().Be("add"); update.Should().Be("update_changed"); remove.Should().BeNull(); }
public void CanGetWithNoInjectedDataAndLongRunningFlushing() { // arrange var flush = new ManualResetEvent(false); var injectedRepository = new TestRepository(flush, null); var hybridRepository = new HybridRepository <string, string>(injectedRepository); hybridRepository.AddOrUpdate(Update, "update"); hybridRepository.AddOrUpdate(Remove, "remove"); // act hybridRepository.AddOrUpdate(Add, "add"); hybridRepository.AddOrUpdate(Update, "update_changed"); hybridRepository.Remove(Remove); new Task( () => { hybridRepository.TakeSnapshot(); hybridRepository.FlushSnapshot(); }).Start(); flush.WaitOne(); // NOTE (Cameron): The hybrid repository is now in a 'flushing' state var add = hybridRepository.Get(Add); var update = hybridRepository.Get(Update); var remove = hybridRepository.Get(Remove); // assert add.Should().Be("add"); update.Should().Be("update_changed"); remove.Should().BeNull(); flush.Dispose(); }
public static void Main(string[] args) { var repository1 = new MemoryRepository <long, Data.Thing>(); var repository1h = new HybridRepository <long, Data.Thing>(repository1); var repository2 = new MemoryRepository <long, Data.Thing>(); var repository3 = new MemoryRepository <string, Data.Things>(); var view1 = new Views.Thing(repository1h); var view2 = new Views.Things(repository2, repository3); var events = new List <object> { { new Events.ThingCreated { Checkpoint = 1, Id = 1, Name = "A" } }, { new Events.ThingCreated { Checkpoint = 2, Id = 2, Name = "B" } }, { new Events.ThingCreated { Checkpoint = 3, Id = 3, Name = "C" } }, { new Events.ThingUpdated { Checkpoint = 5, Id = 1, Name = "A_changed" } }, { new Events.ThingUpdated { Checkpoint = 4, Id = 1, Name = "A_changed_mistake" } }, { new Events.ThingDeleted { Checkpoint = 6, Id = 2 } }, }; var sequenceResolver = new CustomSequenceResolver(); var snapshotRepository = new MemoryRepository <string, SequenceInfo>(); #region WireUp //var x = EventDispatcher // .ForViews(view1, view2) // .Create(); //var y = EventDispatcher // .ForViews(view1, view2) // .SequenceEventsUsing(sequenceResolver) // .StartAtSequenceNumber(0) // .Create(); //var z = EventDispatcher // .ForViews(view1, view2) // .SequenceEventsUsing(sequenceResolver) // .StartAtSequenceNumber(1) // .ResolveMissingEventsUsing(null) // .WithAPublisherTimeoutOf(500) // .AndAConsumerTimeoutOf(500) // .Create(); //var a = EventDispatcher // .ForViews(view1, view2) // .SequenceEventsUsing(sequenceResolver) // .SnapshotViewsUsing(snapshotRepository) // .ResolveMissingEventsUsing(n => events.SingleOrDefault(e => sequenceResolver.GetSequenceNumber(e) == n)) // .WithAPublisherTimeoutOf(500) // .AndAConsumerTimeoutOf(500) // .Create(); var b = EventDispatcher .ForViews(view1, view2) .SequenceEventsUsing(sequenceResolver) .SnapshotViewsUsing(snapshotRepository) .Create(); var eventDispatcher = b; // defaultEventDispatcher; #endregion foreach (var @event in events.Where(e => !new long[] { 2, 6 }.Contains(sequenceResolver.GetSequenceNumber(e)))) { eventDispatcher.Dispatch(@event); } Console.ReadLine(); //orderedEventDispatcher.Dispose(); }
public void BigNotSoSpecificHybridRepositoryTest() { var flush = new ManualResetEvent(false); var flushContinue = new ManualResetEvent(false); var flushEnd = new ManualResetEvent(false); var injectedRepository = new TestRepository(flush, flushContinue); var hybridRepository = new HybridRepository <string, string>(injectedRepository); injectedRepository.AddOrUpdate("A", "A"); injectedRepository.AddOrUpdate("B", "B"); new Task( () => { hybridRepository.TakeSnapshot(); hybridRepository.FlushSnapshot(); flushEnd.Set(); }).Start(); flush.WaitOne(); hybridRepository.AddOrUpdate("A", "A_changed"); hybridRepository.Remove("B"); hybridRepository.AddOrUpdate("C", "C"); // assertions injectedRepository.Get("A").Should().Be("A", "ref1"); injectedRepository.Get("B").Should().Be("B", "ref2"); hybridRepository.Get("A").Should().Be("A_changed", "ref3"); hybridRepository.Get("B").Should().BeNull("ref4"); hybridRepository.Get("C").Should().Be("C", "ref5"); flushContinue.Set(); flushEnd.WaitOne(); // assertions injectedRepository.Get("A").Should().Be("A", "ref6"); injectedRepository.Get("B").Should().Be("B", "ref7"); hybridRepository.Get("A").Should().Be("A_changed", "ref8"); hybridRepository.Get("B").Should().BeNull("ref9"); hybridRepository.Get("C").Should().Be("C", "ref10"); var memoryRepository = new MemoryRepository <string, string>(); hybridRepository = new HybridRepository <string, string>(injectedRepository); // NOTE (Cameron): Equivalent of event re-playing. hybridRepository.AddOrUpdate("A", "A_changed"); hybridRepository.Remove("B"); hybridRepository.AddOrUpdate("C", "C"); // assertions injectedRepository.Get("A").Should().Be("A", "ref11"); injectedRepository.Get("B").Should().Be("B", "ref12"); hybridRepository.Get("A").Should().Be("A_changed", "ref13"); hybridRepository.Get("B").Should().BeNull("ref14"); hybridRepository.Get("C").Should().Be("C", "ref15"); hybridRepository.AddOrUpdate("C", "C_changed"); hybridRepository.AddOrUpdate("D", "D"); // assertions injectedRepository.Get("A").Should().Be("A", "ref16"); injectedRepository.Get("B").Should().Be("B", "ref17"); hybridRepository.Get("A").Should().Be("A_changed", "ref18"); hybridRepository.Get("B").Should().BeNull("ref19"); hybridRepository.Get("C").Should().Be("C_changed", "ref20"); hybridRepository.Get("D").Should().Be("D", "ref21"); hybridRepository.TakeSnapshot(); hybridRepository.FlushSnapshot(); flushContinue.Set(); flushEnd.WaitOne(); // assertions injectedRepository.Get("A").Should().Be("A_changed", "ref22"); injectedRepository.Get("B").Should().BeNull("ref23"); injectedRepository.Get("C").Should().Be("C_changed", "ref24"); injectedRepository.Get("D").Should().Be("D", "ref25"); flush.Dispose(); flushContinue.Dispose(); flushEnd.Dispose(); }
public static void Main(string[] args) { var repository1 = new MemoryRepository <long, Data.Thing>(); var repository1h = new HybridRepository <long, Data.Thing>(repository1); var repository2 = new MemoryRepository <long, Data.Thing>(); var repository3 = new MemoryRepository <string, Data.Things>(); var view1 = new Views.Thing(repository1h); var view2 = new Views.Things(repository2, repository3); var events = new List <object> { { new Events.ThingCreated { Checkpoint = 1, Id = 1, Name = "A" } }, { new Events.ThingCreated { Checkpoint = 2, Id = 2, Name = "B" } }, { new Events.ThingCreated { Checkpoint = 3, Id = 3, Name = "C" } }, { new Events.ThingUpdated { Checkpoint = 5, Id = 1, Name = "A_changed" } }, { new Events.ThingUpdated { Checkpoint = 4, Id = 1, Name = "A_changed_mistake" } }, { new Events.ThingDeleted { Checkpoint = 6, Id = 2 } }, }; var sequenceResolver = new CustomSequenceResolver(); var snapshotRepository = new MemoryRepository <string, Snapshot>(); #region WireUp var x = ViewManager .ForViews(view1, view2) .Create(); var y = ViewManager .ForViews(view1, view2) .OrderEventsUsing(sequenceResolver).StartAtSequenceNumber(0) .Create(); var z = ViewManager .ForViews(view1, view2) .OrderEventsUsing(sequenceResolver).StartAtSequenceNumber(1) .ResolveMissingEventsUsing((IEventResolver)null).WithATimeoutOf(Timeout.Infinite) .Create(); var b = ViewManager .ForViews(view1, view2) .OrderEventsUsing(sequenceResolver) .SnapshotViewsUsing(snapshotRepository).WithAQuietTimeTimeoutOf(Timeout.Infinite) .Create(); var a = ViewManager .ForViews(view1, view2) .OrderEventsUsing(sequenceResolver) .ResolveMissingEventsUsing(n => events.Where(e => sequenceResolver.GetSequenceNumber(e) >= n).OrderBy(o => o)).WithATimeoutOf(Timeout.Infinite) .SnapshotViewsUsing(snapshotRepository).WithAQuietTimeTimeoutOf(Timeout.Infinite) .Create(); //// should not be allowed //var c = ViewManager // .ForViews(view1, view2) // .OrderEventsUsing(sequenceResolver) // .Create(); //var d = ViewManager // .ForViews(view1, view2) // .OrderEventsUsing(sequenceResolver) // .ResolveMissingEventsUsing(n => events.SingleOrDefault(e => sequenceResolver.GetSequenceNumber(e) == n)).WithATimeoutOf(Timeout.Infinite) // .Create(); var eventDispatcher = b; // defaultEventDispatcher; #endregion foreach (var @event in events.Where(e => !new long[] { 2, 6 }.Contains(sequenceResolver.GetSequenceNumber(e)))) { eventDispatcher.QueueForDispatch(@event); } Console.ReadLine(); //orderedEventDispatcher.Dispose(); }