public async Task ReadAsyncExpectedTimeoutTest()
        {
            ChangesHandler <MyDocument> handler = (changes, cancelationToken) =>
            {
                IReadOnlyList <MyDocument> list = changes as IReadOnlyList <MyDocument>;
                Assert.IsNotNull(list);
                Assert.AreEqual("test", list[0].id);
                return(Task.CompletedTask);
            };
            Mock <PartitionCheckpointer> mockCheckpointer = new Mock <PartitionCheckpointer>();
            Mock <FeedIterator>          mockIterator     = new Mock <FeedIterator>();

            mockIterator.Setup(i => i.ReadNextAsync(It.IsAny <CancellationToken>()))
            .Returns(async() =>
            {
                await Task.Delay(200);
                return(GetResponse(HttpStatusCode.OK, true));
            });
            mockIterator.SetupSequence(i => i.HasMoreResults).Returns(true).Returns(false);

            CustomSerializer serializer = new CustomSerializer();
            ChangeFeedObserverFactoryCore <MyDocument> factory = new ChangeFeedObserverFactoryCore <MyDocument>(handler, new CosmosSerializerCore(serializer));
            ProcessorOptions options = new ProcessorOptions()
            {
                RequestTimeout = TimeSpan.FromMilliseconds(100)
            };
            FeedProcessorCore processor = new FeedProcessorCore(factory.CreateObserver(), mockIterator.Object, options, mockCheckpointer.Object);

            try
            {
                Task runTask = processor.RunAsync(default);
        public async Task UsesCustomSerializer()
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(1000);

            ChangesHandler <MyDocument> handler = (changes, cancelationToken) =>
            {
                IReadOnlyList <MyDocument> list = changes as IReadOnlyList <MyDocument>;
                Assert.IsNotNull(list);
                Assert.AreEqual("test", list[0].id);
                return(Task.CompletedTask);
            };
            Mock <PartitionCheckpointer> mockCheckpointer = new Mock <PartitionCheckpointer>();
            Mock <FeedIterator>          mockIterator     = new Mock <FeedIterator>();

            mockIterator.Setup(i => i.ReadNextAsync(It.IsAny <CancellationToken>())).ReturnsAsync(GetResponse(HttpStatusCode.OK, true));
            mockIterator.SetupSequence(i => i.HasMoreResults).Returns(true).Returns(false);

            CustomSerializer serializer = new CustomSerializer();
            ChangeFeedObserverFactoryCore <MyDocument> factory = new ChangeFeedObserverFactoryCore <MyDocument>(handler, new CosmosSerializerCore(serializer));
            FeedProcessorCore processor = new FeedProcessorCore(factory.CreateObserver(), mockIterator.Object, FeedProcessorCoreTests.DefaultSettings, mockCheckpointer.Object);

            try
            {
                await processor.RunAsync(cancellationTokenSource.Token);
            }
            catch (TaskCanceledException)
            {
                // Expected
            }

            Assert.AreEqual(1, serializer.FromStreamCalled, "Should have called FromStream on the custom serializer");
        }
        public async Task ThrowOnPartitionSplit(HttpStatusCode statusCode, int subStatusCode)
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(1000);

            Mock <ChangeFeedObserver <MyDocument> > mockObserver = new Mock <ChangeFeedObserver <MyDocument> >();

            Mock <PartitionCheckpointer> mockCheckpointer = new Mock <PartitionCheckpointer>();
            Mock <FeedIterator>          mockIterator     = new Mock <FeedIterator>();

            mockIterator.Setup(i => i.FetchNextSetAsync(It.IsAny <CancellationToken>()))
            .ReturnsAsync(GetResponse(statusCode, false, subStatusCode));

            FeedProcessorCore <MyDocument> processor = new FeedProcessorCore <MyDocument>(mockObserver.Object, mockIterator.Object, FeedProcessorCoreTests.DefaultSettings, mockCheckpointer.Object, new CosmosJsonSerializerCore());

            await Assert.ThrowsExceptionAsync <FeedSplitException>(() => processor.RunAsync(cancellationTokenSource.Token));
        }
