Esempio n. 1
0
        public void messageBroker_POCO_broadcast_using_more_then_one_subscriber_should_call_on_different_thread()
        {
            TestRunner.Execute(ApartmentState.MTA, () =>
            {
                var h1 = new ManualResetEvent(false);
                var h2 = new ManualResetEvent(false);

                var currentThreadId = Thread.CurrentThread.ManagedThreadId;
                var s1ThreadId      = Thread.CurrentThread.ManagedThreadId;
                var s2ThreadId      = Thread.CurrentThread.ManagedThreadId;

                var dispatcher = new NullDispatcher();
                var broker     = new MessageBroker(dispatcher);

                broker.Subscribe <PocoTestMessage>(this, (s, msg) =>
                {
                    s1ThreadId = Thread.CurrentThread.ManagedThreadId;
                    h1.Set();
                });

                broker.Subscribe <PocoTestMessage>(this, (s, msg) =>
                {
                    s2ThreadId = Thread.CurrentThread.ManagedThreadId;
                    h2.Set();
                });

                broker.Broadcast(this, new PocoTestMessage());

                ManualResetEvent.WaitAll(new[] { h1, h2 });

                currentThreadId.Should().Not.Be.EqualTo(s1ThreadId);
                currentThreadId.Should().Not.Be.EqualTo(s2ThreadId);
            });
        }
Esempio n. 2
0
        public async Task messageBroker_POCO_broadcast_async_should_not_fail()
        {
            var expected = 4;
            var actual = 0;

            var dispatcher = new NullDispatcher();
            var broker = new MessageBroker( dispatcher );

            broker.Subscribe<PocoTestMessage>( this, ( s, msg ) =>
            {
                actual++;
            } );

            broker.Subscribe<PocoTestMessage>( this, ( s, msg ) =>
            {
                actual++;
            } );

            broker.Subscribe<PocoTestMessage>( this, ( s, msg ) =>
            {
                actual++;
            } );

            await broker.BroadcastAsync( this, new PocoTestMessage() );
            
            actual++;

            Assert.AreEqual( expected, actual );
        }
Esempio n. 3
0
        public void messageBroker_POCO_Subscribe_based_on_message_type_should_not_fail()
        {
            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            broker.Subscribe <PocoTestMessage>(this, (s, m) => { });
        }
Esempio n. 4
0
        public void messageBroker_POCO_Dispatch_valid_message_should_not_fail()
        {
            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            broker.Dispatch(this, new PocoTestMessage());
        }
Esempio n. 5
0
        //BUG: https://github.com/RadicalFx/Radical/issues/241
        public void messageBroker_should_allow_POCO_subscriptions_and_not_IMessage_ones()
        {
            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            broker.Subscribe(this, this, typeof(PocoTestMessage), InvocationModel.Default, (s, msg) => false, (s, msg) => { /* NOP */ });
        }
Esempio n. 6
0
        public void messageBroker_POCO_subscribe_using_null_action_should_raise_ArgumentNullException()
        {
            Executing.This(() =>
            {
                var dispatcher = new NullDispatcher();
                var broker     = new MessageBroker(dispatcher);

                broker.Subscribe <PocoTestMessage>(this, (Action <Object, PocoTestMessage>)null);
            })
            .Should().Throw <ArgumentNullException>();
        }
Esempio n. 7
0
        public void MessageBroker_POCO_subscriber_using_a_base_class_should_be_dispatched_using_a_derived_class_message()
        {
            var actual = false;

            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            broker.Subscribe <Object>(this, (s, msg) => actual = true);
            broker.Dispatch(this, new PocoTestMessage());

            actual.Should().Be.True();
        }
Esempio n. 8
0
        public void messageBroker_POCO_subscribe_normal_should_notify()
        {
            var expected = true;
            var actual   = false;

            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            broker.Subscribe <PocoTestMessage>(this, (s, msg) => actual = true);
            broker.Dispatch(this, new PocoTestMessage());

            actual.Should().Be.EqualTo(expected);
        }
