public async Task UpdateLeaseAsync_ShouldThrowLeaseLostException_WhenConflictAndRetriesDisabled()
        {
            var          client   = Mock.Of <IChangeFeedDocumentClient>();
            var          updater  = new DocumentServiceLeaseUpdater(client);
            const string etag     = "1";
            ILease       oldLease = CreateLease();

            Mock.Get(client)
            .Setup(c => c.ReplaceDocumentAsync(
                       documentUri,
                       It.Is <ILease>(lease => lease.ConcurrencyToken == etag),
                       It.Is <RequestOptions>(options => options.AccessCondition.Type == AccessConditionType.IfMatch && options.AccessCondition.Condition == etag),
                       default(CancellationToken)))
            .ThrowsAsync(DocumentExceptionHelpers.CreatePreconditionFailedException());
            Mock.Get(client)
            .Setup(c => c.ReadDocumentAsync(documentUri, null, default(CancellationToken)))
            .ReturnsAsync(CreateLeaseResponse(etag));

            int       callbackInvokeCount = 0;
            Exception exception           = await Record.ExceptionAsync(async() => await updater.UpdateLeaseAsync(oldLease, documentUri, null, serverLease =>
            {
                callbackInvokeCount++;
                return(CreateLease(etag));
            }, false));

            Assert.IsAssignableFrom <LeaseLostException>(exception);
            Assert.Equal(1, callbackInvokeCount);
        }
        public async Task UpdateLeaseAsync_ShouldThrowLeaseLostException_WhenConflictAfterAllRetries()
        {
            var       client              = Mock.Of <IChangeFeedDocumentClient>();
            var       updater             = new DocumentServiceLeaseUpdater(client);
            ILease    oldLease            = CreateLease();
            const int retryCount          = 5;
            var       getDocumentSequence = Mock.Get(client)
                                            .SetupSequence(c => c.ReadDocumentAsync(documentUri));

            for (int i = 0; i <= retryCount; i++)
            {
                string eTag = i.ToString();
                Mock.Get(client)
                .Setup(c => c.ReplaceDocumentAsync(
                           documentUri,
                           It.Is <ILease>(lease => lease.ConcurrencyToken == eTag),
                           It.Is <RequestOptions>(options => options.AccessCondition.Type == AccessConditionType.IfMatch && options.AccessCondition.Condition == eTag)))
                .ThrowsAsync(DocumentExceptionHelpers.CreatePreconditionFailedException());
                getDocumentSequence = getDocumentSequence.ReturnsAsync(CreateLeaseResponse(eTag));
            }

            int       callbackInvokeCount = 0;
            Exception exception           = await Record.ExceptionAsync(async() => await updater.UpdateLeaseAsync(oldLease, documentUri, serverLease =>
            {
                callbackInvokeCount++;
                if (serverLease.ConcurrencyToken == null)
                {
                    return(CreateLease("0"));
                }
                return(CreateLease((int.Parse(serverLease.ConcurrencyToken) + 1).ToString()));
            }));

            Assert.IsAssignableFrom <LeaseLostException>(exception);
            Assert.Equal(retryCount + 1, callbackInvokeCount);
        }
 private void SetupReplaceConflict(IChangeFeedDocumentClient client, ILease updatedLease)
 {
     Mock.Get(client)
     .Setup(c => c.ReplaceDocumentAsync(
                documentUri,
                updatedLease,
                It.Is <RequestOptions>(options => options.AccessCondition.Type == AccessConditionType.IfMatch && options.AccessCondition.Condition == eTag1)))
     .ThrowsAsync(DocumentExceptionHelpers.CreatePreconditionFailedException());
 }
        public async Task UpdateLeaseAsync_ShouldRethrow_WhenConflictAndReadReturnsOtherException()
        {
            Exception exception = await TestReadException(DocumentExceptionHelpers.CreatePreconditionFailedException());

            Assert.IsAssignableFrom <DocumentClientException>(exception);
        }