public async Task ConsumeOutputException()
        {
            // Setup: Create a mock message writer
            var mw = new Mock <MessageWriter>(Stream.Null);

            mw.Setup(o => o.WriteMessage(It.IsAny <Message>())).Returns(Task.FromResult(true));

            // If: I start the output consumption thread with a completed blocking collection
            var jh = new JsonRpcHost(GetChannelBase(null, mw.Object).Object);

            jh.outputQueue.CompleteAdding();
            await jh.ConsumeOutput().WithTimeout(TimeSpan.FromSeconds(1));

            // Then: The message writer should not have been called
            mw.Verify(o => o.WriteMessage(It.IsAny <Message>()), Times.Never);
        }
        public async Task ConsumeOutputCancelled()
        {
            // NOTE: This test validates that the blocking collection breaks out when cancellation is requested

            // Setup: Create a mock message writer
            var mw = new Mock <MessageWriter>(Stream.Null);

            mw.Setup(o => o.WriteMessage(It.IsAny <Message>())).Returns(Task.FromResult(true));

            // If:
            // ... I start the output consumption thread
            var  jh = new JsonRpcHost(GetChannelBase(null, mw.Object).Object);
            Task consumeOuputTask = jh.ConsumeOutput();

            // ... and I stop the thread via cancellation and wait for completion
            jh.cancellationTokenSource.Cancel();
            await consumeOuputTask.WithTimeout(TimeSpan.FromSeconds(1));

            // Then: The message writer should not have been called
            mw.Verify(o => o.WriteMessage(It.IsAny <Message>()), Times.Never);
        }
        public async Task ConsumeOutput()
        {
            // Setup:
            // ... Create a mock message writer
            var mw = new Mock <MessageWriter>(Stream.Null);

            mw.Setup(o => o.WriteMessage(CommonObjects.ResponseMessage)).Returns(Task.FromResult(true));

            // ... Create the JSON RPC host and add an item to the output queue
            var jh = new JsonRpcHost(GetChannelBase(null, mw.Object).Object);

            jh.outputQueue.Add(CommonObjects.ResponseMessage);
            jh.outputQueue.CompleteAdding();        // This will cause the thread to stop after processing the items

            // If: I start the output consumption thread
            Task consumeOutputTask = jh.ConsumeOutput();
            await consumeOutputTask.WithTimeout(TimeSpan.FromSeconds(1));

            // Then: The message writer should have been called once
            mw.Verify(o => o.WriteMessage(CommonObjects.ResponseMessage), Times.Once);
        }