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); }); }
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 ); }
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) => { }); }
public void messageBroker_POCO_Dispatch_valid_message_should_not_fail() { var dispatcher = new NullDispatcher(); var broker = new MessageBroker(dispatcher); broker.Dispatch(this, new PocoTestMessage()); }
//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 */ }); }
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>(); }
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(); }
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); }
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); }
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); }
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); }
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); }
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 ); }
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 ); }
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(); }
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 ); }
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 ); } ); }
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(); }
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 ); }
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 ); }
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 ) => { } ); }
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() : "--"); }
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 ); }
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 ); }
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 ); }
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; } }
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 ); }
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 ); }
public void messageBroker_Dispatch_valid_message_should_not_fail() { var dispatcher = new NullDispatcher(); var broker = new MessageBroker( dispatcher ); broker.Dispatch( new LegacyTestMessage( this ) ); }
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 ); }
public void messageBroker_POCO_Dispatch_valid_message_should_not_fail() { var dispatcher = new NullDispatcher(); var broker = new MessageBroker( dispatcher ); broker.Dispatch( this, new PocoTestMessage() ); }
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() : "--" ); }
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>(); }