public void FailedToEnqueueReturnsNull() { var queue = new TaskQueue(TaskAsyncHelper.Empty, 2); queue.Enqueue(() => Task.Delay(100)); queue.Enqueue(() => Task.Delay(100)); Task task = queue.Enqueue(() => Task.Delay(100)); Assert.Null(task); }
public void TaskQueueDoesNotQueueNewTasksIfPreviousTaskFaulted() { var queue = new TaskQueue(); queue.Enqueue(() => TaskAsyncHelper.FromError(new Exception())); Task task = queue.Enqueue(() => TaskAsyncHelper.Empty); Assert.True(task.IsCompleted); Assert.True(task.IsFaulted); }
public void DrainingTaskQueueShutsQueueOff() { var queue = new TaskQueue(); queue.Enqueue(() => TaskAsyncHelper.Empty); queue.Drain(); Task task = queue.Enqueue(() => TaskAsyncHelper.FromError(new Exception())); Assert.True(task.IsCompleted); Assert.False(task.IsFaulted); }
public void NotifiesMonitorWhenMultipleTasksStartsAndCompletes() { var mockMonitor = new Mock<ITaskMonitor>(); var queue = new TaskQueue(TaskAsyncHelper.Empty, mockMonitor.Object); queue.Enqueue(() => TaskAsyncHelper.Empty); queue.Enqueue(() => TaskAsyncHelper.Empty); mockMonitor.Verify(m => m.TaskStarted(), Times.Exactly(2)); mockMonitor.Verify(m => m.TaskCompleted(), Times.Exactly(2)); }
public void TaskQueueRunsTasksInSequence() { var queue = new TaskQueue(); int n = 0; queue.Enqueue(() => { n++; return TaskAsyncHelper.Empty; }); Task task = queue.Enqueue(() => { return Task.Delay(100).Then(() => n++); }); task.Wait(); Assert.Equal(n, 2); }
public void DoesNotNotifyMonitorOfCompletionUntilFuncReturns() { var mockMonitor = new Mock<ITaskMonitor>(); var queue = new TaskQueue(TaskAsyncHelper.Empty, mockMonitor.Object); queue.Enqueue(() => { mockMonitor.Verify(m => m.TaskStarted(), Times.Once()); mockMonitor.Verify(m => m.TaskCompleted(), Times.Never()); return TaskAsyncHelper.Empty; }); mockMonitor.Verify(m => m.TaskStarted(), Times.Once()); mockMonitor.Verify(m => m.TaskCompleted(), Times.Once()); }
public void DoesNotNotifyMonitorOfCompletionUntilTaskCompletesReturns() { var mockMonitor = new Mock<ITaskMonitor>(); var queue = new TaskQueue(TaskAsyncHelper.Empty, mockMonitor.Object); var tcs = new TaskCompletionSource<object>(); queue.Enqueue(() => { mockMonitor.Verify(m => m.TaskStarted(), Times.Once()); return tcs.Task; }); mockMonitor.Verify(m => m.TaskCompleted(), Times.Never()); tcs.SetResult(null); mockMonitor.Verify(m => m.TaskStarted(), Times.Once()); mockMonitor.Verify(m => m.TaskCompleted(), Times.Once()); }
public void RequestCompletesAfterFaultedInitializeResponse() { // Arrange var response = new Mock<IResponse>(); response.Setup(m => m.CancellationToken).Returns(CancellationToken.None); var request = new Mock<IRequest>(); var qs = new NameValueCollection(); qs["connectionId"] = "1"; request.Setup(m => m.QueryString).Returns(new NameValueCollectionWrapper(qs)); request.Setup(m => m.LocalPath).Returns("/test/echo/connect"); var counters = new PerformanceCounterManager(); var heartBeat = new Mock<ITransportHeartbeat>(); var json = new JsonSerializer(); var hostContext = new HostContext(request.Object, response.Object); var transportConnection = new Mock<ITransportConnection>(); var traceManager = new Mock<ITraceManager>(); traceManager.Setup(m => m[It.IsAny<string>()]).Returns(new System.Diagnostics.TraceSource("foo")); transportConnection.Setup(m => m.Receive(It.IsAny<string>(), It.IsAny<Func<PersistentResponse, object, Task<bool>>>(), It.IsAny<int>(), It.IsAny<object>())) .Returns<string, Func<PersistentResponse, object, Task<bool>>, int, object>( (messageId, callback, maxMessages, state) => new DisposableAction(() => callback(new PersistentResponse(), state)) ); var transport = new Mock<ForeverTransport>(hostContext, json, heartBeat.Object, counters, traceManager.Object) { CallBase = true }; var queue = new TaskQueue(); transport.Setup(t => t.EnqueueOperation(It.IsAny<Func<object, Task>>(), It.IsAny<object>())) .Returns<Func<object, Task>, object>( (writeAsync, state) => queue.Enqueue(writeAsync, state)); transport.Setup(t => t.InitializeResponse(It.IsAny<ITransportConnection>())) .Returns<ITransportConnection>( pr => TaskAsyncHelper.FromError(new Exception())); transport.Setup(t => t.Send(It.IsAny<PersistentResponse>())) .Returns<PersistentResponse>( pr => transport.Object.EnqueueOperation(() => TaskAsyncHelper.Empty)); var tcs = new TaskCompletionSource<bool>(); transport.Object.AfterRequestEnd = (ex) => { // Trip the cancellation token tcs.TrySetResult(transport.Object.WriteQueue.IsDrained); }; // Act transport.Object.ProcessRequest(transportConnection.Object); // Assert Assert.True(tcs.Task.Wait(TimeSpan.FromSeconds(2))); Assert.True(tcs.Task.Result); }
public void InitializeResponseIsFirstEnqueuedOperation() { // Arrange var response = new Mock<IResponse>(); response.Setup(m => m.CancellationToken).Returns(CancellationToken.None); var request = new Mock<IRequest>(); var qs = new NameValueCollection(); qs["connectionId"] = "1"; request.Setup(m => m.QueryString).Returns(new NameValueCollectionWrapper(qs)); request.Setup(m => m.LocalPath).Returns("/test/echo/connect"); var counters = new Mock<IPerformanceCounterManager>(); var heartBeat = new Mock<ITransportHeartbeat>(); var json = new JsonSerializer(); var hostContext = new HostContext(request.Object, response.Object); var transportConnection = new Mock<ITransportConnection>(); var traceManager = new Mock<ITraceManager>(); counters.SetupGet(m => m.ConnectionsConnected).Returns(new NoOpPerformanceCounter()); counters.SetupGet(m => m.ErrorsTransportTotal).Returns(new NoOpPerformanceCounter()); counters.SetupGet(m => m.ErrorsTransportPerSec).Returns(new NoOpPerformanceCounter()); counters.SetupGet(m => m.ErrorsAllTotal).Returns(new NoOpPerformanceCounter()); counters.SetupGet(m => m.ErrorsAllPerSec).Returns(new NoOpPerformanceCounter()); traceManager.Setup(m => m[It.IsAny<string>()]).Returns(new System.Diagnostics.TraceSource("foo")); transportConnection.Setup(m => m.Receive(It.IsAny<string>(), It.IsAny<Func<PersistentResponse, object, Task<bool>>>(), It.IsAny<int>(), It.IsAny<object>())) .Returns<string, Func<PersistentResponse, object, Task<bool>>, int, object>( (messageId, callback, maxMessages, state) => { callback(new PersistentResponse(), state); return DisposableAction.Empty; }); var transport = new Mock<ForeverTransport>(hostContext, json, heartBeat.Object, counters.Object, traceManager.Object) { CallBase = true }; var queue = new TaskQueue(); var results = new List<string>(); transport.Setup(t => t.EnqueueOperation(It.IsAny<Func<object, Task>>(), It.IsAny<object>())) .Returns<Func<object, Task>, object>( (writeAsync, state) => { return queue.Enqueue(writeAsync, state); }); transport.Setup(t => t.InitializeResponse(It.IsAny<ITransportConnection>())) .Returns<ITransportConnection>( pr => { results.Add("InitializeResponse"); return TaskAsyncHelper.Empty; }); transport.Setup(t => t.Send(It.IsAny<PersistentResponse>())) .Returns<PersistentResponse>( pr => transport.Object.EnqueueOperation(() => { results.Add("Send"); return TaskAsyncHelper.Empty; })); // Act transport.Object.ProcessRequest(transportConnection.Object); // Assert Assert.Equal("InitializeResponse", results[0]); Assert.Equal("Send", results[1]); }
public void RequestCompletesAfterFaultedInitializeResponse() { // Arrange var testContext = new TestContext("/test/echo/connect"); var counters = new PerformanceCounterManager(new Mock<ILoggerFactory>().Object); var heartBeat = new Mock<ITransportHeartbeat>(); var json = new JsonSerializer(); var transportConnection = new Mock<ITransportConnection>(); var loggerFactory = new Mock<ILoggerFactory>(); var memoryPool = new Mock<IMemoryPool>(); var applicationLifetime = new Mock<IApplicationLifetime>(); applicationLifetime.SetupGet(m => m.ApplicationStopping).Returns(CancellationToken.None); var logger = new Mock<ILogger>(); loggerFactory.Setup(m => m.CreateLogger(It.IsAny<string>())).Returns(logger.Object); transportConnection.Setup(m => m.Receive(It.IsAny<string>(), It.IsAny<Func<PersistentResponse, object, Task<bool>>>(), It.IsAny<int>(), It.IsAny<object>())) .Returns<string, Func<PersistentResponse, object, Task<bool>>, int, object>( (messageId, callback, maxMessages, state) => new DisposableAction(() => callback(new PersistentResponse(), state)) ); var transport = new Mock<ForeverTransport>(testContext.MockHttpContext.Object, json, heartBeat.Object, counters, applicationLifetime.Object, loggerFactory.Object, memoryPool.Object) { CallBase = true }; var queue = new TaskQueue(); transport.Setup(t => t.EnqueueOperation(It.IsAny<Func<object, Task>>(), It.IsAny<object>())) .Returns<Func<object, Task>, object>( (writeAsync, state) => queue.Enqueue(writeAsync, state)); transport.Setup(t => t.InitializeResponse(It.IsAny<ITransportConnection>())) .Returns<ITransportConnection>( pr => TaskAsyncHelper.FromError(new Exception())); transport.Setup(t => t.Send(It.IsAny<PersistentResponse>())) .Returns<PersistentResponse>( pr => transport.Object.EnqueueOperation(() => TaskAsyncHelper.Empty)); var tcs = new TaskCompletionSource<bool>(); transport.Object.AfterRequestEnd = (ex) => { // Trip the cancellation token tcs.TrySetResult(transport.Object.WriteQueue.IsDrained); }; // Act transport.Object.ProcessRequest(transportConnection.Object); // Assert Assert.True(tcs.Task.Wait(TimeSpan.FromSeconds(2))); Assert.True(tcs.Task.Result); }
public void InitializeResponseIsFirstEnqueuedOperation() { // Arrange var testContext = new TestContext("/test/echo/connect"); var counters = new Mock<IPerformanceCounterManager>(); var heartBeat = new Mock<ITransportHeartbeat>(); var json = new JsonSerializer(); var transportConnection = new Mock<ITransportConnection>(); var loggerFactory = new Mock<ILoggerFactory>(); var memoryPool = new Mock<IMemoryPool>(); counters.SetupGet(m => m.ConnectionsConnected).Returns(new NoOpPerformanceCounter()); counters.SetupGet(m => m.ErrorsTransportTotal).Returns(new NoOpPerformanceCounter()); counters.SetupGet(m => m.ErrorsTransportPerSec).Returns(new NoOpPerformanceCounter()); counters.SetupGet(m => m.ErrorsAllTotal).Returns(new NoOpPerformanceCounter()); counters.SetupGet(m => m.ErrorsAllPerSec).Returns(new NoOpPerformanceCounter()); var applicationLifetime = new Mock<IApplicationLifetime>(); applicationLifetime.SetupGet(m => m.ApplicationStopping).Returns(CancellationToken.None); var logger = new Mock<ILogger>(); transportConnection.Setup(m => m.Receive(It.IsAny<string>(), It.IsAny<Func<PersistentResponse, object, Task<bool>>>(), It.IsAny<int>(), It.IsAny<object>())) .Returns<string, Func<PersistentResponse, object, Task<bool>>, int, object>( (messageId, callback, maxMessages, state) => { callback(new PersistentResponse(), state); return DisposableAction.Empty; }); var transport = new Mock<ForeverTransport>(testContext.MockHttpContext.Object, json, heartBeat.Object, counters.Object, applicationLifetime.Object, loggerFactory.Object, memoryPool.Object) { CallBase = true }; var queue = new TaskQueue(); var results = new List<string>(); transport.Setup(t => t.EnqueueOperation(It.IsAny<Func<object, Task>>(), It.IsAny<object>())) .Returns<Func<object, Task>, object>( (writeAsync, state) => { return queue.Enqueue(writeAsync, state); }); transport.Setup(t => t.InitializeResponse(It.IsAny<ITransportConnection>())) .Returns<ITransportConnection>( pr => { results.Add("InitializeResponse"); return TaskAsyncHelper.Empty; }); transport.Setup(t => t.Send(It.IsAny<PersistentResponse>())) .Returns<PersistentResponse>( pr => transport.Object.EnqueueOperation(() => { results.Add("Send"); return TaskAsyncHelper.Empty; })); // Act transport.Object.ProcessRequest(transportConnection.Object); // Assert Assert.Equal("InitializeResponse", results[0]); Assert.Equal("Send", results[1]); }