PageRenderTime 46ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/Microsoft.AspNet.SignalR.Tests/Server/ScaleOutMessageBusFacts.cs

https://github.com/mip1983/SignalR
C# | 188 lines | 148 code | 33 blank | 7 comment | 8 complexity | 641b08deac0acb37a4253cf407254914 MD5 | raw file
Possible License(s): Apache-2.0, CC-BY-SA-3.0
  1. using System;
  2. using System.Linq;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNet.SignalR.Tests.Infrastructure;
  6. using Xunit;
  7. namespace Microsoft.AspNet.SignalR.Tests.Server
  8. {
  9. public class ScaleOutMessageBusFacts
  10. {
  11. [Fact]
  12. public void NewSubscriptionGetsAllMessages()
  13. {
  14. var dr = new DefaultDependencyResolver();
  15. var bus = new TestScaleoutBus(dr, topicCount: 5);
  16. var subscriber = new TestSubscriber(new[] { "key" });
  17. var wh = new ManualResetEventSlim(initialState: false);
  18. IDisposable subscription = null;
  19. try
  20. {
  21. var firstMessages = new[] { new Message("test1", "key", "1"),
  22. new Message("test2", "key", "2") };
  23. bus.SendMany(firstMessages);
  24. subscription = bus.Subscribe(subscriber, null, result =>
  25. {
  26. if (!result.Terminal)
  27. {
  28. var ms = result.GetMessages().ToList();
  29. Assert.Equal(2, ms.Count);
  30. Assert.Equal("key", ms[0].Key);
  31. Assert.Equal("x", ms[0].Value);
  32. Assert.Equal("key", ms[1].Key);
  33. Assert.Equal("y", ms[1].Value);
  34. wh.Set();
  35. return TaskAsyncHelper.True;
  36. }
  37. return TaskAsyncHelper.False;
  38. }, 10);
  39. bus.SendMany(new[] { new Message("test1", "key", "x"),
  40. new Message("test1", "key", "y") });
  41. Assert.True(wh.Wait(TimeSpan.FromSeconds(10)));
  42. }
  43. finally
  44. {
  45. if (subscription != null)
  46. {
  47. subscription.Dispose();
  48. }
  49. }
  50. }
  51. [Fact]
  52. public void SubscriptionWithExistingCursor()
  53. {
  54. var dr = new DefaultDependencyResolver();
  55. var bus = new TestScaleoutBus(dr, topicCount: 2);
  56. var subscriber = new TestSubscriber(new[] { "key" });
  57. var cd = new CountDownRange<int>(Enumerable.Range(2, 4));
  58. IDisposable subscription = null;
  59. // test, test2 = 1
  60. // test1, test3 = 0
  61. //
  62. // Cursor 1, 1
  63. bus.SendMany(new[] {
  64. new Message("test", "key", "1"),
  65. new Message("test", "key", "50")
  66. });
  67. // Cursor 0,1|1,1
  68. bus.SendMany(new[] {
  69. new Message("test1", "key", "51")
  70. });
  71. bus.SendMany(new[]{
  72. new Message("test2", "key", "2"),
  73. new Message("test3", "key", "3"),
  74. new Message("test2", "key", "4"),
  75. });
  76. try
  77. {
  78. subscription = bus.Subscribe(subscriber, "0,00000001|1,00000001", result =>
  79. {
  80. foreach (var m in result.GetMessages())
  81. {
  82. int n = Int32.Parse(m.Value);
  83. Assert.True(cd.Mark(n));
  84. }
  85. return TaskAsyncHelper.True;
  86. }, 10);
  87. bus.SendMany(new[] { new Message("test", "key", "5") });
  88. Assert.True(cd.Wait(TimeSpan.FromSeconds(10)));
  89. }
  90. finally
  91. {
  92. if (subscription != null)
  93. {
  94. subscription.Dispose();
  95. }
  96. }
  97. }
  98. [Fact]
  99. public void SubscriptionPublishingAfter()
  100. {
  101. var dr = new DefaultDependencyResolver();
  102. var bus = new TestScaleoutBus(dr, topicCount: 5);
  103. var subscriber = new TestSubscriber(new[] { "key" });
  104. IDisposable subscription = null;
  105. var wh = new ManualResetEventSlim();
  106. // test, test2 = 1
  107. // test1, test3 = 0
  108. try
  109. {
  110. subscription = bus.Subscribe(subscriber, null, result =>
  111. {
  112. if (!result.Terminal)
  113. {
  114. var messages = result.GetMessages().ToList();
  115. Assert.Equal(1, messages.Count);
  116. Assert.Equal("connected", messages[0].Value);
  117. wh.Set();
  118. }
  119. return TaskAsyncHelper.True;
  120. }, 10);
  121. bus.SendMany(new[] { new Message("test", "key", "connected") });
  122. Assert.True(wh.Wait(TimeSpan.FromSeconds(10)));
  123. }
  124. finally
  125. {
  126. if (subscription != null)
  127. {
  128. subscription.Dispose();
  129. }
  130. }
  131. }
  132. private class TestScaleoutBus : ScaleoutMessageBus
  133. {
  134. private long[] _topics;
  135. public TestScaleoutBus(IDependencyResolver resolver, int topicCount = 1)
  136. : base(resolver)
  137. {
  138. _topics = new long[topicCount];
  139. }
  140. public Task SendMany(Message[] messages)
  141. {
  142. return Send(messages);
  143. }
  144. protected override Task Send(Message[] messages)
  145. {
  146. foreach (var g in messages.GroupBy(m => m.Source))
  147. {
  148. int topic = Math.Abs(g.Key.GetHashCode()) % _topics.Length;
  149. OnReceived(topic.ToString(), (ulong)Interlocked.Increment(ref _topics[topic]), g.ToArray()).Wait();
  150. }
  151. return TaskAsyncHelper.Empty;
  152. }
  153. }
  154. }
  155. }