/ToMigrate/Raven.Tests.FileSystem/Storage/FileTests.cs

https://github.com/fitzchak/ravendb · C# · 825 lines · 651 code · 168 blank · 6 comment · 4 complexity · b381017da629296f03f21025375e3d92 MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="FileTests.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 Raven.Abstractions.Data;
  10. using Raven.Abstractions.Util;
  11. using Raven.Database.FileSystem.Infrastructure;
  12. using Raven.Json.Linq;
  13. using Xunit;
  14. using Xunit.Extensions;
  15. namespace Raven.Tests.FileSystem.Storage
  16. {
  17. public class FileTests : StorageAccessorTestBase
  18. {
  19. [Theory]
  20. [PropertyData("Storages")]
  21. public void PutFileShouldCreateEtag(string requestedStorage)
  22. {
  23. using (var storage = NewTransactionalStorage(requestedStorage))
  24. {
  25. storage.Batch(accessor =>
  26. {
  27. var result = accessor.PutFile("file1", null, new RavenJObject { { "key1", "value1" } });
  28. Assert.NotNull(result.Etag);
  29. });
  30. }
  31. }
  32. [Theory]
  33. [PropertyData("Storages")]
  34. public void PutFile(string requestedStorage)
  35. {
  36. using (var storage = NewTransactionalStorage(requestedStorage))
  37. {
  38. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  39. storage.Batch(accessor => accessor.PutFile("file2", 10, new RavenJObject()));
  40. storage.Batch(accessor =>
  41. {
  42. var file1 = accessor.GetFile("file1", 0, 0);
  43. Assert.NotNull(file1);
  44. Assert.Equal("file1", file1.Name);
  45. Assert.Equal(null, file1.TotalSize);
  46. Assert.Equal(0, file1.UploadedSize);
  47. Assert.Equal(0, file1.Start);
  48. Assert.Equal(0, file1.Pages.Count);
  49. var file1Metadata = file1.Metadata;
  50. Assert.NotNull(file1Metadata);
  51. Assert.Equal(1, file1Metadata.Count);
  52. Assert.Equal("00000000-0000-0000-0000-000000000001", file1Metadata.Value<string>(Constants.MetadataEtagField));
  53. var file2 = accessor.GetFile("file2", 5, 10);
  54. Assert.NotNull(file2);
  55. Assert.Equal("file2", file2.Name);
  56. Assert.Equal(10, file2.TotalSize);
  57. Assert.Equal(0, file2.UploadedSize);
  58. Assert.Equal(5, file2.Start);
  59. Assert.Equal(0, file2.Pages.Count);
  60. var file2Metadata = file2.Metadata;
  61. Assert.NotNull(file2Metadata);
  62. Assert.Equal(1, file2Metadata.Count);
  63. Assert.Equal("00000000-0000-0000-0000-000000000002", file2Metadata.Value<string>(Constants.MetadataEtagField));
  64. });
  65. }
  66. }
  67. [Theory]
  68. [PropertyData("Storages")]
  69. public void ReadFile(string requestedStorage)
  70. {
  71. using (var storage = NewTransactionalStorage(requestedStorage))
  72. {
  73. storage.Batch(accessor => Assert.Null(accessor.ReadFile("file1")));
  74. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  75. storage.Batch(accessor => accessor.PutFile("file2", 10, new RavenJObject()));
  76. storage.Batch(accessor =>
  77. {
  78. var file1 = accessor.ReadFile("file1");
  79. Assert.NotNull(file1);
  80. Assert.Equal("file1", file1.Name);
  81. Assert.Equal(null, file1.TotalSize);
  82. Assert.Equal(0, file1.UploadedSize);
  83. var file1Metadata = file1.Metadata;
  84. Assert.NotNull(file1Metadata);
  85. Assert.Equal(1, file1Metadata.Count);
  86. Assert.Equal(EtagUtil.Increment(Etag.Empty, 1), Etag.Parse(file1Metadata.Value<string>(Constants.MetadataEtagField)));
  87. var file2 = accessor.ReadFile("file2");
  88. Assert.NotNull(file2);
  89. Assert.Equal("file2", file2.Name);
  90. Assert.Equal(10, file2.TotalSize);
  91. Assert.Equal(0, file2.UploadedSize);
  92. var file2Metadata = file2.Metadata;
  93. Assert.NotNull(file2Metadata);
  94. Assert.Equal(1, file2Metadata.Count);
  95. Assert.Equal(EtagUtil.Increment(Etag.Empty, 2), Etag.Parse(file2Metadata.Value<string>(Constants.MetadataEtagField)));
  96. });
  97. }
  98. }
  99. [Theory]
  100. [PropertyData("Storages")]
  101. public void DeleteFile(string requestedStorage)
  102. {
  103. var etag1 = Guid.NewGuid();
  104. var etag2 = Guid.NewGuid();
  105. using (var storage = NewTransactionalStorage(requestedStorage))
  106. {
  107. storage.Batch(accessor => accessor.Delete("file1"));
  108. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  109. storage.Batch(accessor => accessor.PutFile("file2", 10, new RavenJObject()));
  110. storage.Batch(accessor => accessor.Delete("file2"));
  111. storage.Batch(accessor =>
  112. {
  113. Assert.NotNull(accessor.ReadFile("file1"));
  114. Assert.Null(accessor.ReadFile("file2"));
  115. });
  116. storage.Batch(accessor => accessor.Delete("file1"));
  117. storage.Batch(accessor =>
  118. {
  119. Assert.Null(accessor.ReadFile("file1"));
  120. Assert.Null(accessor.ReadFile("file2"));
  121. });
  122. }
  123. }
  124. [Theory]
  125. [PropertyData("Storages")]
  126. public void GetFileCount(string requestedStorage)
  127. {
  128. using (var storage = NewTransactionalStorage(requestedStorage))
  129. {
  130. storage.Batch(accessor => Assert.Equal(0, accessor.GetFileCount()));
  131. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  132. storage.Batch(accessor => accessor.PutFile("file2", 10, new RavenJObject()));
  133. storage.Batch(accessor => Assert.Equal(2, accessor.GetFileCount()));
  134. storage.Batch(accessor => accessor.PutFile("file3", 10, new RavenJObject(), tombstone: true));
  135. storage.Batch(accessor => Assert.Equal(2, accessor.GetFileCount()));
  136. storage.Batch(accessor =>
  137. {
  138. accessor.Delete("file2");
  139. accessor.DecrementFileCount("file2");
  140. });
  141. storage.Batch(accessor => Assert.Equal(1, accessor.GetFileCount()));
  142. storage.Batch(accessor => accessor.Delete("file3"));
  143. storage.Batch(accessor => Assert.Equal(1, accessor.GetFileCount()));
  144. storage.Batch(accessor =>
  145. {
  146. accessor.Delete("file1");
  147. accessor.DecrementFileCount("file1");
  148. });
  149. storage.Batch(accessor => Assert.Equal(0, accessor.GetFileCount()));
  150. }
  151. }
  152. [Theory]
  153. [PropertyData("Storages")]
  154. public void CompleteFileUpload(string requestedStorage)
  155. {
  156. using (var storage = NewTransactionalStorage(requestedStorage))
  157. {
  158. storage.Batch(accessor => Assert.Throws<FileNotFoundException>(() => accessor.CompleteFileUpload("file1")));
  159. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  160. storage.Batch(accessor => accessor.PutFile("file2", 10, new RavenJObject()));
  161. storage.Batch(accessor => accessor.CompleteFileUpload("file1"));
  162. storage.Batch(accessor => accessor.CompleteFileUpload("file2"));
  163. storage.Batch(accessor =>
  164. {
  165. var file1 = accessor.ReadFile("file1");
  166. Assert.NotNull(file1);
  167. Assert.Equal("file1", file1.Name);
  168. Assert.Equal(0, file1.TotalSize);
  169. Assert.Equal(0, file1.UploadedSize);
  170. var file2 = accessor.ReadFile("file2");
  171. Assert.NotNull(file2);
  172. Assert.Equal("file2", file2.Name);
  173. Assert.Equal(0, file1.TotalSize);
  174. Assert.Equal(0, file2.UploadedSize);
  175. });
  176. }
  177. }
  178. [Theory]
  179. [PropertyData("Storages")]
  180. public void ReadFiles(string requestedStorage)
  181. {
  182. using (var storage = NewTransactionalStorage(requestedStorage))
  183. {
  184. storage.Batch(accessor => Assert.Empty(accessor.ReadFiles(0, 10)));
  185. storage.Batch(accessor => accessor.PutFile("/file1", null, new RavenJObject()));
  186. storage.Batch(accessor => accessor.PutFile("/file2", 10, new RavenJObject()));
  187. storage.Batch(accessor => accessor.PutFile("/file3", null, new RavenJObject()));
  188. storage.Batch(accessor => accessor.PutFile("/file4", 10, new RavenJObject()));
  189. storage.Batch(accessor => accessor.PutFile("/file5", null, new RavenJObject()));
  190. storage.Batch(accessor => accessor.PutFile("/file6", 10, new RavenJObject()));
  191. storage.Batch(accessor => accessor.PutFile("/file7", null, new RavenJObject()));
  192. storage.Batch(accessor => accessor.PutFile("/file8", 10, new RavenJObject()));
  193. storage.Batch(accessor =>
  194. {
  195. var fileNames = accessor
  196. .ReadFiles(0, 100)
  197. .Select(x => x.Name)
  198. .ToList();
  199. Assert.Equal(8, fileNames.Count);
  200. Assert.Contains("file1", fileNames);
  201. Assert.Contains("file2", fileNames);
  202. Assert.Contains("file3", fileNames);
  203. Assert.Contains("file4", fileNames);
  204. Assert.Contains("file5", fileNames);
  205. Assert.Contains("file6", fileNames);
  206. Assert.Contains("file7", fileNames);
  207. Assert.Contains("file8", fileNames);
  208. fileNames = accessor
  209. .ReadFiles(1, 1)
  210. .Select(x => x.Name)
  211. .ToList();
  212. Assert.Equal(1, fileNames.Count);
  213. Assert.Contains("file2", fileNames);
  214. fileNames = accessor
  215. .ReadFiles(2, 1)
  216. .Select(x => x.Name)
  217. .ToList();
  218. Assert.Equal(1, fileNames.Count);
  219. Assert.Contains("file3", fileNames);
  220. fileNames = accessor
  221. .ReadFiles(2, 2)
  222. .Select(x => x.Name)
  223. .ToList();
  224. Assert.Equal(2, fileNames.Count);
  225. Assert.Contains("file3", fileNames);
  226. Assert.Contains("file4", fileNames);
  227. fileNames = accessor
  228. .ReadFiles(10, 1)
  229. .Select(x => x.Name)
  230. .ToList();
  231. Assert.Empty(fileNames);
  232. });
  233. }
  234. }
  235. [Theory]
  236. [PropertyData("Storages")]
  237. public void GetFilesAfter(string requestedStorage)
  238. {
  239. using (var storage = NewTransactionalStorage(requestedStorage))
  240. {
  241. storage.Batch(accessor => Assert.Empty(accessor.GetFilesAfter(Guid.NewGuid(), 10)));
  242. storage.Batch(accessor => accessor.PutFile("/file1", null, new RavenJObject()));
  243. storage.Batch(accessor => accessor.PutFile("/file2", 10, new RavenJObject()));
  244. storage.Batch(accessor => accessor.PutFile("/file3", null, new RavenJObject()));
  245. storage.Batch(accessor => accessor.PutFile("/file4", 10, new RavenJObject()));
  246. storage.Batch(accessor => accessor.PutFile("/file5", null, new RavenJObject()));
  247. storage.Batch(accessor => accessor.PutFile("/file6", 10, new RavenJObject()));
  248. storage.Batch(accessor => accessor.PutFile("/file7", null, new RavenJObject()));
  249. storage.Batch(accessor => accessor.PutFile("/file8", 10, new RavenJObject()));
  250. storage.Batch(accessor =>
  251. {
  252. var fileNames = accessor
  253. .GetFilesAfter(EtagUtil.Increment(Etag.Empty, 8), 10)
  254. .Select(x => x.Name)
  255. .ToList();
  256. Assert.Empty(fileNames);
  257. fileNames = accessor
  258. .GetFilesAfter(EtagUtil.Increment(Etag.Empty, 1), 10)
  259. .Select(x => x.Name)
  260. .ToList();
  261. Assert.Equal(7, fileNames.Count);
  262. Assert.Contains("file2", fileNames);
  263. Assert.Contains("file3", fileNames);
  264. Assert.Contains("file4", fileNames);
  265. Assert.Contains("file5", fileNames);
  266. Assert.Contains("file6", fileNames);
  267. Assert.Contains("file7", fileNames);
  268. Assert.Contains("file8", fileNames);
  269. fileNames = accessor
  270. .GetFilesAfter(EtagUtil.Increment(Etag.Empty, 1), 2)
  271. .Select(x => x.Name)
  272. .ToList();
  273. Assert.Equal(2, fileNames.Count);
  274. Assert.Contains("file2", fileNames);
  275. Assert.Contains("file3", fileNames);
  276. fileNames = accessor
  277. .GetFilesAfter(EtagUtil.Increment(Etag.Empty, 5), 10)
  278. .Select(x => x.Name)
  279. .ToList();
  280. Assert.Equal(3, fileNames.Count);
  281. Assert.Contains("file6", fileNames);
  282. Assert.Contains("file7", fileNames);
  283. Assert.Contains("file8", fileNames);
  284. fileNames = accessor
  285. .GetFilesAfter(EtagUtil.Increment(Etag.Empty, 6), 3)
  286. .Select(x => x.Name)
  287. .ToList();
  288. Assert.Equal(2, fileNames.Count);
  289. Assert.Contains("file7", fileNames);
  290. Assert.Contains("file8", fileNames);
  291. });
  292. }
  293. }
  294. [Theory]
  295. [PropertyData("Storages")]
  296. public void GetLastEtag(string requestedStorage)
  297. {
  298. using (var storage = NewTransactionalStorage(requestedStorage))
  299. {
  300. Etag etag = null;
  301. storage.Batch(accessor => etag = accessor.GetLastEtag());
  302. Assert.Equal(Etag.Empty, etag);
  303. storage.Batch(accessor => accessor.PutFile("/file1", null, new RavenJObject()));
  304. storage.Batch(accessor => etag = accessor.GetLastEtag());
  305. Assert.Equal(EtagUtil.Increment(Etag.Empty, 1), etag);
  306. storage.Batch(accessor => accessor.PutFile("/file3", null, new RavenJObject()));
  307. storage.Batch(accessor => etag = accessor.GetLastEtag());
  308. Assert.Equal(EtagUtil.Increment(Etag.Empty, 2), etag);
  309. storage.Batch(accessor => accessor.PutFile("/file2", 10, new RavenJObject()));
  310. storage.Batch(accessor => etag = accessor.GetLastEtag());
  311. Assert.Equal(EtagUtil.Increment(Etag.Empty, 3), etag);
  312. storage.Batch(accessor => accessor.PutFile("/file9", 10, new RavenJObject()));
  313. storage.Batch(accessor => etag = accessor.GetLastEtag());
  314. Assert.Equal(EtagUtil.Increment(Etag.Empty, 4), etag);
  315. }
  316. }
  317. [Theory]
  318. [PropertyData("Storages")]
  319. public void UpdateFileMetadata(string requestedStorage)
  320. {
  321. using (var storage = NewTransactionalStorage(requestedStorage))
  322. {
  323. storage.Batch(accessor => Assert.Throws<FileNotFoundException>(() => accessor.UpdateFileMetadata("file1", new RavenJObject(), null)));
  324. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  325. storage.Batch(accessor => accessor.UpdateFileMetadata("file1", new RavenJObject(), null));
  326. storage.Batch(accessor =>
  327. {
  328. var file1 = accessor.GetFile("file1", 0, 0);
  329. Assert.NotNull(file1);
  330. Assert.Equal("file1", file1.Name);
  331. Assert.Equal(null, file1.TotalSize);
  332. Assert.Equal(0, file1.UploadedSize);
  333. Assert.Equal(0, file1.Start);
  334. Assert.Equal(0, file1.Pages.Count);
  335. var file1Metadata = file1.Metadata;
  336. Assert.NotNull(file1Metadata);
  337. Assert.Equal(1, file1Metadata.Count);
  338. // note that file etag will be incremented two times - by put and update metadata methods
  339. Assert.Equal("00000000-0000-0000-0000-000000000002", file1Metadata.Value<string>(Constants.MetadataEtagField));
  340. });
  341. }
  342. }
  343. [Theory]
  344. [PropertyData("Storages")]
  345. public void RenameFile1(string requestedStorage)
  346. {
  347. using (var storage = NewTransactionalStorage(requestedStorage))
  348. {
  349. storage.Batch(accessor => Assert.Throws<FileNotFoundException>(() => accessor.RenameFile("file1", "file2")));
  350. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  351. storage.Batch(accessor => accessor.RenameFile("FiLe1", "file2"));
  352. storage.Batch(accessor => Assert.Throws<FileNotFoundException>(() => accessor.GetFile("file1", 0, 10)));
  353. storage.Batch(accessor =>
  354. {
  355. var file = accessor.GetFile("file2", 0, 0);
  356. Assert.NotNull(file);
  357. Assert.Equal("file2", file.Name);
  358. Assert.Equal(null, file.TotalSize);
  359. Assert.Equal(0, file.UploadedSize);
  360. Assert.Equal(0, file.Start);
  361. Assert.Equal(0, file.Pages.Count);
  362. var fileMetadata = file.Metadata;
  363. Assert.NotNull(fileMetadata);
  364. Assert.Equal(1, fileMetadata.Count);
  365. Assert.Equal("00000000-0000-0000-0000-000000000001", fileMetadata.Value<string>(Constants.MetadataEtagField));
  366. });
  367. }
  368. }
  369. [Theory]
  370. [PropertyData("Storages")]
  371. public void RenameFile2(string requestedStorage)
  372. {
  373. using (var storage = NewTransactionalStorage(requestedStorage))
  374. {
  375. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  376. storage.Batch(accessor => accessor.AssociatePage("file1", 1, 0, 10));
  377. storage.Batch(accessor => accessor.RenameFile("file1", "file2"));
  378. storage.Batch(accessor => Assert.Throws<FileNotFoundException>(() => accessor.GetFile("file1", 0, 10)));
  379. storage.Batch(accessor =>
  380. {
  381. var file = accessor.GetFile("file2", 0, 10);
  382. Assert.NotNull(file);
  383. Assert.Equal("file2", file.Name);
  384. Assert.Equal(-10, file.TotalSize);
  385. Assert.Equal(10, file.UploadedSize);
  386. Assert.Equal(0, file.Start);
  387. Assert.Equal(1, file.Pages.Count);
  388. Assert.Equal(1, file.Pages[0].Id);
  389. Assert.Equal(10, file.Pages[0].Size);
  390. var fileMetadata = file.Metadata;
  391. Assert.NotNull(fileMetadata);
  392. Assert.Equal(1, fileMetadata.Count);
  393. Assert.Equal("00000000-0000-0000-0000-000000000001", fileMetadata.Value<string>(Constants.MetadataEtagField));
  394. });
  395. }
  396. }
  397. [Theory]
  398. [PropertyData("Storages")]
  399. public void GetFileCaseSensitive(string requestedStorage)
  400. {
  401. using (var storage = NewTransactionalStorage(requestedStorage))
  402. {
  403. storage.Batch(accessor => accessor.PutFile("FiLe1", null, new RavenJObject()));
  404. storage.Batch(accessor =>
  405. {
  406. var file1 = accessor.GetFile("file1", 0, 0);
  407. Assert.NotNull(file1);
  408. Assert.Equal("FiLe1", file1.Name);
  409. Assert.Equal(null, file1.TotalSize);
  410. Assert.Equal(0, file1.UploadedSize);
  411. Assert.Equal(0, file1.Start);
  412. Assert.Equal(0, file1.Pages.Count);
  413. var file1Metadata = file1.Metadata;
  414. Assert.NotNull(file1Metadata);
  415. Assert.Equal(1, file1Metadata.Count);
  416. Assert.Equal("00000000-0000-0000-0000-000000000001", file1Metadata.Value<string>(Constants.MetadataEtagField));
  417. });
  418. }
  419. }
  420. [Theory]
  421. [PropertyData("Storages")]
  422. public void GetFileCaseSensitiveWithPages(string requestedStorage)
  423. {
  424. using (var storage = NewTransactionalStorage(requestedStorage))
  425. {
  426. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  427. storage.Batch(accessor => accessor.AssociatePage("file1", 1, 0, 10));
  428. storage.Batch(accessor =>
  429. {
  430. var file = accessor.GetFile("FiLe1", 0, 10);
  431. Assert.NotNull(file);
  432. Assert.Equal("file1", file.Name);
  433. Assert.Equal(-10, file.TotalSize);
  434. Assert.Equal(10, file.UploadedSize);
  435. Assert.Equal(0, file.Start);
  436. Assert.Equal(1, file.Pages.Count);
  437. Assert.Equal(1, file.Pages[0].Id);
  438. Assert.Equal(10, file.Pages[0].Size);
  439. var fileMetadata = file.Metadata;
  440. Assert.NotNull(fileMetadata);
  441. Assert.Equal(1, fileMetadata.Count);
  442. Assert.Equal("00000000-0000-0000-0000-000000000001", fileMetadata.Value<string>(Constants.MetadataEtagField));
  443. });
  444. }
  445. }
  446. [Theory]
  447. [PropertyData("Storages")]
  448. public void RenameFileWithPageCaseSensitive(string requestedStorage)
  449. {
  450. using (var storage = NewTransactionalStorage(requestedStorage))
  451. {
  452. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  453. storage.Batch(accessor => accessor.AssociatePage("file1", 1, 0, 10));
  454. storage.Batch(accessor => accessor.RenameFile("FiLe1", "file2"));
  455. storage.Batch(accessor => Assert.Throws<FileNotFoundException>(() => accessor.GetFile("file1", 0, 10)));
  456. storage.Batch(accessor =>
  457. {
  458. var file = accessor.GetFile("file2", 0, 10);
  459. Assert.NotNull(file);
  460. Assert.Equal("file2", file.Name);
  461. Assert.Equal(-10, file.TotalSize);
  462. Assert.Equal(10, file.UploadedSize);
  463. Assert.Equal(0, file.Start);
  464. Assert.Equal(1, file.Pages.Count);
  465. Assert.Equal(1, file.Pages[0].Id);
  466. Assert.Equal(10, file.Pages[0].Size);
  467. var fileMetadata = file.Metadata;
  468. Assert.NotNull(fileMetadata);
  469. Assert.Equal(1, fileMetadata.Count);
  470. Assert.Equal("00000000-0000-0000-0000-000000000001", fileMetadata.Value<string>(Constants.MetadataEtagField));
  471. });
  472. }
  473. }
  474. [Theory]
  475. [PropertyData("Storages")]
  476. public void RenameFileWithPageCaseSensitiveMemoryLeak(string requestedStorage)
  477. {
  478. using (var storage = NewTransactionalStorage(requestedStorage))
  479. {
  480. var pageId = 0;
  481. storage.Batch(accessor =>
  482. {
  483. accessor.PutFile("file1", 3, new RavenJObject());
  484. pageId = accessor.InsertPage(new byte[] { 1, 2, 3 }, 3);
  485. accessor.AssociatePage("file1", pageId, 0, 3);
  486. accessor.CompleteFileUpload("file1");
  487. });
  488. storage.Batch(accessor => accessor.RenameFile("File1", "file2"));
  489. storage.Batch(accessor => accessor.Delete("file2"));
  490. storage.Batch(accessor =>
  491. {
  492. var buffer = new byte[3];
  493. Assert.True(buffer.All(b => b == default(byte)));
  494. accessor.ReadPage(pageId, buffer);
  495. Assert.True(buffer.All(b => b == default(byte)));
  496. Assert.Null(accessor.ReadFile("file2"));
  497. });
  498. }
  499. }
  500. [Theory]
  501. [PropertyData("Storages")]
  502. public void DeleteFileWithPageCaseSensitiveMemoryLeak(string requestedStorage)
  503. {
  504. using (var storage = NewTransactionalStorage(requestedStorage))
  505. {
  506. var pageId = 0;
  507. storage.Batch(accessor =>
  508. {
  509. accessor.PutFile("test0.bin", 3, new RavenJObject());
  510. pageId = accessor.InsertPage(new byte[] { 1, 2, 3 }, 3);
  511. accessor.AssociatePage("test0.bin", pageId, 0, 3);
  512. accessor.CompleteFileUpload("test0.bin");
  513. });
  514. storage.Batch(accessor => accessor.Delete("TeSt0.BiN"));
  515. storage.Batch(accessor =>
  516. {
  517. var buffer = new byte[3];
  518. Assert.True(buffer.All(b => b == default(byte)));
  519. accessor.ReadPage(pageId, buffer);
  520. Assert.True(buffer.All(b => b == default(byte)));
  521. Assert.Null(accessor.ReadFile("test0.bin"));
  522. });
  523. }
  524. }
  525. [Theory]
  526. [PropertyData("Storages")]
  527. public void CopyFile1(string requestedStorage)
  528. {
  529. using (var storage = NewTransactionalStorage(requestedStorage))
  530. {
  531. storage.Batch(accessor => Assert.Throws<FileNotFoundException>(() => accessor.CopyFile("file1", "file2")));
  532. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  533. storage.Batch(accessor => accessor.CopyFile("file1", "file2"));
  534. storage.Batch(accessor =>
  535. {
  536. var file = accessor.GetFile("file2", 0, 0);
  537. Assert.NotNull(file);
  538. Assert.Equal("file2", file.Name);
  539. Assert.Equal(null, file.TotalSize);
  540. Assert.Equal(0, file.UploadedSize);
  541. Assert.Equal(0, file.Start);
  542. Assert.Equal(0, file.Pages.Count);
  543. var fileMetadata = file.Metadata;
  544. Assert.NotNull(fileMetadata);
  545. Assert.Equal(1, fileMetadata.Count);
  546. Assert.Equal("00000000-0000-0000-0000-000000000002", fileMetadata.Value<string>(Constants.MetadataEtagField));
  547. });
  548. }
  549. }
  550. [Theory]
  551. [PropertyData("Storages")]
  552. public void GetFilesAfterWhereFileEtagsHaveDifferentRestartValues(string requestedStorage)
  553. {
  554. var etagGenerator = new UuidGenerator();
  555. using (var storage = NewTransactionalStorage(requestedStorage, uuidGenerator: etagGenerator))
  556. {
  557. storage.Batch(accessor => accessor.PutFile("/file1", null, new RavenJObject()));
  558. etagGenerator.EtagBase = 7;
  559. storage.Batch(accessor => accessor.PutFile("/file2", 10, new RavenJObject()));
  560. etagGenerator.EtagBase = 12;
  561. storage.Batch(accessor => accessor.PutFile("/file3", null, new RavenJObject()));
  562. etagGenerator.EtagBase = 300;
  563. storage.Batch(accessor => accessor.PutFile("/file4", 10, new RavenJObject()));
  564. etagGenerator.EtagBase = 450;
  565. storage.Batch(accessor => accessor.PutFile("/file5", null, new RavenJObject()));
  566. etagGenerator.EtagBase = 1024;
  567. storage.Batch(accessor => accessor.PutFile("/file6", 10, new RavenJObject()));
  568. etagGenerator.EtagBase = 3333;
  569. storage.Batch(accessor => accessor.PutFile("/file7", null, new RavenJObject()));
  570. etagGenerator.EtagBase = 10000;
  571. storage.Batch(accessor => accessor.PutFile("/file8", 10, new RavenJObject()));
  572. storage.Batch(accessor =>
  573. {
  574. var files = accessor
  575. .GetFilesAfter(Etag.Empty, 10)
  576. .ToList();
  577. Assert.Equal(8, files.Count);
  578. Assert.Equal("file1", files[0].Name);
  579. Assert.Equal("file2", files[1].Name);
  580. Assert.Equal("file3", files[2].Name);
  581. Assert.Equal("file4", files[3].Name);
  582. Assert.Equal("file5", files[4].Name);
  583. Assert.Equal("file6", files[5].Name);
  584. Assert.Equal("file7", files[6].Name);
  585. Assert.Equal("file8", files[7].Name);
  586. files = accessor
  587. .GetFilesAfter(files[4].Etag, 100)
  588. .ToList();
  589. Assert.Equal(3, files.Count);
  590. Assert.Equal("file6", files[0].Name);
  591. Assert.Equal("file7", files[1].Name);
  592. Assert.Equal("file8", files[2].Name);
  593. });
  594. }
  595. }
  596. [Theory]
  597. [PropertyData("Storages")]
  598. public void CopyFile2(string requestedStorage)
  599. {
  600. using (var storage = NewTransactionalStorage(requestedStorage))
  601. {
  602. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  603. storage.Batch(accessor => accessor.AssociatePage("file1", 1, 0, 10));
  604. storage.Batch(accessor => accessor.CopyFile("file1", "file2"));
  605. storage.Batch(accessor =>
  606. {
  607. var file = accessor.GetFile("file2", 0, 10);
  608. Assert.NotNull(file);
  609. Assert.Equal("file2", file.Name);
  610. Assert.Equal(-10, file.TotalSize);
  611. Assert.Equal(10, file.UploadedSize);
  612. Assert.Equal(0, file.Start);
  613. Assert.Equal(1, file.Pages.Count);
  614. Assert.Equal(1, file.Pages[0].Id);
  615. Assert.Equal(10, file.Pages[0].Size);
  616. var fileMetadata = file.Metadata;
  617. Assert.NotNull(fileMetadata);
  618. Assert.Equal(1, fileMetadata.Count);
  619. Assert.Equal("00000000-0000-0000-0000-000000000002", fileMetadata.Value<string>(Constants.MetadataEtagField));
  620. });
  621. }
  622. }
  623. [Theory]
  624. [PropertyData("Storages")]
  625. public void CopyFile3(string requestedStorage)
  626. {
  627. using (var storage = NewTransactionalStorage(requestedStorage))
  628. {
  629. storage.Batch(accessor => accessor.PutFile("file1", null, new RavenJObject()));
  630. storage.Batch(accessor =>
  631. {
  632. var id = accessor.InsertPage(new byte[10], 10);
  633. accessor.AssociatePage("file1", id, 0, 10);
  634. });
  635. storage.Batch(accessor => accessor.CopyFile("file1", "file2"));
  636. storage.Batch(accessor => Assert.NotNull(accessor.GetFile("file2", 0, int.MaxValue)));
  637. storage.Batch(accessor => accessor.Delete("file1"));
  638. storage.Batch(accessor =>
  639. {
  640. var file = accessor.GetFile("file2", 0, 2);
  641. Assert.NotNull(file);
  642. Assert.Equal("file2", file.Name);
  643. Assert.Equal(-10, file.TotalSize);
  644. Assert.Equal(10, file.UploadedSize);
  645. Assert.Equal(0, file.Start);
  646. Assert.Equal(1, file.Pages.Count);
  647. Assert.Equal(1, file.Pages[0].Id);
  648. Assert.Equal(10, file.Pages[0].Size);
  649. var fileMetadata = file.Metadata;
  650. Assert.NotNull(fileMetadata);
  651. Assert.Equal(1, fileMetadata.Count);
  652. Assert.Equal("00000000-0000-0000-0000-000000000002", fileMetadata.Value<string>(Constants.MetadataEtagField));
  653. });
  654. }
  655. }
  656. }
  657. }