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 |