public void SocketReader_ReadLine_WaitsForMoreDataWhenLineIncomplete()
        {
            // Arrange
            MockSocketAdapter socket = new MockSocketAdapter();

            SocketReader reader = new SocketReader(socket);

            // Act
            Task <string> result = reader.ReadLine(_dontCancel);

            // Assert
            TaskAssert.NotCompleted(result, "Before sending data.");

            // Act
            socket.SendString("This is the first part of the string. ", Encoding.ASCII);

            // Assert
            TaskAssert.NotCompleted(result, "After sending first sentence.");

            // Act
            socket.SendString("This is the second part of the string.\r", Encoding.ASCII);

            // Assert
            TaskAssert.NotCompleted(result, "After sending second sentence.");

            // Act
            socket.SendString("\nThis is an extra, third sentence.\r\n", Encoding.ASCII);

            // Assert
            TaskAssert.ResultEquals(result, "This is the first part of the string. This is the second part of the string.", "After sending data.");
        }
Exemple #2
0
        public void HttpSocketAdapter_ReadsContentIntoResponseHandler()
        {
            // Arrange
            MockSocketAdapter serverSocket = new MockSocketAdapter();

            serverSocket.SendString("HTTP/1.1 200 OK\r\n", Encoding.ASCII);
            serverSocket.SendString("Content-Length: 40\r\n\r\n", Encoding.ASCII);
            serverSocket.SendString("1234567890", Encoding.Unicode);

            HttpSocketAdapter clientSocket = new HttpSocketAdapter("GET", new Uri("http://bing.com"), serverSocket);

            MockResponseHandler handler = new MockResponseHandler(Encoding.Unicode);

            // Act
            clientSocket.SetResponseHandler(handler.HandlerMethod);

            // Assert
            Assert.Equal("1234567890", handler.Response);

            // Act
            Task responseComplete = clientSocket.WaitForResponseComplete();

            // Assert
            TaskAssert.NotCompleted(responseComplete, "After sending first chunk of data");

            // Act - Send too much data to complete Content-Length
            serverSocket.SendString("abcdefghijklmnopqrstuvwxyz", Encoding.Unicode);

            // Assert - Only Content-Length was read
            Assert.Equal("1234567890abcdefghij", handler.Response);
            TaskAssert.Completed(responseComplete, "After sending remaining data");
        }
        public void SocketReader_ReadBytesIntoResponseHandler_ReadsMoreBytes()
        {
            // Arrange
            MockSocketAdapter socket = new MockSocketAdapter();

            socket.SendString("This is a test. This is the next sentence.", Encoding.ASCII);

            MockResponseHandler handler = new MockResponseHandler(Encoding.ASCII);

            SocketReader reader = new SocketReader(socket);

            // Act
            Task <int> result = reader.ReadBytesIntoResponseHandler(15, handler.HandlerMethod, _dontCancel);

            // Assert
            TaskAssert.ResultEquals(result, 15);
            Assert.Equal("This is a test.", handler.Response);

            // Act
            result = reader.ReadBytesIntoResponseHandler(27, handler.HandlerMethod, _dontCancel);

            // Assert
            TaskAssert.ResultEquals(result, 27);
            Assert.Equal("This is a test. This is the next sentence.", handler.Response);
        }
        public void SocketReader_ReadBytesIntoResponseHandler_WaitsForData()
        {
            // Arrange
            MockSocketAdapter socket = new MockSocketAdapter();

            MockResponseHandler handler = new MockResponseHandler(Encoding.Unicode);

            SocketReader reader = new SocketReader(socket);

            // Act
            Task <int> result = reader.ReadBytesIntoResponseHandler(30, handler.HandlerMethod, _dontCancel);

            // Assert
            TaskAssert.NotCompleted(result, "Before any data sent");

            // Act
            socket.SendString("This is ", Encoding.Unicode);

            // Assert
            TaskAssert.NotCompleted(result, "After some data sent");

            // Act
            socket.SendString("a test. And then some.", Encoding.Unicode);

            // Assert
            TaskAssert.ResultEquals(result, 30, "After all data sent");
            Assert.Equal("This is a test.", handler.Response);
        }
        public void SocketReader_ReadBytesIntoResponseHandler_StopsReadingBytesIfCancelled()
        {
            // Arrange
            string stringToSend = "123456789";

            byte[] bufferToSend = Encoding.ASCII.GetBytes(stringToSend);

            MockSocketAdapter socket = new MockSocketAdapter();

            socket.SendBytes(bufferToSend, 0, bufferToSend.Length);

            MockResponseHandler handler = new MockResponseHandler(Encoding.ASCII);

            CancellationTokenSource cts = new CancellationTokenSource();

            SocketReader reader = new SocketReader(socket);
            Task <int>   task   = reader.ReadBytesIntoResponseHandler(bufferToSend.Length + 1, handler.HandlerMethod, cts.Token);

            // Act
            cts.Cancel();

            // Assert
            TaskAssert.ResultEquals(task, bufferToSend.Length);
            Assert.Equal(stringToSend, handler.Response);
        }
        public void SocketReader_ReadBytesIntoResponseHandler_WaitsForHandlerToComplete()
        {
            // Arrange
            MockSocketAdapter socket = new MockSocketAdapter();

            socket.SendString("This is a test. This sentence isn't read.", Encoding.UTF8);

            MockResponseHandler handler = new MockResponseHandler(Encoding.UTF8);

            handler.Block = true;

            SocketReader reader = new SocketReader(socket);

            // Act
            Task <int> result = reader.ReadBytesIntoResponseHandler(15, handler.HandlerMethod, _dontCancel);

            // Assert
            TaskAssert.NotCompleted(result, "Before handler is unblocked.");

            // Act
            handler.Block = false;

            // Assert
            TaskAssert.ResultEquals(result, 15, "After handler is unblocked.");
            Assert.Equal("This is a test.", handler.Response);
        }
        public void ScriptInjectionFilterStream_ExceptionOnSubsequentWrite()
        {
            // Arrange
            MockSocketAdapter serverSocket = new MockSocketAdapter();

            serverSocket.SendString("HTTP/1.1 200 OK\r\n", Encoding.ASCII);

            MockScriptInjectionFilterContext filterContext = new MockScriptInjectionFilterContext();

            ScriptInjectionFilterStream filterStream = CreateFilterStream(serverSocket, filterContext);

            byte[] bytesToSend = Encoding.UTF8.GetBytes("<html><head></head><body></body></html>");

            // Act I - Write some bytes
            filterStream.Write(bytesToSend, 0, 20);

            // Assert
            Assert.Contains("<html><head></head><", serverSocket.SentContent);
            AssertWithMessage.Equal(0, filterContext.GetResponseBody(Encoding.UTF8).Length, "No content should be sent to the response yet.");
            Assert.False(serverSocket.IsClosed, "Server connection should not have been closed.");

            // Act II - Attempt to write more bytes
            serverSocket.ThrowExceptionOnNextSendAsync();


            Task result = filterStream.WriteAsync(bytesToSend, 20, bytesToSend.Length - 20);

            // Assert
            TaskAssert.Faulted(result, "Exception should have been re-thrown");
            Assert.Equal("SendAsync after ThrowExceptionOnNextSendAsync was called.", result.Exception.InnerException.Message);
        }
        public void ScriptInjectionFilterStream_CompletePassthroughProcess()
        {
            // Arrange
            MockSocketAdapter serverSocket = new MockSocketAdapter();
            MockScriptInjectionFilterContext filterContext = new MockScriptInjectionFilterContext(contentType: "text/css");

            ScriptInjectionFilterStream filterStream = CreateFilterStream(serverSocket, filterContext);

            byte[] bytesToSend = Encoding.UTF8.GetBytes("body { font-size: xxlarge; } p { background-color: red }");

            // Act I - Write some bytes
            filterStream.Write(bytesToSend, 0, 20);

            // Assert
            Assert.Equal("body { font-size: xx", filterContext.GetResponseBody(Encoding.UTF8));
            Assert.True(serverSocket.IsClosed, "Server connection should be closed.");

            // Act II - Write some more bytes
            filterStream.Write(bytesToSend, 20, bytesToSend.Length - 20);

            // Assert
            Assert.Equal("body { font-size: xxlarge; } p { background-color: red }", filterContext.GetResponseBody(Encoding.UTF8));

            // Act III - Wait for complete
            Task completeTask = filterStream.FlushAsync();

            // Assert
            TaskAssert.Completed(completeTask, "Flush should complete immediately, because the filter is not being used.");
        }
        public void ScriptInjectionFilterStream_BecomesPassthroughOnTimeout()
        {
            // Arrange
            MockSocketAdapter serverSocket = new MockSocketAdapter();
            MockScriptInjectionFilterContext filterContext = new MockScriptInjectionFilterContext();

            ScriptInjectionFilterStream filterStream = CreateFilterStream(serverSocket, filterContext);

            byte[] bytesToSend = Encoding.UTF8.GetBytes("<html><head></head><body></body></html>");

            // Act I - Send some bytes
            Task writeTask = filterStream.WriteAsync(bytesToSend, 0, 20);

            // Assert
            TaskAssert.NotCompleted(writeTask, "Should be waiting for server to respond");

            // Act II - Wait for the request to time out
            System.Threading.Thread.Sleep(1100);

            // Assert
            TaskAssert.Completed(writeTask, "Write should complete when server fails to respond");
            Assert.True(serverSocket.IsClosed, "Should become passthrough");
            Assert.Equal("<html><head></head><", filterContext.GetResponseBody(Encoding.UTF8));
            AssertWithMessage.Equal(true, filterStream.ScriptInjectionTimedOut, "ScriptInjectionTimedOut");
        }
