public async Task StandByFeedIterator_WithMaxItemCount() { await this.CreateRandomItems(2, randomPartitionKey : true); CosmosContainerCore itemsCore = (CosmosContainerCore)this.Container; FeedIterator feedIterator = itemsCore.GetStandByFeedIterator(maxItemCount: 1, requestOptions: new ChangeFeedRequestOptions() { StartTime = DateTime.MinValue }); while (feedIterator.HasMoreResults) { using (CosmosResponseMessage responseMessage = await feedIterator.FetchNextSetAsync(this.cancellationToken)) { if (responseMessage.IsSuccessStatusCode) { Collection <ToDoActivity> response = new CosmosJsonSerializerCore().FromStream <CosmosFeedResponseUtil <ToDoActivity> >(responseMessage.Content).Data; if (response.Count > 0) { Assert.AreEqual(1, response.Count); return; } } } } Assert.Fail("Found no batch with size 1"); }
public async Task StandByFeedIterator_NoFetchNext() { var pkRanges = await this.Container.ClientContext.DocumentClient.ReadPartitionKeyRangeFeedAsync(this.Container.LinkUri); int expected = 25; int iterations = 0; await this.CreateRandomItems(expected, randomPartitionKey : true); CosmosContainerCore itemsCore = (CosmosContainerCore)this.Container; string continuationToken = null; int count = 0; while (true) { ChangeFeedRequestOptions requestOptions = new ChangeFeedRequestOptions() { StartTime = DateTime.MinValue }; FeedIterator feedIterator = itemsCore.GetStandByFeedIterator(continuationToken, requestOptions: requestOptions); using (CosmosResponseMessage responseMessage = await feedIterator.FetchNextSetAsync(this.cancellationToken)) { continuationToken = responseMessage.Headers.Continuation; if (responseMessage.IsSuccessStatusCode) { Collection <ToDoActivity> response = new CosmosJsonSerializerCore().FromStream <CosmosFeedResponseUtil <ToDoActivity> >(responseMessage.Content).Data; count += response.Count; } } if (count > expected) { Assert.Fail($"{count} does not equal {expected}"); } if (count.Equals(expected)) { break; } if (iterations++ > pkRanges.Count) { Assert.Fail("Feed does not contain all elements even after looping through PK ranges. Either the continuation is not moving forward or there is some state problem."); } } }
public async Task StandByFeedIterator_WithInexistentRange() { // Add some random range, this will force the failure List <CompositeContinuationToken> corruptedTokens = new List <CompositeContinuationToken> { new CompositeContinuationToken() { Range = new Documents.Routing.Range <string>("whatever", "random", true, false), Token = "oops" } }; string corruptedTokenSerialized = JsonConvert.SerializeObject(corruptedTokens); CosmosContainerCore itemsCore = (CosmosContainerCore)this.Container; FeedIterator setIteratorNew = itemsCore.GetStandByFeedIterator(corruptedTokenSerialized); CosmosResponseMessage responseMessage = await setIteratorNew.FetchNextSetAsync(this.cancellationToken); Assert.Fail("Should have thrown."); }
public async Task StandByFeedIterator() { int totalCount = 0; string lastcontinuation = string.Empty; int firstRunTotal = 25; int batchSize = 25; Documents.Routing.Range <string> previousRange = null; Documents.Routing.Range <string> currentRange = null; int pkRangesCount = (await this.Container.ClientContext.DocumentClient.ReadPartitionKeyRangeFeedAsync(this.Container.LinkUri)).Count; int visitedPkRanges = 0; await this.CreateRandomItems(batchSize, randomPartitionKey : true); CosmosContainerCore itemsCore = (CosmosContainerCore)this.Container; FeedIterator feedIterator = itemsCore.GetStandByFeedIterator(requestOptions: new ChangeFeedRequestOptions() { StartTime = DateTime.MinValue }); while (feedIterator.HasMoreResults) { using (CosmosResponseMessage responseMessage = await feedIterator.FetchNextSetAsync(this.cancellationToken)) { lastcontinuation = responseMessage.Headers.Continuation; List <CompositeContinuationToken> deserializedToken = JsonConvert.DeserializeObject <List <CompositeContinuationToken> >(lastcontinuation); currentRange = deserializedToken[0].Range; Assert.AreEqual(pkRangesCount, deserializedToken.Count); if (responseMessage.IsSuccessStatusCode) { Collection <ToDoActivity> response = new CosmosJsonSerializerCore().FromStream <CosmosFeedResponseUtil <ToDoActivity> >(responseMessage.Content).Data; totalCount += response.Count; } if (!currentRange.Equals(previousRange)) { visitedPkRanges++; } if (visitedPkRanges == pkRangesCount && responseMessage.StatusCode == System.Net.HttpStatusCode.NotModified) { break; } previousRange = currentRange; } } Assert.AreEqual(firstRunTotal, totalCount); int expectedFinalCount = 50; previousRange = null; currentRange = null; visitedPkRanges = 0; // Insert another batch of 25 and use the last continuation token from the first cycle await this.CreateRandomItems(batchSize, randomPartitionKey : true); FeedIterator setIteratorNew = itemsCore.GetStandByFeedIterator(lastcontinuation); while (setIteratorNew.HasMoreResults) { using (CosmosResponseMessage responseMessage = await setIteratorNew.FetchNextSetAsync(this.cancellationToken)) { lastcontinuation = responseMessage.Headers.Continuation; currentRange = JsonConvert.DeserializeObject <List <CompositeContinuationToken> >(lastcontinuation)[0].Range; if (responseMessage.IsSuccessStatusCode) { Collection <ToDoActivity> response = new CosmosJsonSerializerCore().FromStream <CosmosFeedResponseUtil <ToDoActivity> >(responseMessage.Content).Data; totalCount += response.Count; } if (!currentRange.Equals(previousRange)) { visitedPkRanges++; } if (visitedPkRanges == pkRangesCount && responseMessage.StatusCode == System.Net.HttpStatusCode.NotModified) { break; } previousRange = currentRange; } } Assert.AreEqual(expectedFinalCount, totalCount); }