Пример #1
0
        public void Now()
        {
            ChangeFeedState            now           = ChangeFeedState.Now();
            CosmosElement              cosmosElement = ChangeFeedStateCosmosElementSerializer.ToCosmosElement(now);
            TryCatch <ChangeFeedState> monadicState  = ChangeFeedStateCosmosElementSerializer.MonadicFromCosmosElement(cosmosElement);

            Assert.IsTrue(monadicState.Succeeded);
            Assert.IsTrue(monadicState.Result is ChangeFeedStateNow);
        }
Пример #2
0
        public static ChangeFeedCrossFeedRangeState CreateFromNow(FeedRange feedRange)
        {
            if (!(feedRange is FeedRangeInternal feedRangeInternal))
            {
                throw new ArgumentException($"{nameof(feedRange)} needs to be a {nameof(FeedRangeInternal)}.");
            }

            if (feedRange.Equals(FeedRangeEpk.FullRange))
            {
                return(FullRangeStatesSingletons.Now);
            }

            return(new ChangeFeedCrossFeedRangeState(
                       new List <FeedRangeState <ChangeFeedState> >()
            {
                new FeedRangeState <ChangeFeedState>(feedRangeInternal, ChangeFeedState.Now())
            }));
        }
        public async Task StartFromNowAsync(bool useContinuations)
        {
            int numItems = 100;
            IDocumentContainer documentContainer = await CreateDocumentContainerAsync(numItems);

            CrossPartitionChangeFeedAsyncEnumerator enumerator = CrossPartitionChangeFeedAsyncEnumerator.Create(
                documentContainer,
                new CrossFeedRangeState <ChangeFeedState>(
                    new FeedRangeState <ChangeFeedState>[]
            {
                new FeedRangeState <ChangeFeedState>(FeedRangeEpk.FullRange, ChangeFeedState.Now())
            }),
                ChangeFeedPaginationOptions.Default,
                cancellationToken: default);

            (int globalCount, double _) = await(useContinuations
                ? DrainWithUntilNotModifiedWithContinuationTokens(documentContainer, enumerator)
                : DrainUntilNotModifedAsync(enumerator));

            Assert.AreEqual(0, globalCount);

            for (int i = 0; i < numItems; i++)
            {
                // Insert an item
                CosmosObject item = CosmosObject.Parse($"{{\"pk\" : {i} }}");
                while (true)
                {
                    TryCatch <Record> monadicCreateRecord = await documentContainer.MonadicCreateItemAsync(item, cancellationToken : default);

                    if (monadicCreateRecord.Succeeded)
                    {
                        break;
                    }
                }
            }

            (int globalCountAfter, double _) = await(useContinuations
                ? DrainWithUntilNotModifiedWithContinuationTokens(documentContainer, enumerator)
                : DrainUntilNotModifedAsync(enumerator));
            Assert.AreEqual(numItems, globalCountAfter);
        }
        public async Task ShouldReturnNotModifiedAfterCyclingOnAllRanges(int partitions)
        {
            ReadOnlyMemory<FeedRangeState<ChangeFeedState>> rangeStates = null;

            if (partitions == 1)
            {
                rangeStates = new FeedRangeState<ChangeFeedState>[]{
                    new FeedRangeState<ChangeFeedState>(FeedRangeEpk.FullRange, ChangeFeedState.Now())
                };
            }
            if (partitions == 2)
            {
                rangeStates = new FeedRangeState<ChangeFeedState>[]{
                    new FeedRangeState<ChangeFeedState>(new FeedRangeEpk(new Documents.Routing.Range<string>("", "AA", true, false)), ChangeFeedState.Now()),
                    new FeedRangeState<ChangeFeedState>(new FeedRangeEpk(new Documents.Routing.Range<string>("AA", "FF", true, false)), ChangeFeedState.Now()),
                };
            }
            if (partitions == 3)
            {
                rangeStates = new FeedRangeState<ChangeFeedState>[]{
                    new FeedRangeState<ChangeFeedState>(new FeedRangeEpk(new Documents.Routing.Range<string>("", "AA", true, false)), ChangeFeedState.Now()),
                    new FeedRangeState<ChangeFeedState>(new FeedRangeEpk(new Documents.Routing.Range<string>("AA", "BB", true, false)), ChangeFeedState.Now()),
                    new FeedRangeState<ChangeFeedState>(new FeedRangeEpk(new Documents.Routing.Range<string>("BB", "FF", true, false)), ChangeFeedState.Now()),
                };
            }

            Assert.IsNotNull(rangeStates, $"Range states not initialized for {partitions} partitions");

            CrossFeedRangeState<ChangeFeedState> state = new CrossFeedRangeState<ChangeFeedState>(rangeStates);
            Mock<IDocumentContainer> documentContainer = new Mock<IDocumentContainer>();

            // Returns a 304 with 1RU charge
            documentContainer.Setup(c => c.MonadicChangeFeedAsync(
                It.IsAny<FeedRangeState<ChangeFeedState>>(),
                It.IsAny<ChangeFeedPaginationOptions>(),
                It.IsAny<ITrace>(),
                It.IsAny<CancellationToken>())).ReturnsAsync(
                (FeedRangeState<ChangeFeedState> state, ChangeFeedPaginationOptions options, ITrace trace, CancellationToken token) 
                    => TryCatch<ChangeFeedPage>.FromResult(new ChangeFeedNotModifiedPage(requestCharge: 1, activityId: string.Empty, additionalHeaders: default, state.State)));