Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }