public void Multiple_events_for_same_page_update_path_in_dispatched_callback()
        {
            var  dispatcher = new MockUpdateRecordDispatcher(1);
            var  queue      = new UpdateDelayQueue(TimeSpan.FromSeconds(1), dispatcher);
            XDoc queued     = new XDoc("deki-event")
                              .Attr("wikiid", "abc")
                              .Elem("channel", "event://abc/deki/pages/create")
                              .Elem("pageid", "1")
                              .Elem("path", "bar");
            DateTime queueTime = DateTime.Now;

            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);

            Thread.Sleep(100);
            queued = new XDoc("deki-event")
                     .Attr("wikiid", "abc")
                     .Elem("channel", "event://abc/deki/pages/update")
                     .Elem("pageid", "1")
                     .Elem("path", "baz");
            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);

            if (!dispatcher.ResetEvent.WaitOne(2000, true))
            {
                Assert.Fail("callbacks didn't happen");
            }
            Assert.AreEqual(1, dispatcher.Dispatches.Count);
            Assert.AreEqual(1, dispatcher.Dispatches[0].Item2.Id);
            Assert.AreEqual("abc", dispatcher.Dispatches[0].Item2.WikiId);
            Assert.AreEqual("baz", dispatcher.Dispatches[0].Item2.Path);
            Assert.AreEqual(RecordType.Page, dispatcher.Dispatches[0].Item2.Type);
        }
        public void Multiple_events_for_different_types_fire_for_each_type()
        {
            var  dispatcher = new MockUpdateRecordDispatcher(3);
            var  queue      = new UpdateDelayQueue(TimeSpan.FromSeconds(1), dispatcher);
            XDoc queued     = new XDoc("deki-event")
                              .Attr("wikiid", "abc")
                              .Elem("channel", "event://abc/deki/pages/create")
                              .Elem("pageid", "1")
                              .Elem("path", "bar");
            DateTime queueTime = DateTime.Now;

            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);

            Thread.Sleep(100);
            queued = new XDoc("deki-event")
                     .Attr("wikiid", "abd")
                     .Elem("channel", "event://abc/deki/pages/update")
                     .Elem("pageid", "2")
                     .Elem("path", "baz");
            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);

            Thread.Sleep(100);
            queued = new XDoc("deki-event")
                     .Attr("wikiid", "abf")
                     .Elem("channel", "event://abc/deki/files/foop")
                     .Elem("fileid", "1");
            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);

            if (!dispatcher.ResetEvent.WaitOne(2000, true))
            {
                Assert.Fail("callbacks didn't happen");
            }
            Assert.AreEqual(3, dispatcher.Dispatches.Count);
            Assert.AreEqual(1, dispatcher.Dispatches[0].Item2.Id);
            Assert.AreEqual("abc", dispatcher.Dispatches[0].Item2.WikiId);
            Assert.AreEqual("bar", dispatcher.Dispatches[0].Item2.Path);
            Assert.AreEqual(RecordType.Page, dispatcher.Dispatches[0].Item2.Type);
            Assert.AreEqual(2, dispatcher.Dispatches[1].Item2.Id);
            Assert.AreEqual("abd", dispatcher.Dispatches[1].Item2.WikiId);
            Assert.AreEqual("baz", dispatcher.Dispatches[1].Item2.Path);
            Assert.AreEqual(RecordType.Page, dispatcher.Dispatches[1].Item2.Type);
            Assert.AreEqual(1, dispatcher.Dispatches[2].Item2.Id);
            Assert.AreEqual("abf", dispatcher.Dispatches[2].Item2.WikiId);
            Assert.IsTrue(string.IsNullOrEmpty(dispatcher.Dispatches[2].Item2.Path));
            Assert.AreEqual(RecordType.File, dispatcher.Dispatches[2].Item2.Type);
        }
        public void Callback_in_delay_time()
        {
            var  dispatcher = new MockUpdateRecordDispatcher(1);
            var  queue      = new UpdateDelayQueue(TimeSpan.FromSeconds(1), dispatcher);
            XDoc queued     = new XDoc("deki-event")
                              .Attr("wikiid", "abc")
                              .Elem("channel", "event://abc/deki/pages/update")
                              .Elem("pageid", "1")
                              .Elem("path", "bar");

            DateTime queueTime = DateTime.Now;

            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);
            if (!dispatcher.ResetEvent.WaitOne(5000, true))
            {
                Assert.Fail("callback didn't happen");
            }
            Assert.AreEqual(1, dispatcher.Dispatches.Count);
            Assert.AreEqual(1, dispatcher.Dispatches[0].Item2.Id);
            Assert.AreEqual("abc", dispatcher.Dispatches[0].Item2.WikiId);
            Assert.AreEqual("bar", dispatcher.Dispatches[0].Item2.Path);
            Assert.AreEqual(RecordType.Page, dispatcher.Dispatches[0].Item2.Type);
            Assert.GreaterOrEqual(dispatcher.Dispatches[0].Item1, queueTime.Add(TimeSpan.FromMilliseconds(1000)));
        }
        public void Multiple_events_for_same_page_fire_once_on_first_plus_delay()
        {
            var  dispatcher = new MockUpdateRecordDispatcher(1);
            var  queue      = new UpdateDelayQueue(TimeSpan.FromSeconds(2), dispatcher);
            XDoc queued     = new XDoc("deki-event")
                              .Attr("wikiid", "abc")
                              .Elem("channel", "event://abc/deki/pages/create")
                              .Elem("pageid", "1")
                              .Elem("path", "bar");
            DateTime queueTime = DateTime.Now;

            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);

            Thread.Sleep(300);
            queued = new XDoc("deki-event")
                     .Attr("wikiid", "abc")
                     .Elem("channel", "event://abc/deki/pages/update")
                     .Elem("pageid", "1")
                     .Elem("path", "bar");
            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);

            Thread.Sleep(300);
            queued = new XDoc("deki-event")
                     .Attr("wikiid", "abc")
                     .Elem("channel", "event://abc/deki/pages/foop")
                     .Elem("pageid", "1")
                     .Elem("path", "bar");
            queue.Enqueue(queued);
            Assert.AreEqual(0, dispatcher.Dispatches.Count);

            if (!dispatcher.ResetEvent.WaitOne(3000, true))
            {
                Assert.Fail("callback didn't happen");
            }
            Assert.AreEqual(1, dispatcher.Dispatches.Count);
            Assert.AreEqual(1, dispatcher.Dispatches[0].Item2.Id);
            Assert.AreEqual("abc", dispatcher.Dispatches[0].Item2.WikiId);
            Assert.AreEqual("bar", dispatcher.Dispatches[0].Item2.Path);
            Assert.AreEqual(RecordType.Page, dispatcher.Dispatches[0].Item2.Type);
            Assert.GreaterOrEqual(dispatcher.Dispatches[0].Item1, queueTime.Add(TimeSpan.FromMilliseconds(2000)));
            Assert.LessOrEqual(dispatcher.Dispatches[0].Item1, queueTime.Add(TimeSpan.FromMilliseconds(2200)));
            Thread.Sleep(1000);
            Assert.AreEqual(1, dispatcher.Dispatches.Count);
        }