Exemple #10
0
        public void HttpSocketAdapter_GetResponseHeader_SocketException()
        {
            // Arrange
            MockSocketAdapter serverSocket = new MockSocketAdapter();

            serverSocket.SendString("HTTP/1.1 200 OK\r\n", Encoding.ASCII);

            HttpSocketAdapter clientSocket = new HttpSocketAdapter("GET", new Uri("http://bing.com"), serverSocket);

            Task <int>    responseCodeTask     = clientSocket.GetResponseStatusCode();
            Task <string> responseHeaderTask   = clientSocket.GetResponseHeader("test header");
            Task          responseCompleteTask = clientSocket.WaitForResponseComplete();

            TaskAssert.Completed(responseCodeTask, "GetResponseStatusCode should have failed.");
            AssertWithMessage.Equal(200, responseCodeTask.Result, "Wrong result for GetResponseStatusCode");

            // Act
            serverSocket.ThrowExceptionFromReceiveAsync();

            // Assert
            TaskAssert.Faulted(responseHeaderTask, "GetResponseHeader should have failed.");
            TaskAssert.Faulted(responseCompleteTask, "WaitForResponseComplete should have failed.");

            AssertWithMessage.Equal("An error occurred.", responseHeaderTask.Exception.InnerException.Message, "Wrong exception for GetResponseHeader");
            AssertWithMessage.Equal("An error occurred.", responseCompleteTask.Exception.InnerException.Message, "Wrong exception for WaitForResponseComplete");
        }
