PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/Raven.Tests.Issues/RavenDB-3491.cs

http://github.com/ravendb/ravendb
C# | 259 lines | 207 code | 52 blank | 0 comment | 0 complexity | d203182b58f38a2b3d7715aacf289e37 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1, MPL-2.0-no-copyleft-exception, Apache-2.0, BSD-3-Clause
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using FluentAssertions;
  9. using Jint.Parser;
  10. using Raven.Abstractions.Data;
  11. using Raven.Database.FileSystem.Extensions;
  12. using Raven.Json.Linq;
  13. using Raven.Tests.Common.Dto;
  14. using Raven.Tests.Helpers;
  15. using Xunit;
  16. namespace Raven.Tests.Issues
  17. {
  18. public class RavenDB_3491 : RavenTestBase
  19. {
  20. private readonly TimeSpan waitForDocTimeout = TimeSpan.FromSeconds(20);
  21. [Fact]
  22. public void SubscribtionWithEtag()
  23. {
  24. using (var store = NewDocumentStore())
  25. {
  26. var us1 = new User { Id = "users/1", Name = "john", Age = 22 };
  27. var us2 = new User { Id = "users/2", Name = "KY", Age = 30 };
  28. var us3 = new User { Id = "users/3", Name = "BEN", Age = 30 };
  29. var us4 = new User { Id = "users/4", Name = "Hila", Age = 29 };
  30. var us5 = new User { Id = "users/5", Name = "Revital", Age = 34 };
  31. using (var session = store.OpenSession())
  32. {
  33. session.Store(us1);
  34. session.Store(us2);
  35. session.Store(us3);
  36. session.Store(us4);
  37. session.Store(us5);
  38. session.SaveChanges();
  39. var user2Etag = session.Advanced.GetEtagFor(us2);
  40. var id = store.Subscriptions.Create(new SubscriptionCriteria
  41. {
  42. StartEtag = user2Etag
  43. });
  44. var users = new List<RavenJObject>();
  45. using (var subscription = store.Subscriptions.Open(id, new SubscriptionConnectionOptions()))
  46. {
  47. var docs = new BlockingCollection<RavenJObject>();
  48. var keys = new BlockingCollection<string>();
  49. var ages = new BlockingCollection<int>();
  50. subscription.Subscribe(x => keys.Add(x[Constants.Metadata].Value<string>("@id")));
  51. subscription.Subscribe(x => ages.Add(x.Value<int>("Age")));
  52. subscription.Subscribe(docs.Add);
  53. RavenJObject doc;
  54. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  55. users.Push(doc);
  56. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  57. users.Push(doc);
  58. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  59. users.Push(doc);
  60. var cnt = users.Count;
  61. Assert.Equal(3, cnt);
  62. string key;
  63. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  64. Assert.Equal("users/3", key);
  65. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  66. Assert.Equal("users/4", key);
  67. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  68. Assert.Equal("users/5", key);
  69. int age;
  70. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  71. Assert.Equal(30, age);
  72. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  73. Assert.Equal(29, age);
  74. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  75. Assert.Equal(34, age);
  76. }
  77. }
  78. }
  79. }
  80. [Fact]
  81. public void StronglyTypedSubscribtionWithStartEtag()
  82. {
  83. using (var store = NewDocumentStore())
  84. {
  85. var us1 = new User { Id = "users/1", Name = "john", Age = 22 };
  86. var us2 = new User { Id = "users/2", Name = "KY", Age = 30 };
  87. var us3 = new User { Id = "users/3", Name = "BEN", Age = 30 };
  88. var us4 = new User { Id = "users/4", Name = "Hila", Age = 29 };
  89. var us5 = new User { Id = "users/5", Name = "Revital", Age = 34 };
  90. using (var session = store.OpenSession())
  91. {
  92. session.Store(us1);
  93. session.Store(us2);
  94. session.Store(us3);
  95. session.Store(us4);
  96. session.Store(us5);
  97. session.SaveChanges();
  98. var user2Etag = session.Advanced.GetEtagFor(us2);
  99. var id = store.Subscriptions.Create(new SubscriptionCriteria<User>
  100. {
  101. StartEtag = user2Etag
  102. });
  103. var users = new List<User>();
  104. using (var subscription = store.Subscriptions.Open<User>(id, new SubscriptionConnectionOptions()))
  105. {
  106. var docs = new BlockingCollection<User>();
  107. var keys = new BlockingCollection<string>();
  108. var ages = new BlockingCollection<int>();
  109. subscription.Subscribe(x => keys.Add(x.Id));
  110. subscription.Subscribe(x => ages.Add(x.Age));
  111. subscription.Subscribe(docs.Add);
  112. User doc;
  113. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  114. users.Push(doc);
  115. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  116. users.Push(doc);
  117. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  118. users.Push(doc);
  119. var cnt = users.Count;
  120. Assert.Equal(3, cnt);
  121. string key;
  122. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  123. Assert.Equal("users/3", key);
  124. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  125. Assert.Equal("users/4", key);
  126. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  127. Assert.Equal("users/5", key);
  128. int age;
  129. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  130. Assert.Equal(30, age);
  131. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  132. Assert.Equal(29, age);
  133. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  134. Assert.Equal(34, age);
  135. }
  136. }
  137. }
  138. }
  139. [Fact]
  140. public void SubscribtionWithEtag_MultipleOpens()
  141. {
  142. using (var store = NewDocumentStore())
  143. {
  144. var us1 = new User { Id = "users/1", Name = "john", Age = 22 };
  145. var us2 = new User { Id = "users/2", Name = "KY", Age = 30 };
  146. var us3 = new User { Id = "users/3", Name = "BEN", Age = 30 };
  147. var us4 = new User { Id = "users/4", Name = "Hila", Age = 29 };
  148. var us5 = new User { Id = "users/5", Name = "Revital", Age = 34 };
  149. long subscriptionId;
  150. using (var session = store.OpenSession())
  151. {
  152. session.Store(us1);
  153. session.Store(us2);
  154. session.Store(us3);
  155. session.Store(us4);
  156. session.Store(us5);
  157. session.SaveChanges();
  158. var user2Etag = session.Advanced.GetEtagFor(us2);
  159. subscriptionId = store.Subscriptions.Create(new SubscriptionCriteria
  160. {
  161. StartEtag = user2Etag
  162. });
  163. var users = new List<RavenJObject>();
  164. using (var subscription = store.Subscriptions.Open(subscriptionId, new SubscriptionConnectionOptions()))
  165. {
  166. var docs = new BlockingCollection<RavenJObject>();
  167. var keys = new BlockingCollection<string>();
  168. var ages = new BlockingCollection<int>();
  169. subscription.Subscribe(x => keys.Add(x[Constants.Metadata].Value<string>("@id")));
  170. subscription.Subscribe(x => ages.Add(x.Value<int>("Age")));
  171. subscription.Subscribe(docs.Add);
  172. RavenJObject doc;
  173. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  174. users.Push(doc);
  175. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  176. users.Push(doc);
  177. Assert.True(docs.TryTake(out doc, waitForDocTimeout));
  178. users.Push(doc);
  179. var cnt = users.Count;
  180. Assert.Equal(3, cnt);
  181. string key;
  182. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  183. Assert.Equal("users/3", key);
  184. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  185. Assert.Equal("users/4", key);
  186. Assert.True(keys.TryTake(out key, waitForDocTimeout));
  187. Assert.Equal("users/5", key);
  188. int age;
  189. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  190. Assert.Equal(30, age);
  191. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  192. Assert.Equal(29, age);
  193. Assert.True(ages.TryTake(out age, waitForDocTimeout));
  194. Assert.Equal(34, age);
  195. }
  196. }
  197. using (var subscription = store.Subscriptions.Open(subscriptionId, new SubscriptionConnectionOptions()))
  198. {
  199. var docs = new BlockingCollection<RavenJObject>();
  200. subscription.Subscribe(o => docs.Add(o));
  201. RavenJObject item;
  202. Assert.False(docs.TryTake(out item,TimeSpan.FromMilliseconds(250)));
  203. }
  204. }
  205. }
  206. }
  207. }