Пример #5
0
        public void Callback_in_delay_time()
        {
            XDoc queued = new XDoc("deki-event")
                          .Attr("wikiid", "abc")
                          .Elem("channel", "event://abc/deki/pages/update")
                          .Elem("uri", "http://foo/bar")
                          .Elem("content.uri", "")
                          .Elem("revision.uri", "")
                          .Elem("path", "bar")
                          .Elem("previous-path", "bar");

            _log.DebugFormat("queueing item");
            _queue.Enqueue(queued);
            Assert.AreEqual(1, _peekQueue.Count);
            Assert.AreEqual(0, _dispatcher.Dispatches.Count);
            if (!_dispatcher.ResetEvent.WaitOne(5000, true))
            {
                _log.Debug("reset event never fired");
                Assert.AreEqual(0, _peekQueue.Count, "item still in the queue");
                Assert.Fail("callback didn't happen");
            }
            Assert.IsTrue(_dispatcher.ResetEvent.WaitOne(5000));
            Assert.AreEqual(1, _dispatcher.Dispatches.Count);
            Assert.AreEqual(queued.ToString(), _dispatcher.Dispatches[0].Item2.Meta.ToString());
            Assert.IsNotNull(_dispatcher.Dispatches[0].Item2.Id);
            Assert.IsTrue(_dispatcher.Dispatches[0].Item2.ActionStack.IsAdd);
            Assert.IsTrue(_dispatcher.Dispatches[0].Item2.ActionStack.IsDelete);
        }
        internal Yield QueuePurge(DreamContext context, DreamMessage request, Result <DreamMessage> response)
        {
            XDoc   doc     = request.ToDocument();
            XUri   channel = doc["channel"].AsUri;
            string action  = channel.Segments[2];

            // there are certain sub-events we don't use to trigger on
            if (action != "view")
            {
                _updateDelayQueue.Enqueue(doc);
            }
            response.Return(DreamMessage.Ok());
            yield break;
        }
        public void Can_dispatch_using_coroutine_dispatcher()
        {
            var helper = new CallbackHelper();
            var queue  = new UpdateDelayQueue(TimeSpan.FromSeconds(1), new UpdateRecordDispatcher(helper.Invoke));
            var queued = new XDoc("deki-event")
                         .Attr("wikiid", "abc")
                         .Elem("channel", "event://abc/deki/pages/update")
                         .Elem("pageid", "1")
                         .Elem("path", "bar");

            queue.Enqueue(queued);
            Assert.AreEqual(0, helper.Callbacks.Count);
            if (!helper.ResetEvent.WaitOne(2000, true))
            {
                Assert.Fail("callback didn't happen");
            }
            Assert.AreEqual(1, helper.Callbacks.Count);
            Assert.AreEqual(1, helper.Callbacks[0].Id);
            Assert.AreEqual("abc", helper.Callbacks[0].WikiId);
            Assert.AreEqual("bar", helper.Callbacks[0].Path);
            Assert.AreEqual(RecordType.Page, helper.Callbacks[0].Type);
        }