public void DelayConnectingHttpSocketAdapter_AddRequestHeader_DoesNotConnect()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(DoNotConnect);

            // Act
            delayAdapter.AddRequestHeader("Hello", "World");

            // Assert
            //   If we got here, the connection was not created
        }
        public void DelayConnectingHttpSocketAdapter_SetResponseHandler_DoesNotConnect()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(DoNotConnect);

            // Act
            delayAdapter.SetResponseHandler(HandleAsciiResponse);

            // Assert
            //   If we got here, the connection was not created
        }
        public void DelayConnectingHttpSocketAdapter_Dispose_DoesNothingIfNotConnected()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            // Act
            delayAdapter.Dispose();

            // Assert
            //   Should do nothing
        }
        public void DelayConnectingHttpSocketAdapter_CompleteRequest_DoesNotConnectIfNoDataAndNoResponse()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(DoNotConnect);

            // Act
            Task result = delayAdapter.CompleteRequest();

            // Assert
            TaskAssert.Completed(result, "CompleteRequest should complete immediately when there is no request.");
        }
        public void DelayConnectingHttpSocketAdapter_WriteToRequestAsync_DoesNothingAfterFailureToConnect()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(FailToConnect);

            byte[] bytesToWrite = Encoding.ASCII.GetBytes("Hello, world!");

            // Act
            Task result = delayAdapter.WriteToRequestAsync(bytesToWrite, 7, 5);

            // Assert
            TaskAssert.Completed(result);
        }
        public void DelayConnectingHttpSocketAdapter_Dispose_DisposesExistingConnection()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            delayAdapter.WaitForResponseComplete();

            // Act
            delayAdapter.Dispose();

            // Assert
            Assert.True(_createdAdapter.IsDisposed);
        }
        public void DelayConnectingHttpSocketAdapter_AddRequestHeader_AddsHeadersToExistingConnection()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            delayAdapter.GetResponseStatusCode();

            // Act
            delayAdapter.AddRequestHeader("Hello", "World");

            // Assert
            Assert.True(_createdAdapter.RequestHeaders.ContainsKey("Hello"), "Header 'Hello' should be added.");
            Assert.Equal("World", _createdAdapter.RequestHeaders["Hello"]);
        }
        public void DelayConnectingHttpSocketAdapter_Dispose_DoesNotDisposeASecondTime()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            delayAdapter.CompleteRequest();
            delayAdapter.Dispose();

            // Act
            delayAdapter.Dispose();

            // Assert
            //   If we got here, the adapter was not Disposed a second time
        }
        public void DelayConnectingHttpSocketAdapter_CompleteRequest_CompletesIfThereIsAResponseHandler()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            delayAdapter.SetResponseHandler(HandleAsciiResponse);

            // Act
            Task result = delayAdapter.CompleteRequest();

            // Assert
            Assert.True(_createdAdapter != null, "Adapter should have been created");
            Assert.True(_createdAdapter.IsCompleted, "Adapter should be completed");
        }
        public void DelayConnectingHttpSocketAdapter_WriteToRequestAsync_DoesNotAttemptToConnectAfterFailure()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(FailToConnect);

            byte[] bytesToWrite = Encoding.ASCII.GetBytes("Hello, world!");
            delayAdapter.WriteToRequestAsync(bytesToWrite, 7, 5);

            // Act
            Task result = delayAdapter.WriteToRequestAsync(bytesToWrite, 7, 5);

            // Assert
            //  If we got here, a second connection was not attempted
            TaskAssert.Completed(result);
        }
        public void DelayConnectingHttpSocketAdapter_WriteToRequestAsync_WritesDataToSameConnection()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            byte[] bytesToWrite = Encoding.ASCII.GetBytes("Hello, world!");
            delayAdapter.WriteToRequestAsync(bytesToWrite, 0, 7);

            // Act
            delayAdapter.WriteToRequestAsync(bytesToWrite, 7, 5);

            // Assert
            Assert.True(_createdAdapter != null, "Adapter was not created.");
            Assert.Equal("Hello, world", _createdAdapter.RequestContent);
        }
        public void DelayConnectingHttpSocketAdapter_WriteToRequestAsync_ConnectsAndWritesData()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            byte[] bytesToWrite = Encoding.ASCII.GetBytes("Hello, world!");

            // Act
            Task result = delayAdapter.WriteToRequestAsync(bytesToWrite, 7, 5);

            // Assert
            Assert.True(result != null, "No Task was returned.");
            Assert.True(_createdAdapter != null, "Adapter was not created.");
            Assert.Equal("world", _createdAdapter.RequestContent);
        }
        public void DelayConnectingHttpSocketAdapter_CompleteRequest_DoesNotRecreateConnection()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            byte[] bytesToWrite = Encoding.ASCII.GetBytes("Hello");
            delayAdapter.WriteToRequestAsync(bytesToWrite, 0, bytesToWrite.Length);

            // Act
            delayAdapter.CompleteRequest();

            // Assert
            Assert.True(_createdAdapter != null, "Adapter was not created.");
            Assert.True(_createdAdapter.IsCompleted, "Adapter was not Completed.");
        }
        public void DelayConnectingHttpSocketAdapter_AddRequestHeader_AddsHeadersAfterConnection()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            delayAdapter.AddRequestHeader("Hello", "World");
            delayAdapter.AddRequestHeader("Hello2", "Planet");

            // Act
            delayAdapter.WaitForResponseComplete();

            // Assert
            Assert.True(_createdAdapter.RequestHeaders.ContainsKey("Hello"), "Header 'Hello' should be added.");
            Assert.Equal("World", _createdAdapter.RequestHeaders["Hello"]);
            Assert.True(_createdAdapter.RequestHeaders.ContainsKey("Hello2"), "Header 'Hello2' should be added.");
            Assert.Equal("Planet", _createdAdapter.RequestHeaders["Hello2"]);
        }
        public void DelayConnectingHttpSocketAdapter_GetResponseHeader_ConnectsAndGetsHeader()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            // Act
            Task <string> result = delayAdapter.GetResponseHeader("Content-Length");

            // Assert
            Assert.True(_createdAdapter != null, "Adapter was not created.");
            TaskAssert.NotCompleted(result, "Status code should not be returned yet.");

            // Act
            _createdAdapter.SendResponseHeader("Content-Length", "1234");

            // Assert
            TaskAssert.ResultEquals(result, "1234");
        }
        public void DelayConnectingHttpSocketAdapter_WaitForResponseComplete_ConnectsAndWaits()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            // Act
            Task result = delayAdapter.WaitForResponseComplete();

            // Assert
            Assert.True(_createdAdapter != null, "Adapter was not created.");
            TaskAssert.NotCompleted(result, "Status code should not be returned yet.");

            // Act
            _createdAdapter.SendResponseComplete();

            // Assert
            TaskAssert.Completed(result);
        }
        public void DelayConnectingHttpSocketAdapter_GetResponseStatusCode_ConnectsAndRequestsStatusCode()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            // Act
            Task <int> result = delayAdapter.GetResponseStatusCode();

            // Assert
            Assert.True(_createdAdapter != null, "Adapter was not created.");
            TaskAssert.NotCompleted(result, "Status code should not be returned yet.");

            // Act
            _createdAdapter.SendResponseStatusCode(304);

            // Assert
            TaskAssert.ResultEquals(result, 304);
        }
        public void DelayConnectingHttpSocketAdapter_SetResponseHandler_SetsHandlerOnExistingConnection()
        {
            // Arrange
            IHttpSocketAdapter delayAdapter = new DelayConnectingHttpSocketAdapter(ConnectOnlyOnce);

            delayAdapter.GetResponseStatusCode();

            // Act
            delayAdapter.SetResponseHandler(HandleAsciiResponse);

            // Assert
            Assert.True(_createdAdapter.HasResponseHandler, "Response handler was not set.");

            // Act
            _createdAdapter.SendResponseBodyContent("This is a test", Encoding.ASCII);

            // Assert
            Assert.Equal("This is a test", _responseContent);
        }