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();
            }
        }