/ToMigrate/Raven.Tests/Storage/Voron/ListStorageActionsTests.cs

https://github.com/fitzchak/ravendb · C# · 509 lines · 422 code · 82 blank · 5 comment · 4 complexity · eeecbf697b2de508f63cc7003aed54eb MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="ListStorageActionsTests.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. // -----------------------------------------------------------------------
  6. using System;
  7. using System.Globalization;
  8. using Raven.Abstractions;
  9. using Raven.Tests.Common;
  10. namespace Raven.Tests.Storage.Voron
  11. {
  12. using System.Linq;
  13. using Raven.Abstractions.Data;
  14. using Raven.Database.Storage;
  15. using Raven.Json.Linq;
  16. using Xunit;
  17. using Xunit.Extensions;
  18. using global::Voron.Exceptions;
  19. [Trait("VoronTest", "StorageActionsTests")]
  20. public class ListStorageActionsTests : TransactionalStorageTestBase
  21. {
  22. [Theory]
  23. [PropertyData("Storages")]
  24. public void Set(string requestedStorage)
  25. {
  26. using (var storage = NewTransactionalStorage(requestedStorage))
  27. {
  28. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  29. storage.Batch(accessor =>
  30. {
  31. var item = accessor.Lists.Read("name1", "key1");
  32. Assert.NotNull(item);
  33. Assert.Equal("key1", item.Key);
  34. Assert.Equal("123", item.Data.Value<string>("data"));
  35. });
  36. }
  37. }
  38. [Theory]
  39. [PropertyData("Storages")]
  40. public void CanAddTwoIdenticalKeys(string requestedStorage)
  41. {
  42. using (var storage = NewTransactionalStorage(requestedStorage))
  43. {
  44. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  45. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "321" } }, UuidType.ReduceResults));
  46. storage.Batch(
  47. accessor =>
  48. {
  49. var item = accessor.Lists.Read("name1", "key1");
  50. Assert.NotNull(item);
  51. Assert.Equal("key1", item.Key);
  52. Assert.Equal("321", item.Data.Value<string>("data"));
  53. });
  54. }
  55. }
  56. [Theory]
  57. [PropertyData("Storages")]
  58. public void CanAddTwoDifferentKeys(string requestedStorage)
  59. {
  60. using (var storage = NewTransactionalStorage(requestedStorage))
  61. {
  62. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  63. storage.Batch(accessor => accessor.Lists.Set("name1", "key2", new RavenJObject { { "data", "321" } }, UuidType.ReduceResults));
  64. storage.Batch(accessor =>
  65. {
  66. var item1 = accessor.Lists.Read("name1", "key1");
  67. var item2 = accessor.Lists.Read("name1", "key2");
  68. Assert.NotNull(item1);
  69. Assert.Equal("key1", item1.Key);
  70. Assert.Equal("123", item1.Data.Value<string>("data"));
  71. Assert.NotNull(item2);
  72. Assert.Equal("key2", item2.Key);
  73. Assert.Equal("321", item2.Data.Value<string>("data"));
  74. });
  75. }
  76. }
  77. [Theory]
  78. [PropertyData("Storages")]
  79. public void Remove(string requestedStorage)
  80. {
  81. using (var storage = NewTransactionalStorage(requestedStorage))
  82. {
  83. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  84. storage.Batch(accessor => accessor.Lists.Set("name1", "key2", new RavenJObject { { "data", "321" } }, UuidType.ReduceResults));
  85. storage.Batch(accessor => accessor.Lists.Remove("name1", "key2"));
  86. storage.Batch(accessor =>
  87. {
  88. var item1 = accessor.Lists.Read("name1", "key1");
  89. var item2 = accessor.Lists.Read("name1", "key2");
  90. Assert.NotNull(item1);
  91. Assert.Equal("key1", item1.Key);
  92. Assert.Equal("123", item1.Data.Value<string>("data"));
  93. Assert.Null(item2);
  94. });
  95. storage.Batch(accessor => accessor.Lists.Remove("name1", "key1"));
  96. storage.Batch(accessor =>
  97. {
  98. var item1 = accessor.Lists.Read("name1", "key1");
  99. var item2 = accessor.Lists.Read("name1", "key2");
  100. Assert.Null(item1);
  101. Assert.Null(item2);
  102. });
  103. }
  104. }
  105. [Theory]
  106. [PropertyData("Storages")]
  107. public void Read1(string requestedStorage)
  108. {
  109. using (var storage = NewTransactionalStorage(requestedStorage))
  110. {
  111. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  112. storage.Batch(accessor => accessor.Lists.Set("name1", "key2", new RavenJObject { { "data", "321" } }, UuidType.ReduceResults));
  113. storage.Batch(accessor => accessor.Lists.Set("name1", "key3", new RavenJObject { { "data", "213" } }, UuidType.ReduceResults));
  114. storage.Batch(accessor =>
  115. {
  116. var item1 = accessor.Lists.Read("name1", "key1");
  117. var item2 = accessor.Lists.Read("name1", "key2");
  118. var item3 = accessor.Lists.Read("name1", "key3");
  119. var items = accessor.Lists.Read("name1", item1.Etag, null, 10).ToList();
  120. Assert.Equal(2, items.Count);
  121. CompareListItems(item2, items[0]);
  122. CompareListItems(item3, items[1]);
  123. items = accessor.Lists.Read("name1", item1.Etag, null, 2).ToList();
  124. Assert.Equal(2, items.Count);
  125. CompareListItems(item2, items[0]);
  126. CompareListItems(item3, items[1]);
  127. items = accessor.Lists.Read("name1", item1.Etag, item2.Etag, 10).ToList();
  128. Assert.Equal(0, items.Count);
  129. items = accessor.Lists.Read("name1", item2.Etag, null, 10).ToList();
  130. Assert.Equal(1, items.Count);
  131. CompareListItems(item3, items[0]);
  132. items = accessor.Lists.Read("name1", item1.Etag, item3.Etag, 10).ToList();
  133. Assert.Equal(1, items.Count);
  134. CompareListItems(item2, items[0]);
  135. });
  136. }
  137. }
  138. [Theory]
  139. [PropertyData("Storages")]
  140. public void Read2(string requestedStorage)
  141. {
  142. using (var storage = NewTransactionalStorage(requestedStorage))
  143. {
  144. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  145. storage.Batch(accessor => accessor.Lists.Set("name2", "key1", new RavenJObject { { "data", "321" } }, UuidType.ReduceResults));
  146. storage.Batch(accessor =>
  147. {
  148. var item1 = accessor.Lists.Read("name1", "key1");
  149. var item2 = accessor.Lists.Read("name2", "key1");
  150. Assert.NotNull(item1);
  151. Assert.Equal("key1", item1.Key);
  152. Assert.Equal("123", item1.Data.Value<string>("data"));
  153. Assert.NotNull(item2);
  154. Assert.Equal("key1", item2.Key);
  155. Assert.Equal("321", item2.Data.Value<string>("data"));
  156. });
  157. }
  158. }
  159. [Theory]
  160. [PropertyData("Storages")]
  161. public void ReadLast(string requestedStorage)
  162. {
  163. using (var storage = NewTransactionalStorage(requestedStorage))
  164. {
  165. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  166. storage.Batch(accessor => accessor.Lists.Set("name1", "key9", new RavenJObject { { "data", "111" } }, UuidType.ReduceResults));
  167. storage.Batch(accessor => accessor.Lists.Set("name1", "key5", new RavenJObject { { "data", "321" } }, UuidType.ReduceResults));
  168. storage.Batch(accessor => accessor.Lists.Set("name2", "key2", new RavenJObject { { "data", "000" } }, UuidType.ReduceResults));
  169. storage.Batch(accessor => accessor.Lists.Set("name3", "key7", new RavenJObject { { "data", "000" } }, UuidType.ReduceResults));
  170. storage.Batch(accessor => accessor.Lists.Remove("name3", "key7"));
  171. storage.Batch(accessor =>
  172. {
  173. var item1 = accessor.Lists.ReadLast("name1");
  174. var item2 = accessor.Lists.ReadLast("name2");
  175. var item3 = accessor.Lists.ReadLast("name3");
  176. Assert.NotNull(item1);
  177. Assert.Equal("key5", item1.Key);
  178. Assert.Equal("321", item1.Data.Value<string>("data"));
  179. Assert.NotNull(item2);
  180. Assert.Equal("key2", item2.Key);
  181. Assert.Equal("000", item2.Data.Value<string>("data"));
  182. Assert.Null(item3);
  183. });
  184. }
  185. }
  186. [Theory]
  187. [PropertyData("Storages")]
  188. public void RemoveBefore(string requestedStorage)
  189. {
  190. using (var storage = NewTransactionalStorage(requestedStorage))
  191. {
  192. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  193. storage.Batch(accessor => accessor.Lists.Set("name1", "key2", new RavenJObject { { "data", "111" } }, UuidType.ReduceResults));
  194. storage.Batch(accessor => accessor.Lists.Set("name2", "key1", new RavenJObject { { "data", "000" } }, UuidType.ReduceResults));
  195. Etag name1Etag = null;
  196. Etag name2Etag = null;
  197. storage.Batch(accessor =>
  198. {
  199. name1Etag = accessor.Lists.Read("name1", Etag.Empty, null, 10).Max(x => x.Etag);
  200. name2Etag = accessor.Lists.Read("name2", Etag.Empty, null, 10).Max(x => x.Etag);
  201. });
  202. storage.Batch(accessor => accessor.Lists.Set("name1", "key3", new RavenJObject { { "data", "321" } }, UuidType.ReduceResults));
  203. storage.Batch(accessor => accessor.Lists.Set("name2", "key2", new RavenJObject { { "data", "000" } }, UuidType.ReduceResults));
  204. storage.Batch(accessor =>
  205. {
  206. accessor.Lists.RemoveAllBefore("name1", name1Etag);
  207. accessor.Lists.RemoveAllBefore("name2", name2Etag);
  208. });
  209. storage.Batch(accessor =>
  210. {
  211. var items1 = accessor.Lists.Read("name1", Etag.Empty, null, 10).ToList();
  212. var items2 = accessor.Lists.Read("name2", Etag.Empty, null, 10).ToList();
  213. Assert.Equal(1, items1.Count);
  214. Assert.Equal("key3", items1[0].Key);
  215. Assert.Equal("321", items1[0].Data.Value<string>("data"));
  216. Assert.Equal(1, items2.Count);
  217. Assert.Equal("key2", items2[0].Key);
  218. Assert.Equal("000", items2[0].Data.Value<string>("data"));
  219. });
  220. }
  221. }
  222. [Theory]
  223. [PropertyData("Storages")]
  224. public void RemoveOlderThan(string requestedStorage)
  225. {
  226. using (var storage = NewTransactionalStorage(requestedStorage))
  227. {
  228. SystemTime.UtcDateTime = () => DateTime.Now.AddDays(-2);
  229. storage.Batch(accessor => accessor.Lists.Set("name1", "key1", new RavenJObject { { "data", "123" } }, UuidType.ReduceResults));
  230. storage.Batch(accessor => accessor.Lists.Set("name1", "key2", new RavenJObject { { "data", "111" } }, UuidType.ReduceResults));
  231. storage.Batch(accessor => accessor.Lists.Set("name2", "key1", new RavenJObject { { "data", "000" } }, UuidType.ReduceResults));
  232. SystemTime.UtcDateTime = () => DateTime.Now;
  233. storage.Batch(accessor => accessor.Lists.Set("name1", "key3", new RavenJObject { { "data", "321" } }, UuidType.ReduceResults));
  234. storage.Batch(accessor => accessor.Lists.Set("name2", "key2", new RavenJObject { { "data", "000" } }, UuidType.ReduceResults));
  235. storage.Batch(accessor =>
  236. {
  237. accessor.Lists.RemoveAllOlderThan("name1", SystemTime.UtcNow.Subtract(TimeSpan.FromDays(1)));
  238. accessor.Lists.RemoveAllOlderThan("name2", SystemTime.UtcNow.Subtract(TimeSpan.FromDays(1)));
  239. });
  240. storage.Batch(accessor =>
  241. {
  242. var items1 = accessor.Lists.Read("name1", Etag.Empty, null, 10).ToList();
  243. var items2 = accessor.Lists.Read("name2", Etag.Empty, null, 10).ToList();
  244. Assert.Equal(1, items1.Count);
  245. Assert.Equal("key3", items1[0].Key);
  246. Assert.Equal("321", items1[0].Data.Value<string>("data"));
  247. Assert.Equal(1, items2.Count);
  248. Assert.Equal("key2", items2[0].Key);
  249. Assert.Equal("000", items2[0].Data.Value<string>("data"));
  250. });
  251. }
  252. }
  253. [Theory]
  254. [PropertyData("Storages")]
  255. public void CanReadWithStartTakeParameters(string requestedStorage)
  256. {
  257. using (var storage = NewTransactionalStorage(requestedStorage))
  258. {
  259. for (int i = 0; i < 10; i++)
  260. {
  261. storage.Batch(
  262. actions => actions.Lists.Set("items", i.ToString(CultureInfo.InvariantCulture), new RavenJObject
  263. {
  264. {"i", i}
  265. }, UuidType.Indexing));
  266. storage.Batch(
  267. actions => actions.Lists.Set("another", i.ToString(CultureInfo.InvariantCulture), new RavenJObject
  268. {
  269. {"i", i*2}
  270. }, UuidType.Indexing));
  271. }
  272. storage.Batch(actions =>
  273. {
  274. var list = actions.Lists.Read("items", 0, 5).ToList();
  275. Assert.Equal(5, list.Count);
  276. for (int i = 0; i < 5; i++)
  277. {
  278. Assert.Equal(i, list[i].Data.Value<int>("i"));
  279. }
  280. list = actions.Lists.Read("items", 5, 5).ToList();
  281. Assert.Equal(5, list.Count);
  282. for (int i = 0; i < 5; i++)
  283. {
  284. Assert.Equal(i + 5, list[i].Data.Value<int>("i"));
  285. }
  286. });
  287. }
  288. }
  289. [Theory]
  290. [PropertyData("Storages")]
  291. public void ShouldUpdate(string requestedStorage)
  292. {
  293. using (var storage = NewTransactionalStorage(requestedStorage))
  294. {
  295. storage.Batch(actions => actions.Lists.Set("items", "1", new RavenJObject
  296. {
  297. {
  298. "test", "data1"
  299. }
  300. }, UuidType.Indexing));
  301. storage.Batch(actions => actions.Lists.Set("items", "1", new RavenJObject
  302. {
  303. {
  304. "test", "data2"
  305. }
  306. }, UuidType.Indexing));
  307. storage.Batch(actions =>
  308. {
  309. var item = actions.Lists.Read("items", "1");
  310. Assert.Equal("data2", item.Data.Value<string>("test"));
  311. });
  312. storage.Batch(actions =>
  313. {
  314. var items = actions.Lists.Read("items", 0, 10).ToList();
  315. Assert.Equal(1, items.Count);
  316. Assert.Equal("data2", items[0].Data.Value<string>("test"));
  317. });
  318. }
  319. }
  320. [Theory]
  321. [PropertyData("Storages")]
  322. public void TouchingListItemIncreasesItsEtag(string requestedStorage)
  323. {
  324. using (var storage = NewTransactionalStorage(requestedStorage))
  325. {
  326. storage.Batch(actions => actions.Lists.Set("items", "1", new RavenJObject
  327. {
  328. {
  329. "test", "data1"
  330. }
  331. }, UuidType.Documents));
  332. Etag oldEtag = null;
  333. storage.Batch(actions =>
  334. {
  335. oldEtag = actions.Lists.Read("items", "1").Etag;
  336. });
  337. storage.Batch(actions =>
  338. {
  339. Etag afterEtag;
  340. Etag beforeEtag;
  341. actions.Lists.Touch("items", "1", UuidType.Documents, out beforeEtag, out afterEtag);
  342. Assert.True(afterEtag.CompareTo(oldEtag) > 0);
  343. Assert.True(oldEtag.CompareTo(beforeEtag) == 0);
  344. });
  345. }
  346. }
  347. [Theory]
  348. [PropertyData("Storages")]
  349. public void AfterTouchListItemDataRemainsTheSame(string requestedStorage)
  350. {
  351. using (var storage = NewTransactionalStorage(requestedStorage))
  352. {
  353. storage.Batch(actions => actions.Lists.Set("items", "1", new RavenJObject
  354. {
  355. {
  356. "test", "data1"
  357. }
  358. }, UuidType.Documents));
  359. DateTime? createdAt = null;
  360. storage.Batch(actions =>
  361. {
  362. createdAt = actions.Lists.Read("items", "1").CreatedAt;
  363. });
  364. storage.Batch(actions =>
  365. {
  366. Etag afterEtag;
  367. Etag beforeEtag;
  368. actions.Lists.Touch("items", "1", UuidType.Documents, out beforeEtag, out afterEtag);
  369. });
  370. storage.Batch(actions =>
  371. {
  372. var item = actions.Lists.Read("items", "1");
  373. Assert.Equal("data1", item.Data.Value<string>("test"));
  374. Assert.Equal(createdAt, item.CreatedAt);
  375. });
  376. storage.Batch(actions =>
  377. {
  378. var items = actions.Lists.Read("items", 0, 10).ToList();
  379. Assert.Equal(1, items.Count);
  380. Assert.Equal("data1", items[0].Data.Value<string>("test"));
  381. Assert.Equal(createdAt, items[0].CreatedAt);
  382. });
  383. }
  384. }
  385. [Theory]
  386. [PropertyData("Storages")]
  387. public void TouchedItemShouldBeReturnedOnHigherPosition(string requestedStorage)
  388. {
  389. using (var storage = NewTransactionalStorage(requestedStorage))
  390. {
  391. storage.Batch(actions => actions.Lists.Set("items", "1", new RavenJObject
  392. {
  393. {
  394. "test", "1"
  395. }
  396. }, UuidType.Documents));
  397. storage.Batch(actions => actions.Lists.Set("items", "2", new RavenJObject
  398. {
  399. {
  400. "test", "2"
  401. }
  402. }, UuidType.Documents));
  403. storage.Batch(actions =>
  404. {
  405. Etag afterEtag;
  406. Etag beforeEtag;
  407. actions.Lists.Touch("items", "1", UuidType.Documents, out beforeEtag, out afterEtag);
  408. });
  409. storage.Batch(actions =>
  410. {
  411. var items = actions.Lists.Read("items", 0, 100).ToList();
  412. Assert.Equal("2", items[0].Key);
  413. Assert.Equal("1", items[1].Key);
  414. items = actions.Lists.Read("items", Etag.Empty, null, 10).ToList();
  415. Assert.Equal("2", items[0].Key);
  416. Assert.Equal("1", items[1].Key);
  417. });
  418. }
  419. }
  420. private void CompareListItems(ListItem expected, ListItem actual)
  421. {
  422. Assert.Equal(expected.Key, actual.Key);
  423. Assert.Equal(expected.Etag, actual.Etag);
  424. Assert.Equal(expected.Data["data"], actual.Data["data"]);
  425. }
  426. }
  427. }