Esempio n. 9
0
        public void MessageBroker_POCO_subscriber_using_a_base_class_should_be_dispatched_only_to_the_expected_inheritance_chain()
        {
            var actual = 0;

            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            broker.Subscribe <PocoTestMessage>(this, (s, m) => actual++);
            broker.Dispatch(this, new PocoMessageDerivedFromTestMessage());
            broker.Dispatch(this, new AnotherPocoTestMessage());

            actual.Should().Be.EqualTo(1);
        }
Esempio n. 10
0
        public void MessageBroker_POCO_subscriber_using_a_base_class_should_be_dispatched_using_a_derived_class_message_even_using_different_messages()
        {
            var actual = 0;

            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            broker.Subscribe <Object>(this, (s, msg) => actual++);
            broker.Dispatch(this, new PocoTestMessage());
            broker.Dispatch(this, new AnotherPocoTestMessage());

            actual.Should().Be.EqualTo(2);
        }
Esempio n. 11
0
        public void messageBroker_POCO_should_respect_should_handle_predicate()
        {
            bool actual = false;

            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            broker.Subscribe <PocoTestMessage>(this, (s, msg) => false, (s, msg) =>
            {
                actual = true;
            });

            broker.Dispatch(this, new PocoTestMessage());

            Assert.IsFalse(actual);
        }
Esempio n. 12
0
        public void messageBroker_POCO_unsubscribe_specific_subscriber_and_specific_messageType_should_remove_only_subscriptions_for_that_subscriber()
        {
            const int expected = 1;
            var       actual   = 0;

            var dispatcher = new NullDispatcher();
            var target     = new MessageBroker(dispatcher);

            var subscriber = new Object();

            target.Subscribe <PocoTestMessage>(subscriber, (s, msg) => { actual++; });
            target.Subscribe <AnotherPocoTestMessage>(subscriber, (s, msg) => { actual++; });

            target.Unsubscribe <AnotherPocoTestMessage>(subscriber);

            target.Dispatch(this, new PocoTestMessage());

            actual.Should().Be.EqualTo(expected);
        }
Esempio n. 13
0
		public void messageBroker_unsubscribe_specific_subscriber_should_remove_only_subscriptions_for_that_subscriber()
		{
			const int expected = 1;
			var actual = 0;

			var dispatcher = new NullDispatcher();
			var target = new MessageBroker( dispatcher );

			var subscriber1 = new Object();
			var subscriber2 = new Object();

			target.Subscribe<LegacyTestMessage>( subscriber1, msg => { actual++; } );
			target.Subscribe<LegacyTestMessage>( subscriber1, msg => { actual++; } );
			target.Subscribe<LegacyTestMessage>( subscriber1, msg => { actual++; } );

			target.Subscribe<LegacyTestMessage>( subscriber2, msg => { actual++; } );

			target.Unsubscribe( subscriber1 );

			target.Dispatch( new LegacyTestMessage( this ) );

			actual.Should().Be.EqualTo( expected );
		}
Esempio n. 14
0
		public void MessageBroker_subscriber_using_a_base_class_should_be_dispatched_only_to_the_expected_inheritance_chain()
		{
			var actual = 0;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<LegacyTestMessage>( this, msg => actual++ );
			broker.Dispatch( new LegacyMessageDerivedFromLegacyTestMessage( this ) );
			broker.Dispatch( new LegacyAnotherTestMessage( this ) );

			actual.Should().Be.EqualTo( 1 );
		}
Esempio n. 15
0
		public void MessageBroker_POCO_subscriber_using_a_base_class_should_be_dispatched_using_a_derived_class_message()
		{
			var actual = false;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<Object>( this, ( s, msg ) => actual = true );
			broker.Dispatch( this, new PocoTestMessage() );

			actual.Should().Be.True();
		}
Esempio n. 16
0
		public void MessageBroker_MIXED_subscriber_using_a_base_class_should_be_dispatched_using_a_derived_class_message_even_using_different_messages()
		{
			var actual = 0;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<Object>( this, ( s, msg ) => actual++ );
			broker.Dispatch( this, new PocoTestMessage() );
			broker.Dispatch( new LegacyAnotherTestMessage( this ) );

			actual.Should().Be.EqualTo( 2 );
		}
