public void SubscriptionDoesNotGetNewMessagesWhenTopicStoreOverrunByOtherStream() { var sp = ServiceProviderHelper.CreateServiceProvider(services => { services.Configure <MessageBusOptions>(options => { options.MessageBufferSize = 10; }); }); using (var bus = ActivatorUtilities.CreateInstance <TestScaleoutBus>(sp, 2)) { var subscriber = new TestSubscriber(new[] { "key" }); IDisposable subscription = null; // The min fragment size is 8 and min fragments is 5 var expectedValues = Enumerable.Range(171, 8); var cd = new OrderedCountDownRange <int>(expectedValues); // This will overwrite the buffer ending up with (40 - 79) for stream 2 for (int i = 0; i < 80; i++) { bus.Publish(0, (ulong)i, new[] { new Message("test", "key", i.ToString()) }); } // This will overwrite the buffer with (140 - 179) for stream 1 for (int i = 100; i < 180; i++) { bus.Publish(1, (ulong)i, new[] { new Message("test", "key", i.ToString()) }); } try { subscription = bus.Subscribe(subscriber, "s-0,27|1,AA", (result, state) => { foreach (var m in result.GetMessages()) { int n = Int32.Parse(m.GetString()); cd.Expect(n); } return(TaskAsyncHelper.True); }, 100, null); Assert.True(cd.Wait(TimeSpan.FromSeconds(10))); } finally { if (subscription != null) { subscription.Dispose(); } } } }
public void SubscriptionGetsCorrectCursorsIfLessKeysThanStreams() { var sp = ServiceProviderHelper.CreateServiceProvider(); var ta = new TypeActivator(); using (var bus = ta.CreateInstance <TestScaleoutBus>(sp, 2)) { var subscriber = new TestSubscriber(new[] { "key" }); IDisposable subscription = null; var cd = new OrderedCountDownRange <int>(new[] { 101, 11 }); bus.Publish(0, 10ul, new[] { new Message("test", "key", "100") }); bus.Publish(1, 10ul, new[] { new Message("test", "key", "10") }); try { subscription = bus.Subscribe(subscriber, "s-0,0", (result, state) => { foreach (var m in result.GetMessages()) { int n = Int32.Parse(m.GetString()); cd.Expect(n); } return(TaskAsyncHelper.True); }, 100, null); bus.Publish(0, 11ul, new[] { new Message("test", "key", "101") }, new DateTime(TimeSpan.TicksPerDay * 1)); bus.Publish(1, 11ul, new[] { new Message("test", "key", "11") }, new DateTime(TimeSpan.TicksPerDay * 2)); Assert.True(cd.Wait(TimeSpan.FromSeconds(10))); } finally { if (subscription != null) { subscription.Dispose(); } } } }
public void SubscriptionPullFromMultipleStreamsInFairOrder() { var sp = ServiceProviderHelper.CreateServiceProvider(); var ta = new TypeActivator(); using (var bus = ta.CreateInstance <TestScaleoutBus>(sp, 3)) { var subscriber = new TestSubscriber(new[] { "key" }); var cd = new OrderedCountDownRange <int>(new[] { 1, 2, 4, 3 }); IDisposable subscription = null; bus.Publish(0, 1, new[] { new Message("test", "key", "3"), new Message("test", "key2", "5"), }, new DateTime(TimeSpan.TicksPerDay * 5, DateTimeKind.Local)); bus.Publish(1, 1, new[] { new Message("test", "key", "1"), new Message("test", "key2", "foo") }, new DateTime(TimeSpan.TicksPerDay * 1, DateTimeKind.Local)); bus.Publish(2, 1, new[] { new Message("test", "key", "2"), new Message("test", "key", "4") }, new DateTime(TimeSpan.TicksPerDay * 2, DateTimeKind.Local)); try { subscription = bus.Subscribe(subscriber, "s-0,0|1,0|2,0", (result, state) => { foreach (var m in result.GetMessages()) { int n = Int32.Parse(m.GetString()); Assert.True(cd.Expect(n)); } return(TaskAsyncHelper.True); }, 10, null); Assert.True(cd.Wait(TimeSpan.FromSeconds(10))); } finally { if (subscription != null) { subscription.Dispose(); } } } }
public void SubscriptionGetsNewMessagesWhenTopicStoreOverrun() { var sp = ServiceProviderHelper.CreateServiceProvider(services => { services.SetupOptions <SignalROptions>(options => { options.MessageBus.MessageBufferSize = 10; }); }); var ta = new TypeActivator(); using (var bus = ta.CreateInstance <TestScaleoutBus>(sp)) { var subscriber = new TestSubscriber(new[] { "key" }); IDisposable subscription = null; // 16-49 is the valid range var cd = new OrderedCountDownRange <int>(Enumerable.Range(16, 33)); var results = new List <bool>(); for (int i = 0; i < 50; i++) { bus.Publish(0, (ulong)i, new[] { new Message("test", "key", i.ToString()) }); } try { subscription = bus.Subscribe(subscriber, "s-0,1", (result, state) => { foreach (var m in result.GetMessages()) { int n = Int32.Parse(m.GetString()); cd.Expect(n); } return(TaskAsyncHelper.True); }, 10, null); Assert.True(cd.Wait(TimeSpan.FromSeconds(5))); } finally { if (subscription != null) { subscription.Dispose(); } } } }
//[InlineData(HostType.HttpListener, TransportType.ServerSentEvents, MessageBusType.Default)] //[InlineData(HostType.HttpListener, TransportType.LongPolling, MessageBusType.Default)] public void TransportsQueueIncomingMessagesCorrectly(HostType hostType, TransportType transportType, MessageBusType messageBusType) { using (var host = CreateHost(hostType, transportType)) { host.Initialize(messageBusType: messageBusType); var hubConnection = CreateHubConnection(host); var proxy = hubConnection.CreateHubProxy("OnConnectedBufferHub"); var bufferCountdown = new OrderedCountDownRange <int>(new[] { 0, 1 }); var bufferMeCalls = 0; using (hubConnection) { var wh = new ManualResetEvent(false); proxy.On <int>("bufferMe", (val) => { // Ensure correct ordering of the incoming messages Assert.True(bufferCountdown.Expect(val)); bufferMeCalls++; Assert.Equal(hubConnection.State, ConnectionState.Connected); }); proxy.On("pong", () => { Assert.Equal(2, bufferMeCalls); wh.Set(); }); hubConnection.Start(host.Transport).Wait(); // The calls should be complete once the start task returns Assert.Equal(2, bufferMeCalls); proxy.Invoke("Ping").Wait(); Assert.True(wh.WaitOne(TimeSpan.FromSeconds(10))); } } }