async Task PeekSessionAsyncTest(string queueName, int messageCount = 10)
        {
            var queueClient = QueueClient.CreateFromConnectionString(TestUtility.GetEntityConnectionString(queueName), ReceiveMode.ReceiveAndDelete);

            try
            {
                var messageId1 = "test-message1";
                var sessionId1 = "sessionId1";
                await queueClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId1, SessionId = sessionId1
                });

                TestUtility.Log($"Sent Message: {messageId1} to Session: {sessionId1}");

                var messageId2 = "test-message2";
                var sessionId2 = "sessionId2";
                await queueClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId2, SessionId = sessionId2
                });

                TestUtility.Log($"Sent Message: {messageId2} to Session: {sessionId2}");

                // Peek Message, Receive and Delete with SessionId - sessionId 1
                await this.PeekAndDeleteMessageAsync(queueClient, sessionId1, messageId1);

                // Peek Message, Receive and Delete with SessionId - sessionId 2
                await this.PeekAndDeleteMessageAsync(queueClient, sessionId2, messageId2);
            }
            finally
            {
                await queueClient.CloseAsync();
            }
        }
        async Task SessionRenewLockTestCase(string topicName)
        {
            var entityConnectionString = TestUtility.GetEntityConnectionString(topicName);
            var topicClient            = TopicClient.CreateFromConnectionString(entityConnectionString);
            var subscriptionClient     = SubscriptionClient.CreateFromConnectionString(entityConnectionString, this.SubscriptionName);

            try
            {
                var messageId = "test-message1";
                var sessionId = Guid.NewGuid().ToString();
                await topicClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId, SessionId = sessionId
                });

                TestUtility.Log($"Sent Message: {messageId} to Session: {sessionId}");

                var sessionReceiver = await subscriptionClient.AcceptMessageSessionAsync(sessionId);

                Assert.NotNull((object)sessionReceiver);
                var initialSessionLockedUntilTime = sessionReceiver.LockedUntilUtc;
                TestUtility.Log($"Session LockedUntilUTC: {initialSessionLockedUntilTime} for Session: {sessionReceiver.SessionId}");
                var message = await sessionReceiver.ReceiveAsync();

                TestUtility.Log($"Received Message: {message.MessageId} from Session: {sessionReceiver.SessionId}");
                Assert.True(message.MessageId == messageId);

                TestUtility.Log("Sleeping 10 seconds...");
                await Task.Delay(TimeSpan.FromSeconds(10));

                await sessionReceiver.RenewLockAsync();

                var firstLockedUntilUtcTime = sessionReceiver.LockedUntilUtc;
                TestUtility.Log($"After Renew Session LockedUntilUTC: {firstLockedUntilUtcTime} for Session: {sessionReceiver.SessionId}");
                Assert.True(firstLockedUntilUtcTime >= initialSessionLockedUntilTime + TimeSpan.FromSeconds(10));

                TestUtility.Log("Sleeping 5 seconds...");
                await Task.Delay(TimeSpan.FromSeconds(5));

                await sessionReceiver.RenewLockAsync();

                TestUtility.Log($"After Second Renew Session LockedUntilUTC: {sessionReceiver.LockedUntilUtc} for Session: {sessionReceiver.SessionId}");
                Assert.True(sessionReceiver.LockedUntilUtc >= firstLockedUntilUtcTime + TimeSpan.FromSeconds(5));
                await message.CompleteAsync();

                TestUtility.Log($"Completed Message: {message.MessageId} for Session: {sessionReceiver.SessionId}");
                await sessionReceiver.CloseAsync();
            }
            finally
            {
                subscriptionClient.Close();
                topicClient.Close();
            }
        }
        async Task PeekLockDeferTest(string queueName, int messageCount = 10)
        {
            var queueClient = QueueClient.CreateFromConnectionString(TestUtility.GetEntityConnectionString(queueName));

            try
            {
                await this.PeekLockDeferTestCase(queueClient.InnerSender, queueClient.InnerReceiver, messageCount);
            }
            finally
            {
                await queueClient.CloseAsync();
            }
        }
        async Task ReceiveDeleteTest(string queueName, int messageCount = 10)
        {
            var queueClient = QueueClient.CreateFromConnectionString(TestUtility.GetEntityConnectionString(queueName), ReceiveMode.ReceiveAndDelete);

            try
            {
                await this.ReceiveDeleteTestCase(queueClient.InnerSender, queueClient.InnerReceiver, messageCount);
            }
            finally
            {
                await queueClient.CloseAsync();
            }
        }
        async Task SessionTest(string topicName)
        {
            var entityConnectionString = TestUtility.GetEntityConnectionString(topicName);
            var topicClient            = TopicClient.CreateFromConnectionString(entityConnectionString);
            var subscriptionClient     = SubscriptionClient.CreateFromConnectionString(entityConnectionString, this.SubscriptionName);

            try
            {
                var messageId1 = "test-message1";
                var sessionId1 = "sessionId1";
                await topicClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId1, SessionId = sessionId1
                });

                TestUtility.Log($"Sent Message: {messageId1} to Session: {sessionId1}");

                var messageId2 = "test-message2";
                var sessionId2 = "sessionId2";
                await topicClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId2, SessionId = sessionId2
                });

                TestUtility.Log($"Sent Message: {messageId2} to Session: {sessionId2}");

                // Receive Message, Complete and Close with SessionId - sessionId 1
                await this.AcceptAndCompleteSessionsAsync(subscriptionClient, sessionId1, messageId1);

                // Receive Message, Complete and Close with SessionId - sessionId 2
                await this.AcceptAndCompleteSessionsAsync(subscriptionClient, sessionId2, messageId2);

                // Receive Message, Complete and Close - With Null SessionId specified
                var messageId3 = "test-message3";
                var sessionId3 = "sessionId3";
                await topicClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId3, SessionId = sessionId3
                });

                await this.AcceptAndCompleteSessionsAsync(subscriptionClient, null, messageId3);
            }
            finally
            {
                subscriptionClient.Close();
                topicClient.Close();
            }
        }
        async Task TopicClientPeekLockWithAbandonTestCase(string topicName, int messageCount = 10)
        {
            var entityConnectionString = TestUtility.GetEntityConnectionString(topicName);
            var topicClient            = TopicClient.CreateFromConnectionString(entityConnectionString);
            var subscriptionClient     = SubscriptionClient.CreateFromConnectionString(entityConnectionString, this.SubscriptionName);

            try
            {
                await this.PeekLockWithAbandonTestCase(topicClient.InnerSender, subscriptionClient.InnerReceiver, messageCount);
            }
            finally
            {
                await subscriptionClient.CloseAsync();

                await topicClient.CloseAsync();
            }
        }
        async Task SessionTest(string queueName)
        {
            var queueClient = QueueClient.CreateFromConnectionString(TestUtility.GetEntityConnectionString(queueName));

            try
            {
                var messageId1 = "test-message1";
                var sessionId1 = "sessionId1";
                await queueClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId1, SessionId = sessionId1
                });

                TestUtility.Log($"Sent Message: {messageId1} to Session: {sessionId1}");

                var messageId2 = "test-message2";
                var sessionId2 = "sessionId2";
                await queueClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId2, SessionId = sessionId2
                });

                TestUtility.Log($"Sent Message: {messageId2} to Session: {sessionId2}");

                // Receive Message, Complete and Close with SessionId - sessionId 1
                await this.AcceptAndCompleteSessionsAsync(queueClient, sessionId1, messageId1);

                // Receive Message, Complete and Close with SessionId - sessionId 2
                await this.AcceptAndCompleteSessionsAsync(queueClient, sessionId2, messageId2);

                // Receive Message, Complete and Close - With Null SessionId specified
                var messageId3 = "test-message3";
                var sessionId3 = "sessionId3";
                await queueClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId3, SessionId = sessionId3
                });

                await this.AcceptAndCompleteSessionsAsync(queueClient, null, messageId3);
            }
            finally
            {
                await queueClient.CloseAsync();
            }
        }
        async Task PeekLockWithDeadLetterTest(string queueName, int messageCount = 10)
        {
            var queueClient = QueueClient.CreateFromConnectionString(TestUtility.GetEntityConnectionString(queueName));

            // Create DLQ Client To Receive DeadLetteredMessages
            var builder = new ServiceBusConnectionStringBuilder(TestUtility.GetEntityConnectionString(queueName));

            builder.EntityPath = EntityNameHelper.FormatDeadLetterPath(queueClient.QueueName);
            var deadLetterQueueClient = QueueClient.CreateFromConnectionString(builder.ToString());

            try
            {
                await this.PeekLockWithDeadLetterTestCase(queueClient.InnerSender, queueClient.InnerReceiver, deadLetterQueueClient.InnerReceiver, messageCount);
            }
            finally
            {
                await deadLetterQueueClient.CloseAsync();

                await queueClient.CloseAsync();
            }
        }
        async Task TopicClientPeekLockWithDeadLetterTestCase(string topicName, int messageCount = 10)
        {
            var entityConnectionString = TestUtility.GetEntityConnectionString(topicName);
            var topicClient            = TopicClient.CreateFromConnectionString(entityConnectionString);
            var subscriptionClient     = SubscriptionClient.CreateFromConnectionString(entityConnectionString, this.SubscriptionName);

            // Create DLQ Client To Receive DeadLetteredMessages
            var builder = new ServiceBusConnectionStringBuilder(TestUtility.GetEntityConnectionString(topicName));
            var subscriptionDeadletterPath   = EntityNameHelper.FormatDeadLetterPath(this.SubscriptionName);
            var deadLetterSubscriptionClient = SubscriptionClient.CreateFromConnectionString(TestUtility.GetEntityConnectionString(topicName), subscriptionDeadletterPath);

            try
            {
                await this.PeekLockWithDeadLetterTestCase(topicClient.InnerSender, subscriptionClient.InnerReceiver, deadLetterSubscriptionClient.InnerReceiver, messageCount);
            }
            finally
            {
                await deadLetterSubscriptionClient.CloseAsync();

                await topicClient.CloseAsync();

                await subscriptionClient.CloseAsync();
            }
        }
        async Task GetAndSetSessionStateTest(string topicName)
        {
            var entityConnectionString = TestUtility.GetEntityConnectionString(topicName);
            var topicClient            = TopicClient.CreateFromConnectionString(entityConnectionString);
            var subscriptionClient     = SubscriptionClient.CreateFromConnectionString(entityConnectionString, this.SubscriptionName);

            try
            {
                var messageId = "test-message1";
                var sessionId = Guid.NewGuid().ToString();
                await topicClient.SendAsync(new BrokeredMessage()
                {
                    MessageId = messageId, SessionId = sessionId
                });

                TestUtility.Log($"Sent Message: {messageId} to Session: {sessionId}");

                var sessionReceiver = await subscriptionClient.AcceptMessageSessionAsync(sessionId);

                Assert.NotNull((object)sessionReceiver);
                var message = await sessionReceiver.ReceiveAsync();

                TestUtility.Log($"Received Message: {message.MessageId} from Session: {sessionReceiver.SessionId}");
                Assert.True(message.MessageId == messageId);

                var sessionStateString = "Received Message From Session!";
                var sessionState       = new MemoryStream(Encoding.UTF8.GetBytes(sessionStateString));
                await sessionReceiver.SetStateAsync(sessionState);

                TestUtility.Log($"Set Session State: {sessionStateString} for Session: {sessionReceiver.SessionId}");

                var returnedSessionState = await sessionReceiver.GetStateAsync();

                using (var reader = new StreamReader(returnedSessionState, Encoding.UTF8))
                {
                    var returnedSessionStateString = await reader.ReadToEndAsync();

                    TestUtility.Log($"Get Session State Returned: {returnedSessionStateString} for Session: {sessionReceiver.SessionId}");
                    Assert.Equal(sessionStateString, returnedSessionStateString);
                }

                // Complete message using Session Receiver
                await sessionReceiver.CompleteAsync(new Guid[] { message.LockToken });

                TestUtility.Log($"Completed Message: {message.MessageId} for Session: {sessionReceiver.SessionId}");

                sessionStateString = "Completed Message On Session!";
                sessionState       = new MemoryStream(Encoding.UTF8.GetBytes(sessionStateString));
                await sessionReceiver.SetStateAsync(sessionState);

                TestUtility.Log($"Set Session State: {sessionStateString} for Session: {sessionReceiver.SessionId}");

                returnedSessionState = await sessionReceiver.GetStateAsync();

                using (var reader = new StreamReader(returnedSessionState, Encoding.UTF8))
                {
                    var returnedSessionStateString = await reader.ReadToEndAsync();

                    TestUtility.Log($"Get Session State Returned: {returnedSessionStateString} for Session: {sessionReceiver.SessionId}");
                    Assert.Equal(sessionStateString, returnedSessionStateString);
                }

                await sessionReceiver.CloseAsync();
            }
            finally
            {
                subscriptionClient.Close();
                topicClient.Close();
            }
        }
        async Task BrokeredMessageOperationsTest()
        {
            // Create QueueClient with ReceiveDelete,
            // Send and Receive a message, Try to Complete/Abandon/Defer/DeadLetter should throw InvalidOperationException()
            var queueClient = QueueClient.CreateFromConnectionString(
                TestUtility.GetEntityConnectionString(Constants.PartitionedQueueName),
                ReceiveMode.ReceiveAndDelete);

            await TestUtility.SendMessagesAsync(queueClient.InnerSender, 1);

            var message = await queueClient.ReceiveAsync();

            Assert.NotNull((object)message);

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await message.CompleteAsync());

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await message.AbandonAsync());

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await message.DeferAsync());

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await message.DeadLetterAsync());

            // Create a PeekLock queueClient and do rest of the operations
            // Send a Message, Receive/ Abandon and Complete it using BrokeredMessage methods
            queueClient = QueueClient.CreateFromConnectionString(
                TestUtility.GetEntityConnectionString(Constants.PartitionedQueueName),
                ReceiveMode.PeekLock);

            await TestUtility.SendMessagesAsync(queueClient.InnerSender, 1);

            message = await queueClient.ReceiveAsync();

            Assert.NotNull((object)message);
            await message.AbandonAsync();

            await Task.Delay(TimeSpan.FromMilliseconds(100));

            message = await queueClient.ReceiveAsync();

            await message.CompleteAsync();

            // Send a Message, Receive / DeadLetter using BrokeredMessage methods
            await TestUtility.SendMessagesAsync(queueClient.InnerSender, 1);

            message = await queueClient.ReceiveAsync();

            await message.DeadLetterAsync();

            var builder = new ServiceBusConnectionStringBuilder(TestUtility.GetEntityConnectionString(Constants.PartitionedQueueName));

            builder.EntityPath = EntityNameHelper.FormatDeadLetterPath(queueClient.QueueName);
            var deadLetterQueueClient = QueueClient.CreateFromConnectionString(builder.ToString());

            message = await deadLetterQueueClient.ReceiveAsync();

            await message.CompleteAsync();

            // Send a Message, Receive/Defer using BrokeredMessage methods
            await TestUtility.SendMessagesAsync(queueClient.InnerSender, 1);

            message = await queueClient.ReceiveAsync();

            var deferredSequenceNumber = message.SequenceNumber;
            await message.DeferAsync();

            var deferredMessage = await queueClient.ReceiveBySequenceNumberAsync(deferredSequenceNumber);

            await deferredMessage.CompleteAsync();

            await queueClient.CloseAsync();
        }