/ToMigrate/Raven.Tests/Smuggler/SmugglerIdentitiesTests.cs

https://github.com/fitzchak/ravendb · C# · 370 lines · 316 code · 49 blank · 5 comment · 0 complexity · 6facf64748a77ddc196d1c12e950ad99 MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="RavenDB_2808.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.Linq;
  9. using System.Threading.Tasks;
  10. using Raven.Abstractions.Data;
  11. using Raven.Abstractions.Smuggler;
  12. using Raven.Database.Smuggler;
  13. using Raven.Json.Linq;
  14. using Raven.Smuggler;
  15. using Raven.Tests.Common;
  16. using Xunit;
  17. namespace Raven.Tests.Smuggler
  18. {
  19. public class SmugglerIdentitiesTests : ReplicationBase
  20. {
  21. private class Foo
  22. {
  23. public string Id { get; set; }
  24. public string Name { get; set; }
  25. public string NameImport { get; set; }
  26. }
  27. [Fact, Trait("Category", "Smuggler")]
  28. public async Task SmugglerTransformShouldWorkForDatabaseDataDumper()
  29. {
  30. var path = NewDataPath(forceCreateDir: true);
  31. var backupPath = Path.Combine(path, "backup.dump");
  32. using (var store = NewDocumentStore())
  33. {
  34. using (var session = store.OpenSession())
  35. {
  36. session.Store(new Foo { Name = "N1" });
  37. session.Store(new Foo { Name = "N2" });
  38. session.SaveChanges();
  39. }
  40. var smugglerApi = new DatabaseDataDumper(store.DocumentDatabase);
  41. smugglerApi.Options.TransformScript =
  42. @"function(doc) {
  43. var id = doc['@metadata']['@id'];
  44. if(id === 'foos/1')
  45. return null;
  46. return doc;
  47. }";
  48. await smugglerApi.ExportData(
  49. new SmugglerExportOptions<RavenConnectionStringOptions>
  50. {
  51. ToFile = backupPath,
  52. From = new EmbeddedRavenConnectionStringOptions
  53. {
  54. DefaultDatabase = store.DefaultDatabase
  55. }
  56. });
  57. }
  58. using (var documentStore = NewDocumentStore())
  59. {
  60. var smugglerApi = new DatabaseDataDumper(documentStore.DocumentDatabase);
  61. smugglerApi.Options.TransformScript =
  62. @"function(doc) {
  63. var id = doc['@metadata']['@id'];
  64. if(id === 'foos/1')
  65. return null;
  66. return doc;
  67. }";
  68. await smugglerApi.ImportData(
  69. new SmugglerImportOptions<RavenConnectionStringOptions>
  70. {
  71. FromFile = backupPath,
  72. To = new EmbeddedRavenConnectionStringOptions
  73. {
  74. DefaultDatabase = documentStore.DefaultDatabase
  75. }
  76. });
  77. using (var session = documentStore.OpenSession())
  78. {
  79. var foos = session.Query<Foo>()
  80. .Customize(customization => customization.WaitForNonStaleResultsAsOfNow())
  81. .ToList();
  82. Assert.Equal(1, foos.Count);
  83. Assert.Equal("foos/2", foos[0].Id);
  84. Assert.Equal("N2", foos[0].Name);
  85. Assert.Null(session.Load<Foo>(1));
  86. }
  87. }
  88. }
  89. [Fact]
  90. public void DuringRestoreDatabaseIdCanBeChanged()
  91. {
  92. var backupPath = NewDataPath();
  93. using (var store = NewRemoteDocumentStore(runInMemory: false))
  94. {
  95. store
  96. .DatabaseCommands
  97. .GlobalAdmin
  98. .CreateDatabase(new DatabaseDocument
  99. {
  100. Id = "N1",
  101. Settings =
  102. {
  103. { Constants.ActiveBundles, "Replication" },
  104. { "Raven/DataDir", NewDataPath() }
  105. }
  106. });
  107. var commands = store.DatabaseCommands.ForDatabase("N1");
  108. var oldDatabaseId = store.DatabaseCommands.GetStatistics().DatabaseId;
  109. commands.GlobalAdmin.StartBackup(backupPath, null, incremental: false, databaseName: "N1").WaitForCompletion();
  110. var operation = commands
  111. .GlobalAdmin
  112. .StartRestore(new DatabaseRestoreRequest
  113. {
  114. BackupLocation = backupPath,
  115. DatabaseName = "N3",
  116. GenerateNewDatabaseId = true
  117. });
  118. var status = operation.WaitForCompletion();
  119. var newDatabaseId = commands
  120. .ForDatabase("N3")
  121. .GetStatistics()
  122. .DatabaseId;
  123. Assert.NotEqual(oldDatabaseId, newDatabaseId);
  124. }
  125. }
  126. [Fact]
  127. public void AfterRestoreDatabaseIdIsTheSame()
  128. {
  129. var backupPath = NewDataPath();
  130. using (var store = NewRemoteDocumentStore(runInMemory: false))
  131. {
  132. store
  133. .DatabaseCommands
  134. .GlobalAdmin
  135. .CreateDatabase(new DatabaseDocument
  136. {
  137. Id = "N1",
  138. Settings =
  139. {
  140. { Constants.ActiveBundles, "Replication" },
  141. { "Raven/DataDir", NewDataPath() }
  142. }
  143. });
  144. var commands = store.DatabaseCommands.ForDatabase("N1");
  145. var oldDatabaseId = commands.GetStatistics().DatabaseId;
  146. commands.GlobalAdmin.StartBackup(backupPath, null, incremental: false, databaseName: "N1").WaitForCompletion();
  147. var operation = commands
  148. .GlobalAdmin
  149. .StartRestore(new DatabaseRestoreRequest
  150. {
  151. BackupLocation = backupPath,
  152. DatabaseName = "N3",
  153. GenerateNewDatabaseId = false
  154. });
  155. var status = operation.WaitForCompletion();
  156. var newDatabaseId = commands
  157. .ForDatabase("N3")
  158. .GetStatistics()
  159. .DatabaseId;
  160. Assert.Equal(oldDatabaseId, newDatabaseId);
  161. }
  162. }
  163. [Fact]
  164. public void SmugglerCanStripReplicationInformationDuringImport_Remote()
  165. {
  166. var path = NewDataPath(forceCreateDir: true);
  167. var backupPath = Path.Combine(path, "backup.dump");
  168. using (var store = NewRemoteDocumentStore(runInMemory: false))
  169. {
  170. store
  171. .DatabaseCommands
  172. .GlobalAdmin
  173. .CreateDatabase(new DatabaseDocument
  174. {
  175. Id = "N1",
  176. Settings =
  177. {
  178. { Constants.ActiveBundles, "Replication" },
  179. { "Raven/DataDir", NewDataPath() }
  180. }
  181. });
  182. var commands = store.DatabaseCommands.ForDatabase("N1");
  183. commands.Put("keys/1", null, new RavenJObject(), new RavenJObject());
  184. var doc = commands.Get("keys/1");
  185. Assert.True(doc.Metadata.ContainsKey(Constants.RavenReplicationSource));
  186. Assert.True(doc.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  187. commands.PutAttachment("keys/1", null, new MemoryStream(), new RavenJObject());
  188. var attachment = commands.GetAttachment("keys/1");
  189. Assert.True(attachment.Metadata.ContainsKey(Constants.RavenReplicationSource));
  190. Assert.True(attachment.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  191. var smuggler = new SmugglerDatabaseApi(new SmugglerDatabaseOptions { StripReplicationInformation = true });
  192. smuggler.ExportData(new SmugglerExportOptions<RavenConnectionStringOptions>
  193. {
  194. ToFile = backupPath,
  195. From = new RavenConnectionStringOptions
  196. {
  197. Url = store.Url,
  198. DefaultDatabase = "N1"
  199. }
  200. }).Wait(TimeSpan.FromSeconds(15));
  201. store
  202. .DatabaseCommands
  203. .GlobalAdmin
  204. .CreateDatabase(new DatabaseDocument
  205. {
  206. Id = "N2",
  207. Settings =
  208. {
  209. { Constants.ActiveBundles, "" },
  210. { "Raven/DataDir", NewDataPath() }
  211. }
  212. });
  213. smuggler.ImportData(new SmugglerImportOptions<RavenConnectionStringOptions>
  214. {
  215. FromFile = backupPath,
  216. To = new RavenConnectionStringOptions
  217. {
  218. DefaultDatabase = "N2",
  219. Url = store.Url
  220. }
  221. }).Wait(TimeSpan.FromSeconds(15));
  222. commands = store.DatabaseCommands.ForDatabase("N2");
  223. doc = commands.Get("keys/1");
  224. Assert.False(doc.Metadata.ContainsKey(Constants.RavenReplicationSource));
  225. Assert.False(doc.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  226. attachment = commands.GetAttachment("keys/1");
  227. Assert.False(attachment.Metadata.ContainsKey(Constants.RavenReplicationSource));
  228. Assert.False(attachment.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  229. store
  230. .DatabaseCommands
  231. .GlobalAdmin
  232. .CreateDatabase(new DatabaseDocument
  233. {
  234. Id = "N3",
  235. Settings =
  236. {
  237. { Constants.ActiveBundles, "Replication" },
  238. { "Raven/DataDir", NewDataPath() }
  239. }
  240. });
  241. smuggler.ImportData(new SmugglerImportOptions<RavenConnectionStringOptions>
  242. {
  243. FromFile = backupPath,
  244. To = new RavenConnectionStringOptions
  245. {
  246. DefaultDatabase = "N3",
  247. Url = store.Url
  248. }
  249. }).Wait(TimeSpan.FromSeconds(15));
  250. commands = store.DatabaseCommands.ForDatabase("N3");
  251. doc = commands.Get("keys/1");
  252. Assert.True(doc.Metadata.ContainsKey(Constants.RavenReplicationSource));
  253. Assert.True(doc.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  254. attachment = commands.GetAttachment("keys/1");
  255. Assert.True(attachment.Metadata.ContainsKey(Constants.RavenReplicationSource));
  256. Assert.True(attachment.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  257. }
  258. }
  259. [Fact]
  260. public void SmugglerCanStripReplicationInformationDuringImport_Embedded()
  261. {
  262. using (var stream = new MemoryStream())
  263. {
  264. using (var store = NewDocumentStore(activeBundles: "Replication"))
  265. {
  266. var commands = store.DatabaseCommands;
  267. commands.Put("keys/1", null, new RavenJObject(), new RavenJObject());
  268. var doc = commands.Get("keys/1");
  269. Assert.True(doc.Metadata.ContainsKey(Constants.RavenReplicationSource));
  270. Assert.True(doc.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  271. commands.PutAttachment("keys/1", null, new MemoryStream(), new RavenJObject());
  272. var attachment = commands.GetAttachment("keys/1");
  273. Assert.True(attachment.Metadata.ContainsKey(Constants.RavenReplicationSource));
  274. Assert.True(attachment.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  275. var smuggler = new DatabaseDataDumper(store.DocumentDatabase, new SmugglerDatabaseOptions { StripReplicationInformation = true });
  276. smuggler.ExportData(new SmugglerExportOptions<RavenConnectionStringOptions> { ToStream = stream, From = new RavenConnectionStringOptions { DefaultDatabase = store.DefaultDatabase } }).Wait(TimeSpan.FromSeconds(15));
  277. }
  278. stream.Position = 0;
  279. using (var store = NewDocumentStore())
  280. {
  281. var smuggler = new DatabaseDataDumper(store.DocumentDatabase, new SmugglerDatabaseOptions { StripReplicationInformation = true });
  282. smuggler.ImportData(new SmugglerImportOptions<RavenConnectionStringOptions>
  283. {
  284. FromStream = stream,
  285. To = new RavenConnectionStringOptions
  286. {
  287. DefaultDatabase = store.DefaultDatabase,
  288. }
  289. }).Wait(TimeSpan.FromSeconds(15));
  290. var commands = store.DatabaseCommands;
  291. var doc = commands.Get("keys/1");
  292. Assert.False(doc.Metadata.ContainsKey(Constants.RavenReplicationSource));
  293. Assert.False(doc.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  294. var attachment = commands.GetAttachment("keys/1");
  295. Assert.False(attachment.Metadata.ContainsKey(Constants.RavenReplicationSource));
  296. Assert.False(attachment.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  297. }
  298. stream.Position = 0;
  299. using (var store = NewDocumentStore(activeBundles: "Replication"))
  300. {
  301. var smuggler = new DatabaseDataDumper(store.DocumentDatabase, new SmugglerDatabaseOptions { StripReplicationInformation = true });
  302. smuggler.ImportData(new SmugglerImportOptions<RavenConnectionStringOptions>
  303. {
  304. FromStream = stream,
  305. To = new RavenConnectionStringOptions
  306. {
  307. DefaultDatabase = store.DefaultDatabase,
  308. }
  309. }).Wait(TimeSpan.FromSeconds(15));
  310. var commands = store.DatabaseCommands;
  311. var doc = commands.Get("keys/1");
  312. Assert.True(doc.Metadata.ContainsKey(Constants.RavenReplicationSource));
  313. Assert.True(doc.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  314. var attachment = commands.GetAttachment("keys/1");
  315. Assert.True(attachment.Metadata.ContainsKey(Constants.RavenReplicationSource));
  316. Assert.True(attachment.Metadata.ContainsKey(Constants.RavenReplicationVersion));
  317. }
  318. }
  319. }
  320. }
  321. }