public void NotifyCallBackOnRequestHandlerException() { var clientConnection = new TestableClientConnection(); clientConnection.MonitorTask = Task.Delay(-1); clientConnection.ReadBuildRequestTask = Task.FromResult(s_emptyCSharpBuildRequest); var ex = new Exception(); var handler = new Mock <IRequestHandler>(); handler .Setup(x => x.HandleRequest(It.IsAny <BuildRequest>(), It.IsAny <CancellationToken>())) .Throws(ex); var invoked = false; FatalError.OverwriteHandler((providedEx) => { Assert.Same(ex, providedEx); invoked = true; }); var client = new ServerDispatcher.Connection(clientConnection, handler.Object); Assert.Throws(typeof(AggregateException), () => client.ServeConnection().Wait()); Assert.True(invoked); }
public void ReadError() { var handler = new Mock <IRequestHandler>(MockBehavior.Strict); var ex = new Exception("Simulated read error."); var clientConnection = new TestableClientConnection(); var calledClose = false; clientConnection.ReadBuildRequestTask = TaskFromException <BuildRequest>(ex); clientConnection.CloseAction = delegate { calledClose = true; }; var client = new ServerDispatcher.Connection(clientConnection, handler.Object); Assert.Equal(ServerDispatcher.CompletionReason.CompilationNotStarted, client.ServeConnection().Result); Assert.True(calledClose); }
public void WriteError() { var clientConnection = new TestableClientConnection(); clientConnection.MonitorTask = Task.Delay(-1); clientConnection.ReadBuildRequestTask = Task.FromResult(s_emptyCSharpBuildRequest); clientConnection.WriteBuildResponseTask = TaskFromException(new Exception()); var handler = new Mock <IRequestHandler>(); handler .Setup(x => x.HandleRequest(It.IsAny <BuildRequest>(), It.IsAny <CancellationToken>())) .Returns(s_emptyBuildResponse); var client = new ServerDispatcher.Connection(clientConnection, handler.Object); Assert.Equal(ServerDispatcher.CompletionReason.ClientDisconnect, client.ServeConnection().Result); }
public void ClientDisconnectCancelBuildAndReturnsFailure() { var clientConnection = new TestableClientConnection(); clientConnection.ReadBuildRequestTask = Task.FromResult(s_emptyCSharpBuildRequest); var monitorTaskSource = new TaskCompletionSource <bool>(); clientConnection.MonitorTask = monitorTaskSource.Task; var handler = new Mock <IRequestHandler>(); var handlerTaskSource = new TaskCompletionSource <CancellationToken>(); var releaseHandlerSource = new TaskCompletionSource <bool>(); handler .Setup(x => x.HandleRequest(It.IsAny <BuildRequest>(), It.IsAny <CancellationToken>())) .Callback <BuildRequest, CancellationToken>((_, t) => { handlerTaskSource.SetResult(t); releaseHandlerSource.Task.Wait(); }) .Returns(s_emptyBuildResponse); var client = new ServerDispatcher.Connection(clientConnection, handler.Object); var serveTask = client.ServeConnection(new TaskCompletionSource <TimeSpan?>()); // Once this returns we know the Connection object has kicked off a compilation and // started monitoring the disconnect task. Can now initiate a disconnect in a known // state. var cancellationToken = handlerTaskSource.Task.Result; monitorTaskSource.SetResult(true); Assert.Equal(ServerDispatcher.CompletionReason.ClientDisconnect, serveTask.Result); Assert.True(cancellationToken.IsCancellationRequested); // Now that the asserts are done unblock the "build" long running task. Have to do this // last to simulate a build which is still running when the client disconnects. releaseHandlerSource.SetResult(true); }