public void TestGatewayAddressCacheAutoRefreshOnSuboptimalPartition() { FakeMessageHandler messageHandler = new FakeMessageHandler(); HttpClient httpClient = new HttpClient(messageHandler); httpClient.Timeout = TimeSpan.FromSeconds(120); GatewayAddressCache cache = new GatewayAddressCache( new Uri(GatewayAddressCacheTests.DatabaseAccountApiEndpoint), Documents.Client.Protocol.Https, this.mockTokenProvider.Object, this.mockServiceConfigReader.Object, MockCosmosUtil.CreateCosmosHttpClient(() => httpClient), suboptimalPartitionForceRefreshIntervalInSeconds: 2); int initialAddressesCount = cache.TryGetAddressesAsync( DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid), this.testPartitionKeyRangeIdentity, this.serviceIdentity, false, CancellationToken.None).Result.AllAddresses.Count(); Assert.IsTrue(initialAddressesCount < this.targetReplicaSetSize); Task.Delay(3000).Wait(); int finalAddressCount = cache.TryGetAddressesAsync( DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid), this.testPartitionKeyRangeIdentity, this.serviceIdentity, false, CancellationToken.None).Result.AllAddresses.Count(); Assert.IsTrue(finalAddressCount == this.targetReplicaSetSize); }
public async Task GatewayAddressCacheInNetworkRequestTestAsync() { FakeMessageHandler messageHandler = new FakeMessageHandler(); HttpClient httpClient = new HttpClient(messageHandler); httpClient.Timeout = TimeSpan.FromSeconds(120); GatewayAddressCache cache = new GatewayAddressCache( new Uri(GatewayAddressCacheTests.DatabaseAccountApiEndpoint), Documents.Client.Protocol.Https, this.mockTokenProvider.Object, this.mockServiceConfigReader.Object, MockCosmosUtil.CreateCosmosHttpClient(() => httpClient), suboptimalPartitionForceRefreshIntervalInSeconds: 2, enableTcpConnectionEndpointRediscovery: true); // No header should be present. PartitionAddressInformation legacyRequest = await cache.TryGetAddressesAsync( DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid), this.testPartitionKeyRangeIdentity, this.serviceIdentity, false, CancellationToken.None); Assert.IsFalse(legacyRequest.IsLocalRegion); // Header indicates the request is from the same azure region. messageHandler.Headers[HttpConstants.HttpHeaders.LocalRegionRequest] = "true"; PartitionAddressInformation inNetworkAddresses = await cache.TryGetAddressesAsync( DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid), this.testPartitionKeyRangeIdentity, this.serviceIdentity, true, CancellationToken.None); Assert.IsTrue(inNetworkAddresses.IsLocalRegion); // Header indicates the request is not from the same azure region. messageHandler.Headers[HttpConstants.HttpHeaders.LocalRegionRequest] = "false"; PartitionAddressInformation outOfNetworkAddresses = await cache.TryGetAddressesAsync( DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid), this.testPartitionKeyRangeIdentity, this.serviceIdentity, true, CancellationToken.None); Assert.IsFalse(outOfNetworkAddresses.IsLocalRegion); }
public async Task TestGatewayAddressCacheUpdateOnConnectionResetAsync() { FakeMessageHandler messageHandler = new FakeMessageHandler(); HttpClient httpClient = new HttpClient(messageHandler); httpClient.Timeout = TimeSpan.FromSeconds(120); GatewayAddressCache cache = new GatewayAddressCache( new Uri(GatewayAddressCacheTests.DatabaseAccountApiEndpoint), Documents.Client.Protocol.Https, this.mockTokenProvider.Object, this.mockServiceConfigReader.Object, MockCosmosUtil.CreateCosmosHttpClient(() => httpClient), suboptimalPartitionForceRefreshIntervalInSeconds: 2, enableTcpConnectionEndpointRediscovery: true); PartitionAddressInformation addresses = cache.TryGetAddressesAsync( DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid), this.testPartitionKeyRangeIdentity, this.serviceIdentity, false, CancellationToken.None).Result; Assert.IsNotNull(addresses.AllAddresses.Select(address => address.PhysicalUri == "https://blabla.com")); // call updateAddress await cache.TryRemoveAddressesAsync(new Documents.Rntbd.ServerKey(new Uri("https://blabla.com")), CancellationToken.None); // check if the addresss is updated addresses = cache.TryGetAddressesAsync( DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid), this.testPartitionKeyRangeIdentity, this.serviceIdentity, false, CancellationToken.None).Result; Assert.IsNotNull(addresses.AllAddresses.Select(address => address.PhysicalUri == "https://blabla5.com")); }
public async Task TestGatewayAddressCacheAvoidCacheRefresWhenAlreadyUpdatedAsync() { Mock <IHttpHandler> mockHttpHandler = new Mock <IHttpHandler>(MockBehavior.Strict); string oldAddress = "rntbd://dummytenant.documents.azure.com:14003/apps/APPGUID/services/SERVICEGUID/partitions/PARTITIONGUID/replicas/4s"; string newAddress = "rntbd://dummytenant.documents.azure.com:14003/apps/APPGUID/services/SERVICEGUID/partitions/PARTITIONGUID/replicas/5s"; mockHttpHandler.SetupSequence(x => x.SendAsync( It.IsAny <HttpRequestMessage>(), It.IsAny <CancellationToken>())) .Returns(MockCosmosUtil.CreateHttpResponseOfAddresses(new List <string>() { "rntbd://dummytenant.documents.azure.com:14003/apps/APPGUID/services/SERVICEGUID/partitions/PARTITIONGUID/replicas/1p", "rntbd://dummytenant.documents.azure.com:14003/apps/APPGUID/services/SERVICEGUID/partitions/PARTITIONGUID/replicas/2s", "rntbd://dummytenant.documents.azure.com:14003/apps/APPGUID/services/SERVICEGUID/partitions/PARTITIONGUID/replicas/3s", oldAddress, })) .Returns(MockCosmosUtil.CreateHttpResponseOfAddresses(new List <string>() { "rntbd://dummytenant.documents.azure.com:14003/apps/APPGUID/services/SERVICEGUID/partitions/PARTITIONGUID/replicas/1p", "rntbd://dummytenant.documents.azure.com:14003/apps/APPGUID/services/SERVICEGUID/partitions/PARTITIONGUID/replicas/2s", "rntbd://dummytenant.documents.azure.com:14003/apps/APPGUID/services/SERVICEGUID/partitions/PARTITIONGUID/replicas/3s", newAddress, })); HttpClient httpClient = new HttpClient(new HttpHandlerHelper(mockHttpHandler.Object)); GatewayAddressCache cache = new GatewayAddressCache( new Uri(GatewayAddressCacheTests.DatabaseAccountApiEndpoint), Documents.Client.Protocol.Tcp, this.mockTokenProvider.Object, this.mockServiceConfigReader.Object, MockCosmosUtil.CreateCosmosHttpClient(() => httpClient), suboptimalPartitionForceRefreshIntervalInSeconds: 2, enableTcpConnectionEndpointRediscovery: true); DocumentServiceRequest request1 = DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid); DocumentServiceRequest request2 = DocumentServiceRequest.Create(OperationType.Invalid, ResourceType.Address, AuthorizationTokenType.Invalid); PartitionAddressInformation request1Addresses = await cache.TryGetAddressesAsync( request : request1, partitionKeyRangeIdentity : this.testPartitionKeyRangeIdentity, serviceIdentity : this.serviceIdentity, forceRefreshPartitionAddresses : false, cancellationToken : CancellationToken.None); PartitionAddressInformation request2Addresses = await cache.TryGetAddressesAsync( request : request2, partitionKeyRangeIdentity : this.testPartitionKeyRangeIdentity, serviceIdentity : this.serviceIdentity, forceRefreshPartitionAddresses : false, cancellationToken : CancellationToken.None); Assert.AreEqual(request1Addresses, request2Addresses); Assert.AreEqual(4, request1Addresses.AllAddresses.Count()); Assert.AreEqual(1, request1Addresses.AllAddresses.Count(x => x.PhysicalUri == oldAddress)); Assert.AreEqual(0, request1Addresses.AllAddresses.Count(x => x.PhysicalUri == newAddress)); // check if the addresss is updated request1Addresses = await cache.TryGetAddressesAsync( request : request1, partitionKeyRangeIdentity : this.testPartitionKeyRangeIdentity, serviceIdentity : this.serviceIdentity, forceRefreshPartitionAddresses : true, cancellationToken : CancellationToken.None); // Even though force refresh is true it will just use the new cache // value rather than doing a gateway call to do another refresh since the value // already changed from the last cache access request2Addresses = await cache.TryGetAddressesAsync( request : request2, partitionKeyRangeIdentity : this.testPartitionKeyRangeIdentity, serviceIdentity : this.serviceIdentity, forceRefreshPartitionAddresses : true, cancellationToken : CancellationToken.None); Assert.AreEqual(request1Addresses, request2Addresses); Assert.AreEqual(4, request1Addresses.AllAddresses.Count()); Assert.AreEqual(0, request1Addresses.AllAddresses.Count(x => x.PhysicalUri == oldAddress)); Assert.AreEqual(1, request1Addresses.AllAddresses.Count(x => x.PhysicalUri == newAddress)); mockHttpHandler.VerifyAll(); }