/test/SlowTests/Utils/ConflictResolverTests.cs

https://github.com/fitzchak/ravendb · C# · 413 lines · 363 code · 50 blank · 0 comment · 0 complexity · 0750cc2e14f3a49e695b1ff26888de8d MD5 · raw file

  1. using System.Collections.Generic;
  2. using FastTests;
  3. using Raven.Server.Utils;
  4. using Sparrow.Json;
  5. using Sparrow.Json.Parsing;
  6. using Sparrow.LowMemory;
  7. using Sparrow.Threading;
  8. using Xunit;
  9. namespace SlowTests.Utils
  10. {
  11. public class ConflictResolverTests : NoDisposalNeeded
  12. {
  13. [Fact]
  14. public void CanResolveEmpty()
  15. {
  16. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  17. {
  18. DynamicJsonValue obj1 = new DynamicJsonValue();
  19. DynamicJsonValue obj2 = new DynamicJsonValue();
  20. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  21. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  22. ctx);
  23. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  24. Assert.Equal(0, resolvled.Count);
  25. }
  26. }
  27. [Fact]
  28. public void CanResolveIdentical()
  29. {
  30. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  31. {
  32. DynamicJsonValue obj1 = new DynamicJsonValue();
  33. DynamicJsonValue obj2 = new DynamicJsonValue();
  34. obj1["name"] = "Oren";
  35. obj2["name"] = "Oren";
  36. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  37. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  38. ctx);
  39. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  40. string name;
  41. resolvled.TryGet("name", out name);
  42. Assert.Equal("Oren", name);
  43. }
  44. }
  45. [Fact]
  46. public void CanResolveTwoEmptyArrays()
  47. {
  48. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  49. {
  50. DynamicJsonValue obj1 = new DynamicJsonValue();
  51. DynamicJsonValue obj2 = new DynamicJsonValue();
  52. obj1["name"] = new DynamicJsonArray();
  53. obj2["name"] = new DynamicJsonArray();
  54. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  55. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  56. ctx);
  57. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  58. BlittableJsonReaderArray name;
  59. resolvled.TryGet("name", out name);
  60. Assert.Equal(0, name.Length);
  61. }
  62. }
  63. [Fact]
  64. public void CanResolveOneEmptyArraysAndOneWithValue()
  65. {
  66. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  67. {
  68. DynamicJsonValue obj1 = new DynamicJsonValue();
  69. DynamicJsonValue obj2 = new DynamicJsonValue();
  70. obj1["name"] = new DynamicJsonArray {1};
  71. obj2["name"] = new DynamicJsonArray();
  72. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  73. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  74. ctx);
  75. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  76. BlittableJsonReaderArray name;
  77. resolvled.TryGet("name", out name);
  78. Assert.Equal(">>>> auto merged array start", name[0].ToString());
  79. Assert.Equal((long) 1, name[1]);
  80. Assert.Equal("<<<< auto merged array end", name[2].ToString());
  81. }
  82. }
  83. [Fact]
  84. public void CanMergeAdditionalProperties()
  85. {
  86. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  87. {
  88. DynamicJsonValue obj1 = new DynamicJsonValue();
  89. DynamicJsonValue obj2 = new DynamicJsonValue();
  90. obj1["Name"] = "Oren";
  91. obj2["Age"] = 2;
  92. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  93. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  94. ctx);
  95. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  96. string name;
  97. int age;
  98. resolvled.TryGet("Name", out name);
  99. resolvled.TryGet("Age", out age);
  100. Assert.Equal(2, age);
  101. Assert.Equal("Oren", name);
  102. }
  103. }
  104. [Fact]
  105. public void CanDetectAndSuggestOptionsForConflict_SimpleProp()
  106. {
  107. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  108. {
  109. DynamicJsonValue obj1 = new DynamicJsonValue();
  110. DynamicJsonValue obj2 = new DynamicJsonValue();
  111. obj1["Name"] = "Oren";
  112. obj2["Name"] = "Ayende";
  113. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  114. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  115. ctx);
  116. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  117. BlittableJsonReaderArray name;
  118. resolvled.TryGet("Name", out name);
  119. Assert.Equal(">>>> conflict start", name[0].ToString());
  120. Assert.Equal("Oren", name[1].ToString());
  121. Assert.Equal("Ayende", name[2].ToString());
  122. Assert.Equal("<<<< conflict end", name[3].ToString());
  123. }
  124. }
  125. [Fact]
  126. public void CanMergeProperties_Nested()
  127. {
  128. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  129. {
  130. DynamicJsonValue obj1 = new DynamicJsonValue();
  131. DynamicJsonValue obj2 = new DynamicJsonValue();
  132. obj1["Name"] = new DynamicJsonValue
  133. {
  134. ["First"] = "Oren"
  135. };
  136. obj2["Name"] = new DynamicJsonValue
  137. {
  138. ["Last"] = "Eini"
  139. };
  140. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  141. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  142. ctx);
  143. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  144. BlittableJsonReaderObject name;
  145. resolvled.TryGet("Name", out name);
  146. Assert.Equal("Oren", name["First"].ToString());
  147. Assert.Equal("Eini", name["Last"].ToString());
  148. }
  149. }
  150. [Fact]
  151. public void CanDetectConflict_DifferentValues()
  152. {
  153. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  154. {
  155. DynamicJsonValue obj1 = new DynamicJsonValue();
  156. DynamicJsonValue obj2 = new DynamicJsonValue();
  157. obj1["Name"] = new DynamicJsonValue
  158. {
  159. ["First"] = "Oren"
  160. };
  161. obj2["Name"] = "Eini";
  162. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  163. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  164. ctx);
  165. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  166. BlittableJsonReaderArray name;
  167. resolvled.TryGet("Name", out name);
  168. Assert.Equal(">>>> conflict start", name[0].ToString());
  169. Assert.Equal("Oren", ((BlittableJsonReaderObject) name[1])["First"].ToString());
  170. Assert.Equal("Eini", name[2].ToString());
  171. Assert.Equal("<<<< conflict end", name[3].ToString());
  172. }
  173. }
  174. [Fact]
  175. public void CanMergeArrays()
  176. {
  177. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  178. {
  179. DynamicJsonValue obj1 = new DynamicJsonValue();
  180. DynamicJsonValue obj2 = new DynamicJsonValue();
  181. obj1["Nicks"] = new DynamicJsonArray {"Oren"};
  182. obj2["Nicks"] = new DynamicJsonArray {"Ayende"};
  183. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  184. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  185. ctx);
  186. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  187. BlittableJsonReaderArray nicks;
  188. resolvled.TryGet("Nicks", out nicks);
  189. Assert.Equal(">>>> auto merged array start", nicks[0].ToString());
  190. Assert.Equal("Oren", nicks[1].ToString());
  191. Assert.Equal("Ayende", nicks[2].ToString());
  192. Assert.Equal("<<<< auto merged array end", nicks[3].ToString());
  193. }
  194. }
  195. [Fact]
  196. public void CanMergeArrays_SameStart()
  197. {
  198. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  199. {
  200. DynamicJsonValue obj1 = new DynamicJsonValue();
  201. DynamicJsonValue obj2 = new DynamicJsonValue();
  202. obj1["Comments"] = new DynamicJsonArray {1, 2, 4};
  203. obj2["Comments"] = new DynamicJsonArray {1, 2, 5};
  204. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  205. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  206. ctx);
  207. var resolvled = conflictResovlerAdvisor.Resolve().Document;
  208. BlittableJsonReaderArray comments;
  209. resolvled.TryGet("Comments", out comments);
  210. Assert.Equal(">>>> auto merged array start", comments[0].ToString());
  211. Assert.Equal((long) 1, comments[1]);
  212. Assert.Equal((long) 2, comments[2]);
  213. Assert.Equal((long) 4, comments[3]);
  214. Assert.Equal((long) 5, comments[4]);
  215. Assert.Equal("<<<< auto merged array end", comments[5].ToString());
  216. }
  217. }
  218. [Fact]
  219. public void CanResolveEmptyWithMetadata()
  220. {
  221. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  222. {
  223. DynamicJsonValue obj1 = new DynamicJsonValue();
  224. DynamicJsonValue obj2 = new DynamicJsonValue();
  225. obj1["@metadata"] = new DynamicJsonValue();
  226. obj2["@metadata"] = new DynamicJsonValue();
  227. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  228. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  229. ctx);
  230. var resolvled = conflictResovlerAdvisor.Resolve().Metadata;
  231. Assert.Equal(0, resolvled.Count);
  232. }
  233. }
  234. [Fact]
  235. public void CanResolveIdenticalMetadata()
  236. {
  237. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  238. {
  239. DynamicJsonValue obj1 = new DynamicJsonValue();
  240. DynamicJsonValue obj2 = new DynamicJsonValue();
  241. obj1["@metadata"] = new DynamicJsonValue
  242. {
  243. ["Foo"] = "Bar"
  244. };
  245. obj2["@metadata"] = new DynamicJsonValue
  246. {
  247. ["Foo"] = "Bar"
  248. };
  249. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  250. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  251. ctx);
  252. var resolvled = conflictResovlerAdvisor.Resolve().Metadata;
  253. string foo;
  254. resolvled.TryGet("Foo", out foo);
  255. Assert.Equal("Bar", foo);
  256. }
  257. }
  258. [Fact]
  259. public void CanResolveTwoEmptyArraysInMetadata()
  260. {
  261. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  262. {
  263. DynamicJsonValue obj1 = new DynamicJsonValue();
  264. DynamicJsonValue obj2 = new DynamicJsonValue();
  265. obj1["@metadata"] = new DynamicJsonValue
  266. {
  267. ["Foo"] = new DynamicJsonArray()
  268. };
  269. obj2["@metadata"] = new DynamicJsonValue
  270. {
  271. ["Foo"] = new DynamicJsonArray()
  272. };
  273. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  274. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  275. ctx);
  276. var resolvled = conflictResovlerAdvisor.Resolve().Metadata;
  277. BlittableJsonReaderArray foo;
  278. resolvled.TryGet("Foo", out foo);
  279. Assert.Equal(0, foo.Length);
  280. }
  281. }
  282. [Fact]
  283. public void CanResolveOneEmptyArraysAndOneWithValueInMetadata()
  284. {
  285. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  286. {
  287. DynamicJsonValue obj1 = new DynamicJsonValue();
  288. DynamicJsonValue obj2 = new DynamicJsonValue();
  289. obj1["@metadata"] = new DynamicJsonValue
  290. {
  291. ["Foo"] = new DynamicJsonArray {1}
  292. };
  293. obj2["@metadata"] = new DynamicJsonValue
  294. {
  295. ["Foo"] = new DynamicJsonArray()
  296. };
  297. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  298. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  299. ctx);
  300. var resolvled = conflictResovlerAdvisor.Resolve().Metadata;
  301. BlittableJsonReaderArray foo;
  302. resolvled.TryGet("Foo", out foo);
  303. Assert.Equal(">>>> auto merged array start", foo[0].ToString());
  304. Assert.Equal((long) 1, foo[1]);
  305. Assert.Equal("<<<< auto merged array end", foo[2].ToString());
  306. }
  307. }
  308. [Fact]
  309. public void CanMergeAdditionalMetadata()
  310. {
  311. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  312. {
  313. DynamicJsonValue obj1 = new DynamicJsonValue();
  314. DynamicJsonValue obj2 = new DynamicJsonValue();
  315. obj1["@metadata"] = new DynamicJsonValue
  316. {
  317. ["Name"] = "Oren"
  318. };
  319. obj2["@metadata"] = new DynamicJsonValue
  320. {
  321. ["Age"] = 2
  322. };
  323. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  324. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  325. ctx);
  326. var resolvled = conflictResovlerAdvisor.Resolve().Metadata;
  327. string name;
  328. int age;
  329. resolvled.TryGet("Name", out name);
  330. resolvled.TryGet("Age", out age);
  331. Assert.Equal("Oren", name);
  332. Assert.Equal(2, age);
  333. }
  334. }
  335. [Fact]
  336. public void CanDetectAndSuggestOptionsForConflict_SimpleMetadata()
  337. {
  338. using (var ctx = new JsonOperationContext(4096, 16*1024, SharedMultipleUseFlag.None))
  339. {
  340. DynamicJsonValue obj1 = new DynamicJsonValue();
  341. DynamicJsonValue obj2 = new DynamicJsonValue();
  342. obj1["@metadata"] = new DynamicJsonValue
  343. {
  344. ["Name"] = "Oren"
  345. };
  346. obj2["@metadata"] = new DynamicJsonValue
  347. {
  348. ["Name"] = "Ayende"
  349. };
  350. var conflictResovlerAdvisor = new ConflictResolverAdvisor(
  351. new List<BlittableJsonReaderObject> {ctx.ReadObject(obj1, "doc/1"), ctx.ReadObject(obj2, "doc/1")},
  352. ctx);
  353. var resolvled = conflictResovlerAdvisor.Resolve().Metadata;
  354. BlittableJsonReaderArray name;
  355. resolvled.TryGet("Name", out name);
  356. Assert.Equal(">>>> conflict start", name[0].ToString());
  357. Assert.Equal("Oren", name[1].ToString());
  358. Assert.Equal("Ayende", name[2].ToString());
  359. Assert.Equal("<<<< conflict end", name[3].ToString());
  360. }
  361. }
  362. }
  363. }