public void FileSystemDispatcher_Picks_Up_Existing_Messages() { BinaryMessageEncodingBindingElement element = new BinaryMessageEncodingBindingElement(); MessageEncoder encoder = element.CreateMessageEncoderFactory().Encoder; ServiceBusRuntime dispatchRuntime = new ServiceBusRuntime(new DirectDeliveryCore()); var subscription = new SubscriptionEndpoint(Guid.NewGuid(), "File System Dispatcher", null, null, typeof(IContract), new FileSystemDispatcher(new ConverterMessageDeliveryWriterFactory(encoder,typeof(IContract)),Config.IncomingFilePath), new PassThroughMessageFilter()); dispatchRuntime.Subscribe(subscription); ServiceBusRuntime listenerRuntime = new ServiceBusRuntime(new DirectDeliveryCore()); var listener = new ListenerEndpoint(Guid.NewGuid(), "File System Listener", null, null, typeof(IContract), new FileSystemListener(new ConverterMessageDeliveryReaderFactory(encoder, typeof(IContract)),Config.IncomingFilePath, Config.ProcessedFilePath)); listenerRuntime.AddListener(listener); listenerRuntime.Subscribe(new SubscriptionEndpoint(Guid.NewGuid(), "Pass through", null, null, typeof(IContract), new ActionDispatcher((se, md) => { }), new PassThroughMessageFilter())); var dispatchTester = new ServiceBusTest(dispatchRuntime); var listenerTester = new ServiceBusTest(listenerRuntime); string message = "test this thing"; dispatchTester.StartAndStop(() => { dispatchRuntime.PublishOneWay(typeof(IContract), "PublishThis", message); listenerTester.WaitForDeliveries(1, TimeSpan.FromSeconds(10), () => { }); }); dispatchRuntime.RemoveSubscription(subscription); }
public void MessageFilter_Properly_Excludes_Messages() { using (var serviceBusRuntime = Create.MsmqRuntime <IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(1); tester.OnlyRetryOnce(); tester.AddTestListener(); tester.AddTestSubscription(ci, new BooleanMessageFilter(false)); try { tester.WaitForDeliveries(2, TimeSpan.FromSeconds(5), () => { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); } catch (TimeoutException) // should timeout while waiting { } Assert.AreEqual(0, ci.PublishedCount); tester.VerifyQueuesEmpty(); } }
public void Not_Yet_Expired_Subscriptions_Get_Messages() { using (var serviceBusRuntime = new ServiceBusRuntime()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); tester.AddTestSubscription(ci, new PassThroughMessageFilter(), DateTime.MaxValue); try { tester.WaitForDeliveries(2, TimeSpan.FromSeconds(1), () => { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); } catch (TimeoutException) { Assert.Fail("Message should have been delivered to not yet expired subscription."); } } }
public void MessageFilter_Properly_Includes_Messages() { using (var serviceBusRuntime = Create.MsmqRuntime <IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); tester.OnlyRetryOnce(); ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(0); tester.AddTestListener(); tester.AddTestSubscription(ci, new BooleanMessageFilter(true)); string message = "Publish this message"; tester.WaitForDeliveries(2, TimeSpan.FromMinutes(1), () => { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); Assert.AreEqual(1, ci.PublishedCount); Assert.AreEqual(message, ci.PublishedMessages[0]); tester.VerifyQueuesEmpty(); } }
public void FileSystemDispatcher_Picks_Up_Existing_Messages() { BinaryMessageEncodingBindingElement element = new BinaryMessageEncodingBindingElement(); MessageEncoder encoder = element.CreateMessageEncoderFactory().Encoder; ServiceBusRuntime dispatchRuntime = new ServiceBusRuntime(new DirectDeliveryCore()); var subscription = new SubscriptionEndpoint(Guid.NewGuid(), "File System Dispatcher", null, null, typeof(IContract), new FileSystemDispatcher(new ConverterMessageDeliveryWriterFactory(encoder, typeof(IContract)), Config.IncomingFilePath), new PassThroughMessageFilter()); dispatchRuntime.Subscribe(subscription); ServiceBusRuntime listenerRuntime = new ServiceBusRuntime(new DirectDeliveryCore()); var listener = new ListenerEndpoint(Guid.NewGuid(), "File System Listener", null, null, typeof(IContract), new FileSystemListener(new ConverterMessageDeliveryReaderFactory(encoder, typeof(IContract)), Config.IncomingFilePath, Config.ProcessedFilePath)); listenerRuntime.AddListener(listener); listenerRuntime.Subscribe(new SubscriptionEndpoint(Guid.NewGuid(), "Pass through", null, null, typeof(IContract), new ActionDispatcher((se, md) => { }), new PassThroughMessageFilter())); var dispatchTester = new ServiceBusTest(dispatchRuntime); var listenerTester = new ServiceBusTest(listenerRuntime); string message = "test this thing"; dispatchTester.StartAndStop(() => { dispatchRuntime.PublishOneWay(typeof(IContract), "PublishThis", message); listenerTester.WaitForDeliveries(1, TimeSpan.FromSeconds(10), () => { }); }); dispatchRuntime.RemoveSubscription(subscription); }
public void Failure_Queue_Receives_Messages_When_Retries_Maxed() { using (var serviceBusRuntime = Create.MsmqRuntime <IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); tester.OnlyRetryOnce(); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(3); tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); tester.WaitForDeliveriesAndFailures(1, 3, TimeSpan.FromSeconds(10), () => { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); Assert.AreEqual(0, ci.PublishedCount); MessageDelivery delivery = serviceBusRuntime.ServiceLocator.GetInstance <QueuedDeliveryCore>().FailureQueue.Dequeue(TimeSpan.FromSeconds(1)); Assert.IsNotNull(delivery); tester.VerifyQueuesEmpty(); Assert.AreEqual(3, ((IEnumerable <string>)delivery.Context[MessageDelivery.Exceptions]).Count()); } }
public void Retry_Queue_Receives_Initial_Failures() { using (var serviceBusRuntime = Create.MsmqRuntime <IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(1); tester.OnlyRetryOnce(); tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); bool failFirst = false; bool deliverSecond = false; tester.StartAndStop(() => { CountdownLatch latch = new CountdownLatch(2 + 1); serviceBusRuntime.MessageDelivered += (o, mdea) => { int tick; if ((tick = latch.Tick()) == 0) { deliverSecond = true; } Console.WriteLine("Tick deliver " + tick); }; serviceBusRuntime.MessageDeliveryFailed += (o, mdfea) => { int tick; if ((tick = latch.Tick()) == 1) { failFirst = true; } Console.WriteLine("Tick fail " + tick); }; serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); // Wait for delivery latch.Handle.WaitOne(TimeSpan.FromMinutes(1), false); // give it a minute }); Assert.AreEqual(true, failFirst); Assert.AreEqual(true, deliverSecond); Assert.AreEqual(1, ci.PublishedCount); Assert.AreEqual(message, ci.PublishedMessages[0]); tester.VerifyQueuesEmpty(); } }
public void Can_Deliver_Many_Messages_With_Failures() { using (var serviceBusRuntime = Create.MsmqRuntime <IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); tester.OnlyRetryOnce(); ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(0); ci.SetFailInterval(10); QueuedDeliveryCore qc = serviceBusRuntime.ServiceLocator.GetInstance <QueuedDeliveryCore>(); qc.RetryDelay = 1; tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); int messageCount = 1000; DateTime start = DateTime.Now; tester.WaitForDeliveries(messageCount * 2, TimeSpan.FromMinutes(1), () => { for (int i = 0; i < messageCount; i++) { string message = i.ToString(); serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); } }); bool[] results = new bool[messageCount]; // Wait for delivery DateTime end = DateTime.Now; System.Diagnostics.Trace.TraceInformation("Time to deliver " + messageCount + " = " + (end - start)); for (int i = 0; i < ci.PublishedCount; i++) { results[Convert.ToInt32(ci.PublishedMessages[i])] = true; } for (int i = 0; i < messageCount; i++) { Assert.IsTrue(results[i]); } Assert.AreEqual(messageCount, ci.PublishedCount); tester.VerifyQueuesEmpty(); } }
public void Can_Deliver_Many_Messages() { using (var serviceBusRuntime = Create.MsmqRuntime <IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(0); tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); int messageCount = 1000; for (int i = 0; i < messageCount; i++) { string message = i.ToString(); serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); } DateTime start = DateTime.Now; tester.WaitForDeliveries(messageCount * 2, TimeSpan.FromMinutes(1), () => { }); bool[] results = new bool[messageCount]; DateTime end = DateTime.Now; System.Diagnostics.Trace.TraceInformation("Time to deliver messages " + messageCount + " = " + (end - start)); Assert.AreEqual(messageCount, ci.PublishedCount); for (int i = 0; i < ci.PublishedCount; i++) { int j = Convert.ToInt32(ci.PublishedMessages[i]); results[j] = true; } for (int i = 0; i < messageCount; i++) { Assert.IsTrue(results[i]); } tester.VerifyQueuesEmpty(); } }
public void WcfListener_Publishes_Incoming_Messages_Properly() { ServiceBusRuntime runtime = new ServiceBusRuntime(new DirectDeliveryCore()); runtime.AddListener(new ListenerEndpoint("test", "NamedPipeListener", "net.pipe://localhost/remotehello", typeof(IContract), new WcfServiceHostListener())); string message = "This is a test"; runtime.Subscribe(new SubscriptionEndpoint("test subscription", null, null, typeof(IContract), new ActionDispatcher((se, md) => { Assert.AreEqual(message, (string)md.Message); }), new PassThroughMessageFilter())); ServiceBusTest tester = new ServiceBusTest(runtime); tester.WaitForDeliveries(1, TimeSpan.FromSeconds(5), () => { Service.Use<IContract>("NamedPipeClient", contract => { contract.PublishThis(message); }); }); }
public void Heartbeat_Timeout_Causes_Failure_Request() { using (HeartbeatRuntimeService heartbeatService = new HeartbeatRuntimeService()) { using (ServiceBusRuntime runtime = new ServiceBusRuntime(new DirectDeliveryCore(), new TimerRuntimeService(), heartbeatService)) { heartbeatService.RegisterHeartbeat(new Heartbeat(Guid.NewGuid(), TimeSpan.FromSeconds(5), new PublishRequest(null, null, "BeatRequest"), new PublishRequest(null, null, "Success"), new PublishRequest(null, null, "Failure"), new PredicateMessageFilter(pr => (string)pr.Message == "BeatResponse"), TimeSpan.FromSeconds(1))); AutoResetEvent failEvt = new AutoResetEvent(false); AutoResetEvent successEvt = new AutoResetEvent(false); AutoResetEvent responseEvt = new AutoResetEvent(false); /*runtime.Subscribe(new SubscriptionEndpoint("BeatResponse", null, null, null, new ActionDispatcher((se, md) => { * responseEvt.Set(); ThreadPool.QueueUserWorkItem(s => { Thread.Sleep(2000); runtime.PublishOneWay(new PublishRequest(null, null, "BeatResponse")); }); * }), * new PredicateMessageFilter(pr => (string)pr.Message == "BeatRequest")));*/ runtime.Subscribe(new SubscriptionEndpoint("Success", null, null, null, new ActionDispatcher((se, md) => successEvt.Set()), new PredicateMessageFilter(pr => (string)pr.Message == "Success"))); runtime.Subscribe(new SubscriptionEndpoint("Failure", null, null, null, new ActionDispatcher((se, md) => failEvt.Set()), new PredicateMessageFilter(pr => (string)pr.Message == "Failure"))); ServiceBusTest tester = new ServiceBusTest(runtime); tester.StartAndStop(() => { if (!failEvt.WaitOne(TimeSpan.FromSeconds(10))) { if (!responseEvt.WaitOne(0)) { Assert.Fail("The heartbeat request was never published."); } if (successEvt.WaitOne(0)) { Assert.Fail("The heartbeat success event was published instead of the failure event"); } Assert.Fail("The heartbeat failure event was not published"); } }); } } }
public void SmtpDispatcher_Can_Send_Messages() { if (Config.FromMailAddress != null && Config.ToMailAddress != null) { ServiceBusRuntime dispatchRuntime = new ServiceBusRuntime(new DirectDeliveryCore()); var subscription = new SubscriptionEndpoint(Guid.NewGuid(), "Smtp Dispatcher", null, null, typeof(IContract), new SmtpDispatcher("this is a test", new MailAddress(Config.FromMailAddress), new MailAddress[] { new MailAddress(Config.ToMailAddress) }), new PassThroughMessageFilter()); ServiceBusTest tester = new ServiceBusTest(dispatchRuntime); tester.StartAndStop(() => { dispatchRuntime.Subscribe(subscription); dispatchRuntime.PublishOneWay(typeof(IContract), "PublishThis", "this is a test message"); }); } else { NUnit.Framework.Assert.Ignore("From and to email addresses must be configured to run smtp tests"); } }
public void WcfListener_Can_Listen_For_Raw_Messages() { ServiceBusRuntime runtime = new ServiceBusRuntime(new DirectDeliveryCore()); runtime.AddListener(new ListenerEndpoint("test", "PassThroughListener", "net.pipe://localhost/passthrough", typeof(IPassThroughServiceContract), new WcfServiceHostListener())); string action = "http://someaction"; string body = "some body"; runtime.Subscribe(new SubscriptionEndpoint("test subscription", null, null, typeof(IContract), new ActionDispatcher((se, md) => { Assert.AreEqual(action, ((Message)md.Message).Headers.Action); Assert.AreEqual(body, ((Message)md.Message).GetBody<string>()); }), new PassThroughMessageFilter())); ServiceBusTest tester = new ServiceBusTest(runtime); tester.WaitForDeliveries(1, TimeSpan.FromSeconds(5), () => { Service.Use<IPassThroughServiceContract>("PassThroughClient", contract => { Message message = Message.CreateMessage(MessageVersion.Default, action, body); contract.Send(message); }); }); }
public void WcfListener_Publishes_Incoming_Messages_Properly() { ServiceBusRuntime runtime = new ServiceBusRuntime(new DirectDeliveryCore()); runtime.AddListener(new ListenerEndpoint("test", "NamedPipeListener", "net.pipe://localhost/remotehello", typeof(IContract), new WcfServiceHostListener())); string message = "This is a test"; runtime.Subscribe(new SubscriptionEndpoint("test subscription", null, null, typeof(IContract), new ActionDispatcher((se, md) => { Assert.AreEqual(message, (string)md.Message); }), new PassThroughMessageFilter())); ServiceBusTest tester = new ServiceBusTest(runtime); tester.WaitForDeliveries(1, TimeSpan.FromSeconds(5), () => { Service.Use <IContract>("NamedPipeClient", contract => { contract.PublishThis(message); }); }); }
public void Can_Add_And_Remove_Listeners() { using (ServiceBusRuntime runtime = new ServiceBusRuntime(new DirectDeliveryCore(), new WcfManagementService())) { ServiceBusTest tester = new ServiceBusTest(runtime); tester.StartAndStop(() => { Service.Use <IServiceBusManagementService>(managementService => { SubscriptionEndpoint endpoint = new SubscriptionEndpoint(Guid.NewGuid(), "name of endpoint", "NamedPipeClient", "net.pipe://test/someservice/", typeof(IContract), new WcfProxyDispatcher(), null); managementService.Subscribe(endpoint); SubscriptionEndpoint added = managementService.ListSubscribers().First(); tester.AssertEqual(endpoint, added); managementService.Unsubscribe(endpoint.Id); Assert.IsEmpty(managementService.ListSubscribers()); }); }); } }
public void Can_Add_And_Remove_Subscriptions() { using(ServiceBusRuntime runtime = new ServiceBusRuntime(new DirectDeliveryCore(), new WcfManagementService())) { ServiceBusTest tester = new ServiceBusTest(runtime); tester.StartAndStop(() => { Service.Use<IServiceBusManagementService>(managementService => { ListenerEndpoint endpoint = new ListenerEndpoint(Guid.NewGuid(), "name of endpoint", "NamedPipeListener", "net.pipe://test/someservice/", typeof(IContract), new WcfServiceHostListener()); managementService.AddListener(endpoint); ListenerEndpoint added = managementService.ListListeners().First(); tester.AssertEqual(endpoint, added); managementService.RemoveListener(endpoint.Id); Assert.IsEmpty(managementService.ListListeners()); }); }); } }
public void Heartbeat_Response_Causes_Success_Request() { using (HeartbeatRuntimeService heartbeatService = new HeartbeatRuntimeService()) { using (ServiceBusRuntime runtime = new ServiceBusRuntime(new DirectDeliveryCore(), new TimerRuntimeService(), heartbeatService)) { heartbeatService.RegisterHeartbeat(new Heartbeat(Guid.NewGuid(), TimeSpan.FromSeconds(5), new PublishRequest(null, null, "BeatRequest"), new PublishRequest(null, null, "Success"), new PublishRequest(null, null, "Failure"), new PredicateMessageFilter(pr => (string)pr.Message == "BeatResponse"), TimeSpan.FromSeconds(1))); AutoResetEvent responseEvt = new AutoResetEvent(false); AutoResetEvent failEvt = new AutoResetEvent(false); AutoResetEvent successEvt = new AutoResetEvent(false); runtime.Subscribe(new SubscriptionEndpoint("BeatResponse", null, null, null, new ActionDispatcher((se, md) => { responseEvt.Set(); runtime.PublishOneWay(new PublishRequest(null, null, "BeatResponse")); }), new PredicateMessageFilter(pr => (string)pr.Message == "BeatRequest"))); runtime.Subscribe(new SubscriptionEndpoint("Success", null, null, null, new ActionDispatcher((se, md) => successEvt.Set()), new PredicateMessageFilter(pr => (string)pr.Message == "Success"))); runtime.Subscribe(new SubscriptionEndpoint("Failure", null, null, null, new ActionDispatcher((se, md) => failEvt.Set()), new PredicateMessageFilter(pr => (string)pr.Message == "Failure"))); ServiceBusTest tester = new ServiceBusTest(runtime); tester.StartAndStop(() => { if (!successEvt.WaitOne(TimeSpan.FromSeconds(10))) { if (!responseEvt.WaitOne(0)) { Assert.Fail("The heartbeat request was never published."); } if (failEvt.WaitOne(0)) { Assert.Fail("The heartbeat fail event was published instead of the success event"); } Assert.Fail("The heartbeat success event was not published"); } }); } } }
public void WcfListener_Can_Listen_For_Raw_Messages() { ServiceBusRuntime runtime = new ServiceBusRuntime(new DirectDeliveryCore()); runtime.AddListener(new ListenerEndpoint("test", "PassThroughListener", "net.pipe://localhost/passthrough", typeof(IPassThroughServiceContract), new WcfServiceHostListener())); string action = "http://someaction"; string body = "some body"; runtime.Subscribe(new SubscriptionEndpoint("test subscription", null, null, typeof(IContract), new ActionDispatcher((se, md) => { Assert.AreEqual(action, ((Message)md.Message).Headers.Action); Assert.AreEqual(body, ((Message)md.Message).GetBody <string>()); }), new PassThroughMessageFilter())); ServiceBusTest tester = new ServiceBusTest(runtime); tester.WaitForDeliveries(1, TimeSpan.FromSeconds(5), () => { Service.Use <IPassThroughServiceContract>("PassThroughClient", contract => { Message message = Message.CreateMessage(MessageVersion.Default, action, body); contract.Send(message); }); }); }
public void Dispatcher_Receives_Messages() { using (var serviceBusRuntime = Create.MsmqRuntime <IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(0); tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); tester.WaitForDeliveries(2, TimeSpan.FromSeconds(50), () => { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); Assert.AreEqual(1, ci.PublishedCount); Assert.AreEqual(message, ci.PublishedMessages[0]); tester.VerifyQueuesEmpty(); } }
public void Can_Deliver_Many_Messages_With_Failures() { using (var serviceBusRuntime = Create.MsmqRuntime<IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); tester.OnlyRetryOnce(); ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(0); ci.SetFailInterval(10); QueuedDeliveryCore qc = serviceBusRuntime.ServiceLocator.GetInstance<QueuedDeliveryCore>(); qc.RetryDelay = 1; tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); int messageCount = 1000; DateTime start = DateTime.Now; tester.WaitForDeliveries(messageCount*2, TimeSpan.FromMinutes(1), () => { for (int i = 0; i < messageCount; i++) { string message = i.ToString(); serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); } }); bool[] results = new bool[messageCount]; // Wait for delivery DateTime end = DateTime.Now; System.Diagnostics.Trace.TraceInformation("Time to deliver " + messageCount + " = " + (end - start)); for (int i = 0; i < ci.PublishedCount; i++) { results[Convert.ToInt32(ci.PublishedMessages[i])] = true; } for (int i = 0; i < messageCount; i++) { Assert.IsTrue(results[i]); } Assert.AreEqual(messageCount, ci.PublishedCount); tester.VerifyQueuesEmpty(); } }
public void Dispatcher_Receives_Messages() { using (var serviceBusRuntime = Create.MsmqRuntime<IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(0); tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); tester.WaitForDeliveries(2, TimeSpan.FromSeconds(50), () => { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); Assert.AreEqual(1, ci.PublishedCount); Assert.AreEqual(message, ci.PublishedMessages[0]); tester.VerifyQueuesEmpty(); } }
public void Failure_Queue_Receives_Messages_When_Retries_Maxed() { using (var serviceBusRuntime = Create.MsmqRuntime<IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); tester.OnlyRetryOnce(); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(3); tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); tester.WaitForDeliveriesAndFailures(1, 3, TimeSpan.FromSeconds(10), () => { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); Assert.AreEqual(0, ci.PublishedCount); MessageDelivery delivery = serviceBusRuntime.ServiceLocator.GetInstance<QueuedDeliveryCore>().FailureQueue.Dequeue(TimeSpan.FromSeconds(1)); Assert.IsNotNull(delivery); tester.VerifyQueuesEmpty(); Assert.AreEqual(3, ((IEnumerable<string>)delivery.Context[MessageDelivery.Exceptions]).Count()); } }
public void MessageFilter_Properly_Excludes_Messages() { using (var serviceBusRuntime = Create.MsmqRuntime<IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(1); tester.OnlyRetryOnce(); tester.AddTestListener(); tester.AddTestSubscription(ci, new BooleanMessageFilter(false)); try { tester.WaitForDeliveries(2, TimeSpan.FromSeconds(5), () => { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); } catch (TimeoutException) // should timeout while waiting { } Assert.AreEqual(0, ci.PublishedCount); tester.VerifyQueuesEmpty(); } }
public void MessageFilter_Properly_Includes_Messages() { using (var serviceBusRuntime = Create.MsmqRuntime<IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); tester.OnlyRetryOnce(); ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(0); tester.AddTestListener(); tester.AddTestSubscription(ci, new BooleanMessageFilter(true)); string message = "Publish this message"; tester.WaitForDeliveries(2, TimeSpan.FromMinutes(1), ()=> { serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); }); Assert.AreEqual(1, ci.PublishedCount); Assert.AreEqual(message, ci.PublishedMessages[0]); tester.VerifyQueuesEmpty(); } }
public void Retry_Queue_Receives_Initial_Failures() { using (var serviceBusRuntime = Create.MsmqRuntime<IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); string message = "Publish this message"; ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(1); tester.OnlyRetryOnce(); tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); bool failFirst = false; bool deliverSecond = false; tester.StartAndStop(() => { CountdownLatch latch = new CountdownLatch(2+1); serviceBusRuntime.MessageDelivered += (o, mdea) => { int tick; if ((tick = latch.Tick()) == 0) deliverSecond = true; Console.WriteLine("Tick deliver " + tick); }; serviceBusRuntime.MessageDeliveryFailed += (o, mdfea) => { int tick; if ((tick = latch.Tick()) == 1) failFirst = true; Console.WriteLine("Tick fail " + tick); }; serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); // Wait for delivery latch.Handle.WaitOne(TimeSpan.FromMinutes(1), false); // give it a minute }); Assert.AreEqual(true, failFirst); Assert.AreEqual(true, deliverSecond); Assert.AreEqual(1, ci.PublishedCount); Assert.AreEqual(message, ci.PublishedMessages[0]); tester.VerifyQueuesEmpty(); } }
public void Can_Deliver_Many_Messages() { using (var serviceBusRuntime = Create.MsmqRuntime<IContract>()) { ServiceBusTest tester = new ServiceBusTest(serviceBusRuntime); ContractImplementation ci = new ContractImplementation(); ci.SetFailCount(0); tester.AddTestListener(); tester.AddTestSubscription(ci, new PassThroughMessageFilter()); int messageCount = 1000; for (int i = 0; i < messageCount; i++) { string message = i.ToString(); serviceBusRuntime.PublishOneWay(new PublishRequest(typeof(IContract), "PublishThis", message)); } DateTime start = DateTime.Now; tester.WaitForDeliveries(messageCount*2, TimeSpan.FromMinutes(1), () => { }); bool[] results = new bool[messageCount]; DateTime end = DateTime.Now; System.Diagnostics.Trace.TraceInformation("Time to deliver messages "+messageCount+" = "+(end - start)); Assert.AreEqual(messageCount, ci.PublishedCount); for(int i = 0; i < ci.PublishedCount; i++) { int j = Convert.ToInt32(ci.PublishedMessages[i]); results[j] = true; } for (int i = 0; i < messageCount; i++) { Assert.IsTrue(results[i]); } tester.VerifyQueuesEmpty(); } }