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)); }
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)); }
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); }