Esempio n. 17
0
		public void messageBroker_POCO_broadcast_using_more_then_one_subscriber_should_call_on_different_thread()
		{
			TestRunner.Execute( ApartmentState.MTA, () =>
			{
				var h1 = new ManualResetEvent( false );
				var h2 = new ManualResetEvent( false );

				var currentThreadId = Thread.CurrentThread.ManagedThreadId;
				var s1ThreadId = Thread.CurrentThread.ManagedThreadId;
				var s2ThreadId = Thread.CurrentThread.ManagedThreadId;

				var dispatcher = new NullDispatcher();
				var broker = new MessageBroker( dispatcher );

				broker.Subscribe<PocoTestMessage>( this, ( s, msg ) =>
				{
					s1ThreadId = Thread.CurrentThread.ManagedThreadId;
					h1.Set();
				} );

				broker.Subscribe<PocoTestMessage>( this, ( s, msg ) =>
				{
					s2ThreadId = Thread.CurrentThread.ManagedThreadId;
					h2.Set();
				} );

				broker.Broadcast( this, new PocoTestMessage() );

				ManualResetEvent.WaitAll( new[] { h1, h2 } );

				currentThreadId.Should().Not.Be.EqualTo( s1ThreadId );
				currentThreadId.Should().Not.Be.EqualTo( s2ThreadId );
			} );
		}
Esempio n. 18
0
		public void MessageBroker_subscriber_using_a_base_class_should_be_dispatched_using_a_derived_class_message()
		{
			var actual = false;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<IMessage>( this, msg => actual = true );
			broker.Dispatch( new LegacyTestMessage( this ) );

			actual.Should().Be.True();
		}
Esempio n. 19
0
		public void messageBroker_MIXED_subscribe_POCO_normal_should_notify_IMessage()
		{
			var expected = true;
			var actual = false;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<Object>( this, ( s, msg ) => actual = true );
			broker.Dispatch( new LegacyTestMessage( this ) );

			actual.Should().Be.EqualTo( expected );
		}
Esempio n. 20
0
		public void messageBroker_MIXED_subscribe_IMessage_normal_should_not_notify_POCO()
		{
			var expected = false;
			var actual = false;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<IMessage>( this, ( msg ) => actual = true );
			broker.Dispatch( this, new PocoTestMessage() );

			actual.Should().Be.EqualTo( expected );
		}
Esempio n. 21
0
		public void messageBroker_POCO_Subscribe_based_on_message_type_should_not_fail()
		{
			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<PocoTestMessage>( this, ( s, m ) => { } );
		}
Esempio n. 22
0
        public void MessageBroker_broadcast_from_multiple_thread_should_not_fail()
        {
            Exception failure = null;
            var       wh      = new ManualResetEvent(false);
            var       run     = true;

            var dispatcher = new NullDispatcher();
            var broker     = new MessageBroker(dispatcher);

            // do some metrics to find a good number of subscription to let the pub do a long running
            const int metricsCount = 100;

            for (int i = 0; i < metricsCount; i++)
            {
                broker.Subscribe <PocoTestMessage>(this, (sender, msg) => { });
            }

            var sw = Stopwatch.StartNew();

            broker.Broadcast(this, new PocoTestMessage());
            sw.Stop();

            const int longRunningTiming   = 100;
            var       elapsedMilliseconds = sw.ElapsedMilliseconds == 0
                ? longRunningTiming
                : sw.ElapsedMilliseconds;

            var subCountForLongRunning = (longRunningTiming / elapsedMilliseconds) * metricsCount;

            Trace.WriteLine(string.Format("Need {0} subscriptions to run for at least {1} ms. {2} took {3} ms.", subCountForLongRunning, longRunningTiming, metricsCount, sw.ElapsedMilliseconds));

            for (int i = 0; i < subCountForLongRunning - metricsCount; i++)
            {
                broker.Subscribe <PocoTestMessage>(this, (sender, msg) => { });
            }

            // this will take approximately 100 ms to do 1 broadcast
            var broadcastThread1 = new Thread(payload =>
            {
                while (run)
                {
                    try
                    {
                        broker.Broadcast(this, new PocoTestMessage());
                    }
                    catch (Exception e)
                    {
                        lock (this)
                        {
                            failure = e;
                            wh.Set();
                        }

                        break;
                    }
                }
            });

            broadcastThread1.IsBackground = true;
            broadcastThread1.Start();

            // this should istantly throw an error because the broadcasting is enumerating the subscriptions and should take 100 ms to enumerate them all
            var subscriberThread1 = new Thread(payload =>
            {
                while (run)
                {
                    try
                    {
                        broker.Subscribe <PocoTestMessage>(this, (sender, msg) =>
                        {
                            Thread.Sleep(10);
                        });
                    }
                    catch (Exception e)
                    {
                        lock (this)
                        {
                            failure = e;
                            wh.Set();

                            break;
                        }
                    }
                }
            });

            subscriberThread1.IsBackground = true;
            subscriberThread1.Start();

            var timeout  = 1;
            var signaled = wh.WaitOne(TimeSpan.FromSeconds(timeout));

            if (!signaled)
            {
                Trace.WriteLine(string.Format("Run without any issue for {0} seconds.", timeout));
            }

            run = false;

            subscriberThread1.Join();

            Assert.IsNull(failure, failure != null ? failure.ToString() : "--");
        }
