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 _));
        }
Пример #3
0
        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));
            }
        }