public void Handle_WithNull_DoesNothing() { // Arrange var dispatcher = new TopicDispatcher(); // Act TestDelegate handle = () => dispatcher.Handle(subscriber, null); // Assert Assert.That(handle, Throws.Nothing); }
public void Register_WithAsyncTopicHandlerDelegate_WithUnserializableTopic_ThrowsUnserializableTypeException() { // Arrange var dispatcher = new TopicDispatcher(); AsyncTopicHandlerDelegate <UnserializableTopic> handler = _ => Task.CompletedTask; // Act TestDelegate register = () => dispatcher.Register(handler); // Assert Assert.That(register, Throws.TypeOf <UnserializableTypeException>()); }
public void Register_WithAsyncTopicHandler_WithUnserializableTopic_ThrowsUnserializableTypeException() { // Arrange var dispatcher = new TopicDispatcher(); var handler = new Mock <IAsyncTopicHandler <UnserializableTopic> >().Object; // Act TestDelegate register = () => dispatcher.Register(handler); // Assert Assert.That(register, Throws.TypeOf <UnserializableTypeException>()); }
public void Handle_WithNoHandlerRegistered_DoesNothing() { // Arrange var dispatcher = new TopicDispatcher(); var message = new Topic(); // Act TestDelegate handle = () => dispatcher.Handle(subscriber, message); // Assert Assert.That(handle, Throws.Nothing); }
public void Handle_WithBaseClassHandlerRegistered_DoesNothing() { // Arrange var dispatcher = new TopicDispatcher(); dispatcher.Register(handler); var message = new SubTopic(); // Act dispatcher.Handle(subscriber, message); // Assert mockHandler.Verify(m => m.Handle(It.IsAny <Topic>()), Times.Never); }
public void Handle_WithAsyncHandlerRegistered_CallsHandler() { // Arrange var dispatcher = new TopicDispatcher(); dispatcher.Register(asyncHandler); var message = new Topic(); // Act dispatcher.Handle(subscriber, message); // Assert mockAsyncHandler.Verify(m => m.Handle(It.IsIn(message)), Times.Once); }
public void Handle_WithHandlerDelegateRegistered_CallsHandler() { // Arrange var handled = false; var dispatcher = new TopicDispatcher(); var message = new Topic(); dispatcher.Register <Topic>(e => { handled = true; }); // Act dispatcher.Handle(subscriber, message); // Assert Assert.That(handled, Is.True); }
public Builder(string name) { this.name = name; TopicRouter = new TopicRouter(); MonitorCache = new MonitorCache(); RequestRouter = new RequestRouter(); PackageFactory = new PackageFactory(); TopicDispatcher = new TopicDispatcher(); RequestDispatcher = new RequestDispatcher(); SubscriptionsCache = new SubscriptionsCache(); SerializerCache = new SerializerCache(); SenderCache = new SenderCache(RequestRouter, MonitorCache); ReceiverCache = new ReceiverCache(MonitorCache); PublisherCache = new PublisherCache(MonitorCache); SubscriberCache = new SubscriberCache(TopicRouter, MonitorCache, SubscriptionsCache); }
public void Handle_WithAsyncHandlerDelegateRegistered_CallsHandler() { // Arrange var handled = false; var dispatcher = new TopicDispatcher(); var message = new Topic(); var wait = new ManualResetEvent(false); dispatcher.Register <Topic>(e => Task.Run(() => { handled = true; wait.Set(); })); // Act dispatcher.Handle(subscriber, message); wait.WaitOne(); // Assert Assert.That(handled, Is.True); }
private static void BackPressureTest() { var topicDispatcher = new TopicDispatcher(); var threadBoundaryMonitor = new ThreadBoundaryMonitor(); var reporting = threadBoundaryMonitor.Wrap(new ReportingSystem(topicDispatcher)); var cashierInner = new Cashier(topicDispatcher); var cashier = threadBoundaryMonitor.Wrap(cashierInner); var assManager = threadBoundaryMonitor.Wrap(new AssistantManager(topicDispatcher)); var cooks = new[] { threadBoundaryMonitor.Wrap(new Cook(topicDispatcher, 20)), threadBoundaryMonitor.Wrap(new Cook(topicDispatcher, 50)), threadBoundaryMonitor.Wrap(new Cook(topicDispatcher, 90)) }; var cookDispatcher = TTLSettingHandler.Wrap( threadBoundaryMonitor.Wrap( RetryDispatcher.Wrap( TTLFilteringHandler.Wrap( SmartDispatcher.Wrap(cooks, maxQueueLength: 15)))), 10); var waiter = new Waiter("Neil", topicDispatcher); topicDispatcher.Subscribe(cashier); topicDispatcher.Subscribe(cookDispatcher); topicDispatcher.Subscribe(assManager); topicDispatcher.Subscribe(reporting); topicDispatcher.Subscribe(threadBoundaryMonitor.Wrap(new Logger())); topicDispatcher.Subscribe(new SelfUnsubscribingOrderSampler(topicDispatcher)); topicDispatcher.Subscribe(threadBoundaryMonitor.Wrap<OrderTaken>(new OrderFulfillmentCoordinator(topicDispatcher))); threadBoundaryMonitor.Start(); RunTest(waiter, cashierInner, orderCount: 5000); }
private static void BackPressureTest() { var topicDispatcher = new TopicDispatcher(); var threadBoundaryMonitor = new ThreadBoundaryMonitor(); ThreadBoundary <Report> reporting = threadBoundaryMonitor.Wrap(new ReportingSystem(topicDispatcher)); var cashierInner = new Cashier(topicDispatcher); ThreadBoundary <QueueOrderForPayment> cashier = threadBoundaryMonitor.Wrap(cashierInner); ThreadBoundary <PriceFood> assManager = threadBoundaryMonitor.Wrap(new AssistantManager(topicDispatcher)); var cooks = new[] { threadBoundaryMonitor.Wrap(new Cook(topicDispatcher, 20)), threadBoundaryMonitor.Wrap(new Cook(topicDispatcher, 50)), threadBoundaryMonitor.Wrap(new Cook(topicDispatcher, 90)) }; TTLSettingHandler <CookFood> cookDispatcher = TTLSettingHandler.Wrap( threadBoundaryMonitor.Wrap( RetryDispatcher.Wrap( TTLFilteringHandler.Wrap( SmartDispatcher.Wrap(cooks, 15)))), 10); var waiter = new Waiter("Neil", topicDispatcher); topicDispatcher.Subscribe(cashier); topicDispatcher.Subscribe(cookDispatcher); topicDispatcher.Subscribe(assManager); topicDispatcher.Subscribe(reporting); topicDispatcher.Subscribe(threadBoundaryMonitor.Wrap(new Logger())); topicDispatcher.Subscribe(new SelfUnsubscribingOrderSampler(topicDispatcher)); topicDispatcher.Subscribe(threadBoundaryMonitor.Wrap <OrderTaken>(new OrderFulfillmentCoordinator(topicDispatcher))); threadBoundaryMonitor.Start(); RunTest(waiter, cashierInner, 5000); }
public Builder WithAsyncTopicHandler <TTopic>(AsyncTopicHandlerDelegate <TTopic> handler) { TopicDispatcher.Register(handler); return(this); }
public Builder WithTopicHandler <TTopic>(ITopicHandler <TTopic> handler) { TopicDispatcher.Register(handler); return(this); }