SubscriptionTests.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. using System;
  2. using Abc.Zebus.Routing;
  3. using Abc.Zebus.Testing.Extensions;
  4. using Abc.Zebus.Testing.Measurements;
  5. using Abc.Zebus.Tests.Messages;
  6. using NUnit.Framework;
  7. namespace Abc.Zebus.Tests
  8. {
  9. [TestFixture]
  10. public partial class SubscriptionTests
  11. {
  12. [SetUp]
  13. public void Setup()
  14. {
  15. _field = Environment.TickCount;
  16. }
  17. private int _field;
  18. [TestCase("whatever")]
  19. [TestCase("*")]
  20. [TestCase("#")]
  21. public void single_star_should_always_match(string routingKey)
  22. {
  23. var subscription = CreateSubscription("*");
  24. subscription.Matches(BindingKey.Split(routingKey)).ShouldBeTrue();
  25. }
  26. [TestCase("whatever")]
  27. [TestCase("*")]
  28. [TestCase("#")]
  29. public void single_dash_should_always_match(string routingKey)
  30. {
  31. var subscription = CreateSubscription("#");
  32. subscription.Matches(BindingKey.Split(routingKey)).ShouldBeTrue();
  33. }
  34. [TestCase("whatever")]
  35. [TestCase("*")]
  36. [TestCase("#")]
  37. public void empty_bindingkey_should_always_match(string routingKey)
  38. {
  39. var subscription = new Subscription(new MessageTypeId(typeof(FakeCommand)), BindingKey.Empty);
  40. subscription.Matches(BindingKey.Split(routingKey)).ShouldBeTrue();
  41. }
  42. [TestCase("a.b.c")]
  43. [TestCase("b.c.d")]
  44. public void stars_should_always_match_if_same_number_of_parts(string routingKey)
  45. {
  46. var subscription = CreateSubscription("*.*.*");
  47. subscription.Matches(BindingKey.Split(routingKey)).ShouldBeTrue();
  48. }
  49. [TestCase("a.b.*")]
  50. [TestCase("a.*.*")]
  51. [TestCase("a.*.c")]
  52. [TestCase("*.b.c")]
  53. public void binding_key_with_star_should_match_routing_key(string bindingKey)
  54. {
  55. var subscription = CreateSubscription(bindingKey);
  56. subscription.Matches(BindingKey.Split("a.b.c")).ShouldBeTrue();
  57. }
  58. [TestCase("a.b.#")]
  59. [TestCase("a.#")]
  60. public void binding_key_with_dashr_should_match_routing_key(string bindingKey)
  61. {
  62. var subscription = CreateSubscription(bindingKey);
  63. subscription.Matches(BindingKey.Split("a.b.c")).ShouldBeTrue();
  64. }
  65. [TestCase("a.b", "a.b.c.d")]
  66. [TestCase("d.*", "a.b.c.d")]
  67. [TestCase("d.#", "a.b.c.d")]
  68. public void should_not_match_binding_key(string routingKey, string bindingKey)
  69. {
  70. var subscription = CreateSubscription(bindingKey);
  71. subscription.Matches(BindingKey.Split(routingKey)).ShouldBeFalse();
  72. }
  73. [Test]
  74. public void exact_same_routing_key_should_match_binding_key()
  75. {
  76. var subscription = CreateSubscription("a.b.c");
  77. subscription.Matches(BindingKey.Split("a.b.c")).ShouldBeTrue();
  78. }
  79. [Test]
  80. public void should_create_subscription_by_example()
  81. {
  82. var subscription = Subscription.ByExample(x => new FakeRoutableCommand(12, "name"));
  83. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommand)));
  84. subscription.BindingKey.ShouldEqual(BindingKey.Split("12.name.*"));
  85. }
  86. [Test]
  87. public void should_create_subscription_by_example_with_field()
  88. {
  89. var subscription = Subscription.ByExample(x => new FakeRoutableCommand(_field, "name"));
  90. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommand)));
  91. subscription.BindingKey.ShouldEqual(new BindingKey(_field.ToString(), "name", "*"));
  92. }
  93. [Test]
  94. public void should_create_subscription_by_example_with_method()
  95. {
  96. var subscription = Subscription.ByExample(x => new FakeRoutableCommand(GetFieldValue(), "name"));
  97. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommand)));
  98. subscription.BindingKey.ShouldEqual(new BindingKey(_field.ToString(), "name", "*"));
  99. }
  100. [Test]
  101. public void should_create_subscription_by_example_with_placeholder()
  102. {
  103. var subscription = Subscription.ByExample(x => new FakeRoutableCommand(x.Any<decimal>(), "name"));
  104. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommand)));
  105. subscription.BindingKey.ShouldEqual(BindingKey.Split("*.name.*"));
  106. }
  107. [Test]
  108. public void should_create_subscription_by_example_with_variable()
  109. {
  110. var value = Environment.TickCount;
  111. var subscription = Subscription.ByExample(x => new FakeRoutableCommand(value, "name"));
  112. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommand)));
  113. subscription.BindingKey.ShouldEqual(new BindingKey(value.ToString(), "name", "*"));
  114. }
  115. [Test]
  116. public void should_create_subscription_from_complex_predicate()
  117. {
  118. var otherId = Guid.NewGuid();
  119. var subscription = Subscription.Matching<FakeRoutableCommand>(x => x.Id == 12 && x.OtherId == otherId && x.Name == "name");
  120. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommand)));
  121. subscription.BindingKey.ShouldEqual(new BindingKey("12", "name", otherId.ToString()));
  122. }
  123. [Test]
  124. public void should_create_subscription_from_predicate_with_unary_expressions()
  125. {
  126. var subscription = Subscription.Matching<FakeRoutableCommandWithBoolean>(x => !x.IsAMatch);
  127. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommandWithBoolean)));
  128. subscription.BindingKey.ShouldEqual(new BindingKey("False"));
  129. subscription = Subscription.Matching<FakeRoutableCommandWithBoolean>(x => x.IsAMatch);
  130. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommandWithBoolean)));
  131. subscription.BindingKey.ShouldEqual(new BindingKey("True"));
  132. subscription = Subscription.Matching<FakeRoutableCommandWithBoolean>(x => !(!x.IsAMatch));
  133. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommandWithBoolean)));
  134. subscription.BindingKey.ShouldEqual(new BindingKey("True"));
  135. }
  136. [Test]
  137. public void should_create_subscription_from_predicate_with_enum()
  138. {
  139. var subscription = Subscription.Matching<FakeRoutableCommandWithEnum>(x => x.Test1 == TestEnum1.Bar);
  140. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommandWithEnum)));
  141. subscription.BindingKey.ShouldEqual(new BindingKey(TestEnum1.Bar.ToString(), "*"));
  142. }
  143. [Test]
  144. public void should_create_subscription_from_inversed_predicate_with_enum()
  145. {
  146. var subscription = Subscription.Matching<FakeRoutableCommandWithEnum>(x => TestEnum1.Bar == x.Test1);
  147. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommandWithEnum)));
  148. subscription.BindingKey.ShouldEqual(new BindingKey(TestEnum1.Bar.ToString(), "*"));
  149. }
  150. [Test]
  151. public void should_create_subscription_from_complex_predicate_with_enum()
  152. {
  153. var subscription = Subscription.Matching<FakeRoutableCommandWithEnum>(x => x.Test1 == TestEnum1.Bar && x.Test2 == TestEnum2.Buz);
  154. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommandWithEnum)));
  155. subscription.BindingKey.ShouldEqual(new BindingKey(TestEnum1.Bar.ToString(), TestEnum2.Buz.ToString()));
  156. }
  157. [Test]
  158. public void should_create_subscription_from_simple_predicate()
  159. {
  160. var subscription = Subscription.Matching<FakeRoutableCommand>(x => x.Id == GetFieldValue());
  161. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommand)));
  162. subscription.BindingKey.ShouldEqual(new BindingKey(GetFieldValue().ToString(), "*", "*"));
  163. }
  164. [Test]
  165. public void should_create_subscription_from_simple_predicate_in_generic_context()
  166. {
  167. var subscription = CreateSubscription<FakeRoutableCommand>();
  168. subscription.MessageTypeId.ShouldEqual(new MessageTypeId(typeof(FakeRoutableCommand)));
  169. subscription.BindingKey.ShouldEqual(new BindingKey(GetFieldValue().ToString(), "*", "*"));
  170. }
  171. private Subscription CreateSubscription<TMessage>()
  172. where TMessage : FakeRoutableCommand
  173. {
  174. return Subscription.Matching<TMessage>(x => x.Id == GetFieldValue());
  175. }
  176. [Test]
  177. public void should_be_equatable()
  178. {
  179. var otherId = Guid.NewGuid();
  180. var subscription1 = Subscription.Matching<FakeRoutableCommand>(x => x.Id == 12 && x.OtherId == otherId);
  181. var subscription2 = Subscription.Matching<FakeRoutableCommand>(x => x.Id == 12 && x.OtherId == otherId);
  182. subscription1.GetHashCode().ShouldEqual(subscription2.GetHashCode());
  183. subscription1.Equals(subscription2).ShouldBeTrue();
  184. subscription1.Equals((object)subscription2).ShouldBeTrue();
  185. }
  186. [Test]
  187. [Ignore]
  188. [Category("ManualOnly")]
  189. [TestCase("a.b", "a.b.c.d")]
  190. [TestCase("d.*", "a.b.c.d")]
  191. [TestCase("d.#", "a.b.c.d")]
  192. public void MeasurePerformance(string routingKey, string bindingKey)
  193. {
  194. var subscription = CreateSubscription(bindingKey);
  195. var key = BindingKey.Split(routingKey);
  196. Measure.Execution(x =>
  197. {
  198. x.Iteration = 1000000;
  199. x.WarmUpIteration = 1000;
  200. x.Action = _ => subscription.Matches(key);
  201. });
  202. }
  203. private Subscription CreateSubscription(string bindingKey)
  204. {
  205. return new Subscription(new MessageTypeId(typeof(FakeCommand)), BindingKey.Split(bindingKey));
  206. }
  207. private int GetFieldValue()
  208. {
  209. return _field;
  210. }
  211. }
  212. }