/ToMigrate/Raven.Tests.FileSystem/Synchronization/AutomaticConflictResolutions.cs

https://github.com/fitzchak/ravendb · C# · 374 lines · 275 code · 94 blank · 5 comment · 10 complexity · d26fb7c8fe23664c99a169d58bf6c018 MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="AutomaticConflictResolutions.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. // -----------------------------------------------------------------------
  6. using System;
  7. using System.IO;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using Raven.Abstractions.FileSystem;
  12. using Raven.Abstractions.Replication;
  13. using Raven.Client.FileSystem;
  14. using Raven.Database.FileSystem.Synchronization;
  15. using Raven.Database.FileSystem.Synchronization.Multipart;
  16. using Raven.Database.FileSystem.Synchronization.Rdc.Wrapper;
  17. using Raven.Json.Linq;
  18. using Raven.Tests.Helpers;
  19. using Xunit;
  20. using FileSystemInfo = Raven.Abstractions.FileSystem.FileSystemInfo;
  21. namespace Raven.Tests.FileSystem.Synchronization
  22. {
  23. public class AutomaticConflictResolutions : RavenFilesTestWithLogs
  24. {
  25. [Fact]
  26. public async Task ShouldAutomaticallyResolveInFavourOfLocal_ContentUpdate()
  27. {
  28. var sourceClient = NewAsyncClient(0);
  29. var destinationClient = NewAsyncClient(1);
  30. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  31. {
  32. FileConflictResolution = StraightforwardConflictResolution.ResolveToLocal
  33. });
  34. var content = await ExecuteRawSynchronizationRequest(sourceClient, destinationClient);
  35. Assert.Equal("destination", content);
  36. }
  37. [Fact]
  38. public async Task ShouldAutomaticallyResolveInFavourOfRemote_ContentUpdate()
  39. {
  40. var sourceClient = NewAsyncClient(0);
  41. var destinationClient = NewAsyncClient(1);
  42. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  43. {
  44. FileConflictResolution = StraightforwardConflictResolution.ResolveToRemote
  45. });
  46. var content = await ExecuteRawSynchronizationRequest(sourceClient, destinationClient);
  47. Assert.Equal("source", content);
  48. }
  49. [Fact]
  50. public async Task ShouldAutomaticallyResolveInFavourOfLatest_ContentUpdate()
  51. {
  52. var sourceClient = NewAsyncClient(0);
  53. var destinationClient = NewAsyncClient(1);
  54. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  55. {
  56. FileConflictResolution = StraightforwardConflictResolution.ResolveToLatest
  57. });
  58. var content = await ExecuteRawSynchronizationRequest(sourceClient, destinationClient, () => Thread.Sleep(1000));
  59. Assert.Equal("source", content);
  60. }
  61. private static async Task<string> ExecuteRawSynchronizationRequest(IAsyncFilesCommands sourceClient, IAsyncFilesCommands destinationClient, Action action = null)
  62. {
  63. await destinationClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("destination")));
  64. if (action != null)
  65. action();
  66. await sourceClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("source")));
  67. var sourceStream = new MemoryStream();
  68. (await sourceClient.DownloadAsync("test")).CopyTo(sourceStream);
  69. var metadata = await sourceClient.GetMetadataForAsync("test");
  70. var request = new SynchronizationMultipartRequest(destinationClient.Synchronization, new FileSystemInfo()
  71. {
  72. Url = sourceClient.UrlFor(),
  73. Id = sourceClient.GetServerIdAsync().Result
  74. }, "test", metadata, sourceStream, new[]
  75. {
  76. new RdcNeed()
  77. {
  78. BlockLength = 6,
  79. BlockType = RdcNeedType.Source,
  80. FileOffset = 0
  81. }
  82. });
  83. var synchronizationReport = await request.PushChangesAsync(CancellationToken.None);
  84. Assert.Null(synchronizationReport.Exception);
  85. var stream = await destinationClient.DownloadAsync("test");
  86. return StreamToString(stream);
  87. }
  88. private static async Task<string> RunContentSynchronization(IAsyncFilesCommands sourceClient, IAsyncFilesCommands destinationClient, Action action = null)
  89. {
  90. await destinationClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("destination")));
  91. if (action != null)
  92. action();
  93. await sourceClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("source")));
  94. var report = await sourceClient.Synchronization.StartAsync("test", destinationClient);
  95. Assert.Null(report.Exception);
  96. Assert.Equal(SynchronizationType.ContentUpdate, report.Type);
  97. var stream = await destinationClient.DownloadAsync("test");
  98. return StreamToString(stream);
  99. }
  100. [Fact]
  101. public async Task ShouldAutomaticallyResolveInFavourOfLocal_DuringSynchronization_ContentUpdate()
  102. {
  103. var sourceClient = NewAsyncClient(0);
  104. var destinationClient = NewAsyncClient(1);
  105. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  106. {
  107. FileConflictResolution = StraightforwardConflictResolution.ResolveToLocal
  108. });
  109. var content = await RunContentSynchronization(sourceClient, destinationClient);
  110. Assert.Equal("destination", content);
  111. }
  112. [Fact]
  113. public async Task ShouldAutomaticallyResolveInFavourOfRemote_DuringSynchronization_ContentUpdate()
  114. {
  115. var sourceClient = NewAsyncClient(0);
  116. var destinationClient = NewAsyncClient(1);
  117. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  118. {
  119. FileConflictResolution = StraightforwardConflictResolution.ResolveToRemote
  120. });
  121. var content = await RunContentSynchronization(sourceClient, destinationClient);
  122. Assert.Equal("source", content);
  123. }
  124. [Fact]
  125. public async Task ShouldAutomaticallyResolveInFavourOfLatest_DuringSynchronization_ContentUpdate()
  126. {
  127. var sourceClient = NewAsyncClient(0);
  128. var destinationClient = NewAsyncClient(1);
  129. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  130. {
  131. FileConflictResolution = StraightforwardConflictResolution.ResolveToLatest
  132. });
  133. var content = await RunContentSynchronization(sourceClient, destinationClient, () => Thread.Sleep(1000));
  134. Assert.Equal("source", content);
  135. }
  136. [Fact]
  137. public async Task ShouldAutomaticallyResolveInFavourOfLocal_DuringSynchronization_Rename()
  138. {
  139. var sourceClient = NewAsyncClient(0);
  140. var destinationClient = NewAsyncClient(1);
  141. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  142. {
  143. FileConflictResolution = StraightforwardConflictResolution.ResolveToLocal
  144. });
  145. await RunRenameSynchronization(sourceClient, destinationClient);
  146. Assert.NotNull(await destinationClient.GetMetadataForAsync("test"));
  147. Assert.Null(await destinationClient.GetMetadataForAsync("renamed"));
  148. }
  149. [Fact]
  150. public async Task ShouldAutomaticallyResolveInFavourOfRemote_DuringSynchronization_Rename()
  151. {
  152. var sourceClient = NewAsyncClient(0);
  153. var destinationClient = NewAsyncClient(1);
  154. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  155. {
  156. FileConflictResolution = StraightforwardConflictResolution.ResolveToRemote
  157. });
  158. await RunRenameSynchronization(sourceClient, destinationClient);
  159. Assert.Null(await destinationClient.GetMetadataForAsync("test"));
  160. Assert.NotNull(await destinationClient.GetMetadataForAsync("renamed"));
  161. }
  162. [Fact]
  163. public async Task ShouldAutomaticallyResolveInFavourOfLatest_DuringSynchronization_Rename()
  164. {
  165. var sourceClient = NewAsyncClient(0);
  166. var destinationClient = NewAsyncClient(1);
  167. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  168. {
  169. FileConflictResolution = StraightforwardConflictResolution.ResolveToLatest
  170. });
  171. await RunRenameSynchronization(sourceClient, destinationClient, () => Thread.Sleep(1000));
  172. Assert.Null(await destinationClient.GetMetadataForAsync("test"));
  173. Assert.NotNull(await destinationClient.GetMetadataForAsync("renamed"));
  174. }
  175. private static async Task RunRenameSynchronization(IAsyncFilesCommands sourceClient, IAsyncFilesCommands destinationClient, Action action = null)
  176. {
  177. await destinationClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("rename-test")));
  178. if (action != null)
  179. action();
  180. await sourceClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("rename-test")));
  181. await sourceClient.RenameAsync("test", "renamed");
  182. var report = await sourceClient.Synchronization.StartAsync("test", destinationClient);
  183. Assert.Null(report.Exception);
  184. Assert.Equal(SynchronizationType.Rename, report.Type);
  185. }
  186. [Fact]
  187. public async Task ShouldAutomaticallyResolveInFavourOfLocal_DuringSynchronization_MetadataUpdate()
  188. {
  189. var sourceClient = NewAsyncClient(0);
  190. var destinationClient = NewAsyncClient(1);
  191. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  192. {
  193. FileConflictResolution = StraightforwardConflictResolution.ResolveToLocal
  194. });
  195. await RunMetadataSynchronization(sourceClient, destinationClient);
  196. Assert.Equal("destination", (await destinationClient.GetMetadataForAsync("test")).Value<string>("Sample-Header"));
  197. }
  198. [Fact]
  199. public async Task ShouldAutomaticallyResolveInFavourOfRemote_DuringSynchronization_MetadataUpdate()
  200. {
  201. var sourceClient = NewAsyncClient(0);
  202. var destinationClient = NewAsyncClient(1);
  203. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  204. {
  205. FileConflictResolution = StraightforwardConflictResolution.ResolveToRemote
  206. });
  207. await RunMetadataSynchronization(sourceClient, destinationClient);
  208. Assert.Equal("source", (await destinationClient.GetMetadataForAsync("test")).Value<string>("Sample-Header"));
  209. }
  210. [Fact]
  211. public async Task ShouldAutomaticallyResolveInFavourOfLatest_DuringSynchronization_MetadataUpdate()
  212. {
  213. var sourceClient = NewAsyncClient(0);
  214. var destinationClient = NewAsyncClient(1);
  215. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  216. {
  217. FileConflictResolution = StraightforwardConflictResolution.ResolveToLatest
  218. });
  219. await RunMetadataSynchronization(sourceClient, destinationClient, () => Thread.Sleep(1000));
  220. Assert.Equal("source", (await destinationClient.GetMetadataForAsync("test")).Value<string>("Sample-Header"));
  221. }
  222. private static async Task RunMetadataSynchronization(IAsyncFilesCommands sourceClient, IAsyncFilesCommands destinationClient, Action action = null)
  223. {
  224. await destinationClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("metadata-test")), new RavenJObject { { "Sample-Header", "destination" } });
  225. if (action != null)
  226. action();
  227. await sourceClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("metadata-test")), new RavenJObject { { "Sample-Header", "source" } });
  228. var report = await sourceClient.Synchronization.StartAsync("test", destinationClient);
  229. Assert.Null(report.Exception);
  230. Assert.Equal(SynchronizationType.MetadataUpdate, report.Type);
  231. }
  232. [Fact]
  233. public async Task ShouldAutomaticallyResolveInFavourOfLocal_DuringSynchronization_Delete()
  234. {
  235. var sourceClient = NewAsyncClient(0);
  236. var destinationClient = NewAsyncClient(1);
  237. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  238. {
  239. FileConflictResolution = StraightforwardConflictResolution.ResolveToLocal
  240. });
  241. await RunDeleteSynchronization(sourceClient, destinationClient);
  242. Assert.NotNull(await destinationClient.GetMetadataForAsync("test"));
  243. }
  244. [Fact]
  245. public async Task ShouldAutomaticallyResolveInFavourOfRemote_DuringSynchronization_Delete()
  246. {
  247. var sourceClient = NewAsyncClient(0);
  248. var destinationClient = NewAsyncClient(1);
  249. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  250. {
  251. FileConflictResolution = StraightforwardConflictResolution.ResolveToRemote
  252. });
  253. await RunDeleteSynchronization(sourceClient, destinationClient);
  254. Assert.Null(await destinationClient.GetMetadataForAsync("test"));
  255. }
  256. [Fact]
  257. public async Task ShouldAutomaticallyResolveInFavourOfLatest_DuringSynchronization_Delete()
  258. {
  259. var sourceClient = NewAsyncClient(0);
  260. var destinationClient = NewAsyncClient(1);
  261. await destinationClient.Configuration.SetKeyAsync(SynchronizationConstants.RavenSynchronizationConfig, new SynchronizationConfig()
  262. {
  263. FileConflictResolution = StraightforwardConflictResolution.ResolveToLatest
  264. });
  265. await RunDeleteSynchronization(sourceClient, destinationClient);
  266. Assert.Null(await destinationClient.GetMetadataForAsync("test"));
  267. }
  268. private static async Task RunDeleteSynchronization(IAsyncFilesCommands sourceClient, IAsyncFilesCommands destinationClient, Action action = null)
  269. {
  270. await destinationClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("delete-test")));
  271. if (action != null)
  272. action();
  273. await sourceClient.UploadAsync("test", new MemoryStream(Encoding.UTF8.GetBytes("delete-test")));
  274. await sourceClient.DeleteAsync("test");
  275. var report = await sourceClient.Synchronization.StartAsync("test", destinationClient);
  276. Assert.Null(report.Exception);
  277. Assert.Equal(SynchronizationType.Delete, report.Type);
  278. }
  279. }
  280. }