PageRenderTime 55ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/DriverOnlineTests/GridFS/MongoGridFSTests.cs

https://github.com/mikekalo/mongo-csharp-driver
C# | 354 lines | 292 code | 48 blank | 14 comment | 0 complexity | 14b7172076a19b2b30ff43844e217ed8 MD5 | raw file
  1. /* Copyright 2010-2011 10gen Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. using System;
  16. using System.Collections.Generic;
  17. using System.IO;
  18. using System.Linq;
  19. using System.Text;
  20. using System.Threading;
  21. using NUnit.Framework;
  22. using MongoDB.Bson;
  23. using MongoDB.Driver;
  24. using MongoDB.Driver.Builders;
  25. using MongoDB.Driver.GridFS;
  26. namespace MongoDB.DriverOnlineTests.GridFS {
  27. [TestFixture]
  28. public class MongoGridFSTests {
  29. private MongoServer server;
  30. private MongoDatabase database;
  31. private MongoGridFS gridFS;
  32. [TestFixtureSetUp]
  33. public void TestFixtureSetup() {
  34. server = MongoServer.Create("mongodb://localhost/?safe=true");
  35. database = server["onlinetests"];
  36. gridFS = database.GridFS;
  37. gridFS.Chunks.RemoveAll();
  38. gridFS.Chunks.ResetIndexCache();
  39. gridFS.Files.RemoveAll();
  40. }
  41. [Test]
  42. public void TestConstructorFeezesSettings() {
  43. var settings = new MongoGridFSSettings();
  44. Assert.IsFalse(settings.IsFrozen);
  45. var gridFS = new MongoGridFS(database, settings);
  46. Assert.IsTrue(gridFS.Settings.IsFrozen);
  47. }
  48. [Test]
  49. public void TestCopyTo() {
  50. gridFS.Delete(Query.Null);
  51. Assert.AreEqual(0, gridFS.Chunks.Count());
  52. Assert.AreEqual(0, gridFS.Files.Count());
  53. var contents = "Hello World";
  54. var bytes = Encoding.UTF8.GetBytes(contents);
  55. var uploadStream = new MemoryStream(bytes);
  56. var createOptions = new MongoGridFSCreateOptions {
  57. Aliases = new[] { "HelloWorld", "HelloUniverse" },
  58. ChunkSize = gridFS.Settings.ChunkSize,
  59. ContentType = "text/plain",
  60. Id = ObjectId.GenerateNewId(),
  61. Metadata = new BsonDocument { { "a", 1 }, { "b", 2 } },
  62. UploadDate = DateTime.UtcNow
  63. };
  64. var fileInfo = gridFS.Upload(uploadStream, "HelloWorld.txt", createOptions);
  65. var copyInfo = fileInfo.CopyTo("HelloWorld2.txt");
  66. Assert.AreEqual(2, gridFS.Chunks.Count());
  67. Assert.AreEqual(2, gridFS.Files.Count());
  68. Assert.IsNull(copyInfo.Aliases);
  69. Assert.AreEqual(fileInfo.ChunkSize, copyInfo.ChunkSize);
  70. Assert.AreEqual(fileInfo.ContentType, copyInfo.ContentType);
  71. Assert.AreNotEqual(fileInfo.Id, copyInfo.Id);
  72. Assert.AreEqual(fileInfo.Length, copyInfo.Length);
  73. Assert.AreEqual(fileInfo.MD5, copyInfo.MD5);
  74. Assert.AreEqual(fileInfo.Metadata, copyInfo.Metadata);
  75. Assert.AreEqual("HelloWorld2.txt", copyInfo.Name);
  76. Assert.AreEqual(fileInfo.UploadDate, copyInfo.UploadDate);
  77. }
  78. [Test]
  79. public void TestAppendText() {
  80. Assert.IsFalse(gridFS.Exists("HelloWorld.txt"));
  81. using (var writer = gridFS.AppendText("HelloWorld.txt")) {
  82. Assert.IsFalse(writer.BaseStream.CanRead);
  83. Assert.IsTrue(writer.BaseStream.CanSeek);
  84. Assert.IsTrue(writer.BaseStream.CanWrite);
  85. writer.Write("Hello");
  86. }
  87. Assert.IsTrue(gridFS.Exists("HelloWorld.txt"));
  88. using (var writer = gridFS.AppendText("HelloWorld.txt")) {
  89. writer.Write(" World");
  90. }
  91. var memoryStream = new MemoryStream();
  92. gridFS.Download(memoryStream, "HelloWorld.txt");
  93. var bytes = memoryStream.ToArray();
  94. Assert.AreEqual(0xEF, bytes[0]); // the BOM
  95. Assert.AreEqual(0xBB, bytes[1]);
  96. Assert.AreEqual(0xBF, bytes[2]);
  97. var text = Encoding.UTF8.GetString(bytes, 3, bytes.Length - 3);
  98. Assert.AreEqual("Hello World", text);
  99. }
  100. [Test]
  101. public void TestDeleteByFileId() {
  102. gridFS.Delete(Query.Null);
  103. Assert.AreEqual(0, gridFS.Chunks.Count());
  104. Assert.AreEqual(0, gridFS.Files.Count());
  105. var fileInfo = UploadHelloWord();
  106. Assert.AreEqual(1, gridFS.Chunks.Count());
  107. Assert.AreEqual(1, gridFS.Files.Count());
  108. gridFS.DeleteById(fileInfo.Id);
  109. Assert.AreEqual(0, gridFS.Chunks.Count());
  110. Assert.AreEqual(0, gridFS.Files.Count());
  111. }
  112. [Test]
  113. public void TestDeleteByFileName() {
  114. gridFS.Delete(Query.Null);
  115. Assert.AreEqual(0, gridFS.Chunks.Count());
  116. Assert.AreEqual(0, gridFS.Files.Count());
  117. UploadHelloWord();
  118. Assert.AreEqual(1, gridFS.Chunks.Count());
  119. Assert.AreEqual(1, gridFS.Files.Count());
  120. gridFS.Delete("HelloWorld.txt");
  121. Assert.AreEqual(0, gridFS.Chunks.Count());
  122. Assert.AreEqual(0, gridFS.Files.Count());
  123. }
  124. [Test]
  125. public void TestDeleteAll() {
  126. gridFS.Delete(Query.Null);
  127. Assert.AreEqual(0, gridFS.Chunks.Count());
  128. Assert.AreEqual(0, gridFS.Files.Count());
  129. }
  130. [Test]
  131. public void TestDownload() {
  132. gridFS.Delete(Query.Null);
  133. var fileInfo = UploadHelloWord();
  134. var downloadStream = new MemoryStream();
  135. gridFS.Download(downloadStream, fileInfo);
  136. var downloadedBytes = downloadStream.ToArray();
  137. var downloadedContents = Encoding.UTF8.GetString(downloadedBytes);
  138. Assert.AreEqual("Hello World", downloadedContents);
  139. }
  140. [Test]
  141. public void TestDownloadTwoChunks() {
  142. gridFS.Delete(Query.Null);
  143. var contents = new string('x', 256 * 1024) + new string('y', 256 * 1024);
  144. var bytes = Encoding.UTF8.GetBytes(contents);
  145. var stream = new MemoryStream(bytes);
  146. var fileInfo = gridFS.Upload(stream, "TwoChunks.txt");
  147. Assert.AreEqual(2 * fileInfo.ChunkSize, fileInfo.Length);
  148. Assert.AreEqual(2, gridFS.Chunks.Count());
  149. Assert.AreEqual(1, gridFS.Files.Count());
  150. var downloadStream = new MemoryStream();
  151. gridFS.Download(downloadStream, fileInfo);
  152. var downloadedBytes = downloadStream.ToArray();
  153. var downloadedContents = Encoding.UTF8.GetString(downloadedBytes);
  154. Assert.AreEqual(contents, downloadedContents);
  155. }
  156. [Test]
  157. public void TestExists() {
  158. gridFS.Delete(Query.Null);
  159. Assert.IsFalse(gridFS.Exists("HelloWorld.txt"));
  160. var fileInfo = UploadHelloWord();
  161. Assert.IsTrue(gridFS.Exists("HelloWorld.txt"));
  162. Assert.IsTrue(gridFS.ExistsById(fileInfo.Id));
  163. }
  164. [Test]
  165. public void TestFindAll() {
  166. gridFS.Delete(Query.Null);
  167. Assert.IsFalse(gridFS.Exists("HelloWorld.txt"));
  168. var fileInfo = UploadHelloWord();
  169. foreach (var foundInfo in gridFS.FindAll()) {
  170. Assert.AreEqual(fileInfo, foundInfo);
  171. }
  172. }
  173. [Test]
  174. public void TestFindByName() {
  175. gridFS.Delete(Query.Null);
  176. Assert.IsFalse(gridFS.Exists("HelloWorld.txt"));
  177. var fileInfo = UploadHelloWord();
  178. foreach (var foundInfo in gridFS.Find("HelloWorld.txt")) {
  179. Assert.AreEqual(fileInfo, foundInfo);
  180. }
  181. }
  182. [Test]
  183. public void TestFindOneById() {
  184. gridFS.Delete(Query.Null);
  185. Assert.IsFalse(gridFS.Exists("HelloWorld.txt"));
  186. var fileInfo = UploadHelloWord();
  187. var foundInfo = gridFS.FindOneById(fileInfo.Id);
  188. Assert.AreEqual(fileInfo, foundInfo);
  189. }
  190. [Test]
  191. public void TestFindOneByName() {
  192. gridFS.Delete(Query.Null);
  193. Assert.IsFalse(gridFS.Exists("HelloWorld.txt"));
  194. var fileInfo = UploadHelloWord();
  195. var foundInfo = gridFS.FindOne("HelloWorld.txt");
  196. Assert.AreEqual(fileInfo, foundInfo);
  197. }
  198. [Test]
  199. public void TestFindOneNewest() {
  200. gridFS.Delete(Query.Null);
  201. Assert.IsFalse(gridFS.Exists("HelloWorld.txt"));
  202. var fileInfo1 = UploadHelloWord();
  203. Thread.Sleep(TimeSpan.FromMilliseconds(1));
  204. var fileInfo2 = UploadHelloWord();
  205. var foundInfo = gridFS.FindOne("HelloWorld.txt", -1);
  206. Assert.AreEqual(fileInfo2, foundInfo);
  207. }
  208. [Test]
  209. public void TestFindOneOldest() {
  210. gridFS.Delete(Query.Null);
  211. Assert.IsFalse(gridFS.Exists("HelloWorld.txt"));
  212. var fileInfo1 = UploadHelloWord();
  213. Thread.Sleep(TimeSpan.FromMilliseconds(1));
  214. var fileInfo2 = UploadHelloWord();
  215. var foundInfo = gridFS.FindOne("HelloWorld.txt", 1);
  216. Assert.AreEqual(fileInfo1, foundInfo);
  217. }
  218. [Test]
  219. public void TestMoveTo() {
  220. gridFS.Delete(Query.Null);
  221. Assert.AreEqual(0, gridFS.Chunks.Count());
  222. Assert.AreEqual(0, gridFS.Files.Count());
  223. var contents = "Hello World";
  224. var bytes = Encoding.UTF8.GetBytes(contents);
  225. var uploadStream = new MemoryStream(bytes);
  226. var fileInfo = gridFS.Upload(uploadStream, "HelloWorld.txt");
  227. Assert.AreEqual(1, gridFS.Chunks.Count());
  228. Assert.AreEqual(1, gridFS.Files.Count());
  229. gridFS.MoveTo("HelloWorld.txt", "HelloWorld2.txt");
  230. Assert.AreEqual(1, gridFS.Chunks.Count());
  231. Assert.AreEqual(1, gridFS.Files.Count());
  232. var movedInfo = gridFS.FindOne("HelloWorld2.txt");
  233. Assert.AreEqual("HelloWorld2.txt", movedInfo.Name);
  234. Assert.AreEqual(fileInfo.Id, movedInfo.Id);
  235. }
  236. [Test]
  237. public void TestSetAliases() {
  238. var fileInfo = UploadHelloWord();
  239. Assert.IsNull(fileInfo.Aliases);
  240. var aliases = new string[] { "a", "b" };
  241. gridFS.SetAliases(fileInfo, aliases);
  242. fileInfo.Refresh();
  243. Assert.IsTrue(aliases.SequenceEqual(fileInfo.Aliases));
  244. gridFS.SetAliases(fileInfo, null);
  245. fileInfo.Refresh();
  246. Assert.IsNull(fileInfo.Aliases);
  247. }
  248. [Test]
  249. public void TestSetContentType() {
  250. var fileInfo = UploadHelloWord();
  251. Assert.IsNull(fileInfo.ContentType);
  252. gridFS.SetContentType(fileInfo, "text/plain");
  253. fileInfo.Refresh();
  254. Assert.AreEqual("text/plain", fileInfo.ContentType);
  255. gridFS.SetContentType(fileInfo, null);
  256. fileInfo.Refresh();
  257. Assert.IsNull(fileInfo.ContentType);
  258. }
  259. [Test]
  260. public void TestSetMetadata() {
  261. var fileInfo = UploadHelloWord();
  262. Assert.IsNull(fileInfo.Metadata);
  263. var metadata = new BsonDocument { { "a", 1 }, { "b", 2 } };
  264. gridFS.SetMetadata(fileInfo, metadata);
  265. fileInfo.Refresh();
  266. Assert.AreEqual(metadata, fileInfo.Metadata);
  267. gridFS.SetMetadata(fileInfo, null);
  268. fileInfo.Refresh();
  269. Assert.IsNull(fileInfo.Metadata);
  270. }
  271. [Test]
  272. public void TestUpload() {
  273. gridFS.Delete(Query.Null);
  274. Assert.AreEqual(0, gridFS.Chunks.Count());
  275. Assert.AreEqual(0, gridFS.Files.Count());
  276. var contents = "Hello World";
  277. var bytes = Encoding.UTF8.GetBytes(contents);
  278. var uploadStream = new MemoryStream(bytes);
  279. var createOptions = new MongoGridFSCreateOptions {
  280. Aliases = new[] { "HelloWorld", "HelloUniverse" },
  281. ChunkSize = gridFS.Settings.ChunkSize,
  282. ContentType = "text/plain",
  283. Id = ObjectId.GenerateNewId(),
  284. Metadata = new BsonDocument { { "a", 1 }, { "b", 2 } },
  285. UploadDate = DateTime.UtcNow
  286. };
  287. var fileInfo = gridFS.Upload(uploadStream, "HelloWorld.txt", createOptions);
  288. Assert.AreEqual(1, gridFS.Chunks.Count());
  289. Assert.AreEqual(1, gridFS.Files.Count());
  290. Assert.IsTrue(createOptions.Aliases.SequenceEqual(fileInfo.Aliases));
  291. Assert.AreEqual(createOptions.ChunkSize, fileInfo.ChunkSize);
  292. Assert.AreEqual(createOptions.ContentType, fileInfo.ContentType);
  293. Assert.AreEqual(createOptions.Id, fileInfo.Id);
  294. Assert.AreEqual(11, fileInfo.Length);
  295. Assert.IsTrue(!string.IsNullOrEmpty(fileInfo.MD5));
  296. Assert.AreEqual(createOptions.Metadata, fileInfo.Metadata);
  297. Assert.AreEqual("HelloWorld.txt", fileInfo.Name);
  298. Assert.AreEqual(createOptions.UploadDate.AddTicks(-(createOptions.UploadDate.Ticks % 10000)), fileInfo.UploadDate);
  299. }
  300. private MongoGridFSFileInfo UploadHelloWord() {
  301. var bytes = Encoding.UTF8.GetBytes("Hello World");
  302. var stream = new MemoryStream(bytes);
  303. return gridFS.Upload(stream, "HelloWorld.txt");
  304. }
  305. }
  306. }