public void CanHandleMultipleRequests()
        {
            var stream1 = GetResponseStream(NntpResponseCode.ArticleRetrievedHeadAndBodyFollows, true, true);
            var stream2 = GetResponseStream(NntpResponseCode.ArticleRetrievedHeadAndBodyFollows, false, true);

            MemoryStream stream = new MemoryStream();

            JoinStreams(stream, stream1, stream2);

            Mock<StreamAccessor> streamAccessorMock = new Mock<StreamAccessor>(stream, null);
            streamAccessorMock.SetupGet(s => s.BaseStream).CallBase().Verifiable();
            streamAccessorMock.Setup(s => s.AutoFlush).CallBase().Verifiable();
            streamAccessorMock.Setup(s => s.NewLine).CallBase().Verifiable();
            streamAccessorMock.Setup(s => s.ReadLine()).CallBase().Verifiable();
            streamAccessorMock.Setup(s => s.WriteLine(It.IsAny<string>())).Verifiable();

            NntpProtocolHandler handler = new NntpProtocolHandler(streamAccessorMock.Object);

            var response1 = handler.PerformRequest(new NntpRequest(NntpCommand.Article, false, "185"));

            Assert.AreEqual(response1.ResponseCode, NntpResponseCode.ArticleRetrievedHeadAndBodyFollows);

            Assert.IsNotNull(response1.StatusLine);
            Assert.IsNotNull(response1.Payload);

            var response2 = handler.PerformRequest(new NntpRequest(NntpCommand.Article, false, "186"));

            Assert.AreEqual(response2.ResponseCode, NntpResponseCode.ArticleRetrievedHeadAndBodyFollows);

            Assert.IsNotNull(response2.StatusLine);
            Assert.IsNotNull(response2.Payload);
        }
        public void StreamAccessorTimeoutsAreUnhandled()
        {
            var stream = GetResponseStream(NntpResponseCode.ArticleRetrievedHeadAndBodyFollows, true, true);

            Mock<StreamAccessor> streamAccessorMock = new Mock<StreamAccessor>(stream, null);
            streamAccessorMock.SetupGet(s => s.BaseStream).CallBase().Verifiable();
            streamAccessorMock.Setup(s => s.AutoFlush).CallBase().Verifiable();
            streamAccessorMock.Setup(s => s.NewLine).CallBase().Verifiable();

            int callCount = 0;
            streamAccessorMock.Setup(s => s.ReadLine()).Callback(() =>
            {
                if(callCount >= 2)//Timeout on body read
                    Thread.Sleep(3000);
                callCount++;
            }).CallBase();
            streamAccessorMock.Setup(s => s.WriteLine(It.IsAny<string>())).Verifiable();

            NntpProtocolHandler handler = new NntpProtocolHandler(streamAccessorMock.Object, 2000); //set timeout to 2 seconds

            //We need the timeout exception to buble up to the caller so they are aware they need to retry
            var response = handler.PerformRequest(new NntpRequest(NntpCommand.Article, false, "123")); // No data available, this should timeout
        }