public void Test_BlobStorage_CopyDirectory() { // Arrange - setup source and destination folders with blobs for testing. var destinationContainerName = "testdestination"; var metaData = new Dictionary <string, string> { { "testKey", "testValue" } }; // Delete destination container at start. _client.DeleteContainer(destinationContainerName).GetAwaiter().GetResult(); Task.Delay(30000).GetAwaiter().GetResult(); try { // Ensure there are some files in the test folder. for (int i = 0; i <= 10; i++) { _client.UploadBlob($"{TestContainerName}/sourceTestFile{i}", new MemoryStream(Encoding.Default.GetBytes("This is a test this is a test")), metaData).GetAwaiter().GetResult(); } var totalAtSource = _client.ListBlobs(TestContainerName, true).Count(); // Create a destination container with some blobs for (int i = 0; i < 10; i++) { _client.UploadBlob($"{destinationContainerName}/destinationTestFile{i}", new MemoryStream(Encoding.Default.GetBytes("This is a test this is a test"))).GetAwaiter().GetResult(); } var totalAtDestination = _client.ListBlobs(destinationContainerName, true).Count(); List <string> receivedEvents = new List <string>(); Action <TransferEventType, ITransferEvent> transferEventAction = (transferEvent, success) => { Console.WriteLine("Received event type: " + transferEvent.ToString()); receivedEvents.Add(success.ToString()); Console.WriteLine($"Starttime: {success.StartTime}"); Console.WriteLine($"Source: {success.Source}"); Console.WriteLine($"Destination: {success.Destination}"); Console.WriteLine($"Endtime: {success.EndTime}"); }; // Act - carrry out server side copy directory. var copyBlobsResult = _client.CopyDirectory(TestContainerName, destinationContainerName, transferEventAction).GetAwaiter().GetResult(); Console.WriteLine($"totalAtSource: {totalAtSource}, NumberOfFilesTransferred: {copyBlobsResult.NumberOfFilesTransferred}"); // Assert - Ensure correct amount of blobs transferred Assert.Equal(totalAtSource, copyBlobsResult.NumberOfFilesTransferred); Assert.True(copyBlobsResult.NumberOfFilesFailed == 0); Assert.True(copyBlobsResult.NumberOfFilesSkipped == 0); Assert.True(copyBlobsResult.BytesTransferred > 0); //Ensure the event handler was called for each file transferred Assert.Equal(totalAtSource, receivedEvents.Count); // Enure all blobs have been copied and existing ones havent been overwritten var blobs = _client.ListBlobs(destinationContainerName, true); var expectedDesinationCount = copyBlobsResult.NumberOfFilesTransferred + totalAtDestination; Assert.Equal(expectedDesinationCount, blobs.Count()); // Ensure all metadata has been maintained on the copied blobs var copiedBlobs = _client.ListBlobs(destinationContainerName, true, true, "sourceTestFile"); var copiedBlob = (BlobItem)copiedBlobs.First(); var metadata = copiedBlob.Metadata; Assert.True(metadata.ContainsKey("testKey")); Assert.True(metadata.ContainsValue("testValue")); Assert.True(copiedBlobs.Count() >= 10); } finally { // Clean-up // Delete source destination files foreach (var file in _client.ListBlobs(TestContainerName, true, false, "sourceTestFile")) { _client.DeleteBlob(file.Path).GetAwaiter().GetResult(); } // Delete destination container _client.DeleteContainer(destinationContainerName).GetAwaiter().GetResult(); } }