| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/websockets/websocket_handshake_stream_create_helper.h" | 5 #include "net/websockets/websocket_handshake_stream_create_helper.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "net/base/completion_callback.h" | 10 #include "net/base/completion_callback.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 void OnSSLCertificateError( | 69 void OnSSLCertificateError( |
| 70 scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks> | 70 scoped_ptr<WebSocketEventInterface::SSLErrorCallbacks> |
| 71 ssl_error_callbacks, | 71 ssl_error_callbacks, |
| 72 const SSLInfo& ssl_info, | 72 const SSLInfo& ssl_info, |
| 73 bool fatal) override {} | 73 bool fatal) override {} |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 class WebSocketHandshakeStreamCreateHelperTest : public ::testing::Test { | 76 class WebSocketHandshakeStreamCreateHelperTest : public ::testing::Test { |
| 77 protected: | 77 protected: |
| 78 scoped_ptr<WebSocketStream> CreateAndInitializeStream( | 78 scoped_ptr<WebSocketStream> CreateAndInitializeStream( |
| 79 const std::string& socket_url, | |
| 80 const std::string& socket_host, | |
| 81 const std::string& socket_path, | |
| 82 const std::vector<std::string>& sub_protocols, | 79 const std::vector<std::string>& sub_protocols, |
| 83 const std::string& origin, | |
| 84 const std::string& extra_request_headers, | 80 const std::string& extra_request_headers, |
| 85 const std::string& extra_response_headers) { | 81 const std::string& extra_response_headers) { |
| 82 static const char kOrigin[] = "http://localhost"; |
| 86 WebSocketHandshakeStreamCreateHelper create_helper(&connect_delegate_, | 83 WebSocketHandshakeStreamCreateHelper create_helper(&connect_delegate_, |
| 87 sub_protocols); | 84 sub_protocols); |
| 88 create_helper.set_failure_message(&failure_message_); | 85 create_helper.set_failure_message(&failure_message_); |
| 89 | 86 |
| 90 scoped_ptr<ClientSocketHandle> socket_handle = | 87 scoped_ptr<ClientSocketHandle> socket_handle = |
| 91 socket_handle_factory_.CreateClientSocketHandle( | 88 socket_handle_factory_.CreateClientSocketHandle( |
| 92 WebSocketStandardRequest(socket_path, socket_host, | 89 WebSocketStandardRequest("/", "localhost", |
| 93 url::Origin(GURL(origin)), | 90 url::Origin(GURL(kOrigin)), |
| 94 extra_request_headers), | 91 extra_request_headers), |
| 95 WebSocketStandardResponse(extra_response_headers)); | 92 WebSocketStandardResponse(extra_response_headers)); |
| 96 | 93 |
| 97 scoped_ptr<WebSocketHandshakeStreamBase> handshake( | 94 scoped_ptr<WebSocketHandshakeStreamBase> handshake( |
| 98 create_helper.CreateBasicStream(socket_handle.Pass(), false)); | 95 create_helper.CreateBasicStream(socket_handle.Pass(), false)); |
| 99 | 96 |
| 100 // If in future the implementation type returned by CreateBasicStream() | 97 // If in future the implementation type returned by CreateBasicStream() |
| 101 // changes, this static_cast will be wrong. However, in that case the test | 98 // changes, this static_cast will be wrong. However, in that case the test |
| 102 // will fail and AddressSanitizer should identify the issue. | 99 // will fail and AddressSanitizer should identify the issue. |
| 103 static_cast<WebSocketBasicHandshakeStream*>(handshake.get()) | 100 static_cast<WebSocketBasicHandshakeStream*>(handshake.get()) |
| 104 ->SetWebSocketKeyForTesting("dGhlIHNhbXBsZSBub25jZQ=="); | 101 ->SetWebSocketKeyForTesting("dGhlIHNhbXBsZSBub25jZQ=="); |
| 105 | 102 |
| 106 HttpRequestInfo request_info; | 103 HttpRequestInfo request_info; |
| 107 request_info.url = GURL(socket_url); | 104 request_info.url = GURL("ws://localhost/"); |
| 108 request_info.method = "GET"; | 105 request_info.method = "GET"; |
| 109 request_info.load_flags = LOAD_DISABLE_CACHE; | 106 request_info.load_flags = LOAD_DISABLE_CACHE; |
| 110 int rv = handshake->InitializeStream( | 107 int rv = handshake->InitializeStream( |
| 111 &request_info, DEFAULT_PRIORITY, BoundNetLog(), CompletionCallback()); | 108 &request_info, DEFAULT_PRIORITY, BoundNetLog(), CompletionCallback()); |
| 112 EXPECT_EQ(OK, rv); | 109 EXPECT_EQ(OK, rv); |
| 113 | 110 |
| 114 HttpRequestHeaders headers; | 111 HttpRequestHeaders headers; |
| 115 headers.SetHeader("Host", "localhost"); | 112 headers.SetHeader("Host", "localhost"); |
| 116 headers.SetHeader("Connection", "Upgrade"); | 113 headers.SetHeader("Connection", "Upgrade"); |
| 117 headers.SetHeader("Pragma", "no-cache"); | 114 headers.SetHeader("Pragma", "no-cache"); |
| 118 headers.SetHeader("Cache-Control", "no-cache"); | 115 headers.SetHeader("Cache-Control", "no-cache"); |
| 119 headers.SetHeader("Upgrade", "websocket"); | 116 headers.SetHeader("Upgrade", "websocket"); |
| 120 headers.SetHeader("Origin", origin); | 117 headers.SetHeader("Origin", kOrigin); |
| 121 headers.SetHeader("Sec-WebSocket-Version", "13"); | 118 headers.SetHeader("Sec-WebSocket-Version", "13"); |
| 122 headers.SetHeader("User-Agent", ""); | 119 headers.SetHeader("User-Agent", ""); |
| 123 headers.SetHeader("Accept-Encoding", "gzip, deflate"); | 120 headers.SetHeader("Accept-Encoding", "gzip, deflate"); |
| 124 headers.SetHeader("Accept-Language", "en-us,fr"); | 121 headers.SetHeader("Accept-Language", "en-us,fr"); |
| 125 | 122 |
| 126 HttpResponseInfo response; | 123 HttpResponseInfo response; |
| 127 TestCompletionCallback dummy; | 124 TestCompletionCallback dummy; |
| 128 | 125 |
| 129 rv = handshake->SendRequest(headers, &response, dummy.callback()); | 126 rv = handshake->SendRequest(headers, &response, dummy.callback()); |
| 130 | 127 |
| 131 EXPECT_EQ(OK, rv); | 128 EXPECT_EQ(OK, rv); |
| 132 | 129 |
| 133 rv = handshake->ReadResponseHeaders(dummy.callback()); | 130 rv = handshake->ReadResponseHeaders(dummy.callback()); |
| 134 EXPECT_EQ(OK, rv); | 131 EXPECT_EQ(OK, rv); |
| 135 EXPECT_EQ(101, response.headers->response_code()); | 132 EXPECT_EQ(101, response.headers->response_code()); |
| 136 EXPECT_TRUE(response.headers->HasHeaderValue("Connection", "Upgrade")); | 133 EXPECT_TRUE(response.headers->HasHeaderValue("Connection", "Upgrade")); |
| 137 EXPECT_TRUE(response.headers->HasHeaderValue("Upgrade", "websocket")); | 134 EXPECT_TRUE(response.headers->HasHeaderValue("Upgrade", "websocket")); |
| 138 return handshake->Upgrade(); | 135 return handshake->Upgrade(); |
| 139 } | 136 } |
| 140 | 137 |
| 141 MockClientSocketHandleFactory socket_handle_factory_; | 138 MockClientSocketHandleFactory socket_handle_factory_; |
| 142 TestConnectDelegate connect_delegate_; | 139 TestConnectDelegate connect_delegate_; |
| 143 std::string failure_message_; | 140 std::string failure_message_; |
| 144 }; | 141 }; |
| 145 | 142 |
| 146 // Confirm that the basic case works as expected. | 143 // Confirm that the basic case works as expected. |
| 147 TEST_F(WebSocketHandshakeStreamCreateHelperTest, BasicStream) { | 144 TEST_F(WebSocketHandshakeStreamCreateHelperTest, BasicStream) { |
| 148 scoped_ptr<WebSocketStream> stream = CreateAndInitializeStream( | 145 scoped_ptr<WebSocketStream> stream = |
| 149 "ws://localhost/", "localhost", "/", std::vector<std::string>(), | 146 CreateAndInitializeStream(std::vector<std::string>(), "", ""); |
| 150 "http://localhost", "", ""); | |
| 151 EXPECT_EQ("", stream->GetExtensions()); | 147 EXPECT_EQ("", stream->GetExtensions()); |
| 152 EXPECT_EQ("", stream->GetSubProtocol()); | 148 EXPECT_EQ("", stream->GetSubProtocol()); |
| 153 } | 149 } |
| 154 | 150 |
| 155 // Verify that the sub-protocols are passed through. | 151 // Verify that the sub-protocols are passed through. |
| 156 TEST_F(WebSocketHandshakeStreamCreateHelperTest, SubProtocols) { | 152 TEST_F(WebSocketHandshakeStreamCreateHelperTest, SubProtocols) { |
| 157 std::vector<std::string> sub_protocols; | 153 std::vector<std::string> sub_protocols; |
| 158 sub_protocols.push_back("chat"); | 154 sub_protocols.push_back("chat"); |
| 159 sub_protocols.push_back("superchat"); | 155 sub_protocols.push_back("superchat"); |
| 160 scoped_ptr<WebSocketStream> stream = CreateAndInitializeStream( | 156 scoped_ptr<WebSocketStream> stream = CreateAndInitializeStream( |
| 161 "ws://localhost/", "localhost", "/", sub_protocols, "http://localhost", | 157 sub_protocols, "Sec-WebSocket-Protocol: chat, superchat\r\n", |
| 162 "Sec-WebSocket-Protocol: chat, superchat\r\n", | |
| 163 "Sec-WebSocket-Protocol: superchat\r\n"); | 158 "Sec-WebSocket-Protocol: superchat\r\n"); |
| 164 EXPECT_EQ("superchat", stream->GetSubProtocol()); | 159 EXPECT_EQ("superchat", stream->GetSubProtocol()); |
| 165 } | 160 } |
| 166 | 161 |
| 167 // Verify that extension name is available. Bad extension names are tested in | 162 // Verify that extension name is available. Bad extension names are tested in |
| 168 // websocket_stream_test.cc. | 163 // websocket_stream_test.cc. |
| 169 TEST_F(WebSocketHandshakeStreamCreateHelperTest, Extensions) { | 164 TEST_F(WebSocketHandshakeStreamCreateHelperTest, Extensions) { |
| 170 scoped_ptr<WebSocketStream> stream = CreateAndInitializeStream( | 165 scoped_ptr<WebSocketStream> stream = CreateAndInitializeStream( |
| 171 "ws://localhost/", "localhost", "/", std::vector<std::string>(), | 166 std::vector<std::string>(), "", |
| 172 "http://localhost", "", | |
| 173 "Sec-WebSocket-Extensions: permessage-deflate\r\n"); | 167 "Sec-WebSocket-Extensions: permessage-deflate\r\n"); |
| 174 EXPECT_EQ("permessage-deflate", stream->GetExtensions()); | 168 EXPECT_EQ("permessage-deflate", stream->GetExtensions()); |
| 175 } | 169 } |
| 176 | 170 |
| 177 // Verify that extension parameters are available. Bad parameters are tested in | 171 // Verify that extension parameters are available. Bad parameters are tested in |
| 178 // websocket_stream_test.cc. | 172 // websocket_stream_test.cc. |
| 179 TEST_F(WebSocketHandshakeStreamCreateHelperTest, ExtensionParameters) { | 173 TEST_F(WebSocketHandshakeStreamCreateHelperTest, ExtensionParameters) { |
| 180 scoped_ptr<WebSocketStream> stream = CreateAndInitializeStream( | 174 scoped_ptr<WebSocketStream> stream = CreateAndInitializeStream( |
| 181 "ws://localhost/", "localhost", "/", std::vector<std::string>(), | 175 std::vector<std::string>(), "", |
| 182 "http://localhost", "", | |
| 183 "Sec-WebSocket-Extensions: permessage-deflate;" | 176 "Sec-WebSocket-Extensions: permessage-deflate;" |
| 184 " client_max_window_bits=14; server_max_window_bits=14;" | 177 " client_max_window_bits=14; server_max_window_bits=14;" |
| 185 " server_no_context_takeover; client_no_context_takeover\r\n"); | 178 " server_no_context_takeover; client_no_context_takeover\r\n"); |
| 186 | 179 |
| 187 EXPECT_EQ( | 180 EXPECT_EQ( |
| 188 "permessage-deflate;" | 181 "permessage-deflate;" |
| 189 " client_max_window_bits=14; server_max_window_bits=14;" | 182 " client_max_window_bits=14; server_max_window_bits=14;" |
| 190 " server_no_context_takeover; client_no_context_takeover", | 183 " server_no_context_takeover; client_no_context_takeover", |
| 191 stream->GetExtensions()); | 184 stream->GetExtensions()); |
| 192 } | 185 } |
| 193 | 186 |
| 194 } // namespace | 187 } // namespace |
| 195 } // namespace net | 188 } // namespace net |
| OLD | NEW |