Пример #4
0
        public async Task ThrowOnPartitionGone(HttpStatusCode statusCode, int subStatusCode)
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(1000);

            Mock <ChangeFeedObserver> mockObserver = new Mock <ChangeFeedObserver>();

            Mock <PartitionCheckpointer> mockCheckpointer = new Mock <PartitionCheckpointer>();
            Mock <FeedIterator>          mockIterator     = new Mock <FeedIterator>();

            mockIterator.Setup(i => i.ReadNextAsync(It.IsAny <CancellationToken>()))
            .ReturnsAsync(GetResponse(statusCode, false, subStatusCode));

            FeedProcessorCore processor = new FeedProcessorCore(mockObserver.Object, mockIterator.Object, FeedProcessorCoreTests.DefaultSettings, mockCheckpointer.Object);

            await Assert.ThrowsExceptionAsync <FeedNotFoundException>(() => processor.RunAsync(cancellationTokenSource.Token));
        }
        public async Task ThrowsOnFailedCustomSerializer()
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(1000);

            Mock <ChangeFeedObserver <MyDocument> > mockObserver     = new Mock <ChangeFeedObserver <MyDocument> >();
            Mock <PartitionCheckpointer>            mockCheckpointer = new Mock <PartitionCheckpointer>();
            Mock <FeedIterator> mockIterator = new Mock <FeedIterator>();

            mockIterator.Setup(i => i.FetchNextSetAsync(It.IsAny <CancellationToken>())).ReturnsAsync(GetResponse(HttpStatusCode.OK, true));
            mockIterator.SetupSequence(i => i.HasMoreResults).Returns(true).Returns(false);

            CustomSerializerFails          serializer = new CustomSerializerFails();
            FeedProcessorCore <MyDocument> processor  = new FeedProcessorCore <MyDocument>(mockObserver.Object, mockIterator.Object, FeedProcessorCoreTests.DefaultSettings, mockCheckpointer.Object, serializer);

            ObserverException caughtException = await Assert.ThrowsExceptionAsync <ObserverException>(() => processor.RunAsync(cancellationTokenSource.Token));

            Assert.IsInstanceOfType(caughtException.InnerException, typeof(CustomException));
        }
        public async Task ThrowsOnFailedCustomSerializer()
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(1000);

            Mock <PartitionCheckpointer> mockCheckpointer = new Mock <PartitionCheckpointer>();
            Mock <FeedIterator>          mockIterator     = new Mock <FeedIterator>();

            mockIterator.Setup(i => i.ReadNextAsync(It.IsAny <CancellationToken>())).ReturnsAsync(GetResponse(HttpStatusCode.OK, true));
            mockIterator.SetupSequence(i => i.HasMoreResults).Returns(true).Returns(false);

            CustomSerializerFails    serializer             = new CustomSerializerFails();
            ChangesHandler <dynamic> handler                = (changes, cancelationToken) => Task.CompletedTask;
            ChangeFeedObserverFactoryCore <dynamic> factory = new ChangeFeedObserverFactoryCore <dynamic>(handler, new CosmosSerializerCore(serializer));
            FeedProcessorCore processor = new FeedProcessorCore(factory.CreateObserver(), mockIterator.Object, FeedProcessorCoreTests.DefaultSettings, mockCheckpointer.Object);

            ChangeFeedProcessorUserException caughtException = await Assert.ThrowsExceptionAsync <ChangeFeedProcessorUserException>(() => processor.RunAsync(cancellationTokenSource.Token));

            Assert.IsInstanceOfType(caughtException.InnerException, typeof(CustomException));
        }
Пример #7
0
        public async Task UsesCustomSerializer()
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(1000);

            Mock <ChangeFeedObserver <MyDocument> > mockObserver = new Mock <ChangeFeedObserver <MyDocument> >();

            mockObserver.Setup(o => o.ProcessChangesAsync(
                                   It.IsAny <ChangeFeedObserverContext>(),
                                   It.Is <IReadOnlyList <MyDocument> >(list => list[0].id.Equals("test")),
                                   It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);
            Mock <PartitionCheckpointer> mockCheckpointer = new Mock <PartitionCheckpointer>();
            Mock <FeedIterator>          mockIterator     = new Mock <FeedIterator>();

            mockIterator.Setup(i => i.ReadNextAsync(It.IsAny <CancellationToken>())).ReturnsAsync(GetResponse(HttpStatusCode.OK, true));
            mockIterator.SetupSequence(i => i.HasMoreResults).Returns(true).Returns(false);

            CustomSerializer serializer = new CustomSerializer();
            FeedProcessorCore <MyDocument> processor = new FeedProcessorCore <MyDocument>(
                mockObserver.Object,
                mockIterator.Object,
                FeedProcessorCoreTests.DefaultSettings,
                mockCheckpointer.Object,
                new CosmosSerializerCore(serializer));

            try
            {
                await processor.RunAsync(cancellationTokenSource.Token);
            }
            catch (TaskCanceledException)
            {
                // Expected
            }

            Mock.Get(mockObserver.Object)
            .Verify(o => o.ProcessChangesAsync(
                        It.IsAny <ChangeFeedObserverContext>(),
                        It.Is <IReadOnlyList <MyDocument> >(list => list[0].id.Equals("test")),
                        It.IsAny <CancellationToken>())
                    , Times.Once);

            Assert.AreEqual(1, serializer.FromStreamCalled, "Should have called FromStream on the custom serializer");
        }
        public async Task ThrowOnReadSessionNotAvailable(HttpStatusCode statusCode, int subStatusCode)
        {
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(1000);

            Mock <ChangeFeedObserver> mockObserver = new Mock <ChangeFeedObserver>();

            Mock <PartitionCheckpointer> mockCheckpointer = new Mock <PartitionCheckpointer>();
            Mock <FeedIterator>          mockIterator     = new Mock <FeedIterator>();

            mockIterator.Setup(i => i.ReadNextAsync(It.IsAny <CancellationToken>()))
            .ReturnsAsync(GetResponse(statusCode, false, subStatusCode));

            FeedProcessorCore processor = new FeedProcessorCore(
                mockObserver.Object,
                mockIterator.Object,
                FeedProcessorCoreTests.DefaultSettings,
                mockCheckpointer.Object);

            CosmosException cosmosException = await Assert.ThrowsExceptionAsync <CosmosException>(() => processor.RunAsync(cancellationTokenSource.Token));

            Assert.AreEqual(statusCode, cosmosException.StatusCode);
            Assert.AreEqual(subStatusCode, (int)cosmosException.Headers.SubStatusCode);
        }