PageRenderTime 750ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/ToMigrate/Raven.Tests/Storage/GeneralStorage.cs

http://github.com/ayende/ravendb
C# | 287 lines | 223 code | 59 blank | 5 comment | 3 complexity | c990a8d3c37dc65284c9c110556aa7e2 MD5 | raw file
Possible License(s): GPL-3.0, MPL-2.0-no-copyleft-exception, LGPL-2.1, Apache-2.0, BSD-3-Clause, CC-BY-SA-3.0
  1. //-----------------------------------------------------------------------
  2. // <copyright file="GeneralStorage.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Threading;
  9. using Raven.Client.Embedded;
  10. using Raven.Imports.Newtonsoft.Json.Linq;
  11. using Raven.Abstractions;
  12. using Raven.Abstractions.Data;
  13. using Raven.Json.Linq;
  14. using Raven.Database;
  15. using Raven.Database.Tasks;
  16. using Raven.Tests.Common;
  17. using Xunit;
  18. using System.Linq;
  19. using Raven.Abstractions.Extensions;
  20. using Raven.Database.Config;
  21. using Raven.Storage.Esent;
  22. using Xunit.Extensions;
  23. namespace Raven.Tests.Storage
  24. {
  25. public class GeneralStorage : RavenTest
  26. {
  27. private readonly EmbeddableDocumentStore store;
  28. private readonly DocumentDatabase db;
  29. public GeneralStorage()
  30. {
  31. store = NewDocumentStore();
  32. db = store.SystemDatabase;
  33. }
  34. public override void Dispose()
  35. {
  36. store.Dispose();
  37. base.Dispose();
  38. }
  39. [Fact]
  40. public void Can_query_by_id_prefix()
  41. {
  42. db.Documents.Put("abc", null, new RavenJObject { { "a", "b" } }, new RavenJObject(), null);
  43. db.Documents.Put("Raven/Databases/Hello", null, new RavenJObject { { "a", "b" } }, new RavenJObject(), null);
  44. db.Documents.Put("Raven/Databases/Northwind", null, new RavenJObject { { "a", "b" } }, new RavenJObject(), null);
  45. db.Documents.Put("Raven/Databases/Sys", null, new RavenJObject { { "a", "b" } }, new RavenJObject(), null);
  46. db.Documents.Put("Raven/Databases/Db", null, new RavenJObject { { "a", "b" } }, new RavenJObject(), null);
  47. db.Documents.Put("Raven/Database", null, new RavenJObject { { "a", "b" } }, new RavenJObject(), null);
  48. int nextPageStart = 0;
  49. var dbs = db.Documents.GetDocumentsWithIdStartingWith("Raven/Databases/", null, null, 0, 10, CancellationToken.None, ref nextPageStart);
  50. Assert.Equal(4, dbs.Length);
  51. }
  52. [Fact]
  53. public void WhenPutAnIdWithASpace_IdWillBeAGuid()
  54. {
  55. db.Documents.Put(" ", null, new RavenJObject { { "a", "b" } }, new RavenJObject(), null);
  56. var doc = db.Documents.GetDocumentsAsJson(0, 10, null, CancellationToken.None)
  57. .OfType<RavenJObject>()
  58. .Single();
  59. var id = doc["@metadata"].Value<string>("@id");
  60. Assert.False(string.IsNullOrWhiteSpace(id));
  61. Assert.DoesNotThrow(() => new Guid(id));
  62. }
  63. [Fact]
  64. public void CanGetDocumentCounts()
  65. {
  66. db.TransactionalStorage.Batch(actions =>
  67. {
  68. Assert.Equal(0, actions.Documents.GetDocumentsCount());
  69. actions.Documents.AddDocument("a", null, new RavenJObject(), new RavenJObject());
  70. });
  71. db.TransactionalStorage.Batch(actions =>
  72. {
  73. Assert.Equal(1, actions.Documents.GetDocumentsCount());
  74. RavenJObject metadata;
  75. Etag tag;
  76. actions.Documents.DeleteDocument("a", null, out metadata, out tag);
  77. });
  78. db.TransactionalStorage.Batch(actions => Assert.Equal(0, actions.Documents.GetDocumentsCount()));
  79. }
  80. [Fact]
  81. public void CanGetDocumentAfterEmptyEtag()
  82. {
  83. db.TransactionalStorage.Batch(actions => actions.Documents.AddDocument("a", null, new RavenJObject(), new RavenJObject()));
  84. db.TransactionalStorage.Batch(actions =>
  85. {
  86. var documents = actions.Documents.GetDocumentsAfter(Etag.Empty, 5, CancellationToken.None).ToArray();
  87. Assert.Equal(1, documents.Length);
  88. });
  89. }
  90. [Fact]
  91. public void CanGetDocumentAfterAnEtag()
  92. {
  93. db.TransactionalStorage.Batch(actions =>
  94. {
  95. actions.Documents.AddDocument("a", null, new RavenJObject(), new RavenJObject());
  96. actions.Documents.AddDocument("b", null, new RavenJObject(), new RavenJObject());
  97. actions.Documents.AddDocument("c", null, new RavenJObject(), new RavenJObject());
  98. });
  99. db.TransactionalStorage.Batch(actions =>
  100. {
  101. var doc = actions.Documents.DocumentByKey("a");
  102. var documents = actions.Documents.GetDocumentsAfter(doc.Etag, 5, CancellationToken.None).Select(x => x.Key).ToArray();
  103. Assert.Equal(2, documents.Length);
  104. Assert.Equal("b", documents[0]);
  105. Assert.Equal("c", documents[1]);
  106. });
  107. }
  108. [Fact]
  109. public void CanGetDocumentAfterAnEtagAfterDocumentUpdateWouldReturnThatDocument()
  110. {
  111. db.TransactionalStorage.Batch(actions =>
  112. {
  113. actions.Documents.AddDocument("a", null, new RavenJObject(), new RavenJObject());
  114. actions.Documents.AddDocument("b", null, new RavenJObject(), new RavenJObject());
  115. actions.Documents.AddDocument("c", null, new RavenJObject(), new RavenJObject());
  116. });
  117. Etag etag = null;
  118. db.TransactionalStorage.Batch(actions =>
  119. {
  120. var doc = actions.Documents.DocumentByKey("a");
  121. etag = doc.Etag;
  122. actions.Documents.AddDocument("a", null, new RavenJObject(), new RavenJObject());
  123. });
  124. db.TransactionalStorage.Batch(actions =>
  125. {
  126. var documents = actions.Documents.GetDocumentsAfter(etag, 5, CancellationToken.None).Select(x => x.Key).ToArray();
  127. Assert.Equal(3, documents.Length);
  128. Assert.Equal("b", documents[0]);
  129. Assert.Equal("c", documents[1]);
  130. Assert.Equal("a", documents[2]);
  131. });
  132. }
  133. [Fact]
  134. public void UpdatingDocumentWillKeepSameCount()
  135. {
  136. db.TransactionalStorage.Batch(actions =>
  137. {
  138. Assert.Equal(0, actions.Documents.GetDocumentsCount());
  139. actions.Documents.AddDocument("a", null, new RavenJObject(), new RavenJObject());
  140. });
  141. db.TransactionalStorage.Batch(actions =>
  142. {
  143. Assert.Equal(1, actions.Documents.GetDocumentsCount());
  144. actions.Documents.AddDocument("a", null, new RavenJObject(), new RavenJObject());
  145. });
  146. db.TransactionalStorage.Batch(actions => Assert.Equal(1, actions.Documents.GetDocumentsCount()));
  147. }
  148. [Fact]
  149. public void CanEnqueueAndPeek()
  150. {
  151. db.TransactionalStorage.Batch(actions => actions.Queue.EnqueueToQueue("ayende", new byte[] { 1, 2 }));
  152. db.TransactionalStorage.Batch(actions => Assert.Equal(new byte[] { 1, 2 }, actions.Queue.PeekFromQueue("ayende").First().Item1));
  153. }
  154. [Fact]
  155. public void PoisonMessagesWillBeDeleted()
  156. {
  157. db.TransactionalStorage.Batch(actions => actions.Queue.EnqueueToQueue("ayende", new byte[] { 1, 2 }));
  158. db.TransactionalStorage.Batch(actions =>
  159. {
  160. for (int i = 0; i < 6; i++)
  161. {
  162. actions.Queue.PeekFromQueue("ayende").First();
  163. }
  164. Assert.Equal(null, actions.Queue.PeekFromQueue("ayende").FirstOrDefault());
  165. });
  166. }
  167. [Fact]
  168. public void CanDeleteQueuedData()
  169. {
  170. db.TransactionalStorage.Batch(actions => actions.Queue.EnqueueToQueue("ayende", new byte[] { 1, 2 }));
  171. db.TransactionalStorage.Batch(actions =>
  172. {
  173. actions.Queue.DeleteFromQueue("ayende", actions.Queue.PeekFromQueue("ayende").First().Item2);
  174. Assert.Equal(null, actions.Queue.PeekFromQueue("ayende").FirstOrDefault());
  175. });
  176. }
  177. [Fact]
  178. public void CanGetNewIdentityValues()
  179. {
  180. db.TransactionalStorage.Batch(actions =>
  181. {
  182. var nextIdentityValue = actions.General.GetNextIdentityValue("users");
  183. Assert.Equal(1, nextIdentityValue);
  184. nextIdentityValue = actions.General.GetNextIdentityValue("users");
  185. Assert.Equal(2, nextIdentityValue);
  186. });
  187. db.TransactionalStorage.Batch(actions =>
  188. {
  189. var nextIdentityValue = actions.General.GetNextIdentityValue("users");
  190. Assert.Equal(3, nextIdentityValue);
  191. nextIdentityValue = actions.General.GetNextIdentityValue("users");
  192. Assert.Equal(4, nextIdentityValue);
  193. });
  194. }
  195. [Fact]
  196. public void CanGetNewIdentityValuesWhenUsingTwoDifferentItems()
  197. {
  198. db.TransactionalStorage.Batch(actions =>
  199. {
  200. var nextIdentityValue = actions.General.GetNextIdentityValue("users");
  201. Assert.Equal(1, nextIdentityValue);
  202. nextIdentityValue = actions.General.GetNextIdentityValue("blogs");
  203. Assert.Equal(1, nextIdentityValue);
  204. });
  205. db.TransactionalStorage.Batch(actions =>
  206. {
  207. var nextIdentityValue = actions.General.GetNextIdentityValue("blogs");
  208. Assert.Equal(2, nextIdentityValue);
  209. nextIdentityValue = actions.General.GetNextIdentityValue("users");
  210. Assert.Equal(2, nextIdentityValue);
  211. });
  212. }
  213. [Fact]
  214. public void check_alerts_document()
  215. {
  216. db.TransactionalStorage.Batch(actions =>
  217. {
  218. Assert.DoesNotThrow(() =>
  219. {
  220. var doc = actions.Documents.DocumentByKey(Constants.RavenAlerts);
  221. if (doc == null)
  222. return;
  223. throw new InvalidOperationException("Alerts document data: " + doc.DataAsJson);
  224. });
  225. });
  226. }
  227. }
  228. }