Esempio n. 23
0
		public void messageBroker_POCO_should_broadcast_non_POCO_message_with_correct_Sender()
		{
			Object expected = this;
			Object actual = null;

			var h = new ManualResetEvent( false );
			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<LegacyTestMessage>( this, msg =>
			{
				actual = msg.Sender;
				h.Set();
			} );

			broker.Broadcast( this, new LegacyTestMessage() );

			h.WaitOne();

			Assert.AreEqual( expected, actual );
		}
Esempio n. 24
0
		public void MessageBroker_POCO_subscriber_using_a_base_class_should_be_dispatched_only_to_the_expected_inheritance_chain()
		{
			var actual = 0;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<PocoTestMessage>( this, ( s, m ) => actual++ );
			broker.Dispatch( this, new PocoMessageDerivedFromTestMessage() );
			broker.Dispatch( this, new AnotherPocoTestMessage() );

			actual.Should().Be.EqualTo( 1 );
		}
Esempio n. 25
0
		public void messageBroker_POCO_should_dispatch_non_POCO_message_and_subscribe_as_POCO()
		{
			var received = false;
			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<LegacyTestMessage>( this, ( s, msg ) =>
			{
				received = true;
			} );

			broker.Dispatch( this, new LegacyTestMessage() );
			Assert.IsTrue( received );
		}
Esempio n. 26
0
		public void messageBroker_broadcast_should_report_expected_exception()
		{
			ManualResetEvent h = new ManualResetEvent( false );

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<LegacyTestMessage>( this, msg =>
			{
				throw new ArgumentException();
			} );

			try
			{
				broker.Broadcast( new LegacyTestMessage( this ) );

				h.WaitOne();
			}
			catch
			{
				h.Set();
				throw;
			}
		}
Esempio n. 27
0
		public void messageBroker_POCO_unsubscribe_specific_subscriber_and_specific_messageType_should_remove_only_subscriptions_for_that_subscriber()
		{
			const int expected = 1;
			var actual = 0;

			var dispatcher = new NullDispatcher();
			var target = new MessageBroker( dispatcher );

			var subscriber = new Object();

			target.Subscribe<PocoTestMessage>( subscriber, ( s, msg ) => { actual++; } );
			target.Subscribe<AnotherPocoTestMessage>( subscriber, ( s, msg ) => { actual++; } );

			target.Unsubscribe<AnotherPocoTestMessage>( subscriber );

			target.Dispatch( this, new PocoTestMessage() );

			actual.Should().Be.EqualTo( expected );
		}
Esempio n. 28
0
		public void messageBroker_POCO_should_broadcast_non_POCO_message_and_subscribe_as_POCO()
		{
			var received = false;
			var h = new ManualResetEvent( false );
			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<LegacyTestMessage>( this, ( s, msg ) =>
			{
				received = true;
				h.Set();
			} );

			broker.Broadcast( this, new LegacyTestMessage() );

			h.WaitOne();

			Assert.IsTrue( received );
		}
