public async void Test_dispatch_dispatches()
        {
            // Arrange
            var subscription = new SubscriptionIdentifier("foo", "B=1");
            MessageBusCallbackDelegate emptyDelegate        = (topic, filter, message) => { };
            MessageBusCallbackDelegate testCallbackDelegate = (topic, filter, message) =>
            {
                Assert.Pass("Callback successfully called");
            };
            var mockMessage = new Mock <IMagicHubMessage>();

            _mockFilteringService
            .Setup(f =>
                   f.Filter(
                       It.IsAny <IReadOnlyDictionary <string, object> >(),
                       It.IsAny <IEnumerable <KeyValuePair <SubscriptionIdentifier, MessageBusCallbackDelegate> > >()))
            .Returns(Task.FromResult <IEnumerable <KeyValuePair <SubscriptionIdentifier, MessageBusCallbackDelegate> > >(new[]
            {
                new KeyValuePair <SubscriptionIdentifier, MessageBusCallbackDelegate>(
                    subscription,
                    testCallbackDelegate)
            }));

            _dispatcher.Subscribe(subscription, emptyDelegate);

            // Act
            await _dispatcher.DispatchMessage(mockMessage.Object);
        }
示例#2
0
        public void Test_unsubscribe()
        {
            //Arrange
            var waitEvent = new ManualResetEvent(false);

            var callback = new MessageBusCallbackDelegate((key, fltr, value) =>
            {
                waitEvent.Set();
            });

            var dispatcher = new Mock <IMessageDispatcher>();

            dispatcher.Setup(s => s.Subscribe(It.IsAny <SubscriptionIdentifier>(), It.IsAny <MessageBusCallbackDelegate>())).Callback(() => { });

            var messageBus = new MessageBus(GlobalHost.DependencyResolver.Resolve <IMessageBus>(),
                                            dispatcher.Object, GlobalHost.DependencyResolver.Resolve <JsonSerializer>());

            //Act
            messageBus.Subscribe("foo", callback);
            messageBus.Publish("foo", "{\"message\":\"blah\"}");
            messageBus.Unsubscribe("foo");
            waitEvent.WaitOne(100);

            //Assert
            dispatcher.Verify(g => g.Subscribe(It.Is <SubscriptionIdentifier>(s => s.Topic == "foo" && s.Filter == null), callback), Times.Once());
            dispatcher.Verify(g => g.DispatchMessage(It.Is <IMagicHubMessage>(m => (string)m.Context["Topic"] == "foo")), Times.Once());
            dispatcher.Verify(g => g.Unsubscribe(It.Is <SubscriptionIdentifier>(s => s.Topic == "foo" && s.Filter == null)), Times.Once());
        }
示例#3
0
        /// <summary>
        /// Subscribe to inprocess message bus.
        /// </summary>
        /// <param name="topic"></param>
        /// <param name="filter"></param>
        /// <param name="callback"></param>
        /// <returns></returns>
        /// <remarks>
        /// Stores the callback and uses the callback when SignalR calls the main callback.
        /// </remarks>
        public virtual Task Subscribe(string topic, string filter, MessageBusCallbackDelegate callback)
        {
            var subscription = new SubscriptionIdentifier(topic, filter);

            _messageDispatcher.Subscribe(subscription, callback);

            //return emtpy task
            return(TaskAsyncHelper.Empty);
        }
        public void Test_when_concurrent_subscribe_on_same_topic_should_callback_once()
        {
            //Arrange
            var count        = 0;
            var manualResets = Enumerable.Range(0, 10).Select(_ => new ManualResetEvent(false)).ToArray();
            var subscription = new SubscriptionIdentifier("foo", null);

            var testCallbackDelegates = new MessageBusCallbackDelegate[10];

            for (int i = 0; i < 10; i++)
            {
                testCallbackDelegates[i] = (topic, filter, message) =>
                {
                    Interlocked.Increment(ref count);
                    manualResets[i].Set();
                }
            }
            ;

            var mockMessage = new Mock <IMagicHubMessage>();

            _mockFilteringService
            .Setup(f =>
                   f.Filter(
                       It.IsAny <IReadOnlyDictionary <string, object> >(),
                       It.IsAny <IEnumerable <KeyValuePair <SubscriptionIdentifier, MessageBusCallbackDelegate> > >()))
            .Returns(Task.FromResult <IEnumerable <KeyValuePair <SubscriptionIdentifier, MessageBusCallbackDelegate> > >(new[]
            {
                new KeyValuePair <SubscriptionIdentifier, MessageBusCallbackDelegate>(
                    subscription,
                    (topic, filter, message) => Interlocked.Increment(ref count))
            }));

            //Act
            Enumerable.Range(0, 10).AsParallel().ForAll(i => _dispatcher.Subscribe(subscription, testCallbackDelegates[i]));

            _dispatcher.DispatchMessage(mockMessage.Object);
            WaitHandle.WaitAny(manualResets, 100);

            //Assert
            Assert.That(count, Is.EqualTo(1));
        }
    }
 /// <summary>
 /// Informs the message dispatcher of a new subscription
 /// </summary>
 /// <param name="subscription">The subscription.</param>
 /// <param name="callback">The callback.</param>
 public void Subscribe(SubscriptionIdentifier subscription, MessageBusCallbackDelegate callback)
 {
     _callbacks[subscription] = callback;
 }
示例#6
0
 /// <summary>
 /// Subscribe to inprocess message bus.
 /// </summary>
 /// <param name="topic">Topic</param>
 /// <param name="callback">Callback</param>
 /// <returns></returns>
 /// <remarks>
 /// Stores the callback and uses the callback when SignalR calls the main callback.
 /// </remarks>
 public virtual Task Subscribe(string topic, MessageBusCallbackDelegate callback)
 {
     return(Subscribe(topic, null, callback));
 }