Exemple #11
0
        public void HttpSocketAdapter_ReadsChunkedContentIntoResponseHandler()
        {
            // Arrange
            MockSocketAdapter serverSocket = new MockSocketAdapter();

            serverSocket.SendString("HTTP/1.1 200 OK\r\n", Encoding.ASCII);
            serverSocket.SendString("Transfer-Encoding: chunked\r\n\r\n", Encoding.ASCII);

            HttpSocketAdapter clientSocket = new HttpSocketAdapter("GET", new Uri("http://bing.com"), serverSocket);

            MockResponseHandler handler = new MockResponseHandler(Encoding.ASCII);

            // Act
            clientSocket.SetResponseHandler(handler.HandlerMethod);

            // Assert
            Assert.Equal("", handler.Response);

            // Act
            serverSocket.SendString("C\r\nHello, world\r\n", Encoding.ASCII);

            // Assert
            Assert.Equal("Hello, world", handler.Response);

            // Act
            Task responseComplete = clientSocket.WaitForResponseComplete();

            // Assert
            TaskAssert.NotCompleted(responseComplete, "After sending 'Hello, World'");

            // Act
            serverSocket.SendString("8\r\nwide", Encoding.ASCII);

            // Assert
            Assert.Equal("Hello, worldwide", handler.Response);
            TaskAssert.NotCompleted(responseComplete, "After sending 'wide'");

            // Act
            serverSocket.SendString("!!\r\n", Encoding.ASCII);

            // Assert
            Assert.Equal("Hello, worldwide!!\r\n", handler.Response);
            TaskAssert.NotCompleted(responseComplete, "after sending '!!\r\n'");

            // Act
            serverSocket.SendString("\r\n", Encoding.ASCII);

            // Assert
            Assert.Equal("Hello, worldwide!!\r\n", handler.Response);
            TaskAssert.NotCompleted(responseComplete, "after sending '\r\n'");

            // Act
            serverSocket.SendString("0\r\n", Encoding.ASCII);

            // Assert
            Assert.Equal("Hello, worldwide!!\r\n", handler.Response);
            TaskAssert.Completed(responseComplete, "after completing the response");
        }
 public static void Faulted(Task task, string messageFormat = null, params object[] args)
 {
     if (!task.IsFaulted)
     {
         TaskAssert.ThrowFailure(
             GetMethodFailureMessage(nameof(Faulted)),
             FormatMessage(messageFormat, args));
     }
 }
        public void RevolvingBuffers_WaitForBufferEmptyAsync_ReturnsImmediatelyIfNoData()
        {
            // Arrange
            RevolvingBuffers <char> buffers = new RevolvingBuffers <char>(20);

            // Act
            Task task = buffers.WaitForBufferEmptyAsync();

            // Assert
            TaskAssert.Completed(task, "Task should be completed immediately.");
        }
        public static void NotCompleted(Task task, string messageFormat = null, params object[] args)
        {
            TaskAssert.NotFaulted(task, messageFormat, args);

            if (task.IsCompleted)
            {
                ThrowFailure(
                    GetMethodFailureMessage(nameof(NotCompleted)),
                    FormatMessage(messageFormat, args));
            }
        }
        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 TaskHelpers_WaitWithCancellation_DoesNotCompleteUntilTaskCompletes()
        {
            // Arrange
            TaskCompletionSource <string> tcs = new TaskCompletionSource <string>();
            CancellationTokenSource       cts = new CancellationTokenSource();

            // Act
            Task <string> result = TaskHelpers.WaitWithCancellation(tcs.Task, cts.Token, null);

            // Assert
            TaskAssert.NotCompleted(result);
        }
        public void TaskHelpers_WaitWithCancellation_ReturnsCompletedTask()
        {
            // Arrange
            Task <string>           task = Task.FromResult("Hello");
            CancellationTokenSource cts  = new CancellationTokenSource();

            // Act
            Task <string> result = TaskHelpers.WaitWithCancellation(task, cts.Token, null);

            // Assert
            TaskAssert.ResultEquals(result, "Hello");
        }
        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 SendResponseHeader(string name, string value)
        {
            TaskCompletionSource <string> tcs;

            if (!_responseHeaderRequests.TryGetValue(name, out tcs))
            {
                tcs = new TaskCompletionSource <string>();
                _responseHeaderRequests[name] = tcs;
            }

            TaskAssert.NotCompleted(tcs.Task, "MockHttpSocketAdapter: Response header '{0}' can only be set once.", name);

            tcs.SetResult(value);
        }
        public void TaskHelpers_WaitWithCancellation_ReturnsTaskWhenCompleted()
        {
            // Arrange
            TaskCompletionSource <string> tcs = new TaskCompletionSource <string>();
            CancellationTokenSource       cts = new CancellationTokenSource();

            Task <string> result = TaskHelpers.WaitWithCancellation(tcs.Task, cts.Token, null);

            // Act
            tcs.SetResult("Hello");

            // Assert
            TaskAssert.ResultEquals(result, "Hello");
        }
        public void TaskHelpers_WaitWithCancellation_ReturnsCancelValueWhenTokenCancels()
        {
            // Arrange
            TaskCompletionSource <string> tcs = new TaskCompletionSource <string>();
            CancellationTokenSource       cts = new CancellationTokenSource();

            Task <string> result = TaskHelpers.WaitWithCancellation(tcs.Task, cts.Token, "Cancelled");

            // Act
            cts.Cancel();

            // Assert
            TaskAssert.ResultEquals(result, "Cancelled");
        }
        public void TaskHelpers_WaitWithTimeout_ReturnsTaskResultWhenComplete()
        {
            // Arrange
            TaskCompletionSource <string> tcs = new TaskCompletionSource <string>();
            TimeSpan timeout = TimeSpan.FromMilliseconds(1000);

            Task <string> result = TaskHelpers.WaitWithTimeout(tcs.Task, timeout, null);

            // Act
            tcs.SetResult("Hello");

            // Assert
            TaskAssert.ResultEquals(result, "Hello");
        }
        public void TaskHelpers_WaitWithTimeout_HandlesTaskFault()
        {
            // Arrange
            TaskCompletionSource <string> tcs = new TaskCompletionSource <string>();
            TimeSpan timeout = TimeSpan.FromMilliseconds(1000);

            Task <string> result = TaskHelpers.WaitWithTimeout(tcs.Task, timeout, "Timed out");

            // Act
            tcs.SetException(new Exception("MY TEST ERROR"));

            // Assert
            TaskAssert.Faulted(result);
        }
        public void SocketReader_ReadLine_ReadsOneLine()
        {
            // Arrange
            MockSocketAdapter socket = new MockSocketAdapter();

            socket.SendString("This is a test.\r\nThis is left out.\r\n", Encoding.ASCII);

            SocketReader reader = new SocketReader(socket);

            // Act
            Task <string> result = reader.ReadLine(_dontCancel);

            // Assert
            TaskAssert.ResultEquals(result, "This is a test.");
        }
