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();
        }
Beispiel #3
0
        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();
        }
Beispiel #5
0
        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();
        }