You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2810 lines
135 KiB

  1. /*
  2. * MinIO .NET Library for Amazon S3 Compatible Cloud Storage,
  3. * (C) 2017, 2018, 2019, 2020 MinIO, Inc.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. using Microsoft.VisualStudio.TestTools.UnitTesting;
  18. using Minio.DataModel;
  19. using Minio.Exceptions;
  20. using Newtonsoft.Json;
  21. using System;
  22. using System.Collections.Generic;
  23. using System.IO;
  24. using System.Net;
  25. using System.Net.Http;
  26. using System.Security.Cryptography;
  27. using System.Text;
  28. using System.Threading;
  29. using System.Threading.Tasks;
  30. namespace Minio.Functional.Tests
  31. {
  32. public class FunctionalTest
  33. {
  34. private static readonly Random rnd = new Random();
  35. private const int KB = 1024;
  36. private const int MB = 1024 * 1024;
  37. private const string dataFile1B = "datafile-1-b";
  38. private const string dataFile10KB = "datafile-10-kB";
  39. private const string dataFile6MB = "datafile-6-MB";
  40. private static RandomStreamGenerator rsg = new RandomStreamGenerator(100 * MB);
  41. private const string makeBucketSignature = "Task MakeBucketAsync(string bucketName, string location = 'us-east-1', CancellationToken cancellationToken = default(CancellationToken))";
  42. private const string listBucketsSignature = "Task<ListAllMyBucketsResult> ListBucketsAsync(CancellationToken cancellationToken = default(CancellationToken))";
  43. private const string bucketExistsSignature = "Task<bool> BucketExistsAsync(string bucketName, CancellationToken cancellationToken = default(CancellationToken))";
  44. private const string removeBucketSignature = "Task RemoveBucketAsync(string bucketName, CancellationToken cancellationToken = default(CancellationToken))";
  45. private const string listObjectsSignature = "IObservable<Item> ListObjectsAsync(string bucketName, string prefix = null, bool recursive = false, CancellationToken cancellationToken = default(CancellationToken))";
  46. private const string listIncompleteUploadsSignature = "IObservable<Upload> ListIncompleteUploads(string bucketName, string prefix, bool recursive, CancellationToken cancellationToken = default(CancellationToken))";
  47. private const string getObjectSignature1 = "Task GetObjectAsync(string bucketName, string objectName, Action<Stream> callback, CancellationToken cancellationToken = default(CancellationToken))";
  48. private const string getObjectSignature2 = "Task GetObjectAsync(string bucketName, string objectName, Action<Stream> callback, CancellationToken cancellationToken = default(CancellationToken))";
  49. private const string getObjectSignature3 = "Task GetObjectAsync(string bucketName, string objectName, string fileName, CancellationToken cancellationToken = default(CancellationToken))";
  50. private const string putObjectSignature1 = "Task PutObjectAsync(string bucketName, string objectName, Stream data, long size, string contentType, Dictionary<string, string> metaData=null, CancellationToken cancellationToken = default(CancellationToken))";
  51. private const string putObjectSignature2 = "Task PutObjectAsync(string bucketName, string objectName, string filePath, string contentType=null, Dictionary<string, string> metaData=null, CancellationToken cancellationToken = default(CancellationToken))";
  52. private const string listenBucketNotificationsSignature = "IObservable<MinioNotificationRaw> ListenBucketNotificationsAsync(string bucketName, IList<EventType> events, string prefix, string suffix, CancellationToken cancellationToken = default(CancellationToken))";
  53. private const string statObjectSignature = "Task<ObjectStat> StatObjectAsync(string bucketName, string objectName, CancellationToken cancellationToken = default(CancellationToken))";
  54. private const string copyObjectSignature = "Task<CopyObjectResult> CopyObjectAsync(string bucketName, string objectName, string destBucketName, string destObjectName = null, CopyConditions copyConditions = null, CancellationToken cancellationToken = default(CancellationToken))";
  55. private const string removeObjectSignature1 = "Task RemoveObjectAsync(string bucketName, string objectName, CancellationToken cancellationToken = default(CancellationToken))";
  56. private const string removeObjectSignature2 = "Task<IObservable<DeleteError>> RemoveObjectAsync(string bucketName, IEnumerable<string> objectsList, CancellationToken cancellationToken = default(CancellationToken))";
  57. private const string removeIncompleteUploadSignature = "Task RemoveIncompleteUploadAsync(string bucketName, string objectName, CancellationToken cancellationToken = default(CancellationToken))";
  58. private const string presignedGetObjectSignature = "Task<string> PresignedGetObjectAsync(string bucketName, string objectName, int expiresInt, Dictionary<string, string> reqParams = null)";
  59. private const string presignedPutObjectSignature = "Task<string> PresignedPutObjectAsync(string bucketName, string objectName, int expiresInt)";
  60. private const string presignedPostPolicySignature = "Task<Dictionary<string, string>> PresignedPostPolicyAsync(PostPolicy policy)";
  61. private const string getBucketPolicySignature = "Task<string> GetPolicyAsync(string bucketName, CancellationToken cancellationToken = default(CancellationToken))";
  62. private const string setBucketPolicySignature = "Task SetPolicyAsync(string bucketName, string policyJson, CancellationToken cancellationToken = default(CancellationToken))";
  63. private const string getBucketNotificationSignature = "Task<BucketNotification> GetBucketNotificationAsync(string bucketName, CancellationToken cancellationToken = default(CancellationToken))";
  64. private const string setBucketNotificationSignature = "Task SetBucketNotificationAsync(string bucketName, BucketNotification notification, CancellationToken cancellationToken = default(CancellationToken))";
  65. private const string removeAllBucketsNotificationSignature = "Task RemoveAllBucketNotificationsAsync(string bucketName, CancellationToken cancellationToken = default(CancellationToken))";
  66. private const string selectObjectSignature = "Task<SelectResponseStream> SelectObjectContentAsync(string bucketName, string objectName, SelectObjectOptions opts, CancellationToken cancellationToken = default(CancellationToken))";
  67. // Create a file of given size from random byte array or optionally create a symbolic link
  68. // to the dataFileName residing in MINT_DATA_DIR
  69. private static string CreateFile(int size, string dataFileName = null)
  70. {
  71. string fileName = GetRandomName();
  72. if (!IsMintEnv())
  73. {
  74. byte[] data = new byte[size];
  75. rnd.NextBytes(data);
  76. File.WriteAllBytes(fileName, data);
  77. return GetFilePath(fileName);
  78. }
  79. return GetFilePath(dataFileName);
  80. }
  81. public static string GetRandomObjectName(int length = 5)
  82. {
  83. string characters = "abcd+&%$#@*&{}[]()";
  84. StringBuilder result = new StringBuilder(length);
  85. for (int i = 0; i < length; i++)
  86. {
  87. result.Append(characters[rnd.Next(characters.Length)]);
  88. }
  89. return result.ToString();
  90. }
  91. // Generate a random string
  92. public static string GetRandomName(int length = 5)
  93. {
  94. var characters = "0123456789abcdefghijklmnopqrstuvwxyz";
  95. if (length > 50)
  96. {
  97. length = 50;
  98. }
  99. var result = new StringBuilder(length);
  100. for (int i = 0; i < length; i++)
  101. {
  102. result.Append(characters[rnd.Next(characters.Length)]);
  103. }
  104. return $"miniodotnet{result}";
  105. }
  106. // Return true if running in Mint mode
  107. public static bool IsMintEnv()
  108. {
  109. return !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("MINT_DATA_DIR"));
  110. }
  111. // Get full path of file
  112. public static string GetFilePath(string fileName)
  113. {
  114. var dataDir = Environment.GetEnvironmentVariable("MINT_DATA_DIR");
  115. if (!string.IsNullOrEmpty(dataDir))
  116. {
  117. return $"{dataDir}/{fileName}";
  118. }
  119. string path = Directory.GetCurrentDirectory();
  120. return $"{path}/{fileName}";
  121. }
  122. internal static void RunCoreTests(MinioClient minioClient)
  123. {
  124. // Check if bucket exists
  125. BucketExists_Test(minioClient).Wait();
  126. // Create a new bucket
  127. MakeBucket_Test1(minioClient).Wait();
  128. PutObject_Test1(minioClient).Wait();
  129. PutObject_Test2(minioClient).Wait();
  130. ListObjects_Test1(minioClient).Wait();
  131. RemoveObject_Test1(minioClient).Wait();
  132. CopyObject_Test1(minioClient).Wait();
  133. // Test SetPolicyAsync function
  134. SetBucketPolicy_Test1(minioClient).Wait();
  135. // Test Presigned Get/Put operations
  136. PresignedGetObject_Test1(minioClient).Wait();
  137. PresignedPutObject_Test1(minioClient).Wait();
  138. // Test incomplete uploads
  139. ListIncompleteUpload_Test1(minioClient).Wait();
  140. RemoveIncompleteUpload_Test(minioClient).Wait();
  141. // Test GetBucket policy
  142. GetBucketPolicy_Test1(minioClient).Wait();
  143. }
  144. internal async static Task BucketExists_Test(MinioClient minio)
  145. {
  146. DateTime startTime = DateTime.Now;
  147. string bucketName = GetRandomName();
  148. var args = new Dictionary<string, string>
  149. {
  150. { "bucketName", bucketName },
  151. };
  152. try
  153. {
  154. await minio.MakeBucketAsync(bucketName);
  155. bool found = await minio.BucketExistsAsync(bucketName);
  156. Assert.IsTrue(found);
  157. await minio.RemoveBucketAsync(bucketName);
  158. new MintLogger(nameof(BucketExists_Test), bucketExistsSignature, "Tests whether BucketExists passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  159. }
  160. catch (MinioException ex)
  161. {
  162. new MintLogger(nameof(BucketExists_Test), bucketExistsSignature, "Tests whether BucketExists passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  163. }
  164. }
  165. #region Make Bucket
  166. internal async static Task MakeBucket_Test1(MinioClient minio)
  167. {
  168. DateTime startTime = DateTime.Now;
  169. string bucketName = GetRandomName(length: 60);
  170. var args = new Dictionary<string, string>
  171. {
  172. { "bucketName", bucketName },
  173. { "region", "us-east-1" },
  174. };
  175. try
  176. {
  177. await minio.MakeBucketAsync(bucketName);
  178. bool found = await minio.BucketExistsAsync(bucketName);
  179. Assert.IsTrue(found);
  180. await minio.RemoveBucketAsync(bucketName);
  181. new MintLogger(nameof(MakeBucket_Test1), makeBucketSignature, "Tests whether MakeBucket passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  182. }
  183. catch (MinioException ex)
  184. {
  185. new MintLogger(nameof(MakeBucket_Test1), makeBucketSignature, "Tests whether MakeBucket passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  186. }
  187. }
  188. internal async static Task MakeBucket_Test2(MinioClient minio)
  189. {
  190. DateTime startTime = DateTime.Now;
  191. string bucketName = GetRandomName(length: 10) + ".withperiod";
  192. var args = new Dictionary<string, string>
  193. {
  194. { "bucketName", bucketName },
  195. { "region", "us-east-1" },
  196. };
  197. string testType = "Test whether make bucket passes when bucketname has a period.";
  198. try
  199. {
  200. await minio.MakeBucketAsync(bucketName);
  201. bool found = await minio.BucketExistsAsync(bucketName);
  202. Assert.IsTrue(found);
  203. await minio.RemoveBucketAsync(bucketName);
  204. new MintLogger(nameof(MakeBucket_Test2), makeBucketSignature, testType, TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  205. }
  206. catch (MinioException ex)
  207. {
  208. new MintLogger(nameof(MakeBucket_Test2), makeBucketSignature, testType, TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  209. }
  210. }
  211. internal async static Task MakeBucket_Test3(MinioClient minio, bool aws = false)
  212. {
  213. if (!aws)
  214. return;
  215. DateTime startTime = DateTime.Now;
  216. string bucketName = GetRandomName(length: 60);
  217. var args = new Dictionary<string, string>
  218. {
  219. { "bucketName", bucketName },
  220. { "region", "eu-central-1" },
  221. };
  222. try
  223. {
  224. await minio.MakeBucketAsync(bucketName, location: "eu-central-1");
  225. bool found = await minio.BucketExistsAsync(bucketName);
  226. Assert.IsTrue(found);
  227. if (found)
  228. {
  229. await minio.MakeBucketAsync(bucketName);
  230. await minio.RemoveBucketAsync(bucketName);
  231. }
  232. new MintLogger(nameof(MakeBucket_Test3), makeBucketSignature, "Tests whether MakeBucket with region passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  233. }
  234. catch (MinioException ex)
  235. {
  236. // Assert.AreEqual<string>(ex.message, "Your previous request to create the named bucket succeeded and you already own it.");
  237. new MintLogger(nameof(MakeBucket_Test3), makeBucketSignature, "Tests whether MakeBucket with region passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  238. }
  239. }
  240. internal async static Task MakeBucket_Test4(MinioClient minio, bool aws = false)
  241. {
  242. if (!aws)
  243. return;
  244. DateTime startTime = DateTime.Now;
  245. string bucketName = GetRandomName(length: 20) + ".withperiod";
  246. var args = new Dictionary<string, string>
  247. {
  248. { "bucketName", bucketName },
  249. { "region", "us-west-2" },
  250. };
  251. try
  252. {
  253. await minio.MakeBucketAsync(bucketName, location: "us-west-2");
  254. bool found = await minio.BucketExistsAsync(bucketName);
  255. Assert.IsTrue(found);
  256. if (found)
  257. {
  258. await minio.RemoveBucketAsync(bucketName);
  259. }
  260. new MintLogger(nameof(MakeBucket_Test4), makeBucketSignature, "Tests whether MakeBucket with region and bucketname with . passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  261. }
  262. catch (MinioException ex)
  263. {
  264. new MintLogger(nameof(MakeBucket_Test4), makeBucketSignature, "Tests whether MakeBucket with region and bucketname with . passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  265. }
  266. }
  267. #endregion
  268. internal async static Task RemoveBucket_Test1(MinioClient minio)
  269. {
  270. DateTime startTime = DateTime.Now;
  271. string bucketName = GetRandomName(length: 20);
  272. var args = new Dictionary<string, string>
  273. {
  274. { "bucketName", bucketName },
  275. };
  276. try
  277. {
  278. await minio.MakeBucketAsync(bucketName);
  279. bool found = await minio.BucketExistsAsync(bucketName);
  280. Assert.IsTrue(found);
  281. await minio.RemoveBucketAsync(bucketName);
  282. found = await minio.BucketExistsAsync(bucketName);
  283. Assert.IsFalse(found);
  284. new MintLogger(nameof(RemoveBucket_Test1), removeBucketSignature, "Tests whether RemoveBucket passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  285. }
  286. catch (MinioException ex)
  287. {
  288. new MintLogger(nameof(RemoveBucket_Test1), removeBucketSignature, "Tests whether RemoveBucket passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  289. }
  290. }
  291. internal async static Task ListBuckets_Test(MinioClient minio)
  292. {
  293. DateTime startTime = DateTime.Now;
  294. var args = new Dictionary<string, string>();
  295. try
  296. {
  297. var list = await minio.ListBucketsAsync();
  298. foreach (Bucket bucket in list.Buckets)
  299. {
  300. // Ignore
  301. continue;
  302. }
  303. new MintLogger(nameof(ListBuckets_Test), listBucketsSignature, "Tests whether ListBucket passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  304. }
  305. catch (Exception ex)
  306. {
  307. new MintLogger(nameof(ListBuckets_Test), listBucketsSignature, "Tests whether ListBucket passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  308. }
  309. }
  310. internal async static Task Setup_Test(MinioClient minio, string bucketName)
  311. {
  312. await minio.MakeBucketAsync(bucketName);
  313. bool found = await minio.BucketExistsAsync(bucketName);
  314. Assert.IsTrue(found);
  315. }
  316. internal async static Task TearDown(MinioClient minio, string bucketName)
  317. {
  318. await minio.RemoveBucketAsync(bucketName);
  319. }
  320. #region Put Object
  321. internal async static Task PutObject_Test1(MinioClient minio)
  322. {
  323. DateTime startTime = DateTime.Now;
  324. string bucketName = GetRandomName(15);
  325. string objectName = GetRandomObjectName(10);
  326. string contentType = "application/octet-stream";
  327. var args = new Dictionary<string, string>
  328. {
  329. { "bucketName", bucketName },
  330. { "objectName", objectName },
  331. { "contentType", contentType },
  332. { "size", "1MB" }
  333. };
  334. try
  335. {
  336. await Setup_Test(minio, bucketName);
  337. await PutObject_Tester(minio, bucketName, objectName, null, contentType, 0, null, rsg.GenerateStreamFromSeed(1 * KB));
  338. await TearDown(minio, bucketName);
  339. new MintLogger(nameof(PutObject_Test1), putObjectSignature1, "Tests whether PutObject passes for small object", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  340. }
  341. catch (Exception ex)
  342. {
  343. new MintLogger(nameof(PutObject_Test1), putObjectSignature1, "Tests whether PutObject passes for small object", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  344. }
  345. }
  346. internal async static Task PutObject_Test2(MinioClient minio)
  347. {
  348. DateTime startTime = DateTime.Now;
  349. string bucketName = GetRandomName(15);
  350. string objectName = GetRandomObjectName(10);
  351. string contentType = "application/octet-stream";
  352. var args = new Dictionary<string, string>
  353. {
  354. { "bucketName", bucketName },
  355. { "objectName", objectName },
  356. { "contentType", contentType },
  357. { "size", "6MB" }
  358. };
  359. try
  360. {
  361. await Setup_Test(minio, bucketName);
  362. await PutObject_Tester(minio, bucketName, objectName, null, contentType, 0, null, rsg.GenerateStreamFromSeed(6 * MB));
  363. await TearDown(minio, bucketName);
  364. new MintLogger(nameof(PutObject_Test2), putObjectSignature1, "Tests whether multipart PutObject passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  365. }
  366. catch (Exception ex)
  367. {
  368. new MintLogger(nameof(PutObject_Test2), putObjectSignature1, "Tests whether multipart PutObject passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  369. }
  370. }
  371. internal async static Task PutObject_Test3(MinioClient minio)
  372. {
  373. DateTime startTime = DateTime.Now;
  374. string bucketName = GetRandomName(15);
  375. string objectName = GetRandomObjectName(10);
  376. string contentType = "custom-contenttype";
  377. var args = new Dictionary<string, string>
  378. {
  379. { "bucketName", bucketName },
  380. { "objectName", objectName },
  381. { "contentType", contentType },
  382. { "size", "1MB" }
  383. };
  384. try
  385. {
  386. await Setup_Test(minio, bucketName);
  387. await PutObject_Tester(minio, bucketName, objectName, null, contentType, 0, null, rsg.GenerateStreamFromSeed(1 * KB));
  388. await TearDown(minio, bucketName);
  389. new MintLogger(nameof(PutObject_Test3), putObjectSignature1, "Tests whether PutObject with custom content-type passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  390. }
  391. catch (Exception ex)
  392. {
  393. new MintLogger(nameof(PutObject_Test3), putObjectSignature1, "Tests whether PutObject with custom content-type passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  394. }
  395. }
  396. internal async static Task PutObject_Test4(MinioClient minio)
  397. {
  398. DateTime startTime = DateTime.Now;
  399. string bucketName = GetRandomName(15);
  400. string objectName = GetRandomObjectName(10);
  401. string fileName = CreateFile(1, dataFile1B);
  402. string contentType = "custom/contenttype";
  403. var metaData = new Dictionary<string, string>
  404. {
  405. { "customheader", "minio dotnet" }
  406. };
  407. var args = new Dictionary<string, string>
  408. {
  409. { "bucketName", bucketName },
  410. { "objectName", objectName },
  411. { "contentType", contentType },
  412. { "data", "1B" },
  413. { "size", "1B" },
  414. { "metaData", "customheader:minio-dotnet" }
  415. };
  416. try
  417. {
  418. await Setup_Test(minio, bucketName);
  419. ObjectStat statObject = await PutObject_Tester(minio, bucketName, objectName, fileName, contentType: contentType, metaData: metaData);
  420. Assert.IsTrue(statObject != null);
  421. Assert.IsTrue(statObject.MetaData != null);
  422. var statMeta = new Dictionary<string, string>(statObject.MetaData, StringComparer.OrdinalIgnoreCase);
  423. Assert.IsTrue(statMeta.ContainsKey("X-Amz-Meta-Customheader"));
  424. Assert.IsTrue(statObject.MetaData.ContainsKey("Content-Type") && statObject.MetaData["Content-Type"].Equals("custom/contenttype"));
  425. await TearDown(minio, bucketName);
  426. new MintLogger(nameof(PutObject_Test4), putObjectSignature1, "Tests whether PutObject with different content-type passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  427. }
  428. catch (MinioException ex)
  429. {
  430. new MintLogger(nameof(PutObject_Test4), putObjectSignature1, "Tests whether PutObject with different content-type passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  431. }
  432. if (!IsMintEnv())
  433. {
  434. File.Delete(fileName);
  435. }
  436. }
  437. internal async static Task PutObject_Test5(MinioClient minio)
  438. {
  439. DateTime startTime = DateTime.Now;
  440. string bucketName = GetRandomName(15);
  441. string objectName = GetRandomObjectName(10);
  442. var args = new Dictionary<string, string>
  443. {
  444. { "bucketName", bucketName },
  445. { "objectName", objectName },
  446. { "data", "1B" },
  447. { "size", "1B" },
  448. };
  449. try
  450. {
  451. await Setup_Test(minio, bucketName);
  452. await PutObject_Tester(minio, bucketName, objectName, null, null, 0, null, rsg.GenerateStreamFromSeed(1));
  453. await TearDown(minio, bucketName);
  454. new MintLogger(nameof(PutObject_Test5), putObjectSignature1, "Tests whether PutObject with no content-type passes for small object", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  455. }
  456. catch (Exception ex)
  457. {
  458. new MintLogger(nameof(PutObject_Test5), putObjectSignature1, "Tests whether PutObject with no content-type passes for small object", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  459. }
  460. }
  461. internal async static Task PutObject_Test6(MinioClient minio)
  462. {
  463. DateTime startTime = DateTime.Now;
  464. string bucketName = GetRandomName(15);
  465. string objectName = "parallelput";
  466. var args = new Dictionary<string, string>
  467. {
  468. { "bucketName", bucketName },
  469. { "objectName", objectName },
  470. { "data", "10KB" },
  471. { "size", "10KB" },
  472. };
  473. try
  474. {
  475. await Setup_Test(minio, bucketName);
  476. Task[] tasks = new Task[7];
  477. for (int i = 0; i < 7; i++) {
  478. tasks[i] = PutObject_Task(minio, bucketName, objectName, null, null, 0, null, rsg.GenerateStreamFromSeed(10*KB));
  479. }
  480. await Task.WhenAll(tasks);
  481. await minio.RemoveObjectAsync(bucketName, objectName);
  482. await TearDown(minio, bucketName);
  483. new MintLogger(nameof(PutObject_Test6), putObjectSignature1, "Tests thread safety of minioclient on a parallel put operation", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  484. }
  485. catch (Exception ex)
  486. {
  487. new MintLogger(nameof(PutObject_Test6), putObjectSignature1, "Tests thread safety of minioclient on a parallel put operation", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  488. }
  489. }
  490. internal async static Task PutObject_Test7(MinioClient minio)
  491. {
  492. DateTime startTime = DateTime.Now;
  493. string bucketName = GetRandomName(15);
  494. string objectName = GetRandomObjectName(10);
  495. string contentType = "application/octet-stream";
  496. var args = new Dictionary<string, string>
  497. {
  498. { "bucketName", bucketName },
  499. { "objectName", objectName },
  500. { "contentType", contentType },
  501. { "data", "10KB" },
  502. { "size", "-1" },
  503. };
  504. try
  505. {
  506. // Putobject call with unknown stream size. See if PutObjectAsync call succeeds
  507. await Setup_Test(minio, bucketName);
  508. using (System.IO.MemoryStream filestream = rsg.GenerateStreamFromSeed(10 * KB))
  509. {
  510. long size = -1;
  511. long file_write_size = filestream.Length;
  512. await minio.PutObjectAsync(bucketName,
  513. objectName,
  514. filestream,
  515. size,
  516. contentType);
  517. await minio.RemoveObjectAsync(bucketName, objectName);
  518. await TearDown(minio, bucketName);
  519. }
  520. new MintLogger(nameof(PutObject_Test7), putObjectSignature1, "Tests whether PutObject with unknown stream-size passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  521. }
  522. catch (Exception ex)
  523. {
  524. new MintLogger(nameof(PutObject_Test7), putObjectSignature1, "Tests whether PutObject with unknown stream-size passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  525. }
  526. }
  527. internal async static Task PutObject_Test8(MinioClient minio)
  528. {
  529. DateTime startTime = DateTime.Now;
  530. string bucketName = GetRandomName(15);
  531. string objectName = GetRandomObjectName(10);
  532. string contentType = "application/octet-stream";
  533. var args = new Dictionary<string, string>
  534. {
  535. { "bucketName", bucketName },
  536. { "objectName", objectName },
  537. { "contentType", contentType },
  538. { "data", "0B" },
  539. { "size", "-1" },
  540. };
  541. try
  542. {
  543. // Putobject call where unknown stream sent 0 bytes.
  544. await Setup_Test(minio, bucketName);
  545. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(0))
  546. {
  547. long size = -1;
  548. long file_write_size = filestream.Length;
  549. await minio.PutObjectAsync(bucketName,
  550. objectName,
  551. filestream,
  552. size,
  553. contentType);
  554. await minio.RemoveObjectAsync(bucketName, objectName);
  555. await TearDown(minio, bucketName);
  556. }
  557. new MintLogger(nameof(PutObject_Test8), putObjectSignature1, "Tests PutObject where unknown stream sends 0 bytes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  558. }
  559. catch (Exception ex)
  560. {
  561. new MintLogger(nameof(PutObject_Test8), putObjectSignature1, "Tests PutObject where unknown stream sends 0 bytes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  562. }
  563. }
  564. #endregion
  565. internal async static Task PutGetStatEncryptedObject_Test1(MinioClient minio)
  566. {
  567. DateTime startTime = DateTime.Now;
  568. string bucketName = GetRandomName(15);
  569. string objectName = GetRandomObjectName(10);
  570. string contentType = "application/octet-stream";
  571. var args = new Dictionary<string, string>
  572. {
  573. { "bucketName", bucketName },
  574. { "objectName", objectName },
  575. { "contentType", contentType },
  576. { "data", "1KB" },
  577. { "size", "1KB" },
  578. };
  579. try
  580. {
  581. // Putobject with SSE-C encryption.
  582. await Setup_Test(minio, bucketName);
  583. Aes aesEncryption = Aes.Create();
  584. aesEncryption.KeySize = 256;
  585. aesEncryption.GenerateKey();
  586. var ssec = new SSEC(aesEncryption.Key);
  587. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  588. {
  589. long file_write_size = filestream.Length;
  590. string tempFileName = "tempFileName";
  591. long file_read_size = 0;
  592. await minio.PutObjectAsync(bucketName,
  593. objectName,
  594. filestream,
  595. filestream.Length,
  596. contentType, sse: ssec);
  597. await minio.GetObjectAsync(bucketName, objectName,
  598. (stream) =>
  599. {
  600. var fileStream = File.Create(tempFileName);
  601. stream.CopyTo(fileStream);
  602. fileStream.Dispose();
  603. FileInfo writtenInfo = new FileInfo(tempFileName);
  604. file_read_size = writtenInfo.Length;
  605. Assert.AreEqual(file_read_size, file_write_size);
  606. File.Delete(tempFileName);
  607. }, sse:ssec);
  608. await minio.StatObjectAsync(bucketName, objectName, sse:ssec);
  609. await minio.RemoveObjectAsync(bucketName, objectName);
  610. }
  611. await TearDown(minio, bucketName);
  612. new MintLogger("PutGetStatEncryptedObject_Test1", putObjectSignature1, "Tests whether Put/Get/Stat Object with encryption passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  613. }
  614. catch (Exception ex)
  615. {
  616. new MintLogger("PutGetStatEncryptedObject_Test1", putObjectSignature1, "Tests whether Put/Get/Stat Object with encryption passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  617. }
  618. }
  619. internal async static Task PutGetStatEncryptedObject_Test2(MinioClient minio)
  620. {
  621. DateTime startTime = DateTime.Now;
  622. string bucketName = GetRandomName(15);
  623. string objectName = GetRandomObjectName(10);
  624. string contentType = "application/octet-stream";
  625. var args = new Dictionary<string, string>
  626. {
  627. { "bucketName", bucketName },
  628. { "objectName", objectName },
  629. { "contentType", contentType },
  630. { "data", "6MB" },
  631. { "size", "6MB" },
  632. };
  633. try
  634. {
  635. // Test multipart Put with SSE-C encryption
  636. await Setup_Test(minio, bucketName);
  637. Aes aesEncryption = Aes.Create();
  638. aesEncryption.KeySize = 256;
  639. aesEncryption.GenerateKey();
  640. var ssec = new SSEC(aesEncryption.Key);
  641. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(6 * MB))
  642. {
  643. long file_write_size = filestream.Length;
  644. string tempFileName = "tempFileName";
  645. long file_read_size = 0;
  646. await minio.PutObjectAsync(bucketName,
  647. objectName,
  648. filestream,
  649. filestream.Length,
  650. contentType, sse: ssec);
  651. await minio.GetObjectAsync(bucketName, objectName,
  652. (stream) =>
  653. {
  654. var fileStream = File.Create(tempFileName);
  655. stream.CopyTo(fileStream);
  656. fileStream.Dispose();
  657. FileInfo writtenInfo = new FileInfo(tempFileName);
  658. file_read_size = writtenInfo.Length;
  659. Assert.AreEqual(file_read_size, file_write_size);
  660. File.Delete(tempFileName);
  661. }, sse:ssec);
  662. await minio.StatObjectAsync(bucketName, objectName, sse:ssec);
  663. await minio.RemoveObjectAsync(bucketName, objectName);
  664. }
  665. await TearDown(minio, bucketName);
  666. new MintLogger("PutGetStatEncryptedObject_Test2", putObjectSignature1, "Tests whether Put/Get/Stat multipart upload with encryption passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  667. }
  668. catch (Exception ex)
  669. {
  670. new MintLogger("PutGetStatEncryptedObject_Test2", putObjectSignature2, "Tests whether Put/Get/Stat multipart upload with encryption passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  671. }
  672. }
  673. internal async static Task PutGetStatEncryptedObject_Test3(MinioClient minio)
  674. {
  675. DateTime startTime = DateTime.Now;
  676. string bucketName = GetRandomName(15);
  677. string objectName = GetRandomObjectName(10);
  678. string contentType = "application/octet-stream";
  679. var args = new Dictionary<string, string>
  680. {
  681. { "bucketName", bucketName },
  682. { "objectName", objectName },
  683. { "contentType", contentType },
  684. { "data", "6MB" },
  685. { "size", "6MB" },
  686. };
  687. try
  688. {
  689. // Test multipart Put/Get/Stat with SSE-S3 encryption
  690. await Setup_Test(minio, bucketName);
  691. Aes aesEncryption = Aes.Create();
  692. var sses3 = new SSES3();
  693. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(6 * MB))
  694. {
  695. long file_write_size = filestream.Length;
  696. string tempFileName = "tempFileName";
  697. long file_read_size = 0;
  698. await minio.PutObjectAsync(bucketName,
  699. objectName,
  700. filestream,
  701. filestream.Length,
  702. contentType, sse: sses3);
  703. await minio.GetObjectAsync(bucketName, objectName,
  704. (stream) =>
  705. {
  706. var fileStream = File.Create(tempFileName);
  707. stream.CopyTo(fileStream);
  708. fileStream.Dispose();
  709. FileInfo writtenInfo = new FileInfo(tempFileName);
  710. file_read_size = writtenInfo.Length;
  711. Assert.AreEqual(file_read_size, file_write_size);
  712. File.Delete(tempFileName);
  713. });
  714. await minio.StatObjectAsync(bucketName, objectName);
  715. await minio.RemoveObjectAsync(bucketName, objectName);
  716. }
  717. await TearDown(minio, bucketName);
  718. new MintLogger("PutGetStatEncryptedObject_Test3", putObjectSignature1, "Tests whether Put/Get/Stat multipart upload with encryption passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  719. }
  720. catch (Exception ex)
  721. {
  722. new MintLogger("PutGetStatEncryptedObject_Test3", putObjectSignature2, "Tests whether Put/Get/Stat multipart upload with encryption passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  723. }
  724. }
  725. internal async static Task PutObject_Task(MinioClient minio, string bucketName, string objectName, string fileName = null, string contentType = "application/octet-stream", long size = 0, Dictionary<string, string> metaData = null, MemoryStream mstream = null)
  726. {
  727. DateTime startTime = DateTime.Now;
  728. MemoryStream filestream = mstream;
  729. if (filestream == null)
  730. {
  731. byte[] bs = File.ReadAllBytes(fileName);
  732. filestream = new MemoryStream(bs);
  733. }
  734. using (filestream)
  735. {
  736. long file_write_size = filestream.Length;
  737. string tempFileName = "tempfile-" + GetRandomName(5);
  738. if (size == 0)
  739. size = filestream.Length;
  740. await minio.PutObjectAsync(bucketName,
  741. objectName,
  742. filestream,
  743. size,
  744. contentType,
  745. metaData: metaData);
  746. File.Delete(tempFileName);
  747. }
  748. }
  749. internal async static Task<ObjectStat> PutObject_Tester(MinioClient minio, string bucketName, string objectName, string fileName = null, string contentType = "application/octet-stream", long size = 0, Dictionary<string, string> metaData = null, MemoryStream mstream = null)
  750. {
  751. ObjectStat statObject = null;
  752. DateTime startTime = DateTime.Now;
  753. MemoryStream filestream = mstream;
  754. if (filestream == null)
  755. {
  756. byte[] bs = File.ReadAllBytes(fileName);
  757. filestream = new MemoryStream(bs);
  758. }
  759. using (filestream)
  760. {
  761. long file_write_size = filestream.Length;
  762. long file_read_size = 0;
  763. string tempFileName = "tempfile-" + GetRandomName(5);
  764. if (size == 0)
  765. {
  766. size = filestream.Length;
  767. }
  768. await minio.PutObjectAsync(bucketName,
  769. objectName,
  770. filestream,
  771. size,
  772. contentType,
  773. metaData: metaData);
  774. await minio.GetObjectAsync(bucketName, objectName,
  775. (stream) =>
  776. {
  777. var fileStream = File.Create(tempFileName);
  778. stream.CopyTo(fileStream);
  779. fileStream.Dispose();
  780. FileInfo writtenInfo = new FileInfo(tempFileName);
  781. file_read_size = writtenInfo.Length;
  782. Assert.AreEqual(file_read_size, file_write_size);
  783. File.Delete(tempFileName);
  784. });
  785. statObject = await minio.StatObjectAsync(bucketName, objectName);
  786. Assert.IsNotNull(statObject);
  787. Assert.AreEqual(statObject.ObjectName, objectName);
  788. Assert.AreEqual(statObject.Size, file_read_size);
  789. if (contentType != null)
  790. {
  791. Assert.AreEqual(statObject.ContentType, contentType);
  792. }
  793. await minio.RemoveObjectAsync(bucketName, objectName);
  794. }
  795. return statObject;
  796. }
  797. internal async static Task StatObject_Test1(MinioClient minio)
  798. {
  799. DateTime startTime = DateTime.Now;
  800. string bucketName = GetRandomName(15);
  801. string objectName = GetRandomObjectName(10);
  802. string contentType = "gzip";
  803. var args = new Dictionary<string, string>
  804. {
  805. { "bucketName", bucketName },
  806. { "objectName", objectName },
  807. { "contentType", contentType },
  808. { "data", "1KB" },
  809. { "size", "1KB" },
  810. };
  811. try
  812. {
  813. await Setup_Test(minio, bucketName);
  814. await PutObject_Tester(minio, bucketName, objectName, null, null, 0, null, rsg.GenerateStreamFromSeed(1 * KB));
  815. await TearDown(minio, bucketName);
  816. new MintLogger(nameof(StatObject_Test1), statObjectSignature, "Tests whether StatObject passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  817. }
  818. catch (MinioException ex)
  819. {
  820. new MintLogger(nameof(StatObject_Test1), statObjectSignature, "Tests whether StatObject passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  821. }
  822. }
  823. #region Copy Object
  824. internal async static Task CopyObject_Test1(MinioClient minio)
  825. {
  826. DateTime startTime = DateTime.Now;
  827. string bucketName = GetRandomName(15);
  828. string objectName = GetRandomObjectName(10);
  829. string destBucketName = GetRandomName(15);
  830. string destObjectName = GetRandomName(10);
  831. var args = new Dictionary<string, string>
  832. {
  833. { "bucketName", bucketName },
  834. { "objectName", objectName },
  835. { "destBucketName", destBucketName },
  836. { "destObjectName", destObjectName },
  837. { "data", "1KB" },
  838. { "size", "1KB" },
  839. };
  840. try
  841. {
  842. await Setup_Test(minio, bucketName);
  843. await Setup_Test(minio, destBucketName);
  844. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  845. {
  846. await minio.PutObjectAsync(bucketName,
  847. objectName,
  848. filestream, filestream.Length, null);
  849. }
  850. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName);
  851. string outFileName = "outFileName";
  852. await minio.GetObjectAsync(destBucketName, destObjectName, outFileName);
  853. File.Delete(outFileName);
  854. await minio.RemoveObjectAsync(bucketName, objectName);
  855. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  856. await TearDown(minio, bucketName);
  857. await TearDown(minio, destBucketName);
  858. new MintLogger("CopyObject_Test1", copyObjectSignature, "Tests whether CopyObject passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  859. }
  860. catch (MinioException ex)
  861. {
  862. new MintLogger("CopyObject_Test1", copyObjectSignature, "Tests whether CopyObject passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  863. }
  864. }
  865. internal async static Task CopyObject_Test2(MinioClient minio)
  866. {
  867. DateTime startTime = DateTime.Now;
  868. string bucketName = GetRandomName(15);
  869. string objectName = GetRandomObjectName(10);
  870. string destBucketName = GetRandomName(15);
  871. string destObjectName = GetRandomName(10);
  872. var args = new Dictionary<string, string>
  873. {
  874. { "bucketName", bucketName },
  875. { "objectName", objectName },
  876. { "destBucketName", destBucketName },
  877. { "destObjectName", destObjectName },
  878. { "data", "1KB" },
  879. { "size", "1KB" },
  880. };
  881. try
  882. {
  883. // Test CopyConditions where matching ETag is not found
  884. await Setup_Test(minio, bucketName);
  885. await Setup_Test(minio, destBucketName);
  886. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  887. {
  888. await minio.PutObjectAsync(bucketName,
  889. objectName,
  890. filestream, filestream.Length, null);
  891. }
  892. CopyConditions conditions = new CopyConditions();
  893. conditions.SetMatchETag("TestETag");
  894. try
  895. {
  896. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, conditions);
  897. }
  898. catch (MinioException ex)
  899. {
  900. Assert.AreEqual(ex.Message, "MinIO API responded with message=At least one of the pre-conditions you specified did not hold");
  901. }
  902. await minio.RemoveObjectAsync(bucketName, objectName);
  903. await TearDown(minio, bucketName);
  904. await TearDown(minio, destBucketName);
  905. new MintLogger("CopyObject_Test2", copyObjectSignature, "Tests whether CopyObject with Etag mismatch passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  906. }
  907. catch (MinioException ex)
  908. {
  909. new MintLogger("CopyObject_Test2", copyObjectSignature, "Tests whether CopyObject with Etag mismatch passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  910. }
  911. }
  912. internal async static Task CopyObject_Test3(MinioClient minio)
  913. {
  914. DateTime startTime = DateTime.Now;
  915. string bucketName = GetRandomName(15);
  916. string objectName = GetRandomObjectName(10);
  917. string destBucketName = GetRandomName(15);
  918. string destObjectName = GetRandomName(10);
  919. var args = new Dictionary<string, string>
  920. {
  921. { "bucketName", bucketName },
  922. { "objectName", objectName },
  923. { "destBucketName", destBucketName },
  924. { "destObjectName", destObjectName },
  925. { "data", "1KB" },
  926. { "size", "1KB" },
  927. };
  928. try
  929. {
  930. // Test CopyConditions where matching ETag is found
  931. await Setup_Test(minio, bucketName);
  932. await Setup_Test(minio, destBucketName);
  933. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  934. {
  935. await minio.PutObjectAsync(bucketName,
  936. objectName,
  937. filestream, filestream.Length, null);
  938. }
  939. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  940. CopyConditions conditions = new CopyConditions();
  941. conditions.SetMatchETag(stats.ETag);
  942. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, conditions);
  943. string outFileName = "outFileName";
  944. ObjectStat dstats = await minio.StatObjectAsync(destBucketName, destObjectName);
  945. Assert.IsNotNull(dstats);
  946. Assert.AreEqual(dstats.ObjectName, destObjectName);
  947. await minio.GetObjectAsync(destBucketName, destObjectName, outFileName);
  948. File.Delete(outFileName);
  949. await minio.RemoveObjectAsync(bucketName, objectName);
  950. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  951. await TearDown(minio, bucketName);
  952. await TearDown(minio, destBucketName);
  953. new MintLogger("CopyObject_Test3", copyObjectSignature, "Tests whether CopyObject with Etag match passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  954. }
  955. catch (MinioException ex)
  956. {
  957. new MintLogger("CopyObject_Test3", copyObjectSignature, "Tests whether CopyObject with Etag match passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  958. }
  959. }
  960. internal async static Task CopyObject_Test4(MinioClient minio)
  961. {
  962. DateTime startTime = DateTime.Now;
  963. string bucketName = GetRandomName(15);
  964. string objectName = GetRandomObjectName(10);
  965. string destBucketName = GetRandomName(15);
  966. string destObjectName = GetRandomName(10);
  967. var args = new Dictionary<string, string>
  968. {
  969. { "bucketName", bucketName },
  970. { "objectName", objectName },
  971. { "destBucketName", destBucketName },
  972. { "data", "1KB" },
  973. { "size", "1KB" },
  974. };
  975. try
  976. {
  977. // Test if objectName is defaulted to source objectName
  978. await Setup_Test(minio, bucketName);
  979. await Setup_Test(minio, destBucketName);
  980. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  981. {
  982. await minio.PutObjectAsync(bucketName,
  983. objectName,
  984. filestream, filestream.Length, null);
  985. }
  986. CopyConditions conditions = new CopyConditions();
  987. conditions.SetMatchETag("TestETag");
  988. // omit dest bucket name.
  989. await minio.CopyObjectAsync(bucketName, objectName, destBucketName);
  990. string outFileName = "outFileName";
  991. await minio.GetObjectAsync(bucketName, objectName, outFileName);
  992. File.Delete(outFileName);
  993. ObjectStat stats = await minio.StatObjectAsync(destBucketName, objectName);
  994. Assert.IsNotNull(stats);
  995. Assert.AreEqual(stats.ObjectName, objectName);
  996. await minio.RemoveObjectAsync(bucketName, objectName);
  997. await minio.RemoveObjectAsync(destBucketName, objectName);
  998. await TearDown(minio, bucketName);
  999. await TearDown(minio, destBucketName);
  1000. new MintLogger("CopyObject_Test4", copyObjectSignature, "Tests whether CopyObject defaults targetName to objectName", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1001. }
  1002. catch (MinioException ex)
  1003. {
  1004. new MintLogger("CopyObject_Test4", copyObjectSignature, "Tests whether CopyObject defaults targetName to objectName", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1005. }
  1006. }
  1007. internal async static Task CopyObject_Test5(MinioClient minio)
  1008. {
  1009. DateTime startTime = DateTime.Now;
  1010. string bucketName = GetRandomName(15);
  1011. string objectName = GetRandomObjectName(10);
  1012. string destBucketName = GetRandomName(15);
  1013. string destObjectName = GetRandomName(10);
  1014. var args = new Dictionary<string, string>
  1015. {
  1016. { "bucketName", bucketName },
  1017. { "objectName", objectName },
  1018. { "destBucketName", destBucketName },
  1019. { "destObjectName", destObjectName },
  1020. { "data", "6MB" },
  1021. { "size", "6MB" },
  1022. };
  1023. try
  1024. {
  1025. // Test if multi-part copy upload for large files works as expected.
  1026. await Setup_Test(minio, bucketName);
  1027. await Setup_Test(minio, destBucketName);
  1028. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(6 * MB))
  1029. {
  1030. await minio.PutObjectAsync(bucketName,
  1031. objectName,
  1032. filestream, filestream.Length, null);
  1033. }
  1034. CopyConditions conditions = new CopyConditions();
  1035. conditions.SetByteRange(1024, 6291455);
  1036. // omit dest object name.
  1037. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, copyConditions: conditions);
  1038. string outFileName = "outFileName";
  1039. await minio.GetObjectAsync(bucketName, objectName, outFileName);
  1040. File.Delete(outFileName);
  1041. ObjectStat stats = await minio.StatObjectAsync(destBucketName, objectName);
  1042. Assert.IsNotNull(stats);
  1043. Assert.AreEqual(stats.ObjectName, objectName);
  1044. Assert.AreEqual(stats.Size, 6291455 - 1024 + 1);
  1045. await minio.RemoveObjectAsync(bucketName, objectName);
  1046. await minio.RemoveObjectAsync(destBucketName, objectName);
  1047. await TearDown(minio, bucketName);
  1048. await TearDown(minio, destBucketName);
  1049. new MintLogger("CopyObject_Test5", copyObjectSignature, "Tests whether CopyObject multi-part copy upload for large files works", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1050. }
  1051. catch (MinioException ex)
  1052. {
  1053. if (ex.message.Equals("A header you provided implies functionality that is not implemented"))
  1054. {
  1055. new MintLogger("CopyObject_Test5", copyObjectSignature, "Tests whether CopyObject multi-part copy upload for large files works", TestStatus.NA, (DateTime.Now - startTime), args:args).Log();
  1056. }
  1057. else
  1058. {
  1059. new MintLogger("CopyObject_Test5", copyObjectSignature, "Tests whether CopyObject multi-part copy upload for large files works", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1060. }
  1061. }
  1062. }
  1063. internal async static Task CopyObject_Test6(MinioClient minio)
  1064. {
  1065. DateTime startTime = DateTime.Now;
  1066. string bucketName = GetRandomName(15);
  1067. string objectName = GetRandomObjectName(10);
  1068. string destBucketName = GetRandomName(15);
  1069. string destObjectName = GetRandomName(10);
  1070. var args = new Dictionary<string, string>
  1071. {
  1072. { "bucketName", bucketName },
  1073. { "objectName", objectName },
  1074. { "destBucketName", destBucketName },
  1075. { "destObjectName", destObjectName },
  1076. { "data", "1KB" },
  1077. { "size", "1KB" },
  1078. };
  1079. try
  1080. {
  1081. // Test CopyConditions where matching ETag is found
  1082. await Setup_Test(minio, bucketName);
  1083. await Setup_Test(minio, destBucketName);
  1084. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1085. {
  1086. await minio.PutObjectAsync(bucketName,
  1087. objectName,
  1088. filestream, filestream.Length, null);
  1089. }
  1090. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  1091. CopyConditions conditions = new CopyConditions();
  1092. conditions.SetModified(new DateTime(2017, 8, 18));
  1093. // Should copy object since modification date header < object modification date.
  1094. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, conditions);
  1095. string outFileName = "outFileName";
  1096. ObjectStat dstats = await minio.StatObjectAsync(destBucketName, destObjectName);
  1097. Assert.IsNotNull(dstats);
  1098. Assert.AreEqual(dstats.ObjectName, destObjectName);
  1099. await minio.GetObjectAsync(destBucketName, destObjectName, outFileName);
  1100. File.Delete(outFileName);
  1101. await minio.RemoveObjectAsync(bucketName, objectName);
  1102. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  1103. await TearDown(minio, bucketName);
  1104. await TearDown(minio, destBucketName);
  1105. new MintLogger("CopyObject_Test6", copyObjectSignature, "Tests whether CopyObject with positive test for modified date passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1106. }
  1107. catch (MinioException ex)
  1108. {
  1109. new MintLogger("CopyObject_Test6", copyObjectSignature, "Tests whether CopyObject with positive test for modified date passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1110. }
  1111. }
  1112. internal async static Task CopyObject_Test7(MinioClient minio)
  1113. {
  1114. DateTime startTime = DateTime.Now;
  1115. string bucketName = GetRandomName(15);
  1116. string objectName = GetRandomObjectName(10);
  1117. string destBucketName = GetRandomName(15);
  1118. string destObjectName = GetRandomName(10);
  1119. var args = new Dictionary<string, string>
  1120. {
  1121. { "bucketName", bucketName },
  1122. { "objectName", objectName },
  1123. { "destBucketName", destBucketName },
  1124. { "destObjectName", destObjectName },
  1125. { "data", "1KB" },
  1126. { "size", "1KB" },
  1127. };
  1128. try
  1129. {
  1130. // Test CopyConditions where matching ETag is found
  1131. await Setup_Test(minio, bucketName);
  1132. await Setup_Test(minio, destBucketName);
  1133. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1134. {
  1135. await minio.PutObjectAsync(bucketName,
  1136. objectName,
  1137. filestream, filestream.Length, null);
  1138. }
  1139. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  1140. CopyConditions conditions = new CopyConditions();
  1141. DateTime modifiedDate = DateTime.Now;
  1142. modifiedDate = modifiedDate.AddDays(5);
  1143. conditions.SetModified(modifiedDate);
  1144. // Should not copy object since modification date header > object modification date.
  1145. try
  1146. {
  1147. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, conditions);
  1148. }
  1149. catch (Exception ex)
  1150. {
  1151. Assert.AreEqual("MinIO API responded with message=At least one of the pre-conditions you specified did not hold", ex.Message);
  1152. }
  1153. await minio.RemoveObjectAsync(bucketName, objectName);
  1154. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  1155. await TearDown(minio, bucketName);
  1156. await TearDown(minio, destBucketName);
  1157. new MintLogger("CopyObject_Test7", copyObjectSignature, "Tests whether CopyObject with negative test for modified date passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1158. }
  1159. catch (MinioException ex)
  1160. {
  1161. new MintLogger("CopyObject_Test7", copyObjectSignature, "Tests whether CopyObject with negative test for modified date passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1162. }
  1163. }
  1164. internal async static Task CopyObject_Test8(MinioClient minio)
  1165. {
  1166. DateTime startTime = DateTime.Now;
  1167. string bucketName = GetRandomName(15);
  1168. string objectName = GetRandomObjectName(10);
  1169. string destBucketName = GetRandomName(15);
  1170. string destObjectName = GetRandomName(10);
  1171. var args = new Dictionary<string, string>
  1172. {
  1173. { "bucketName", bucketName },
  1174. { "objectName", objectName },
  1175. { "destBucketName", destBucketName },
  1176. { "destObjectName", destObjectName },
  1177. { "data", "1KB" },
  1178. { "size", "1KB" },
  1179. { "copyconditions", "x-amz-metadata-directive:REPLACE" },
  1180. };
  1181. try
  1182. {
  1183. await Setup_Test(minio, bucketName);
  1184. await Setup_Test(minio, destBucketName);
  1185. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1186. {
  1187. await minio.PutObjectAsync(bucketName,
  1188. objectName,
  1189. filestream, filestream.Length, metaData:new Dictionary<string, string>{{"Orig", "orig-val with spaces"}});
  1190. }
  1191. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  1192. Assert.IsTrue(stats.MetaData["X-Amz-Meta-Orig"] != null) ;
  1193. CopyConditions copyCond = new CopyConditions();
  1194. copyCond.SetReplaceMetadataDirective();
  1195. // set custom metadata
  1196. var metadata = new Dictionary<string, string>
  1197. {
  1198. { "Content-Type", "application/css" },
  1199. { "Mynewkey", "test test" }
  1200. };
  1201. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, copyConditions:copyCond, metadata: metadata);
  1202. ObjectStat dstats = await minio.StatObjectAsync(destBucketName, destObjectName);
  1203. Assert.IsTrue(dstats.MetaData["X-Amz-Meta-Mynewkey"] != null);
  1204. await minio.RemoveObjectAsync(bucketName, objectName);
  1205. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  1206. await TearDown(minio, bucketName);
  1207. await TearDown(minio, destBucketName);
  1208. new MintLogger("CopyObject_Test8", copyObjectSignature, "Tests whether CopyObject with metadata replacement passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1209. }
  1210. catch (MinioException ex)
  1211. {
  1212. new MintLogger("CopyObject_Test8", copyObjectSignature, "Tests whether CopyObject with metadata replacement passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1213. }
  1214. }
  1215. #endregion
  1216. #region Encrypted Copy Object
  1217. internal async static Task EncryptedCopyObject_Test1(MinioClient minio)
  1218. {
  1219. DateTime startTime = DateTime.Now;
  1220. string bucketName = GetRandomName(15);
  1221. string objectName = GetRandomObjectName(10);
  1222. string destBucketName = GetRandomName(15);
  1223. string destObjectName = GetRandomName(10);
  1224. var args = new Dictionary<string, string>
  1225. {
  1226. { "bucketName", bucketName },
  1227. { "objectName", objectName },
  1228. { "destBucketName", destBucketName },
  1229. { "destObjectName", destObjectName },
  1230. { "data", "1KB" },
  1231. { "size", "1KB" },
  1232. };
  1233. try
  1234. {
  1235. // Test Copy with SSE-C -> SSE-C encryption
  1236. await Setup_Test(minio, bucketName);
  1237. await Setup_Test(minio, destBucketName);
  1238. Aes aesEncryption = Aes.Create();
  1239. aesEncryption.KeySize = 256;
  1240. aesEncryption.GenerateKey();
  1241. var ssec = new SSEC(aesEncryption.Key);
  1242. var sseCpy = new SSECopy(aesEncryption.Key);
  1243. Aes destAesEncryption = Aes.Create();
  1244. destAesEncryption.KeySize = 256;
  1245. destAesEncryption.GenerateKey();
  1246. var ssecDst = new SSEC(destAesEncryption.Key);
  1247. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1248. {
  1249. await minio.PutObjectAsync(bucketName,
  1250. objectName,
  1251. filestream, filestream.Length, null, sse:ssec);
  1252. }
  1253. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, sseSrc:sseCpy, sseDest:ssecDst);
  1254. string outFileName = "outFileName";
  1255. await minio.GetObjectAsync(destBucketName, destObjectName, outFileName, sse:ssecDst);
  1256. File.Delete(outFileName);
  1257. await minio.RemoveObjectAsync(bucketName, objectName);
  1258. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  1259. await TearDown(minio, bucketName);
  1260. await TearDown(minio, destBucketName);
  1261. new MintLogger("EncryptedCopyObject_Test1", copyObjectSignature, "Tests whether encrypted CopyObject passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1262. }
  1263. catch (MinioException ex)
  1264. {
  1265. new MintLogger("EncryptedCopyObject_Test1", copyObjectSignature, "Tests whether encrypted CopyObject passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1266. }
  1267. }
  1268. internal async static Task EncryptedCopyObject_Test2(MinioClient minio)
  1269. {
  1270. DateTime startTime = DateTime.Now;
  1271. string bucketName = GetRandomName(15);
  1272. string objectName = GetRandomObjectName(10);
  1273. string destBucketName = GetRandomName(15);
  1274. string destObjectName = GetRandomName(10);
  1275. var args = new Dictionary<string, string>
  1276. {
  1277. { "bucketName", bucketName },
  1278. { "objectName", objectName },
  1279. { "destBucketName", destBucketName },
  1280. { "destObjectName", destObjectName },
  1281. { "data", "1KB" },
  1282. { "size", "1KB" },
  1283. };
  1284. try
  1285. {
  1286. // Test Copy of SSE-C encrypted object to unencrypted on destination side
  1287. await Setup_Test(minio, bucketName);
  1288. await Setup_Test(minio, destBucketName);
  1289. Aes aesEncryption = Aes.Create();
  1290. aesEncryption.KeySize = 256;
  1291. aesEncryption.GenerateKey();
  1292. var ssec = new SSEC(aesEncryption.Key);
  1293. var sseCpy = new SSECopy(aesEncryption.Key);
  1294. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1295. {
  1296. await minio.PutObjectAsync(bucketName,
  1297. objectName,
  1298. filestream, filestream.Length, null, sse:ssec);
  1299. }
  1300. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, sseSrc:sseCpy, sseDest:null);
  1301. string outFileName = "outFileName";
  1302. await minio.GetObjectAsync(destBucketName, destObjectName, outFileName);
  1303. File.Delete(outFileName);
  1304. await minio.RemoveObjectAsync(bucketName, objectName);
  1305. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  1306. await TearDown(minio, bucketName);
  1307. await TearDown(minio, destBucketName);
  1308. new MintLogger("EncryptedCopyObject_Test2", copyObjectSignature, "Tests whether encrypted CopyObject passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1309. }
  1310. catch (MinioException ex)
  1311. {
  1312. new MintLogger("EncryptedCopyObject_Test2", copyObjectSignature, "Tests whether encrypted CopyObject passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1313. }
  1314. }
  1315. internal async static Task EncryptedCopyObject_Test3(MinioClient minio)
  1316. {
  1317. DateTime startTime = DateTime.Now;
  1318. string bucketName = GetRandomName(15);
  1319. string objectName = GetRandomObjectName(10);
  1320. string destBucketName = GetRandomName(15);
  1321. string destObjectName = GetRandomName(10);
  1322. var args = new Dictionary<string, string>
  1323. {
  1324. { "bucketName", bucketName },
  1325. { "objectName", objectName },
  1326. { "destBucketName", destBucketName },
  1327. { "destObjectName", destObjectName },
  1328. { "data", "1KB" },
  1329. { "size", "1KB" },
  1330. };
  1331. try
  1332. {
  1333. // Test Copy of SSE-C encrypted object to unencrypted on destination side
  1334. await Setup_Test(minio, bucketName);
  1335. await Setup_Test(minio, destBucketName);
  1336. Aes aesEncryption = Aes.Create();
  1337. aesEncryption.KeySize = 256;
  1338. aesEncryption.GenerateKey();
  1339. var ssec = new SSEC(aesEncryption.Key);
  1340. var sseCpy = new SSECopy(aesEncryption.Key);
  1341. var sses3 = new SSES3();
  1342. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1343. {
  1344. await minio.PutObjectAsync(bucketName,
  1345. objectName,
  1346. filestream, filestream.Length, null, sse:ssec);
  1347. }
  1348. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, sseSrc:sseCpy, sseDest:sses3);
  1349. string outFileName = "outFileName";
  1350. await minio.GetObjectAsync(destBucketName, destObjectName, outFileName);
  1351. File.Delete(outFileName);
  1352. await minio.RemoveObjectAsync(bucketName, objectName);
  1353. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  1354. await TearDown(minio, bucketName);
  1355. await TearDown(minio, destBucketName);
  1356. new MintLogger("EncryptedCopyObject_Test3", copyObjectSignature, "Tests whether encrypted CopyObject passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1357. }
  1358. catch (MinioException ex)
  1359. {
  1360. new MintLogger("EncryptedCopyObject_Test3", copyObjectSignature, "Tests whether encrypted CopyObject passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1361. }
  1362. }
  1363. internal async static Task EncryptedCopyObject_Test4(MinioClient minio)
  1364. {
  1365. DateTime startTime = DateTime.Now;
  1366. string bucketName = GetRandomName(15);
  1367. string objectName = GetRandomObjectName(10);
  1368. string destBucketName = GetRandomName(15);
  1369. string destObjectName = GetRandomName(10);
  1370. var args = new Dictionary<string, string>
  1371. {
  1372. { "bucketName", bucketName },
  1373. { "objectName", objectName },
  1374. { "destBucketName", destBucketName },
  1375. { "destObjectName", destObjectName },
  1376. { "data", "1KB" },
  1377. { "size", "1KB" },
  1378. };
  1379. try
  1380. {
  1381. // Test Copy of SSE-S3 encrypted object to SSE-S3 on destination side
  1382. await Setup_Test(minio, bucketName);
  1383. await Setup_Test(minio, destBucketName);
  1384. var sses3 = new SSES3();
  1385. var sseDest = new SSES3();
  1386. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1387. {
  1388. await minio.PutObjectAsync(bucketName,
  1389. objectName,
  1390. filestream, filestream.Length, null, sse:sses3);
  1391. }
  1392. await minio.CopyObjectAsync(bucketName, objectName, destBucketName, destObjectName, sseSrc:null, sseDest:sses3);
  1393. string outFileName = "outFileName";
  1394. await minio.GetObjectAsync(destBucketName, destObjectName, outFileName);
  1395. File.Delete(outFileName);
  1396. await minio.RemoveObjectAsync(bucketName, objectName);
  1397. await minio.RemoveObjectAsync(destBucketName, destObjectName);
  1398. await TearDown(minio, bucketName);
  1399. await TearDown(minio, destBucketName);
  1400. new MintLogger("EncryptedCopyObject_Test4", copyObjectSignature, "Tests whether encrypted CopyObject passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1401. }
  1402. catch (MinioException ex)
  1403. {
  1404. new MintLogger("EncryptedCopyObject_Test4", copyObjectSignature, "Tests whether encrypted CopyObject passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1405. }
  1406. }
  1407. #endregion
  1408. #region Get Object
  1409. internal async static Task GetObject_Test1(MinioClient minio)
  1410. {
  1411. DateTime startTime = DateTime.Now;
  1412. string bucketName = GetRandomName(15);
  1413. string objectName = GetRandomObjectName(10);
  1414. string contentType = null;
  1415. var args = new Dictionary<string, string>
  1416. {
  1417. { "bucketName", bucketName },
  1418. { "objectName", objectName },
  1419. { "contentType", contentType },
  1420. };
  1421. try
  1422. {
  1423. await Setup_Test(minio, bucketName);
  1424. using (System.IO.MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * MB))
  1425. {
  1426. long file_write_size = filestream.Length;
  1427. string tempFileName = "tempFileName";
  1428. long file_read_size = 0;
  1429. await minio.PutObjectAsync(bucketName,
  1430. objectName,
  1431. filestream,
  1432. filestream.Length,
  1433. contentType);
  1434. await minio.GetObjectAsync(bucketName, objectName,
  1435. (stream) =>
  1436. {
  1437. var fileStream = File.Create(tempFileName);
  1438. stream.CopyTo(fileStream);
  1439. fileStream.Dispose();
  1440. FileInfo writtenInfo = new FileInfo(tempFileName);
  1441. file_read_size = writtenInfo.Length;
  1442. Assert.AreEqual(file_read_size, file_write_size);
  1443. File.Delete(tempFileName);
  1444. });
  1445. await minio.RemoveObjectAsync(bucketName, objectName);
  1446. }
  1447. await TearDown(minio, bucketName);
  1448. new MintLogger("GetObject_Test1", getObjectSignature1, "Tests whether GetObject as stream works", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1449. }
  1450. catch (MinioException ex)
  1451. {
  1452. new MintLogger("GetObject_Test1", getObjectSignature1, "Tests whether GetObject as stream works", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1453. }
  1454. }
  1455. internal async static Task GetObject_Test2(MinioClient minio)
  1456. {
  1457. DateTime startTime = DateTime.Now;
  1458. string bucketName = GetRandomName(15);
  1459. string objectName = GetRandomObjectName(10);
  1460. string fileName = GetRandomName(10);
  1461. var args = new Dictionary<string, string>
  1462. {
  1463. { "bucketName", bucketName },
  1464. { "objectName", objectName },
  1465. { "fileName", fileName },
  1466. };
  1467. try
  1468. {
  1469. await Setup_Test(minio, bucketName);
  1470. try
  1471. {
  1472. await minio.GetObjectAsync(bucketName, objectName, fileName);
  1473. }
  1474. catch (ObjectNotFoundException ex)
  1475. {
  1476. Assert.AreEqual(ex.message, "Not found.");
  1477. }
  1478. await TearDown(minio, bucketName);
  1479. new MintLogger("GetObject_Test2", getObjectSignature1, "Tests for non-existent GetObject", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1480. }
  1481. catch (MinioException ex)
  1482. {
  1483. new MintLogger("GetObject_Test2", getObjectSignature1, "Tests for non-existent GetObject", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1484. }
  1485. }
  1486. internal async static Task GetObject_Test3(MinioClient minio)
  1487. {
  1488. DateTime startTime = DateTime.Now;
  1489. string bucketName = GetRandomName(15);
  1490. string objectName = GetRandomObjectName(10);
  1491. string contentType = null;
  1492. var args = new Dictionary<string, string>
  1493. {
  1494. { "bucketName", bucketName },
  1495. { "objectName", objectName },
  1496. { "contentType", contentType },
  1497. { "size", "1024L" },
  1498. { "length", "10L" },
  1499. };
  1500. try
  1501. {
  1502. await Setup_Test(minio, bucketName);
  1503. using (System.IO.MemoryStream filestream = rsg.GenerateStreamFromSeed(10 * KB))
  1504. {
  1505. long file_write_size = 10L;
  1506. string tempFileName = "tempFileName";
  1507. long file_read_size = 0;
  1508. await minio.PutObjectAsync(bucketName,
  1509. objectName,
  1510. filestream,
  1511. filestream.Length,
  1512. contentType);
  1513. await minio.GetObjectAsync(bucketName, objectName, 1024L, file_write_size,
  1514. (stream) =>
  1515. {
  1516. var fileStream = File.Create(tempFileName);
  1517. stream.CopyTo(fileStream);
  1518. fileStream.Dispose();
  1519. FileInfo writtenInfo = new FileInfo(tempFileName);
  1520. file_read_size = writtenInfo.Length;
  1521. Assert.AreEqual(file_read_size, file_write_size);
  1522. File.Delete(tempFileName);
  1523. });
  1524. await minio.RemoveObjectAsync(bucketName, objectName);
  1525. }
  1526. await TearDown(minio, bucketName);
  1527. new MintLogger("GetObject_Test3", getObjectSignature2, "Tests whether GetObject returns all the data", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1528. }
  1529. catch (MinioException ex)
  1530. {
  1531. new MintLogger("GetObject_Test3", getObjectSignature2, "Tests whether GetObject returns all the data", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1532. }
  1533. }
  1534. internal async static Task FGetObject_Test1(MinioClient minio)
  1535. {
  1536. DateTime startTime = DateTime.Now;
  1537. string bucketName = GetRandomName(15);
  1538. string objectName = GetRandomObjectName(10);
  1539. string outFileName = "outFileName";
  1540. var args = new Dictionary<string, string>
  1541. {
  1542. { "bucketName", bucketName },
  1543. { "objectName", objectName },
  1544. { "fileName", outFileName },
  1545. };
  1546. try
  1547. {
  1548. await Setup_Test(minio, bucketName);
  1549. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1550. {
  1551. await minio.PutObjectAsync(bucketName,
  1552. objectName,
  1553. filestream, filestream.Length, null);
  1554. }
  1555. await minio.GetObjectAsync(bucketName, objectName, outFileName);
  1556. File.Delete(outFileName);
  1557. await minio.RemoveObjectAsync(bucketName, objectName);
  1558. await TearDown(minio, bucketName);
  1559. new MintLogger("FGetObject_Test1", getObjectSignature3, "Tests whether FGetObject passes for small upload", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1560. }
  1561. catch (MinioException ex)
  1562. {
  1563. new MintLogger("FGetObject_Test1", getObjectSignature3, "Tests whether FGetObject passes for small upload", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1564. }
  1565. }
  1566. #endregion
  1567. internal async static Task FPutObject_Test1(MinioClient minio)
  1568. {
  1569. DateTime startTime = DateTime.Now;
  1570. string bucketName = GetRandomName(15);
  1571. string objectName = GetRandomObjectName(10);
  1572. string fileName = CreateFile(6 * MB, dataFile6MB);
  1573. var args = new Dictionary<string, string>
  1574. {
  1575. { "bucketName", bucketName },
  1576. { "objectName", objectName },
  1577. { "fileName", fileName },
  1578. };
  1579. try
  1580. {
  1581. await Setup_Test(minio, bucketName);
  1582. await minio.PutObjectAsync(bucketName,
  1583. objectName,
  1584. fileName);
  1585. await minio.RemoveObjectAsync(bucketName, objectName);
  1586. await TearDown(minio, bucketName);
  1587. new MintLogger("FPutObject_Test1", putObjectSignature2, "Tests whether FPutObject for multipart upload passes", TestStatus.PASS, (DateTime.Now - startTime), args: args).Log();
  1588. }
  1589. catch (MinioException ex)
  1590. {
  1591. new MintLogger("FPutObject_Test1", putObjectSignature2, "Tests whether FPutObject for multipart upload passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1592. }
  1593. if (!IsMintEnv())
  1594. {
  1595. File.Delete(fileName);
  1596. }
  1597. }
  1598. internal async static Task FPutObject_Test2(MinioClient minio)
  1599. {
  1600. DateTime startTime = DateTime.Now;
  1601. string bucketName = GetRandomName(15);
  1602. string objectName = GetRandomObjectName(10);
  1603. string fileName = CreateFile(10 * KB, dataFile10KB);
  1604. var args = new Dictionary<string, string>
  1605. {
  1606. { "bucketName", bucketName },
  1607. { "objectName", objectName },
  1608. { "fileName", fileName },
  1609. };
  1610. try
  1611. {
  1612. await Setup_Test(minio, bucketName);
  1613. await minio.PutObjectAsync(bucketName,
  1614. objectName,
  1615. fileName);
  1616. await minio.RemoveObjectAsync(bucketName, objectName);
  1617. await TearDown(minio, bucketName);
  1618. new MintLogger("FPutObject_Test2", putObjectSignature2, "Tests whether FPutObject for small upload passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1619. }
  1620. catch (MinioException ex)
  1621. {
  1622. new MintLogger("FPutObject_Test2", putObjectSignature2, "Tests whether FPutObject for small upload passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1623. }
  1624. if (!IsMintEnv())
  1625. {
  1626. File.Delete(fileName);
  1627. }
  1628. }
  1629. #region List Objects
  1630. internal async static Task ListObjects_Test1(MinioClient minio)
  1631. {
  1632. DateTime startTime = DateTime.Now;
  1633. string bucketName = GetRandomName(15);
  1634. string prefix = "minix";
  1635. string objectName = prefix + GetRandomName(10);
  1636. var args = new Dictionary<string, string>
  1637. {
  1638. { "bucketName", bucketName },
  1639. { "objectName", objectName },
  1640. { "prefix", prefix },
  1641. { "recursive", "false" },
  1642. };
  1643. try
  1644. {
  1645. await Setup_Test(minio, bucketName);
  1646. Task[] tasks = new Task[2];
  1647. for (int i = 0; i < 2; i++) {
  1648. tasks[i] = PutObject_Task(minio, bucketName, objectName + i.ToString(), null, null, 0, null, rsg.GenerateStreamFromSeed(1));
  1649. }
  1650. await Task.WhenAll(tasks);
  1651. ListObjects_Test(minio, bucketName, prefix, 2, false).Wait();
  1652. System.Threading.Thread.Sleep(2000);
  1653. await minio.RemoveObjectAsync(bucketName, objectName + "0");
  1654. await minio.RemoveObjectAsync(bucketName, objectName + "1");
  1655. await TearDown(minio, bucketName);
  1656. new MintLogger("ListObjects_Test1", listObjectsSignature, "Tests whether ListObjects lists all objects matching a prefix non-recursive", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1657. }
  1658. catch (MinioException ex)
  1659. {
  1660. new MintLogger("ListObjects_Test1", listObjectsSignature, "Tests whether ListObjects lists all objects matching a prefix non-recursive", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1661. }
  1662. }
  1663. internal async static Task ListObjects_Test2(MinioClient minio)
  1664. {
  1665. DateTime startTime = DateTime.Now;
  1666. string bucketName = GetRandomName(15);
  1667. var args = new Dictionary<string, string>
  1668. {
  1669. { "bucketName", bucketName },
  1670. };
  1671. try
  1672. {
  1673. await Setup_Test(minio, bucketName);
  1674. ListObjects_Test(minio, bucketName, null, 0).Wait(1000);
  1675. await TearDown(minio, bucketName);
  1676. new MintLogger("ListObjects_Test2", listObjectsSignature, "Tests whether ListObjects passes when bucket is empty", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1677. }
  1678. catch (MinioException ex)
  1679. {
  1680. new MintLogger("ListObjects_Test2", listObjectsSignature, "Tests whether ListObjects passes when bucket is empty", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1681. }
  1682. }
  1683. internal async static Task ListObjects_Test3(MinioClient minio)
  1684. {
  1685. DateTime startTime = DateTime.Now;
  1686. string bucketName = GetRandomName(15);
  1687. string prefix = "minix";
  1688. string objectName = prefix + "/"+ GetRandomName(10) + "/suffix";
  1689. var args = new Dictionary<string, string>
  1690. {
  1691. { "bucketName", bucketName },
  1692. { "objectName", objectName },
  1693. { "prefix", prefix },
  1694. { "recursive", "true" }
  1695. };
  1696. try
  1697. {
  1698. await Setup_Test(minio, bucketName);
  1699. Task[] tasks = new Task[2];
  1700. for (int i = 0; i < 2; i++) {
  1701. tasks[i] = PutObject_Task(minio, bucketName, objectName + i.ToString(), null, null, 0, null, rsg.GenerateStreamFromSeed(1*KB));
  1702. }
  1703. await Task.WhenAll(tasks);
  1704. ListObjects_Test(minio, bucketName, prefix, 2, true).Wait();
  1705. System.Threading.Thread.Sleep(2000);
  1706. await minio.RemoveObjectAsync(bucketName, objectName + "0");
  1707. await minio.RemoveObjectAsync(bucketName, objectName + "1");
  1708. await TearDown(minio, bucketName);
  1709. new MintLogger("ListObjects_Test3", listObjectsSignature, "Tests whether ListObjects lists all objects matching a prefix and recursive", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1710. }
  1711. catch (MinioException ex)
  1712. {
  1713. new MintLogger("ListObjects_Test3", listObjectsSignature, "Tests whether ListObjects lists all objects matching a prefix and recursive", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1714. }
  1715. }
  1716. internal async static Task ListObjects_Test4(MinioClient minio)
  1717. {
  1718. DateTime startTime = DateTime.Now;
  1719. string bucketName = GetRandomName(15);
  1720. string objectName = GetRandomObjectName(10);
  1721. var args = new Dictionary<string, string>
  1722. {
  1723. { "bucketName", bucketName },
  1724. { "objectName", objectName },
  1725. { "recursive", "false" }
  1726. };
  1727. try
  1728. {
  1729. await Setup_Test(minio, bucketName);
  1730. Task[] tasks = new Task[2];
  1731. for (int i = 0; i < 2; i++) {
  1732. tasks[i] = PutObject_Task(minio, bucketName, objectName + i.ToString(), null, null, 0, null, rsg.GenerateStreamFromSeed(1*KB));
  1733. }
  1734. await Task.WhenAll(tasks);
  1735. ListObjects_Test(minio, bucketName, "", 2, false).Wait();
  1736. System.Threading.Thread.Sleep(2000);
  1737. await minio.RemoveObjectAsync(bucketName, objectName + "0");
  1738. await minio.RemoveObjectAsync(bucketName, objectName + "1");
  1739. await TearDown(minio, bucketName);
  1740. new MintLogger("ListObjects_Test4", listObjectsSignature, "Tests whether ListObjects lists all objects when no prefix is specified", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1741. }
  1742. catch (MinioException ex)
  1743. {
  1744. new MintLogger("ListObjects_Test4", listObjectsSignature, "Tests whether ListObjects lists all objects when no prefix is specified", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1745. }
  1746. }
  1747. internal async static Task ListObjects_Test5(MinioClient minio)
  1748. {
  1749. DateTime startTime = DateTime.Now;
  1750. string bucketName = GetRandomName(15);
  1751. string objectNamePrefix = GetRandomName(10);
  1752. var args = new Dictionary<string, string>
  1753. {
  1754. { "bucketName", bucketName },
  1755. { "objectName", objectNamePrefix },
  1756. { "recursive", "false" }
  1757. };
  1758. try
  1759. {
  1760. int numObjects = 100;
  1761. await Setup_Test(minio, bucketName);
  1762. Task[] tasks = new Task[numObjects];
  1763. for (int i = 1; i <= numObjects; i++) {
  1764. tasks[i - 1] = PutObject_Task(minio, bucketName, objectNamePrefix + i.ToString(), null, null, 0, null, rsg.GenerateStreamFromSeed(1));
  1765. // Add sleep to avoid flooding server with concurrent requests
  1766. if (i % 50 == 0) {
  1767. System.Threading.Thread.Sleep(2000);
  1768. }
  1769. }
  1770. await Task.WhenAll(tasks);
  1771. ListObjects_Test(minio, bucketName, objectNamePrefix, numObjects, false).Wait();
  1772. System.Threading.Thread.Sleep(5000);
  1773. for(int index=1; index <= numObjects; index++)
  1774. {
  1775. string objectName = objectNamePrefix + index.ToString();
  1776. await minio.RemoveObjectAsync(bucketName, objectName);
  1777. }
  1778. await TearDown(minio, bucketName);
  1779. new MintLogger("ListObjects_Test5", listObjectsSignature, "Tests whether ListObjects lists all objects when number of objects == 100", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1780. }
  1781. catch (MinioException ex)
  1782. {
  1783. new MintLogger("ListObjects_Test5", listObjectsSignature, "Tests whether ListObjects lists all objects when number of objects == 100", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1784. }
  1785. }
  1786. internal async static Task ListObjects_Test(MinioClient minio, string bucketName, string prefix, int numObjects, bool recursive = true)
  1787. {
  1788. DateTime startTime = DateTime.Now;
  1789. int count = 0;
  1790. IObservable<Item> observable = minio.ListObjectsAsync(bucketName, prefix, recursive);
  1791. IDisposable subscription = observable.Subscribe(
  1792. item =>
  1793. {
  1794. Assert.IsTrue(item.Key.StartsWith(prefix));
  1795. count += 1;
  1796. },
  1797. ex => throw ex,
  1798. () =>
  1799. {
  1800. Assert.AreEqual(count, numObjects);
  1801. });
  1802. }
  1803. #endregion
  1804. internal async static Task RemoveObject_Test1(MinioClient minio)
  1805. {
  1806. DateTime startTime = DateTime.Now;
  1807. string bucketName = GetRandomName(15);
  1808. string objectName = GetRandomObjectName(10);
  1809. var args = new Dictionary<string, string>
  1810. {
  1811. { "bucketName", bucketName },
  1812. { "objectName", objectName },
  1813. };
  1814. try
  1815. {
  1816. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1817. {
  1818. await Setup_Test(minio, bucketName);
  1819. await minio.PutObjectAsync(bucketName,
  1820. objectName,
  1821. filestream, filestream.Length, null);
  1822. await minio.RemoveObjectAsync(bucketName, objectName);
  1823. await TearDown(minio, bucketName);
  1824. }
  1825. new MintLogger("RemoveObject_Test1", removeObjectSignature1, "Tests whether RemoveObjectAsync for existing object passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1826. }
  1827. catch (MinioException ex)
  1828. {
  1829. new MintLogger("RemoveObject_Test1", removeObjectSignature1, "Tests whether RemoveObjectAsync for existing object passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1830. }
  1831. }
  1832. internal async static Task RemoveObjects_Test2(MinioClient minio)
  1833. {
  1834. DateTime startTime = DateTime.Now;
  1835. string bucketName = GetRandomName(15);
  1836. string objectName = GetRandomObjectName(6);
  1837. var args = new Dictionary<string, string>
  1838. {
  1839. { "bucketName", bucketName },
  1840. { "objectNames", "[" + objectName + "0..." + objectName + "50]" },
  1841. };
  1842. try
  1843. {
  1844. int count = 50;
  1845. Task[] tasks = new Task[count];
  1846. List<string> objectsList = new List<string>();
  1847. await Setup_Test(minio, bucketName);
  1848. for (int i = 0; i < count; i++)
  1849. {
  1850. tasks[i] = PutObject_Task(minio, bucketName, objectName + i.ToString(), null, null, 0, null, rsg.GenerateStreamFromSeed(5));
  1851. objectsList.Add(objectName + i.ToString());
  1852. }
  1853. Task.WhenAll(tasks).Wait();
  1854. System.Threading.Thread.Sleep(1000);
  1855. DeleteError de;
  1856. IObservable<DeleteError> observable = await minio.RemoveObjectAsync(bucketName, objectsList);
  1857. IDisposable subscription = observable.Subscribe(
  1858. deleteError => de = deleteError,
  1859. () =>
  1860. {
  1861. TearDown(minio, bucketName).Wait();
  1862. });
  1863. new MintLogger("RemoveObject_Test2", removeObjectSignature2, "Tests whether RemoveObjectAsync for multi objects delete passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1864. }
  1865. catch (MinioException ex)
  1866. {
  1867. new MintLogger("RemoveObjects_Test2", removeObjectSignature2, "Tests whether RemoveObjectAsync for multi objects delete passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1868. }
  1869. }
  1870. #region Presigned Get Object
  1871. internal async static Task PresignedGetObject_Test1(MinioClient minio)
  1872. {
  1873. DateTime startTime = DateTime.Now;
  1874. string bucketName = GetRandomName(15);
  1875. string objectName = GetRandomObjectName(10);
  1876. int expiresInt = 1000;
  1877. string downloadFile = "downloadFileName";
  1878. var args = new Dictionary<string, string>
  1879. {
  1880. { "bucketName", bucketName },
  1881. { "objectName", objectName },
  1882. { "expiresInt", expiresInt.ToString() }
  1883. };
  1884. try
  1885. {
  1886. await Setup_Test(minio, bucketName);
  1887. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1888. await minio.PutObjectAsync(bucketName,
  1889. objectName,
  1890. filestream, filestream.Length, null);
  1891. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  1892. string presigned_url = await minio.PresignedGetObjectAsync(bucketName, objectName, expiresInt);
  1893. WebRequest httpRequest = WebRequest.Create(presigned_url);
  1894. var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(httpRequest.BeginGetResponse, httpRequest.EndGetResponse, null));
  1895. Stream stream = response.GetResponseStream();
  1896. var fileStream = File.Create(downloadFile);
  1897. stream.CopyTo(fileStream);
  1898. fileStream.Dispose();
  1899. FileInfo writtenInfo = new FileInfo(downloadFile);
  1900. long file_read_size = writtenInfo.Length;
  1901. // Compare size of file downloaded with presigned curl request and actual object size on server
  1902. Assert.AreEqual(file_read_size, stats.Size);
  1903. await minio.RemoveObjectAsync(bucketName, objectName);
  1904. await TearDown(minio, bucketName);
  1905. File.Delete(downloadFile);
  1906. new MintLogger("PresignedGetObject_Test1", presignedGetObjectSignature, "Tests whether PresignedGetObject url retrieves object from bucket", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1907. }
  1908. catch (MinioException ex)
  1909. {
  1910. new MintLogger("PresignedGetObject_Test1", presignedGetObjectSignature, "Tests whether PresignedGetObject url retrieves object from bucket", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1911. }
  1912. }
  1913. internal async static Task PresignedGetObject_Test2(MinioClient minio)
  1914. {
  1915. DateTime startTime = DateTime.Now;
  1916. string bucketName = GetRandomName(15);
  1917. string objectName = GetRandomObjectName(10);
  1918. int expiresInt = 0;
  1919. var args = new Dictionary<string, string>
  1920. {
  1921. { "bucketName", bucketName },
  1922. { "objectName", objectName },
  1923. { "expiresInt", expiresInt.ToString() }
  1924. };
  1925. try
  1926. {
  1927. try
  1928. {
  1929. await Setup_Test(minio, bucketName);
  1930. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1931. await minio.PutObjectAsync(bucketName,
  1932. objectName,
  1933. filestream, filestream.Length, null);
  1934. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  1935. string presigned_url = await minio.PresignedGetObjectAsync(bucketName, objectName, 0);
  1936. }
  1937. catch (InvalidExpiryRangeException)
  1938. {
  1939. new MintLogger("PresignedGetObject_Test2", presignedGetObjectSignature, "Tests whether PresignedGetObject url retrieves object from bucket when invalid expiry is set.", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1940. }
  1941. await minio.RemoveObjectAsync(bucketName, objectName);
  1942. await TearDown(minio, bucketName);
  1943. }
  1944. catch (Exception ex)
  1945. {
  1946. new MintLogger("PresignedGetObject_Test2", presignedGetObjectSignature, "Tests whether PresignedGetObject url retrieves object from bucket when invalid expiry is set.", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  1947. }
  1948. }
  1949. internal async static Task PresignedGetObject_Test3(MinioClient minio)
  1950. {
  1951. DateTime startTime = DateTime.Now;
  1952. string bucketName = GetRandomName(15);
  1953. string objectName = GetRandomObjectName(10);
  1954. int expiresInt = 1000;
  1955. DateTime reqDate = DateTime.UtcNow.AddSeconds(-50);
  1956. var args = new Dictionary<string, string>
  1957. {
  1958. { "bucketName", bucketName },
  1959. { "objectName", objectName },
  1960. { "expiresInt", expiresInt.ToString() },
  1961. { "reqParams", "response-content-type:application/json,response-content-disposition:attachment;filename=MyDocument.json;" },
  1962. { "reqDate", reqDate.ToString() },
  1963. };
  1964. try
  1965. {
  1966. string downloadFile = "downloadFileName";
  1967. await Setup_Test(minio, bucketName);
  1968. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  1969. await minio.PutObjectAsync(bucketName,
  1970. objectName,
  1971. filestream, filestream.Length, null);
  1972. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  1973. var reqParams = new Dictionary<string, string>
  1974. {
  1975. ["response-content-type"] = "application/json",
  1976. ["response-content-disposition"] = "attachment;filename=MyDocument.json;"
  1977. };
  1978. string presigned_url = await minio.PresignedGetObjectAsync(bucketName, objectName, 1000, reqParams, reqDate);
  1979. WebRequest httpRequest = WebRequest.Create(presigned_url);
  1980. var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(httpRequest.BeginGetResponse, httpRequest.EndGetResponse, null));
  1981. Assert.AreEqual(response.ContentType, reqParams["response-content-type"]);
  1982. Assert.AreEqual(response.Headers["Content-Disposition"], "attachment;filename=MyDocument.json;");
  1983. Assert.AreEqual(response.Headers["Content-Type"], "application/json");
  1984. Assert.AreEqual(response.Headers["Content-Length"], stats.Size.ToString());
  1985. Stream stream = response.GetResponseStream();
  1986. var fileStream = File.Create(downloadFile);
  1987. stream.CopyTo(fileStream);
  1988. fileStream.Dispose();
  1989. FileInfo writtenInfo = new FileInfo(downloadFile);
  1990. long file_read_size = writtenInfo.Length;
  1991. // Compare size of file downloaded with presigned curl request and actual object size on server
  1992. Assert.AreEqual(file_read_size, stats.Size);
  1993. await minio.RemoveObjectAsync(bucketName, objectName);
  1994. await TearDown(minio, bucketName);
  1995. File.Delete(downloadFile);
  1996. new MintLogger("PresignedGetObject_Test3", presignedGetObjectSignature, "Tests whether PresignedGetObject url retrieves object from bucket when override response headers sent", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  1997. }
  1998. catch (MinioException ex)
  1999. {
  2000. new MintLogger("PresignedGetObject_Test3", presignedGetObjectSignature, "Tests whether PresignedGetObject url retrieves object from bucket when override response headers sent", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2001. }
  2002. }
  2003. #endregion
  2004. #region Presigned Put Object
  2005. internal async static Task PresignedPutObject_Test1(MinioClient minio)
  2006. {
  2007. DateTime startTime = DateTime.Now;
  2008. string bucketName = GetRandomName(15);
  2009. string objectName = GetRandomObjectName(10);
  2010. int expiresInt = 1000;
  2011. string fileName = CreateFile(10 * KB, dataFile10KB);
  2012. var args = new Dictionary<string, string>
  2013. {
  2014. { "bucketName", bucketName },
  2015. { "objectName", objectName },
  2016. { "expiresInt", expiresInt.ToString() },
  2017. };
  2018. try
  2019. {
  2020. await Setup_Test(minio, bucketName);
  2021. // Upload with presigned url
  2022. string presigned_url = await minio.PresignedPutObjectAsync(bucketName, objectName, 1000);
  2023. await UploadObjectAsync(presigned_url, fileName);
  2024. // Get stats for object from server
  2025. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  2026. // Compare with file used for upload
  2027. FileInfo writtenInfo = new FileInfo(fileName);
  2028. long file_written_size = writtenInfo.Length;
  2029. Assert.AreEqual(file_written_size, stats.Size);
  2030. await minio.RemoveObjectAsync(bucketName, objectName);
  2031. await TearDown(minio, bucketName);
  2032. new MintLogger("PresignedPutObject_Test1", presignedPutObjectSignature, "Tests whether PresignedPutObject url uploads object to bucket", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2033. }
  2034. catch (MinioException ex)
  2035. {
  2036. new MintLogger("PresignedPutObject_Test1", presignedPutObjectSignature, "Tests whether PresignedPutObject url uploads object to bucket", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2037. }
  2038. if (!IsMintEnv())
  2039. {
  2040. File.Delete(fileName);
  2041. }
  2042. }
  2043. internal async static Task PresignedPutObject_Test2(MinioClient minio)
  2044. {
  2045. DateTime startTime = DateTime.Now;
  2046. string bucketName = GetRandomName(15);
  2047. string objectName = GetRandomObjectName(10);
  2048. int expiresInt = 0;
  2049. var args = new Dictionary<string, string>
  2050. {
  2051. { "bucketName", bucketName },
  2052. { "objectName", objectName },
  2053. { "expiresInt", expiresInt.ToString() },
  2054. };
  2055. try
  2056. {
  2057. try
  2058. {
  2059. await Setup_Test(minio, bucketName);
  2060. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  2061. await minio.PutObjectAsync(bucketName,
  2062. objectName,
  2063. filestream, filestream.Length, null);
  2064. ObjectStat stats = await minio.StatObjectAsync(bucketName, objectName);
  2065. string presigned_url = await minio.PresignedPutObjectAsync(bucketName, objectName, 0);
  2066. }
  2067. catch (InvalidExpiryRangeException)
  2068. {
  2069. new MintLogger("PresignedPutObject_Test2", presignedPutObjectSignature, "Tests whether PresignedPutObject url retrieves object from bucket when invalid expiry is set.", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2070. }
  2071. await minio.RemoveObjectAsync(bucketName, objectName);
  2072. await TearDown(minio, bucketName);
  2073. }
  2074. catch (Exception ex)
  2075. {
  2076. new MintLogger("PresignedPutObject_Test2", presignedPutObjectSignature, "Tests whether PresignedPutObject url retrieves object from bucket when invalid expiry is set.", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2077. }
  2078. }
  2079. #endregion
  2080. internal static async Task UploadObjectAsync(string url, string filePath)
  2081. {
  2082. HttpWebRequest httpRequest = WebRequest.Create(url) as HttpWebRequest;
  2083. httpRequest.Method = "PUT";
  2084. using (var dataStream = await Task.Factory.FromAsync<Stream>(httpRequest.BeginGetRequestStream, httpRequest.EndGetRequestStream, null))
  2085. {
  2086. byte[] buffer = new byte[8000];
  2087. using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
  2088. {
  2089. fileStream.CopyTo(dataStream);
  2090. }
  2091. }
  2092. var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(httpRequest.BeginGetResponse, httpRequest.EndGetResponse, null));
  2093. }
  2094. internal async static Task PresignedPostPolicy_Test1(MinioClient minio)
  2095. {
  2096. DateTime startTime = DateTime.Now;
  2097. string bucketName = GetRandomName(15);
  2098. string objectName = GetRandomObjectName(10);
  2099. string metadataKey = GetRandomName(10);
  2100. string metadataValue = GetRandomName(10);
  2101. // Generate presigned post policy url
  2102. PostPolicy form = new PostPolicy();
  2103. DateTime expiration = DateTime.UtcNow;
  2104. form.SetExpires(expiration.AddDays(10));
  2105. form.SetKey(objectName);
  2106. form.SetBucket(bucketName);
  2107. form.SetUserMetadata(metadataKey, metadataValue);
  2108. var args = new Dictionary<string, string>
  2109. {
  2110. { "form", form.Base64() },
  2111. };
  2112. string fileName = CreateFile(10 * KB, dataFile10KB);
  2113. try
  2114. {
  2115. await Setup_Test(minio, bucketName);
  2116. await minio.PutObjectAsync(bucketName,
  2117. objectName,
  2118. fileName);
  2119. var pairs = new List<KeyValuePair<string, string>>();
  2120. string url = "https://s3.amazonaws.com/" + bucketName;
  2121. Tuple<string, System.Collections.Generic.Dictionary<string, string>> policyTuple = await minio.PresignedPostPolicyAsync(form);
  2122. var httpClient = new HttpClient();
  2123. using (var stream = File.OpenRead(fileName))
  2124. {
  2125. MultipartFormDataContent multipartContent = new MultipartFormDataContent();
  2126. multipartContent.Add(new StreamContent(stream), fileName, objectName);
  2127. multipartContent.Add(new FormUrlEncodedContent(pairs));
  2128. var response = await httpClient.PostAsync(url, multipartContent);
  2129. response.EnsureSuccessStatusCode();
  2130. }
  2131. // Validate
  2132. string policy = await minio.GetPolicyAsync(bucketName);
  2133. await minio.RemoveObjectAsync(bucketName, objectName);
  2134. await TearDown(minio, bucketName);
  2135. new MintLogger("PresignedPostPolicy_Test1", presignedPostPolicySignature, "Tests whether PresignedPostPolicy url applies policy on server", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2136. }
  2137. catch (Exception ex)
  2138. {
  2139. new MintLogger("PresignedPostPolicy_Test1", presignedPostPolicySignature, "Tests whether PresignedPostPolicy url applies policy on server", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2140. }
  2141. await minio.RemoveObjectAsync(bucketName, objectName);
  2142. await TearDown(minio, bucketName);
  2143. if (!IsMintEnv())
  2144. {
  2145. File.Delete(fileName);
  2146. }
  2147. }
  2148. #region List Incomplete Upload
  2149. internal async static Task ListIncompleteUpload_Test1(MinioClient minio)
  2150. {
  2151. DateTime startTime = DateTime.Now;
  2152. string bucketName = GetRandomName(15);
  2153. string objectName = GetRandomObjectName(10);
  2154. string contentType = "gzip";
  2155. var args = new Dictionary<string, string>
  2156. {
  2157. { "bucketName", bucketName },
  2158. { "recursive", "true" }
  2159. };
  2160. try
  2161. {
  2162. await Setup_Test(minio, bucketName);
  2163. CancellationTokenSource cts = new CancellationTokenSource();
  2164. cts.CancelAfter(TimeSpan.FromMilliseconds(50));
  2165. try
  2166. {
  2167. using (System.IO.MemoryStream filestream = rsg.GenerateStreamFromSeed(10 * MB))
  2168. {
  2169. long file_write_size = filestream.Length;
  2170. await minio.PutObjectAsync(bucketName,
  2171. objectName,
  2172. filestream,
  2173. filestream.Length,
  2174. contentType, cancellationToken: cts.Token);
  2175. }
  2176. }
  2177. catch (OperationCanceledException)
  2178. {
  2179. IObservable<Upload> observable = minio.ListIncompleteUploads(bucketName);
  2180. IDisposable subscription = observable.Subscribe(
  2181. item => Assert.AreEqual(item.Key, objectName),
  2182. ex => Assert.Fail());
  2183. await minio.RemoveIncompleteUploadAsync(bucketName, objectName);
  2184. }
  2185. catch (Exception ex)
  2186. {
  2187. new MintLogger("ListIncompleteUpload_Test1", listIncompleteUploadsSignature, "Tests whether ListIncompleteUpload passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString()).Log();
  2188. return;
  2189. }
  2190. await TearDown(minio, bucketName);
  2191. new MintLogger("ListIncompleteUpload_Test1", listIncompleteUploadsSignature, "Tests whether ListIncompleteUpload passes", TestStatus.PASS, (DateTime.Now - startTime)).Log();
  2192. }
  2193. catch (MinioException ex)
  2194. {
  2195. new MintLogger("ListIncompleteUpload_Test1", listIncompleteUploadsSignature, "Tests whether ListIncompleteUpload passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString()).Log();
  2196. }
  2197. }
  2198. internal async static Task ListIncompleteUpload_Test2(MinioClient minio)
  2199. {
  2200. DateTime startTime = DateTime.Now;
  2201. string bucketName = GetRandomName(15);
  2202. string prefix = "minioprefix/";
  2203. string objectName = prefix + GetRandomName(10);
  2204. string contentType = "gzip";
  2205. var args = new Dictionary<string, string>
  2206. {
  2207. { "bucketName", bucketName },
  2208. { "prefix", prefix },
  2209. { "recursive", "false" }
  2210. };
  2211. try
  2212. {
  2213. await Setup_Test(minio, bucketName);
  2214. CancellationTokenSource cts = new CancellationTokenSource();
  2215. cts.CancelAfter(TimeSpan.FromMilliseconds(60));
  2216. try
  2217. {
  2218. using (System.IO.MemoryStream filestream = rsg.GenerateStreamFromSeed(10 * MB))
  2219. {
  2220. long file_write_size = filestream.Length;
  2221. await minio.PutObjectAsync(bucketName,
  2222. objectName,
  2223. filestream,
  2224. filestream.Length,
  2225. contentType, cancellationToken: cts.Token);
  2226. }
  2227. }
  2228. catch (OperationCanceledException)
  2229. {
  2230. IObservable<Upload> observable = minio.ListIncompleteUploads(bucketName, "minioprefix", false);
  2231. IDisposable subscription = observable.Subscribe(
  2232. item => Assert.AreEqual(item.Key, objectName),
  2233. ex => Assert.Fail());
  2234. await minio.RemoveIncompleteUploadAsync(bucketName, objectName);
  2235. }
  2236. await TearDown(minio, bucketName);
  2237. new MintLogger("ListIncompleteUpload_Test2", listIncompleteUploadsSignature, "Tests whether ListIncompleteUpload passes when qualified by prefix", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2238. }
  2239. catch (MinioException ex)
  2240. {
  2241. new MintLogger("ListIncompleteUpload_Test2", listIncompleteUploadsSignature, "Tests whether ListIncompleteUpload passes when qualified by prefix", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2242. }
  2243. }
  2244. internal async static Task ListIncompleteUpload_Test3(MinioClient minio)
  2245. {
  2246. DateTime startTime = DateTime.Now;
  2247. string bucketName = GetRandomName(15);
  2248. string prefix = "minioprefix";
  2249. string objectName = prefix + "/" + GetRandomName(10) + "/suffix";
  2250. string contentType = "gzip";
  2251. var args = new Dictionary<string, string>
  2252. {
  2253. { "bucketName", bucketName },
  2254. { "prefix", prefix },
  2255. { "recursive", "true" }
  2256. };
  2257. try
  2258. {
  2259. await Setup_Test(minio, bucketName);
  2260. CancellationTokenSource cts = new CancellationTokenSource();
  2261. cts.CancelAfter(TimeSpan.FromMilliseconds(50));
  2262. try
  2263. {
  2264. using (System.IO.MemoryStream filestream = rsg.GenerateStreamFromSeed(6 * MB))
  2265. {
  2266. long file_write_size = filestream.Length;
  2267. await minio.PutObjectAsync(bucketName,
  2268. objectName,
  2269. filestream,
  2270. filestream.Length,
  2271. contentType, cancellationToken: cts.Token);
  2272. }
  2273. }
  2274. catch (OperationCanceledException)
  2275. {
  2276. IObservable<Upload> observable = minio.ListIncompleteUploads(bucketName, prefix, true);
  2277. IDisposable subscription = observable.Subscribe(
  2278. item => Assert.AreEqual(item.Key, objectName),
  2279. ex => Assert.Fail());
  2280. await minio.RemoveIncompleteUploadAsync(bucketName, objectName);
  2281. }
  2282. await TearDown(minio, bucketName);
  2283. new MintLogger("ListIncompleteUpload_Test3", listIncompleteUploadsSignature, "Tests whether ListIncompleteUpload passes when qualified by prefix and recursive", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2284. }
  2285. catch (MinioException ex)
  2286. {
  2287. new MintLogger("ListIncompleteUpload_Test3", listIncompleteUploadsSignature, "Tests whether ListIncompleteUpload passes when qualified by prefix and recursive", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2288. }
  2289. }
  2290. #endregion
  2291. internal async static Task RemoveIncompleteUpload_Test(MinioClient minio)
  2292. {
  2293. DateTime startTime = DateTime.Now;
  2294. string bucketName = GetRandomName(15);
  2295. string objectName = GetRandomObjectName(10);
  2296. string contentType = "csv";
  2297. var args = new Dictionary<string, string>
  2298. {
  2299. { "bucketName", bucketName },
  2300. { "objectName", objectName },
  2301. };
  2302. try
  2303. {
  2304. await Setup_Test(minio, bucketName);
  2305. CancellationTokenSource cts = new CancellationTokenSource();
  2306. cts.CancelAfter(TimeSpan.FromMilliseconds(10));
  2307. try
  2308. {
  2309. using (System.IO.MemoryStream filestream = rsg.GenerateStreamFromSeed(6 * MB))
  2310. {
  2311. long file_write_size = filestream.Length;
  2312. await minio.PutObjectAsync(bucketName,
  2313. objectName,
  2314. filestream,
  2315. filestream.Length,
  2316. contentType, cancellationToken: cts.Token);
  2317. }
  2318. }
  2319. catch (OperationCanceledException)
  2320. {
  2321. await minio.RemoveIncompleteUploadAsync(bucketName, objectName);
  2322. IObservable<Upload> observable = minio.ListIncompleteUploads(bucketName);
  2323. IDisposable subscription = observable.Subscribe(
  2324. item => Assert.Fail(),
  2325. ex => Assert.Fail());
  2326. }
  2327. await TearDown(minio, bucketName);
  2328. new MintLogger("RemoveIncompleteUpload_Test", removeIncompleteUploadSignature, "Tests whether RemoveIncompleteUpload passes.", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2329. }
  2330. catch (MinioException ex)
  2331. {
  2332. new MintLogger("RemoveIncompleteUpload_Test", removeIncompleteUploadSignature, "Tests whether RemoveIncompleteUpload passes.", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2333. }
  2334. }
  2335. #region Bucket Policy
  2336. /// <summary>
  2337. /// Set a policy for given bucket
  2338. /// </summary>
  2339. /// <param name="minio"></param>
  2340. /// <returns></returns>
  2341. internal async static Task SetBucketPolicy_Test1(MinioClient minio)
  2342. {
  2343. DateTime startTime = DateTime.Now;
  2344. string bucketName = GetRandomName(15);
  2345. string objectName = GetRandomObjectName(10);
  2346. var args = new Dictionary<string, string>
  2347. {
  2348. { "bucketName", bucketName },
  2349. { "objectPrefix", objectName.Substring(5) },
  2350. { "policyType", "readonly" }
  2351. };
  2352. try
  2353. {
  2354. await Setup_Test(minio, bucketName);
  2355. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  2356. await minio.PutObjectAsync(bucketName,
  2357. objectName,
  2358. filestream, filestream.Length, null);
  2359. string policyJson = $@"{{""Version"":""2012-10-17"",""Statement"":[{{""Action"":[""s3:GetObject""],""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}/foo*"",""arn:aws:s3:::{bucketName}/prefix/*""],""Sid"":""""}}]}}";
  2360. await minio.SetPolicyAsync(bucketName,
  2361. policyJson);
  2362. await minio.RemoveObjectAsync(bucketName, objectName);
  2363. await TearDown(minio, bucketName);
  2364. new MintLogger("SetBucketPolicy_Test1", setBucketPolicySignature, "Tests whether SetBucketPolicy passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2365. }
  2366. catch (MinioException ex)
  2367. {
  2368. new MintLogger("SetBucketPolicy_Test1", setBucketPolicySignature, "Tests whether SetBucketPolicy passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2369. }
  2370. }
  2371. /// <summary>
  2372. /// Get a policy for given bucket
  2373. /// </summary>
  2374. /// <param name="minio"></param>
  2375. /// <returns></returns>
  2376. internal async static Task GetBucketPolicy_Test1(MinioClient minio)
  2377. {
  2378. DateTime startTime = DateTime.Now;
  2379. string bucketName = GetRandomName(15);
  2380. string objectName = GetRandomObjectName(10);
  2381. var args = new Dictionary<string, string>
  2382. {
  2383. { "bucketName", bucketName },
  2384. };
  2385. try
  2386. {
  2387. await Setup_Test(minio, bucketName);
  2388. string policyJson = $@"{{""Version"":""2012-10-17"",""Statement"":[{{""Action"":[""s3:GetObject""],""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}/foo*"",""arn:aws:s3:::{bucketName}/prefix/*""],""Sid"":""""}}]}}";
  2389. using (MemoryStream filestream = rsg.GenerateStreamFromSeed(1 * KB))
  2390. await minio.PutObjectAsync(bucketName,
  2391. objectName,
  2392. filestream, filestream.Length, null);
  2393. await minio.SetPolicyAsync(bucketName,
  2394. policyJson);
  2395. string policy = await minio.GetPolicyAsync(bucketName);
  2396. await minio.RemoveObjectAsync(bucketName, objectName);
  2397. await TearDown(minio, bucketName);
  2398. new MintLogger("GetBucketPolicy_Test1", getBucketPolicySignature, "Tests whether GetBucketPolicy passes", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2399. }
  2400. catch (MinioException ex)
  2401. {
  2402. new MintLogger("GetBucketPolicy_Test1", getBucketPolicySignature, "Tests whether GetBucketPolicy passes", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2403. }
  2404. }
  2405. #endregion
  2406. #region Bucket Notifications
  2407. internal async static Task ListenBucketNotificationsAsync_Test1(MinioClient minio)
  2408. {
  2409. DateTime startTime = DateTime.Now;
  2410. string bucketName = GetRandomName(15);
  2411. string objectName = GetRandomObjectName(10);
  2412. string contentType = "application/octet-stream";
  2413. var args = new Dictionary<string, string>
  2414. {
  2415. { "bucketName", bucketName },
  2416. { "objectName", objectName },
  2417. { "contentType", contentType },
  2418. { "size", "1MB" }
  2419. };
  2420. try
  2421. {
  2422. Console.WriteLine($"ListenBucketNotificationsAsync starting: bucketName={bucketName}");
  2423. await Setup_Test(minio, bucketName);
  2424. // Thread.Sleep(10 * 1000);
  2425. Console.WriteLine($"ListenBucketNotificationsAsync starting: bucketName={bucketName}");
  2426. var received = new List<MinioNotificationRaw>();
  2427. IObservable<MinioNotificationRaw> events = minio.ListenBucketNotificationsAsync(bucketName, new List<EventType> { EventType.ObjectCreatedAll });
  2428. IDisposable subscription = events.Subscribe(
  2429. ev => {
  2430. Console.WriteLine($"ListenBucketNotificationsAsync received: " + ev.json);
  2431. received.Add(ev);
  2432. },
  2433. ex => throw ex,
  2434. // ex => new MintLogger(nameof(ListenBucketNotificationsAsync_Test1), listenBucketNotificationsSignature, "ListenBucketNotificationsAsync_Test1", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log(),
  2435. () => Console.WriteLine($"ListenBucketNotificationsAsync finished"));
  2436. Thread.Sleep(2 * 1000);
  2437. await PutObject_Tester(minio, bucketName, objectName, null, contentType, 0, null, rsg.GenerateStreamFromSeed(1 * KB));
  2438. await TearDown(minio, bucketName);
  2439. subscription.Dispose();
  2440. // wait for notifications
  2441. var testOutcome = TestStatus.FAIL;
  2442. for (int attempt = 0; attempt < 10; attempt++) {
  2443. if (received.Count > 0) {
  2444. MinioNotification notification = JsonConvert.DeserializeObject<MinioNotification>(received[0].json);
  2445. Console.WriteLine($" round-trip deserialisation: {JsonConvert.SerializeObject(notification, Formatting.Indented)}");
  2446. Assert.AreEqual(1, notification.Records.Length);
  2447. Assert.AreEqual("s3:ObjectCreated:Put", notification.Records[0].eventName);
  2448. Assert.AreEqual(bucketName, notification.Records[0].s3.bucketMeta.name);
  2449. Assert.AreEqual(objectName, System.Web.HttpUtility.UrlDecode(notification.Records[0].s3.objectMeta.key));
  2450. Assert.AreEqual(contentType, notification.Records[0].s3.objectMeta.contentType);
  2451. Console.WriteLine("PASSED");
  2452. testOutcome = TestStatus.PASS;
  2453. break;
  2454. } else {
  2455. Console.WriteLine($"ListenBucketNotificationsAsync: waiting for notification (t={attempt})");
  2456. }
  2457. Thread.Sleep(2000);
  2458. }
  2459. Console.WriteLine($"outcome: {testOutcome}");
  2460. new MintLogger(nameof(ListenBucketNotificationsAsync_Test1), listenBucketNotificationsSignature, "Tests whether ListenBucketNotifications passes for small object", testOutcome, (DateTime.Now - startTime), args:args).Log();
  2461. }
  2462. catch (Exception ex)
  2463. {
  2464. new MintLogger(nameof(ListenBucketNotificationsAsync_Test1), listenBucketNotificationsSignature, "Tests whether ListenBucketNotifications passes for small object", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2465. }
  2466. }
  2467. #endregion
  2468. #region Select Object Content
  2469. internal async static Task SelectObjectContent_Test(MinioClient minio)
  2470. {
  2471. DateTime startTime = DateTime.Now;
  2472. string bucketName = GetRandomName(15);
  2473. string objectName = GetRandomObjectName(10);
  2474. string outFileName = "outFileName";
  2475. var args = new Dictionary<string, string>
  2476. {
  2477. { "bucketName", bucketName },
  2478. { "objectName", objectName },
  2479. { "fileName", outFileName },
  2480. };
  2481. try
  2482. {
  2483. await Setup_Test(minio, bucketName);
  2484. StringBuilder csvString = new StringBuilder();
  2485. csvString.AppendLine("Employee,Manager,Group");
  2486. csvString.AppendLine("Employee4,Employee2,500");
  2487. csvString.AppendLine("Employee3,Employee1,500");
  2488. csvString.AppendLine("Employee1,,1000");
  2489. csvString.AppendLine("Employee5,Employee1,500");
  2490. csvString.AppendLine("Employee2,Employee1,800");
  2491. var csvBytes = System.Text.Encoding.UTF8.GetBytes(csvString.ToString());
  2492. using (var stream = new MemoryStream(csvBytes))
  2493. {
  2494. await minio.PutObjectAsync(bucketName,
  2495. objectName,
  2496. stream, stream.Length, null);
  2497. }
  2498. var opts = new SelectObjectOptions()
  2499. {
  2500. ExpressionType = QueryExpressionType.SQL,
  2501. Expression = "select * from s3object",
  2502. InputSerialization = new SelectObjectInputSerialization()
  2503. {
  2504. CompressionType = SelectCompressionType.NONE,
  2505. CSV = new CSVInputOptions()
  2506. {
  2507. FileHeaderInfo = CSVFileHeaderInfo.None,
  2508. RecordDelimiter = "\n",
  2509. FieldDelimiter = ",",
  2510. }
  2511. },
  2512. OutputSerialization = new SelectObjectOutputSerialization()
  2513. {
  2514. CSV = new CSVOutputOptions()
  2515. {
  2516. RecordDelimiter = "\n",
  2517. FieldDelimiter = ",",
  2518. }
  2519. }
  2520. };
  2521. var resp = await minio.SelectObjectContentAsync(bucketName, objectName, opts);
  2522. var output = await new StreamReader(resp.Payload).ReadToEndAsync();
  2523. Assert.AreEqual(output,csvString.ToString());
  2524. await minio.RemoveObjectAsync(bucketName, objectName);
  2525. await TearDown(minio, bucketName);
  2526. new MintLogger("SelectObjectContent_Test", selectObjectSignature, "Tests whether SelectObjectContent passes for a select query", TestStatus.PASS, (DateTime.Now - startTime), args:args).Log();
  2527. }
  2528. catch (MinioException ex)
  2529. {
  2530. new MintLogger("SelectObjectContent_Test", selectObjectSignature, "Tests whether SelectObjectContent passes for a select query", TestStatus.FAIL, (DateTime.Now - startTime), "", ex.Message, ex.ToString(), args).Log();
  2531. }
  2532. }
  2533. #endregion
  2534. }
  2535. }