Exemple #25
0
        public void HttpSocketAdapter_GetResponseStatusCode_MalformedStatusLine()
        {
            // Arrange
            MockSocketAdapter serverSocket = new MockSocketAdapter();

            serverSocket.SendString("Hello\r\n", Encoding.ASCII);

            HttpSocketAdapter clientSocket = new HttpSocketAdapter("GET", new Uri("http://bing.com"), serverSocket);

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

            // Assert
            TaskAssert.ResultEquals(result, 500);
        }
        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 TaskHelpers_WaitWithCancellation_ResturnsTaskResultIfTaskCompleteAndCanceledSimultaneously()
        {
            // Arrange
            TaskCompletionSource <string> tcs = new TaskCompletionSource <string>();
            CancellationTokenSource       cts = new CancellationTokenSource();

            tcs.SetResult("Not Cancelled");
            cts.Cancel();

            // Act
            Task <string> result = TaskHelpers.WaitWithCancellation(tcs.Task, cts.Token, "Cancelled");

            // Assert
            TaskAssert.ResultEquals(result, "Not Cancelled");
        }
        public void TaskHelpers_WaitWithTimeout_ReturnsTimeoutResultIfTaskNotComplete()
        {
            // Arrange
            TaskCompletionSource <string> tcs = new TaskCompletionSource <string>();
            TimeSpan timeout = TimeSpan.FromMilliseconds(500);

            Task <string> result = TaskHelpers.WaitWithTimeout(tcs.Task, timeout, "Timed out");

            // Act
            bool completed = result.Wait(millisecondsTimeout: 550);

            // Assert
            Assert.True(completed, "Task did not time out");
            TaskAssert.ResultEquals(result, "Timed out");
        }
        public void SocketReader_ReadLine_IgnoresUnmatchedLineFeed()
        {
            // Arrange
            MockSocketAdapter socket = new MockSocketAdapter();

            socket.SendString("This is a test\rof an unmatched \n\r\n", Encoding.ASCII);

            SocketReader reader = new SocketReader(socket);

            // Act
            Task <string> result = reader.ReadLine(_dontCancel);

            // Assert
            TaskAssert.ResultEquals(result, "This is a test\rof an unmatched \n");
        }
        public void RevolvingBuffers_WaitForBufferEmptyAsync_WaitsAfterDataHasBeenWritten()
        {
            // Arrange
            char[] data = "Hello, world!".ToArray();

            RevolvingBuffers <char> buffers = new RevolvingBuffers <char>(20);

            buffers.CopyDataToBuffer(data, 0, 2);

            // Act
            Task task = buffers.WaitForBufferEmptyAsync();

            // Assert
            TaskAssert.NotCompleted(task, "Task should not be completed until data is read.");
        }