internal CosmosChangeFeedResultSetIteratorCoreMock( CosmosContainerCore cosmosContainer, string continuationToken, int?maxItemCount, CosmosChangeFeedRequestOptions options) : base(cosmosContainer, continuationToken, maxItemCount, options) { List <CompositeContinuationToken> compositeContinuationTokens = new List <CompositeContinuationToken>() { new CompositeContinuationToken() { Token = null, Range = new Documents.Routing.Range <string>("A", "B", true, false) } }; string serialized = JsonConvert.SerializeObject(compositeContinuationTokens); this.compositeContinuationToken = StandByFeedContinuationToken.CreateAsync("containerRid", serialized, (string containerRid, Documents.Routing.Range <string> ranges, bool forceRefresh) => { IReadOnlyList <Documents.PartitionKeyRange> filteredRanges = new List <Documents.PartitionKeyRange>() { new Documents.PartitionKeyRange() { MinInclusive = "A", MaxExclusive = "B", Id = "0" } }; if (forceRefresh) { this.HasCalledForceRefresh = true; } return(Task.FromResult(filteredRanges)); }).Result; }
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); CosmosItemsCore itemsCore = (CosmosItemsCore)this.Container.Items; string continuationToken = null; int count = 0; while (true) { CosmosChangeFeedRequestOptions requestOptions = new CosmosChangeFeedRequestOptions() { StartTime = DateTime.MinValue }; CosmosFeedResultSetIterator setIterator = itemsCore.GetStandByFeedIterator(continuationToken, requestOptions: requestOptions); using (CosmosResponseMessage responseMessage = await setIterator.FetchNextSetAsync(this.cancellationToken)) { continuationToken = responseMessage.Headers.Continuation; if (responseMessage.IsSuccessStatusCode) { Collection <ToDoActivity> response = new CosmosDefaultJsonSerializer().FromStream <CosmosFeedResponse <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."); } } }
internal override Task <CosmosResponseMessage> NextResultSetDelegate( string continuationToken, string partitionKeyRangeId, int?maxItemCount, CosmosChangeFeedRequestOptions options, CancellationToken cancellationToken) { if (this.Iteration++ == 0) { CosmosResponseMessage httpResponse = new CosmosResponseMessage(System.Net.HttpStatusCode.Gone); httpResponse.Headers.Add(Documents.WFConstants.BackendHeaders.SubStatus, ((uint)Documents.SubStatusCodes.PartitionKeyRangeGone).ToString(CultureInfo.InvariantCulture)); return(Task.FromResult(httpResponse)); } return(Task.FromResult(new CosmosResponseMessage(System.Net.HttpStatusCode.NotModified))); }