Esempio n. 29
0
		public void messageBroker_Dispatch_valid_message_should_not_fail()
		{
			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Dispatch( new LegacyTestMessage( this ) );
		}
Esempio n. 30
0
		public void messageBroker_POCO_should_dispatch_non_POCO_message_with_correct_Sender()
		{
			Object expected = this;
			Object actual = null;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Subscribe<LegacyTestMessage>( this, msg =>
			{
				actual = msg.Sender;
			} );

			broker.Dispatch( this, new LegacyTestMessage() );

			Assert.AreEqual( expected, actual );
		}
Esempio n. 31
0
		public void messageBroker_POCO_Dispatch_valid_message_should_not_fail()
		{
			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			broker.Dispatch( this, new PocoTestMessage() );
		}
Esempio n. 32
0
		public void MessageBroker_broadcast_from_multiple_thread_should_not_fail()
		{
			Exception failure = null;
			var wh = new ManualResetEvent( false );
			var run = true;

			var dispatcher = new NullDispatcher();
			var broker = new MessageBroker( dispatcher );

			// do some metrics to find a good number of subscription to let the pub do a long running
			const int metricsCount = 100;
			for( int i = 0; i < metricsCount; i++ )
			{
				broker.Subscribe<PocoTestMessage>( this, ( sender, msg ) => { } );
			}
			
			var sw = Stopwatch.StartNew();
			broker.Broadcast(this, new PocoTestMessage());
			sw.Stop();
			
			const int longRunningTiming = 100;
			var elapsedMilliseconds = sw.ElapsedMilliseconds == 0
				? longRunningTiming
				: sw.ElapsedMilliseconds;

			var subCountForLongRunning = (longRunningTiming / elapsedMilliseconds) * metricsCount;
			Trace.WriteLine(string.Format("Need {0} subscriptions to run for at least {1} ms. {2} took {3} ms.", subCountForLongRunning, longRunningTiming, metricsCount, sw.ElapsedMilliseconds));

			for (int i = 0; i < subCountForLongRunning - metricsCount; i++)
			{
				broker.Subscribe<PocoTestMessage>(this, (sender, msg) => { });
			}

			// this will take approximately 100 ms to do 1 broadcast
			var broadcastThread1 = new Thread( payload =>
			{
				while( run )
				{
					try
					{
						broker.Broadcast( this, new PocoTestMessage() );
					}
					catch( Exception e )
					{
						lock( this )
						{
							failure = e;
							wh.Set();
						}

						break;
					}
				}
			} );
			broadcastThread1.IsBackground = true;
			broadcastThread1.Start();

			// this should istantly throw an error because the broadcasting is enumerating the subscriptions and should take 100 ms to enumerate them all
			var subscriberThread1 = new Thread(payload =>
			{
				while (run)
				{
					try
					{
						broker.Subscribe<PocoTestMessage>(this, (sender, msg) =>
						{
							Thread.Sleep(10);
						});
					}
					catch (Exception e)
					{
						lock (this)
						{
							failure = e;
							wh.Set();

							break;
						}
					}
				}

			});
			subscriberThread1.IsBackground = true;
			subscriberThread1.Start();

			var timeout = 1;
			var signaled = wh.WaitOne( TimeSpan.FromSeconds( timeout ) );
			if( !signaled )
			{
				Trace.WriteLine( String.Format( "Run without any issue for {0} seconds.", timeout ) );
			}

			run = false;

			subscriberThread1.Join();

			Assert.IsNull( failure, failure != null ? failure.ToString() : "--" );

		}
Esempio n. 33
0
		public void messageBroker_POCO_subscribe_using_null_action_should_raise_ArgumentNullException()
		{
			Executing.This( () =>
			{
				var dispatcher = new NullDispatcher();
				var broker = new MessageBroker( dispatcher );

				broker.Subscribe<PocoTestMessage>( this, ( Action<Object, PocoTestMessage> )null );
			} )
			.Should().Throw<ArgumentNullException>();
		}