public async Task FeedToken_PKRangeId_Serialization() { string continuationToken = "TBD"; DocumentFeedResponse <Documents.PartitionKeyRange> ranges = await this.Container.ClientContext.DocumentClient.ReadPartitionKeyRangeFeedAsync(this.Container.LinkUri); Documents.PartitionKeyRange oneRange = ranges.First(); FeedTokenPartitionKeyRange original = new FeedTokenPartitionKeyRange(oneRange.Id); original.UpdateContinuation(continuationToken); string serialized = original.ToString(); FeedToken deserialized = FeedToken.FromString(serialized); FeedTokenPartitionKeyRange deserializedFeedToken = deserialized as FeedTokenPartitionKeyRange; Assert.IsNotNull(deserialized, "Error deserializing to FeedTokenPartitionKeyRange"); Assert.AreEqual(original.PartitionKeyRangeId, deserializedFeedToken.PartitionKeyRangeId); Assert.AreEqual(continuationToken, deserializedFeedToken.GetContinuation()); // Verify that the backward compatible way works too FeedToken deserializedFromBackwardcompatible = FeedToken.FromString(oneRange.Id); FeedTokenPartitionKeyRange deserializedFromBackwardcompatibleToken = deserializedFromBackwardcompatible as FeedTokenPartitionKeyRange; Assert.IsNotNull(deserializedFromBackwardcompatibleToken, "Error deserializing to FeedTokenPartitionKeyRange"); Assert.AreEqual(deserializedFromBackwardcompatibleToken.PartitionKeyRangeId, deserializedFeedToken.PartitionKeyRangeId); }
public void FeedToken_PartitionKeyRange_TryParse() { FeedTokenPartitionKeyRange token = new FeedTokenPartitionKeyRange("0"); Assert.IsTrue(FeedTokenPartitionKeyRange.TryParseInstance(token.ToString(), out FeedToken parsed)); Assert.IsTrue(FeedTokenPartitionKeyRange.TryParseInstance("1", out FeedToken _)); Assert.IsFalse(FeedTokenPartitionKey.TryParseInstance("whatever", out FeedToken _)); }
public void FeedToken_PartitionKeyRange_IsDone() { string pkrangeId = "0"; FeedTokenPartitionKeyRange token = new FeedTokenPartitionKeyRange(pkrangeId); token.UpdateContinuation(Guid.NewGuid().ToString()); Assert.IsFalse(token.IsDone); token.UpdateContinuation(null); Assert.IsTrue(token.IsDone); }
public void FeedToken_PartitionKeyRange_EnrichRequest() { string pkrangeId = "0"; FeedTokenPartitionKeyRange token = new FeedTokenPartitionKeyRange(pkrangeId); RequestMessage requestMessage = new RequestMessage(); token.EnrichRequest(requestMessage); Assert.AreEqual(pkrangeId, requestMessage.PartitionKeyRangeId.PartitionKeyRangeId); Assert.ThrowsException <ArgumentNullException>(() => token.EnrichRequest(null)); }
public void IsFeedOperation_ForFeedTokenPartitionKeyRange() { RequestMessage request = new RequestMessage(); request.OperationType = OperationType.ReadFeed; request.ResourceType = ResourceType.Document; FeedTokenInternal feedTokenEPKRange = new FeedTokenPartitionKeyRange("0"); feedTokenEPKRange.EnrichRequest(request); Assert.IsFalse(request.IsPartitionKeyRangeHandlerRequired); }
public async Task FeedToken_PartitionKeyRange_HandleSplits() { string containerRid = Guid.NewGuid().ToString(); string continuation = Guid.NewGuid().ToString(); FeedTokenPartitionKeyRange feedTokenPartitionKeyRange = new FeedTokenPartitionKeyRange("0"); feedTokenPartitionKeyRange.UpdateContinuation(continuation); PKRangeSplitMockDocumentClient documentClient = new PKRangeSplitMockDocumentClient(); Mock <CosmosClientContext> cosmosClientContext = new Mock <CosmosClientContext>(); cosmosClientContext.Setup(c => c.ClientOptions).Returns(new CosmosClientOptions()); cosmosClientContext.Setup(c => c.DocumentClient).Returns(documentClient); Mock <ContainerCore> containerCore = new Mock <ContainerCore>(); containerCore .Setup(c => c.ClientContext).Returns(cosmosClientContext.Object); containerCore .Setup(c => c.GetRIDAsync(It.IsAny <CancellationToken>())) .Returns(Task.FromResult(containerRid)); ResponseMessage split = new ResponseMessage(HttpStatusCode.Gone); split.Headers.SubStatusCode = Documents.SubStatusCodes.PartitionKeyRangeGone; Assert.IsTrue(await feedTokenPartitionKeyRange.ShouldRetryAsync(containerCore.Object, split)); // FeedToken should have converted to EPKRange token string serialization = feedTokenPartitionKeyRange.ToString(); FeedTokenEPKRange feedTokenEPKRange = FeedToken.FromString(serialization) as FeedTokenEPKRange; Assert.IsNotNull(feedTokenEPKRange, "FeedTokenPartitionKeyRange did not convert to FeedTokenEPKRange after split"); Assert.AreEqual(containerRid, feedTokenEPKRange.ContainerRid); // Split should only capture the sons of the original PKRangeId Assert.AreEqual(2, feedTokenEPKRange.CompositeContinuationTokens.Count); CompositeContinuationToken[] continuationTokens = feedTokenEPKRange.CompositeContinuationTokens.ToArray(); // First token is split Assert.AreEqual(continuation, continuationTokens[0].Token); Assert.AreEqual(documentClient.AvailablePartitionKeyRanges[0].MinInclusive, continuationTokens[0].Range.Min); Assert.AreEqual(documentClient.AvailablePartitionKeyRanges[0].MaxExclusive, continuationTokens[0].Range.Max); // Second token remains the same Assert.AreEqual(continuation, continuationTokens[1].Token); Assert.AreEqual(documentClient.AvailablePartitionKeyRanges[1].MinInclusive, continuationTokens[1].Range.Min); Assert.AreEqual(documentClient.AvailablePartitionKeyRanges[1].MaxExclusive, continuationTokens[1].Range.Max); }
public async Task GetPartitionKeyRangesAsync_WithPKRangeIdToken() { DocumentFeedResponse <Documents.PartitionKeyRange> ranges = await this.Container.ClientContext.DocumentClient.ReadPartitionKeyRangeFeedAsync(this.Container.LinkUri); FeedToken feedToken = new FeedTokenPartitionKeyRange(ranges.First().Id); List <string> resolvedRanges = (await this.Container.GetPartitionKeyRangesAsync(feedToken)).ToList(); Assert.AreEqual(1, resolvedRanges.Count); foreach (string id in resolvedRanges) { Assert.IsTrue(ranges.Any(range => range.Id == id)); } }