[net/http] Add HttpStreamParser.Websocket101Response test

Verify that after parsing 1xx response with 
ReadResponseHeaders, HttpResponseInfo contains the parsed 
headers and the response buffer contains the response that 
follows.

Review URL: https://codereview.chromium.org/45823003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@233428 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/net/http/http_stream_parser_unittest.cc b/net/http/http_stream_parser_unittest.cc
index 1c464b6..30384841 100644
--- a/net/http/http_stream_parser_unittest.cc
+++ b/net/http/http_stream_parser_unittest.cc
@@ -19,6 +19,7 @@
 #include "net/base/upload_file_element_reader.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_request_info.h"
+#include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/socket_test_util.h"
@@ -422,4 +423,65 @@
   }
 }
 
+// Confirm that on 101 response, the headers are parsed but the data that
+// follows remains in the buffer.
+TEST(HttpStreamParser, Websocket101Response) {
+  MockRead reads[] = {
+    MockRead(SYNCHRONOUS, 1,
+             "HTTP/1.1 101 Switching Protocols\r\n"
+             "Upgrade: websocket\r\n"
+             "Connection: Upgrade\r\n"
+             "\r\n"
+             "a fake websocket frame"),
+  };
+
+  MockWrite writes[] = {
+    MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n\r\n"),
+  };
+
+  DeterministicSocketData data(reads, arraysize(reads),
+                               writes, arraysize(writes));
+  data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
+  data.SetStop(2);
+
+  scoped_ptr<DeterministicMockTCPClientSocket> transport(
+      new DeterministicMockTCPClientSocket(NULL, &data));
+  data.set_delegate(transport->AsWeakPtr());
+
+  TestCompletionCallback callback;
+  int rv = transport->Connect(callback.callback());
+  rv = callback.GetResult(rv);
+  ASSERT_EQ(OK, rv);
+
+  scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle);
+  socket_handle->SetSocket(transport.PassAs<StreamSocket>());
+
+  HttpRequestInfo request_info;
+  request_info.method = "GET";
+  request_info.url = GURL("http://localhost");
+  request_info.load_flags = LOAD_NORMAL;
+
+  scoped_refptr<GrowableIOBuffer> read_buffer(new GrowableIOBuffer);
+  HttpStreamParser parser(
+      socket_handle.get(), &request_info, read_buffer.get(), BoundNetLog());
+
+  HttpRequestHeaders request_headers;
+  HttpResponseInfo response_info;
+  rv = parser.SendRequest("GET / HTTP/1.1\r\n", request_headers,
+                          &response_info, callback.callback());
+  ASSERT_EQ(OK, rv);
+
+  rv = parser.ReadResponseHeaders(callback.callback());
+  EXPECT_EQ(OK, rv);
+  ASSERT_TRUE(response_info.headers.get());
+  EXPECT_EQ(101, response_info.headers->response_code());
+  EXPECT_TRUE(response_info.headers->HasHeaderValue("Connection", "Upgrade"));
+  EXPECT_TRUE(response_info.headers->HasHeaderValue("Upgrade", "websocket"));
+  EXPECT_EQ(read_buffer->capacity(), read_buffer->offset());
+  EXPECT_EQ("a fake websocket frame",
+            base::StringPiece(read_buffer->StartOfBuffer(),
+                              read_buffer->capacity()));
+}
+
+
 }  // namespace net