public async Task RequestOptionsHandlerCanHandleDataPlaneRequestOptions() { const string Condition = "*"; const string SessionToken = "test"; ItemRequestOptions options = new ItemRequestOptions { IfNoneMatchEtag = Condition, ConsistencyLevel = (Cosmos.ConsistencyLevel)ConsistencyLevel.Eventual, SessionToken = SessionToken }; TestHandler testHandler = new TestHandler((request, cancellationToken) => { Assert.AreEqual(Condition, request.Headers.GetValues(HttpConstants.HttpHeaders.IfNoneMatch).First()); Assert.AreEqual(ConsistencyLevel.Eventual.ToString(), request.Headers.GetValues(HttpConstants.HttpHeaders.ConsistencyLevel).First()); Assert.AreEqual(SessionToken, request.Headers.GetValues(HttpConstants.HttpHeaders.SessionToken).First()); return TestHandler.ReturnSuccess(); }); using CosmosClient client = MockCosmosUtil.CreateMockCosmosClient(); RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: null) { InnerHandler = testHandler }; RequestMessage requestMessage = new RequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; requestMessage.RequestOptions = options; await invoker.SendAsync(requestMessage, new CancellationToken()); }
public async Task InvalidPartitionExceptionRetryHandlerDoesNotRetryOnSuccess() { using CosmosClient client = MockCosmosUtil.CreateMockCosmosClient(); NamedCacheRetryHandler retryHandler = new NamedCacheRetryHandler(); int handlerCalls = 0; int expectedHandlerCalls = 1; TestHandler testHandler = new TestHandler((request, cancellationToken) => { handlerCalls++; return(TestHandler.ReturnSuccess()); }); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler( client, requestedClientConsistencyLevel: null) { InnerHandler = retryHandler }; RequestMessage requestMessage = new RequestMessage( HttpMethod.Get, new Uri("https://dummy.documents.azure.com:443/dbs")); await invoker.SendAsync(requestMessage, new CancellationToken()); Assert.AreEqual(expectedHandlerCalls, handlerCalls); }
public async Task ConsistencyLevelClient() { List<Cosmos.ConsistencyLevel> cosmosLevels = Enum.GetValues(typeof(Cosmos.ConsistencyLevel)).Cast<Cosmos.ConsistencyLevel>().ToList(); foreach (Cosmos.ConsistencyLevel clientLevel in cosmosLevels) { using CosmosClient client = MockCosmosUtil.CreateMockCosmosClient( accountConsistencyLevel: Cosmos.ConsistencyLevel.Strong, customizeClientBuilder: builder => builder.WithConsistencyLevel(clientLevel)); TestHandler testHandler = new TestHandler((request, cancellationToken) => { Assert.AreEqual(clientLevel.ToString(), request.Headers[HttpConstants.HttpHeaders.ConsistencyLevel]); return TestHandler.ReturnSuccess(); }); RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: client.ClientOptions.ConsistencyLevel) { InnerHandler = testHandler }; RequestMessage requestMessage = new RequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")) { ResourceType = ResourceType.Document }; requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.OperationType = OperationType.Read; await invoker.SendAsync(requestMessage, new CancellationToken()); } }
public async Task ConsistencyLevelClientAndRequestOption() { Cosmos.ConsistencyLevel requestOptionLevel = Cosmos.ConsistencyLevel.BoundedStaleness; using CosmosClient client = MockCosmosUtil.CreateMockCosmosClient( accountConsistencyLevel: Cosmos.ConsistencyLevel.Strong, customizeClientBuilder: builder => builder.WithConsistencyLevel(Cosmos.ConsistencyLevel.Eventual)); TestHandler testHandler = new TestHandler((request, cancellationToken) => { Assert.AreEqual(requestOptionLevel.ToString(), request.Headers[HttpConstants.HttpHeaders.ConsistencyLevel]); return TestHandler.ReturnSuccess(); }); RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: null) { InnerHandler = testHandler }; RequestMessage requestMessage = new RequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")) { ResourceType = ResourceType.Document }; requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.OperationType = OperationType.Read; requestMessage.RequestOptions = new ItemRequestOptions() { ConsistencyLevel = requestOptionLevel }; await invoker.SendAsync(requestMessage, new CancellationToken()); }
public async Task RequestOptionsHandlerCanHandleRequestOptions() { const string PropertyKey = "propkey"; const string Condition = "*"; object propertyValue = Encoding.UTF8.GetBytes("test"); RequestOptions options = new ItemRequestOptions { Properties = new Dictionary<string, object>(new List<KeyValuePair<string, object>> { new KeyValuePair<string, object>(PropertyKey, propertyValue) }), IfMatchEtag = Condition, }; TestHandler testHandler = new TestHandler((request, cancellationToken) => { Assert.AreEqual(propertyValue, request.Properties[PropertyKey]); Assert.AreEqual(Condition, request.Headers.GetValues(HttpConstants.HttpHeaders.IfMatch).First()); return TestHandler.ReturnSuccess(); }); CosmosClient client = MockCosmosUtil.CreateMockCosmosClient(); RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: null) { InnerHandler = testHandler }; RequestMessage requestMessage = new RequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; requestMessage.RequestOptions = options; await invoker.SendAsync(requestMessage, new CancellationToken()); }
public async Task RetryHandlerRetriesOn429() { CosmosClient client = MockDocumentClient.CreateMockCosmosClient(); RetryHandler retryHandler = new RetryHandler(client.DocumentClient.ResetSessionTokenRetryPolicy); int handlerCalls = 0; int expectedHandlerCalls = 2; TestHandler testHandler = new TestHandler((request, cancellationToken) => { if (handlerCalls == 0) { handlerCalls++; return(TestHandler.ReturnStatusCode((HttpStatusCode)StatusCodes.TooManyRequests)); } handlerCalls++; return(TestHandler.ReturnSuccess()); }); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler(client); invoker.InnerHandler = retryHandler; CosmosRequestMessage requestMessage = new CosmosRequestMessage(HttpMethod.Delete, RetryHandlerTests.TestUri); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; await invoker.SendAsync(requestMessage, new CancellationToken()); Assert.AreEqual(expectedHandlerCalls, handlerCalls); }
public async Task RetryHandlerDoesNotRetryOnException() { CosmosClient client = MockDocumentClient.CreateMockCosmosClient(); RetryHandler retryHandler = new RetryHandler(client.DocumentClient.ResetSessionTokenRetryPolicy); int handlerCalls = 0; int expectedHandlerCalls = 2; TestHandler testHandler = new TestHandler((request, cancellationToken) => { handlerCalls++; if (handlerCalls == expectedHandlerCalls) { Assert.Fail("Should not retry on exception."); } throw new Exception("You shall not retry."); }); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler(client); invoker.InnerHandler = retryHandler; CosmosRequestMessage requestMessage = new CosmosRequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; await invoker.SendAsync(requestMessage, new CancellationToken()); }
private async Task RetryHandlerDontRetryOnStatusCode( HttpStatusCode statusCode, SubStatusCodes subStatusCode = SubStatusCodes.Unknown) { int handlerCalls = 0; TestHandler testHandler = new TestHandler((request, response) => { handlerCalls++; if (handlerCalls == 0) { return(TestHandler.ReturnStatusCode(statusCode, subStatusCode)); } return(TestHandler.ReturnSuccess()); }); CosmosClient client = MockDocumentClient.CreateMockCosmosClient(); RetryHandler retryHandler = new RetryHandler(client.DocumentClient.ResetSessionTokenRetryPolicy); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler(client); invoker.InnerHandler = retryHandler; CosmosRequestMessage requestMessage = new CosmosRequestMessage(HttpMethod.Delete, RetryHandlerTests.TestUri); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; await invoker.SendAsync(requestMessage, new CancellationToken()); int expectedHandlerCalls = 1; Assert.AreEqual(expectedHandlerCalls, handlerCalls); }
public async Task PartitionKeyRangeGoneRetryHandlerOn410() { CosmosClient client = MockDocumentClient.CreateMockCosmosClient(); int handlerCalls = 0; TestHandler testHandler = new TestHandler((request, response) => { if (handlerCalls == 0) { handlerCalls++; return(TestHandler.ReturnStatusCode((HttpStatusCode)StatusCodes.Gone, SubStatusCodes.PartitionKeyRangeGone)); } handlerCalls++; return(TestHandler.ReturnSuccess()); }); PartitionKeyRangeGoneRetryHandler retryHandler = new PartitionKeyRangeGoneRetryHandler(client); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler(client); invoker.InnerHandler = retryHandler; CosmosRequestMessage requestMessage = new CosmosRequestMessage(HttpMethod.Get, new Uri("https://localhost/dbs/db1/colls/col1/docs/doc1")); await invoker.SendAsync(requestMessage, new CancellationToken()); int expectedHandlerCalls = 2; Assert.AreEqual(expectedHandlerCalls, handlerCalls); }
public async Task InvalidPartitionExceptionRetryHandlerDoesNotRetryOn410() { CosmosClient client = MockDocumentClient.CreateMockCosmosClient(); NamedCacheRetryHandler retryHandler = new NamedCacheRetryHandler(client); int handlerCalls = 0; int expectedHandlerCalls = 2; TestHandler testHandler = new TestHandler((request, cancellationToken) => { if (handlerCalls == 0) { handlerCalls++; return(TestHandler.ReturnStatusCode((HttpStatusCode)StatusCodes.Gone, SubStatusCodes.NameCacheIsStale)); } handlerCalls++; return(TestHandler.ReturnSuccess()); }); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler(client); invoker.InnerHandler = retryHandler; CosmosRequestMessage requestMessage = new CosmosRequestMessage(HttpMethod.Get, new Uri("https://dummy.documents.azure.com:443/dbs")); await invoker.SendAsync(requestMessage, new CancellationToken()); Assert.AreEqual(expectedHandlerCalls, handlerCalls); }
public async Task QueryRequestOptionsSessionToken() { const string SessionToken = "SessionToken"; ItemRequestOptions options = new ItemRequestOptions { SessionToken = SessionToken }; TestHandler testHandler = new TestHandler((request, cancellationToken) => { Assert.AreEqual(SessionToken, request.Headers.GetValues(HttpConstants.HttpHeaders.SessionToken).First()); return(TestHandler.ReturnSuccess()); }); using CosmosClient client = MockCosmosUtil.CreateMockCosmosClient(); RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: null) { InnerHandler = testHandler }; RequestMessage requestMessage = new RequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; requestMessage.RequestOptions = options; await invoker.SendAsync(requestMessage, new CancellationToken()); }
public async Task RetryHandlerDoesNotRetryOnSuccess() { CosmosClient client = MockCosmosUtil.CreateMockCosmosClient(); RetryHandler retryHandler = new RetryHandler(client); int handlerCalls = 0; int expectedHandlerCalls = 1; TestHandler testHandler = new TestHandler((request, cancellationToken) => { handlerCalls++; return(TestHandler.ReturnSuccess()); }); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: null); invoker.InnerHandler = retryHandler; RequestMessage requestMessage = new RequestMessage(HttpMethod.Delete, RetryHandlerTests.TestUri); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; await invoker.SendAsync(requestMessage, new CancellationToken()); Assert.AreEqual(expectedHandlerCalls, handlerCalls); }
public async Task RequestOptionsConsistencyLevel() { List <Cosmos.ConsistencyLevel> cosmosLevels = Enum.GetValues(typeof(Cosmos.ConsistencyLevel)).Cast <Cosmos.ConsistencyLevel>().ToList(); List <Documents.ConsistencyLevel> documentLevels = Enum.GetValues(typeof(Documents.ConsistencyLevel)).Cast <Documents.ConsistencyLevel>().ToList(); CollectionAssert.AreEqual(cosmosLevels, documentLevels, new EnumComparer(), "Document consistency level is different from cosmos consistency level"); using CosmosClient client = MockCosmosUtil.CreateMockCosmosClient(accountConsistencyLevel: Cosmos.ConsistencyLevel.Strong); foreach (Cosmos.ConsistencyLevel level in cosmosLevels) { List <RequestOptions> requestOptions = new List <RequestOptions> { new ItemRequestOptions { ConsistencyLevel = level }, new QueryRequestOptions { ConsistencyLevel = level }, new StoredProcedureRequestOptions { ConsistencyLevel = level } }; foreach (RequestOptions option in requestOptions) { TestHandler testHandler = new TestHandler((request, cancellationToken) => { Assert.AreEqual(level.ToString(), request.Headers[HttpConstants.HttpHeaders.ConsistencyLevel]); return(TestHandler.ReturnSuccess()); }); RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: null) { InnerHandler = testHandler }; RequestMessage requestMessage = new RequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")) { ResourceType = ResourceType.Document }; requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.OperationType = OperationType.Read; requestMessage.RequestOptions = option; await invoker.SendAsync(requestMessage, new CancellationToken()); } } }
internal static async Task <T> ProcessResourceOperationAsync <T>( RequestInvokerHandler requestHandler, string resourceUri, ResourceType resourceType, OperationType operationType, RequestOptions requestOptions, ContainerInternal cosmosContainerCore, FeedRange feedRange, Stream streamPayload, Action <RequestMessage> requestEnricher, Func <ResponseMessage, T> responseCreator, ITrace trace, CancellationToken cancellationToken) { if (requestHandler == null) { throw new ArgumentException(nameof(requestHandler)); } if (resourceUri == null) { throw new ArgumentNullException(nameof(resourceUri)); } if (responseCreator == null) { throw new ArgumentNullException(nameof(responseCreator)); } if (trace == null) { throw new ArgumentNullException(nameof(trace)); } ResponseMessage response = await requestHandler.SendAsync( resourceUri, resourceType, operationType, requestOptions, cosmosContainerCore, feedRange, streamPayload, requestEnricher, trace, cancellationToken); return(responseCreator(response)); }
public async Task RetryHandlerHttpClientExceptionRefreshesLocations() { DocumentClient dc = new MockDocumentClient(RetryHandlerTests.TestUri, "test"); CosmosClient client = new CosmosClient( RetryHandlerTests.TestUri.OriginalString, Guid.NewGuid().ToString(), new CosmosClientOptions(), dc); Mock <IDocumentClientRetryPolicy> mockClientRetryPolicy = new Mock <IDocumentClientRetryPolicy>(); mockClientRetryPolicy.Setup(m => m.ShouldRetryAsync(It.IsAny <Exception>(), It.IsAny <CancellationToken>())) .Returns <Exception, CancellationToken>((ex, tooken) => Task.FromResult(ShouldRetryResult.RetryAfter(TimeSpan.FromMilliseconds(1)))); Mock <IRetryPolicyFactory> mockRetryPolicy = new Mock <IRetryPolicyFactory>(); mockRetryPolicy.Setup(m => m.GetRequestPolicy()) .Returns(() => mockClientRetryPolicy.Object); RetryHandler retryHandler = new RetryHandler(client); int handlerCalls = 0; int expectedHandlerCalls = 2; TestHandler testHandler = new TestHandler((request, response) => { handlerCalls++; if (handlerCalls == expectedHandlerCalls) { return(TestHandler.ReturnSuccess()); } throw new HttpRequestException("DNS or some other network issue"); }); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: null); invoker.InnerHandler = retryHandler; RequestMessage requestMessage = new RequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; await invoker.SendAsync(requestMessage, new CancellationToken()); Assert.AreEqual(expectedHandlerCalls, handlerCalls); }
public async Task QueryRequestOptionsDedicatedGatewayRequestOptions() { TimeSpan maxStaleness = TimeSpan.FromMinutes(5); DedicatedGatewayRequestOptions dedicatedGatewayRequestOptions = new DedicatedGatewayRequestOptions { MaxIntegratedCacheStaleness = maxStaleness }; List<RequestOptions> requestOptions = new List<RequestOptions> { new ItemRequestOptions { DedicatedGatewayRequestOptions = dedicatedGatewayRequestOptions }, new QueryRequestOptions { DedicatedGatewayRequestOptions = dedicatedGatewayRequestOptions }, }; foreach (RequestOptions option in requestOptions) { TestHandler testHandler = new TestHandler((request, cancellationToken) => { Assert.AreEqual(maxStaleness.TotalMilliseconds.ToString(CultureInfo.InvariantCulture), request.Headers[HttpConstants.HttpHeaders.DedicatedGatewayPerRequestCacheStaleness]); return TestHandler.ReturnSuccess(); }); using CosmosClient client = MockCosmosUtil.CreateMockCosmosClient(); RequestInvokerHandler invoker = new RequestInvokerHandler(client, requestedClientConsistencyLevel: null) { InnerHandler = testHandler }; RequestMessage requestMessage = new RequestMessage(HttpMethod.Get, new System.Uri("https://dummy.documents.azure.com:443/dbs")); requestMessage.Headers.Add(HttpConstants.HttpHeaders.PartitionKey, "[]"); requestMessage.ResourceType = ResourceType.Document; requestMessage.OperationType = OperationType.Read; requestMessage.RequestOptions = option; await invoker.SendAsync(requestMessage, new CancellationToken()); } }
public async Task PartitionKeyRangeGoneRetryHandlerOnSuccess() { CosmosClient client = MockDocumentClient.CreateMockCosmosClient(); PartitionKeyRangeGoneRetryHandler retryHandler = new PartitionKeyRangeGoneRetryHandler(client); int handlerCalls = 0; int expectedHandlerCalls = 1; TestHandler testHandler = new TestHandler((request, cancellationToken) => { handlerCalls++; return(TestHandler.ReturnSuccess()); }); retryHandler.InnerHandler = testHandler; RequestInvokerHandler invoker = new RequestInvokerHandler(client); invoker.InnerHandler = retryHandler; CosmosRequestMessage requestMessage = new CosmosRequestMessage(HttpMethod.Get, new Uri("https://dummy.documents.azure.com:443/dbs")); await invoker.SendAsync(requestMessage, new CancellationToken()); Assert.AreEqual(expectedHandlerCalls, handlerCalls); }
internal static async Task <T> ProcessResourceOperationAsync <T>( RequestInvokerHandler requestHandler, Uri resourceUri, ResourceType resourceType, OperationType operationType, RequestOptions requestOptions, CosmosContainerCore cosmosContainerCore, Object partitionKey, Stream streamPayload, Action <CosmosRequestMessage> requestEnricher, Func <CosmosResponseMessage, T> responseCreator, CancellationToken cancellationToken) { if (requestHandler == null) { throw new ArgumentException(nameof(requestHandler)); } if (resourceUri == null) { throw new ArgumentNullException(nameof(resourceUri)); } if (responseCreator == null) { throw new ArgumentNullException(nameof(responseCreator)); } CosmosResponseMessage response = await requestHandler.SendAsync( resourceUri, resourceType, operationType, requestOptions, cosmosContainerCore, partitionKey, streamPayload, requestEnricher); return(responseCreator(response)); }