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