| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/socket_stream/socket_stream.h" | 5 #include "net/socket_stream/socket_stream.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/callback.h" | 12 #include "base/callback.h" |
| 13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "net/base/auth.h" | 14 #include "net/base/auth.h" |
| 15 #include "net/base/mock_host_resolver.h" | 15 #include "net/base/mock_host_resolver.h" |
| 16 #include "net/base/net_log.h" | 16 #include "net/base/net_log.h" |
| 17 #include "net/base/net_log_unittest.h" | 17 #include "net/base/net_log_unittest.h" |
| 18 #include "net/base/test_completion_callback.h" | 18 #include "net/base/test_completion_callback.h" |
| 19 #include "net/http/http_network_session.h" | 19 #include "net/http/http_network_session.h" |
| 20 #include "net/proxy/proxy_service.h" | 20 #include "net/proxy/proxy_service.h" |
| 21 #include "net/socket/socket_test_util.h" | 21 #include "net/socket/socket_test_util.h" |
| 22 #include "net/url_request/url_request_test_util.h" | 22 #include "net/url_request/url_request_test_util.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 24 #include "testing/platform_test.h" | 24 #include "testing/platform_test.h" |
| 25 | 25 |
| 26 namespace net { |
| 27 |
| 26 namespace { | 28 namespace { |
| 27 | 29 |
| 28 struct SocketStreamEvent { | 30 struct SocketStreamEvent { |
| 29 enum EventType { | 31 enum EventType { |
| 30 EVENT_START_OPEN_CONNECTION, EVENT_CONNECTED, EVENT_SENT_DATA, | 32 EVENT_START_OPEN_CONNECTION, EVENT_CONNECTED, EVENT_SENT_DATA, |
| 31 EVENT_RECEIVED_DATA, EVENT_CLOSE, EVENT_AUTH_REQUIRED, EVENT_ERROR, | 33 EVENT_RECEIVED_DATA, EVENT_CLOSE, EVENT_AUTH_REQUIRED, EVENT_ERROR, |
| 32 }; | 34 }; |
| 33 | 35 |
| 34 SocketStreamEvent(EventType type, | 36 SocketStreamEvent(EventType type, |
| 35 net::SocketStream* socket_stream, | 37 SocketStream* socket_stream, |
| 36 int num, | 38 int num, |
| 37 const std::string& str, | 39 const std::string& str, |
| 38 net::AuthChallengeInfo* auth_challenge_info, | 40 AuthChallengeInfo* auth_challenge_info, |
| 39 int error) | 41 int error) |
| 40 : event_type(type), socket(socket_stream), number(num), data(str), | 42 : event_type(type), socket(socket_stream), number(num), data(str), |
| 41 auth_info(auth_challenge_info), error_code(error) {} | 43 auth_info(auth_challenge_info), error_code(error) {} |
| 42 | 44 |
| 43 EventType event_type; | 45 EventType event_type; |
| 44 net::SocketStream* socket; | 46 SocketStream* socket; |
| 45 int number; | 47 int number; |
| 46 std::string data; | 48 std::string data; |
| 47 scoped_refptr<net::AuthChallengeInfo> auth_info; | 49 scoped_refptr<AuthChallengeInfo> auth_info; |
| 48 int error_code; | 50 int error_code; |
| 49 }; | 51 }; |
| 50 | 52 |
| 51 class SocketStreamEventRecorder : public net::SocketStream::Delegate { | 53 class SocketStreamEventRecorder : public SocketStream::Delegate { |
| 52 public: | 54 public: |
| 53 explicit SocketStreamEventRecorder(const net::CompletionCallback& callback) | 55 explicit SocketStreamEventRecorder(const CompletionCallback& callback) |
| 54 : callback_(callback) {} | 56 : callback_(callback) {} |
| 55 virtual ~SocketStreamEventRecorder() {} | 57 virtual ~SocketStreamEventRecorder() {} |
| 56 | 58 |
| 57 void SetOnStartOpenConnection( | 59 void SetOnStartOpenConnection( |
| 58 const base::Callback<int(SocketStreamEvent*)>& callback) { | 60 const base::Callback<int(SocketStreamEvent*)>& callback) { |
| 59 on_start_open_connection_ = callback; | 61 on_start_open_connection_ = callback; |
| 60 } | 62 } |
| 61 void SetOnConnected( | 63 void SetOnConnected( |
| 62 const base::Callback<void(SocketStreamEvent*)>& callback) { | 64 const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 63 on_connected_ = callback; | 65 on_connected_ = callback; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 75 } | 77 } |
| 76 void SetOnAuthRequired( | 78 void SetOnAuthRequired( |
| 77 const base::Callback<void(SocketStreamEvent*)>& callback) { | 79 const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 78 on_auth_required_ = callback; | 80 on_auth_required_ = callback; |
| 79 } | 81 } |
| 80 void SetOnError(const base::Callback<void(SocketStreamEvent*)>& callback) { | 82 void SetOnError(const base::Callback<void(SocketStreamEvent*)>& callback) { |
| 81 on_error_ = callback; | 83 on_error_ = callback; |
| 82 } | 84 } |
| 83 | 85 |
| 84 virtual int OnStartOpenConnection( | 86 virtual int OnStartOpenConnection( |
| 85 net::SocketStream* socket, | 87 SocketStream* socket, |
| 86 const net::CompletionCallback& callback) OVERRIDE { | 88 const CompletionCallback& callback) OVERRIDE { |
| 87 connection_callback_ = callback; | 89 connection_callback_ = callback; |
| 88 events_.push_back( | 90 events_.push_back( |
| 89 SocketStreamEvent(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 91 SocketStreamEvent(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 90 socket, 0, std::string(), NULL, net::OK)); | 92 socket, 0, std::string(), NULL, OK)); |
| 91 if (!on_start_open_connection_.is_null()) | 93 if (!on_start_open_connection_.is_null()) |
| 92 return on_start_open_connection_.Run(&events_.back()); | 94 return on_start_open_connection_.Run(&events_.back()); |
| 93 return net::OK; | 95 return OK; |
| 94 } | 96 } |
| 95 virtual void OnConnected(net::SocketStream* socket, | 97 virtual void OnConnected(SocketStream* socket, |
| 96 int num_pending_send_allowed) OVERRIDE { | 98 int num_pending_send_allowed) OVERRIDE { |
| 97 events_.push_back( | 99 events_.push_back( |
| 98 SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED, | 100 SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED, |
| 99 socket, num_pending_send_allowed, std::string(), | 101 socket, num_pending_send_allowed, std::string(), |
| 100 NULL, net::OK)); | 102 NULL, OK)); |
| 101 if (!on_connected_.is_null()) | 103 if (!on_connected_.is_null()) |
| 102 on_connected_.Run(&events_.back()); | 104 on_connected_.Run(&events_.back()); |
| 103 } | 105 } |
| 104 virtual void OnSentData(net::SocketStream* socket, | 106 virtual void OnSentData(SocketStream* socket, |
| 105 int amount_sent) OVERRIDE { | 107 int amount_sent) OVERRIDE { |
| 106 events_.push_back( | 108 events_.push_back( |
| 107 SocketStreamEvent(SocketStreamEvent::EVENT_SENT_DATA, socket, | 109 SocketStreamEvent(SocketStreamEvent::EVENT_SENT_DATA, socket, |
| 108 amount_sent, std::string(), NULL, net::OK)); | 110 amount_sent, std::string(), NULL, OK)); |
| 109 if (!on_sent_data_.is_null()) | 111 if (!on_sent_data_.is_null()) |
| 110 on_sent_data_.Run(&events_.back()); | 112 on_sent_data_.Run(&events_.back()); |
| 111 } | 113 } |
| 112 virtual void OnReceivedData(net::SocketStream* socket, | 114 virtual void OnReceivedData(SocketStream* socket, |
| 113 const char* data, int len) OVERRIDE { | 115 const char* data, int len) OVERRIDE { |
| 114 events_.push_back( | 116 events_.push_back( |
| 115 SocketStreamEvent(SocketStreamEvent::EVENT_RECEIVED_DATA, socket, len, | 117 SocketStreamEvent(SocketStreamEvent::EVENT_RECEIVED_DATA, socket, len, |
| 116 std::string(data, len), NULL, net::OK)); | 118 std::string(data, len), NULL, OK)); |
| 117 if (!on_received_data_.is_null()) | 119 if (!on_received_data_.is_null()) |
| 118 on_received_data_.Run(&events_.back()); | 120 on_received_data_.Run(&events_.back()); |
| 119 } | 121 } |
| 120 virtual void OnClose(net::SocketStream* socket) OVERRIDE { | 122 virtual void OnClose(SocketStream* socket) OVERRIDE { |
| 121 events_.push_back( | 123 events_.push_back( |
| 122 SocketStreamEvent(SocketStreamEvent::EVENT_CLOSE, socket, 0, | 124 SocketStreamEvent(SocketStreamEvent::EVENT_CLOSE, socket, 0, |
| 123 std::string(), NULL, net::OK)); | 125 std::string(), NULL, OK)); |
| 124 if (!on_close_.is_null()) | 126 if (!on_close_.is_null()) |
| 125 on_close_.Run(&events_.back()); | 127 on_close_.Run(&events_.back()); |
| 126 if (!callback_.is_null()) | 128 if (!callback_.is_null()) |
| 127 callback_.Run(net::OK); | 129 callback_.Run(OK); |
| 128 } | 130 } |
| 129 virtual void OnAuthRequired(net::SocketStream* socket, | 131 virtual void OnAuthRequired(SocketStream* socket, |
| 130 net::AuthChallengeInfo* auth_info) OVERRIDE { | 132 AuthChallengeInfo* auth_info) OVERRIDE { |
| 131 events_.push_back( | 133 events_.push_back( |
| 132 SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED, socket, 0, | 134 SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED, socket, 0, |
| 133 std::string(), auth_info, net::OK)); | 135 std::string(), auth_info, OK)); |
| 134 if (!on_auth_required_.is_null()) | 136 if (!on_auth_required_.is_null()) |
| 135 on_auth_required_.Run(&events_.back()); | 137 on_auth_required_.Run(&events_.back()); |
| 136 } | 138 } |
| 137 virtual void OnError(const net::SocketStream* socket, int error) OVERRIDE { | 139 virtual void OnError(const SocketStream* socket, int error) OVERRIDE { |
| 138 events_.push_back( | 140 events_.push_back( |
| 139 SocketStreamEvent(SocketStreamEvent::EVENT_ERROR, NULL, 0, | 141 SocketStreamEvent(SocketStreamEvent::EVENT_ERROR, NULL, 0, |
| 140 std::string(), NULL, error)); | 142 std::string(), NULL, error)); |
| 141 if (!on_error_.is_null()) | 143 if (!on_error_.is_null()) |
| 142 on_error_.Run(&events_.back()); | 144 on_error_.Run(&events_.back()); |
| 143 if (!callback_.is_null()) | 145 if (!callback_.is_null()) |
| 144 callback_.Run(error); | 146 callback_.Run(error); |
| 145 } | 147 } |
| 146 | 148 |
| 147 void DoClose(SocketStreamEvent* event) { | 149 void DoClose(SocketStreamEvent* event) { |
| 148 event->socket->Close(); | 150 event->socket->Close(); |
| 149 } | 151 } |
| 150 void DoRestartWithAuth(SocketStreamEvent* event) { | 152 void DoRestartWithAuth(SocketStreamEvent* event) { |
| 151 VLOG(1) << "RestartWithAuth username=" << credentials_.username() | 153 VLOG(1) << "RestartWithAuth username=" << credentials_.username() |
| 152 << " password=" << credentials_.password(); | 154 << " password=" << credentials_.password(); |
| 153 event->socket->RestartWithAuth(credentials_); | 155 event->socket->RestartWithAuth(credentials_); |
| 154 } | 156 } |
| 155 void SetAuthInfo(const net::AuthCredentials& credentials) { | 157 void SetAuthInfo(const AuthCredentials& credentials) { |
| 156 credentials_ = credentials; | 158 credentials_ = credentials; |
| 157 } | 159 } |
| 158 void CompleteConnection(int result) { | 160 void CompleteConnection(int result) { |
| 159 connection_callback_.Run(result); | 161 connection_callback_.Run(result); |
| 160 } | 162 } |
| 161 | 163 |
| 162 const std::vector<SocketStreamEvent>& GetSeenEvents() const { | 164 const std::vector<SocketStreamEvent>& GetSeenEvents() const { |
| 163 return events_; | 165 return events_; |
| 164 } | 166 } |
| 165 | 167 |
| 166 private: | 168 private: |
| 167 std::vector<SocketStreamEvent> events_; | 169 std::vector<SocketStreamEvent> events_; |
| 168 base::Callback<int(SocketStreamEvent*)> on_start_open_connection_; | 170 base::Callback<int(SocketStreamEvent*)> on_start_open_connection_; |
| 169 base::Callback<void(SocketStreamEvent*)> on_connected_; | 171 base::Callback<void(SocketStreamEvent*)> on_connected_; |
| 170 base::Callback<void(SocketStreamEvent*)> on_sent_data_; | 172 base::Callback<void(SocketStreamEvent*)> on_sent_data_; |
| 171 base::Callback<void(SocketStreamEvent*)> on_received_data_; | 173 base::Callback<void(SocketStreamEvent*)> on_received_data_; |
| 172 base::Callback<void(SocketStreamEvent*)> on_close_; | 174 base::Callback<void(SocketStreamEvent*)> on_close_; |
| 173 base::Callback<void(SocketStreamEvent*)> on_auth_required_; | 175 base::Callback<void(SocketStreamEvent*)> on_auth_required_; |
| 174 base::Callback<void(SocketStreamEvent*)> on_error_; | 176 base::Callback<void(SocketStreamEvent*)> on_error_; |
| 175 const net::CompletionCallback callback_; | 177 const CompletionCallback callback_; |
| 176 net::CompletionCallback connection_callback_; | 178 CompletionCallback connection_callback_; |
| 177 net::AuthCredentials credentials_; | 179 AuthCredentials credentials_; |
| 178 | 180 |
| 179 DISALLOW_COPY_AND_ASSIGN(SocketStreamEventRecorder); | 181 DISALLOW_COPY_AND_ASSIGN(SocketStreamEventRecorder); |
| 180 }; | 182 }; |
| 181 | 183 |
| 182 class TestURLRequestContextWithProxy : public TestURLRequestContext { | 184 class TestURLRequestContextWithProxy : public TestURLRequestContext { |
| 183 public: | 185 public: |
| 184 explicit TestURLRequestContextWithProxy(const std::string& proxy) | 186 explicit TestURLRequestContextWithProxy(const std::string& proxy) |
| 185 : TestURLRequestContext(true) { | 187 : TestURLRequestContext(true) { |
| 186 context_storage_.set_proxy_service(net::ProxyService::CreateFixed(proxy)); | 188 context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy)); |
| 187 Init(); | 189 Init(); |
| 188 } | 190 } |
| 189 virtual ~TestURLRequestContextWithProxy() {} | 191 virtual ~TestURLRequestContextWithProxy() {} |
| 190 }; | 192 }; |
| 191 | 193 |
| 192 class TestSocketStreamNetworkDelegate : public TestNetworkDelegate { | 194 class TestSocketStreamNetworkDelegate : public TestNetworkDelegate { |
| 193 public: | 195 public: |
| 194 TestSocketStreamNetworkDelegate() | 196 TestSocketStreamNetworkDelegate() |
| 195 : before_connect_result_(net::OK) {} | 197 : before_connect_result_(OK) {} |
| 196 virtual ~TestSocketStreamNetworkDelegate() {} | 198 virtual ~TestSocketStreamNetworkDelegate() {} |
| 197 | 199 |
| 198 virtual int OnBeforeSocketStreamConnect( | 200 virtual int OnBeforeSocketStreamConnect( |
| 199 net::SocketStream* stream, | 201 SocketStream* stream, |
| 200 const net::CompletionCallback& callback) OVERRIDE { | 202 const CompletionCallback& callback) OVERRIDE { |
| 201 return before_connect_result_; | 203 return before_connect_result_; |
| 202 } | 204 } |
| 203 | 205 |
| 204 void SetBeforeConnectResult(int result) { | 206 void SetBeforeConnectResult(int result) { |
| 205 before_connect_result_ = result; | 207 before_connect_result_ = result; |
| 206 } | 208 } |
| 207 | 209 |
| 208 private: | 210 private: |
| 209 int before_connect_result_; | 211 int before_connect_result_; |
| 210 }; | 212 }; |
| 211 | 213 |
| 212 } // namespace | 214 } // namespace |
| 213 | 215 |
| 214 namespace net { | |
| 215 | |
| 216 class SocketStreamTest : public PlatformTest { | 216 class SocketStreamTest : public PlatformTest { |
| 217 public: | 217 public: |
| 218 virtual ~SocketStreamTest() {} | 218 virtual ~SocketStreamTest() {} |
| 219 virtual void SetUp() { | 219 virtual void SetUp() { |
| 220 mock_socket_factory_.reset(); | 220 mock_socket_factory_.reset(); |
| 221 handshake_request_ = kWebSocketHandshakeRequest; | 221 handshake_request_ = kWebSocketHandshakeRequest; |
| 222 handshake_response_ = kWebSocketHandshakeResponse; | 222 handshake_response_ = kWebSocketHandshakeResponse; |
| 223 } | 223 } |
| 224 virtual void TearDown() { | 224 virtual void TearDown() { |
| 225 mock_socket_factory_.reset(); | 225 mock_socket_factory_.reset(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 252 frame.insert(frame.end(), messages_[i].begin(), messages_[i].end()); | 252 frame.insert(frame.end(), messages_[i].begin(), messages_[i].end()); |
| 253 frame.push_back('\xff'); | 253 frame.push_back('\xff'); |
| 254 EXPECT_TRUE(event->socket->SendData(&frame[0], frame.size())); | 254 EXPECT_TRUE(event->socket->SendData(&frame[0], frame.size())); |
| 255 } | 255 } |
| 256 // Actual StreamSocket close must happen after all frames queued by | 256 // Actual StreamSocket close must happen after all frames queued by |
| 257 // SendData above are sent out. | 257 // SendData above are sent out. |
| 258 event->socket->Close(); | 258 event->socket->Close(); |
| 259 } | 259 } |
| 260 | 260 |
| 261 virtual int DoSwitchToSpdyTest(SocketStreamEvent* event) { | 261 virtual int DoSwitchToSpdyTest(SocketStreamEvent* event) { |
| 262 return net::ERR_PROTOCOL_SWITCHED; | 262 return ERR_PROTOCOL_SWITCHED; |
| 263 } | 263 } |
| 264 | 264 |
| 265 virtual int DoIOPending(SocketStreamEvent* event) { | 265 virtual int DoIOPending(SocketStreamEvent* event) { |
| 266 io_test_callback_.callback().Run(net::OK); | 266 io_test_callback_.callback().Run(OK); |
| 267 return net::ERR_IO_PENDING; | 267 return ERR_IO_PENDING; |
| 268 } | 268 } |
| 269 | 269 |
| 270 static const char kWebSocketHandshakeRequest[]; | 270 static const char kWebSocketHandshakeRequest[]; |
| 271 static const char kWebSocketHandshakeResponse[]; | 271 static const char kWebSocketHandshakeResponse[]; |
| 272 | 272 |
| 273 protected: | 273 protected: |
| 274 TestCompletionCallback io_test_callback_; | 274 TestCompletionCallback io_test_callback_; |
| 275 | 275 |
| 276 private: | 276 private: |
| 277 std::string handshake_request_; | 277 std::string handshake_request_; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 ASSERT_EQ(8U, events.size()); | 352 ASSERT_EQ(8U, events.size()); |
| 353 | 353 |
| 354 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 354 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 355 events[0].event_type); | 355 events[0].event_type); |
| 356 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 356 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 357 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); | 357 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); |
| 358 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); | 358 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); |
| 359 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); | 359 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); |
| 360 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[5].event_type); | 360 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[5].event_type); |
| 361 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[6].event_type); | 361 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[6].event_type); |
| 362 EXPECT_EQ(net::ERR_CONNECTION_CLOSED, events[6].error_code); | 362 EXPECT_EQ(ERR_CONNECTION_CLOSED, events[6].error_code); |
| 363 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[7].event_type); | 363 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[7].event_type); |
| 364 } | 364 } |
| 365 | 365 |
| 366 TEST_F(SocketStreamTest, BasicAuthProxy) { | 366 TEST_F(SocketStreamTest, BasicAuthProxy) { |
| 367 MockClientSocketFactory mock_socket_factory; | 367 MockClientSocketFactory mock_socket_factory; |
| 368 MockWrite data_writes1[] = { | 368 MockWrite data_writes1[] = { |
| 369 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 369 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" |
| 370 "Host: example.com\r\n" | 370 "Host: example.com\r\n" |
| 371 "Proxy-Connection: keep-alive\r\n\r\n"), | 371 "Proxy-Connection: keep-alive\r\n\r\n"), |
| 372 }; | 372 }; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 397 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), | 397 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2), |
| 398 data_writes2, arraysize(data_writes2)); | 398 data_writes2, arraysize(data_writes2)); |
| 399 mock_socket_factory.AddSocketDataProvider(&data2); | 399 mock_socket_factory.AddSocketDataProvider(&data2); |
| 400 | 400 |
| 401 TestCompletionCallback test_callback; | 401 TestCompletionCallback test_callback; |
| 402 | 402 |
| 403 scoped_ptr<SocketStreamEventRecorder> delegate( | 403 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 404 new SocketStreamEventRecorder(test_callback.callback())); | 404 new SocketStreamEventRecorder(test_callback.callback())); |
| 405 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, | 405 delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, |
| 406 base::Unretained(delegate.get()))); | 406 base::Unretained(delegate.get()))); |
| 407 delegate->SetAuthInfo(net::AuthCredentials(ASCIIToUTF16("foo"), | 407 delegate->SetAuthInfo(AuthCredentials(ASCIIToUTF16("foo"), |
| 408 ASCIIToUTF16("bar"))); | 408 ASCIIToUTF16("bar"))); |
| 409 delegate->SetOnAuthRequired(base::Bind( | 409 delegate->SetOnAuthRequired(base::Bind( |
| 410 &SocketStreamEventRecorder::DoRestartWithAuth, | 410 &SocketStreamEventRecorder::DoRestartWithAuth, |
| 411 base::Unretained(delegate.get()))); | 411 base::Unretained(delegate.get()))); |
| 412 | 412 |
| 413 scoped_refptr<SocketStream> socket_stream( | 413 scoped_refptr<SocketStream> socket_stream( |
| 414 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); | 414 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); |
| 415 | 415 |
| 416 TestURLRequestContextWithProxy context("myproxy:70"); | 416 TestURLRequestContextWithProxy context("myproxy:70"); |
| 417 | 417 |
| 418 socket_stream->set_context(&context); | 418 socket_stream->set_context(&context); |
| 419 socket_stream->SetClientSocketFactory(&mock_socket_factory); | 419 socket_stream->SetClientSocketFactory(&mock_socket_factory); |
| 420 | 420 |
| 421 socket_stream->Connect(); | 421 socket_stream->Connect(); |
| 422 | 422 |
| 423 test_callback.WaitForResult(); | 423 test_callback.WaitForResult(); |
| 424 | 424 |
| 425 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 425 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 426 ASSERT_EQ(5U, events.size()); | 426 ASSERT_EQ(5U, events.size()); |
| 427 | 427 |
| 428 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 428 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 429 events[0].event_type); | 429 events[0].event_type); |
| 430 EXPECT_EQ(SocketStreamEvent::EVENT_AUTH_REQUIRED, events[1].event_type); | 430 EXPECT_EQ(SocketStreamEvent::EVENT_AUTH_REQUIRED, events[1].event_type); |
| 431 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[2].event_type); | 431 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[2].event_type); |
| 432 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[3].event_type); | 432 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[3].event_type); |
| 433 EXPECT_EQ(net::ERR_ABORTED, events[3].error_code); | 433 EXPECT_EQ(ERR_ABORTED, events[3].error_code); |
| 434 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[4].event_type); | 434 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[4].event_type); |
| 435 | 435 |
| 436 // TODO(eroman): Add back NetLogTest here... | 436 // TODO(eroman): Add back NetLogTest here... |
| 437 } | 437 } |
| 438 | 438 |
| 439 TEST_F(SocketStreamTest, BasicAuthProxyWithAuthCache) { | 439 TEST_F(SocketStreamTest, BasicAuthProxyWithAuthCache) { |
| 440 MockClientSocketFactory mock_socket_factory; | 440 MockClientSocketFactory mock_socket_factory; |
| 441 MockWrite data_writes[] = { | 441 MockWrite data_writes[] = { |
| 442 // WebSocket(SocketStream) always uses CONNECT when it is configured to use | 442 // WebSocket(SocketStream) always uses CONNECT when it is configured to use |
| 443 // proxy so the port may not be 443. | 443 // proxy so the port may not be 443. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 | 481 |
| 482 socket_stream->Connect(); | 482 socket_stream->Connect(); |
| 483 | 483 |
| 484 test_callback.WaitForResult(); | 484 test_callback.WaitForResult(); |
| 485 | 485 |
| 486 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 486 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 487 ASSERT_EQ(4U, events.size()); | 487 ASSERT_EQ(4U, events.size()); |
| 488 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 488 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 489 events[0].event_type); | 489 events[0].event_type); |
| 490 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 490 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 491 EXPECT_EQ(net::ERR_ABORTED, events[2].error_code); | 491 EXPECT_EQ(ERR_ABORTED, events[2].error_code); |
| 492 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); | 492 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); |
| 493 } | 493 } |
| 494 | 494 |
| 495 TEST_F(SocketStreamTest, WSSBasicAuthProxyWithAuthCache) { | 495 TEST_F(SocketStreamTest, WSSBasicAuthProxyWithAuthCache) { |
| 496 MockClientSocketFactory mock_socket_factory; | 496 MockClientSocketFactory mock_socket_factory; |
| 497 MockWrite data_writes1[] = { | 497 MockWrite data_writes1[] = { |
| 498 MockWrite("CONNECT example.com:443 HTTP/1.1\r\n" | 498 MockWrite("CONNECT example.com:443 HTTP/1.1\r\n" |
| 499 "Host: example.com\r\n" | 499 "Host: example.com\r\n" |
| 500 "Proxy-Connection: keep-alive\r\n" | 500 "Proxy-Connection: keep-alive\r\n" |
| 501 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | 501 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 | 538 |
| 539 socket_stream->Connect(); | 539 socket_stream->Connect(); |
| 540 | 540 |
| 541 test_callback.WaitForResult(); | 541 test_callback.WaitForResult(); |
| 542 | 542 |
| 543 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 543 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 544 ASSERT_EQ(4U, events.size()); | 544 ASSERT_EQ(4U, events.size()); |
| 545 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 545 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 546 events[0].event_type); | 546 events[0].event_type); |
| 547 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 547 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 548 EXPECT_EQ(net::ERR_ABORTED, events[2].error_code); | 548 EXPECT_EQ(ERR_ABORTED, events[2].error_code); |
| 549 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); | 549 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); |
| 550 } | 550 } |
| 551 | 551 |
| 552 TEST_F(SocketStreamTest, IOPending) { | 552 TEST_F(SocketStreamTest, IOPending) { |
| 553 TestCompletionCallback test_callback; | 553 TestCompletionCallback test_callback; |
| 554 | 554 |
| 555 scoped_ptr<SocketStreamEventRecorder> delegate( | 555 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 556 new SocketStreamEventRecorder(test_callback.callback())); | 556 new SocketStreamEventRecorder(test_callback.callback())); |
| 557 delegate->SetOnConnected(base::Bind( | 557 delegate->SetOnConnected(base::Bind( |
| 558 &SocketStreamTest::DoSendWebSocketHandshake, base::Unretained(this))); | 558 &SocketStreamTest::DoSendWebSocketHandshake, base::Unretained(this))); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 587 data_writes, arraysize(data_writes)); | 587 data_writes, arraysize(data_writes)); |
| 588 | 588 |
| 589 MockClientSocketFactory* mock_socket_factory = | 589 MockClientSocketFactory* mock_socket_factory = |
| 590 GetMockClientSocketFactory(); | 590 GetMockClientSocketFactory(); |
| 591 mock_socket_factory->AddSocketDataProvider(&data_provider); | 591 mock_socket_factory->AddSocketDataProvider(&data_provider); |
| 592 | 592 |
| 593 socket_stream->SetClientSocketFactory(mock_socket_factory); | 593 socket_stream->SetClientSocketFactory(mock_socket_factory); |
| 594 | 594 |
| 595 socket_stream->Connect(); | 595 socket_stream->Connect(); |
| 596 io_test_callback_.WaitForResult(); | 596 io_test_callback_.WaitForResult(); |
| 597 EXPECT_EQ(net::SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, | 597 EXPECT_EQ(SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, |
| 598 socket_stream->next_state_); | 598 socket_stream->next_state_); |
| 599 delegate->CompleteConnection(net::OK); | 599 delegate->CompleteConnection(OK); |
| 600 | 600 |
| 601 EXPECT_EQ(net::OK, test_callback.WaitForResult()); | 601 EXPECT_EQ(OK, test_callback.WaitForResult()); |
| 602 | 602 |
| 603 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 603 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 604 ASSERT_EQ(8U, events.size()); | 604 ASSERT_EQ(8U, events.size()); |
| 605 | 605 |
| 606 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 606 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 607 events[0].event_type); | 607 events[0].event_type); |
| 608 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 608 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 609 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); | 609 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[2].event_type); |
| 610 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); | 610 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[3].event_type); |
| 611 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); | 611 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); |
| 612 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[5].event_type); | 612 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[5].event_type); |
| 613 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[6].event_type); | 613 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[6].event_type); |
| 614 EXPECT_EQ(net::ERR_CONNECTION_CLOSED, events[6].error_code); | 614 EXPECT_EQ(ERR_CONNECTION_CLOSED, events[6].error_code); |
| 615 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[7].event_type); | 615 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[7].event_type); |
| 616 } | 616 } |
| 617 | 617 |
| 618 TEST_F(SocketStreamTest, SwitchToSpdy) { | 618 TEST_F(SocketStreamTest, SwitchToSpdy) { |
| 619 TestCompletionCallback test_callback; | 619 TestCompletionCallback test_callback; |
| 620 | 620 |
| 621 scoped_ptr<SocketStreamEventRecorder> delegate( | 621 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 622 new SocketStreamEventRecorder(test_callback.callback())); | 622 new SocketStreamEventRecorder(test_callback.callback())); |
| 623 delegate->SetOnStartOpenConnection(base::Bind( | 623 delegate->SetOnStartOpenConnection(base::Bind( |
| 624 &SocketStreamTest::DoSwitchToSpdyTest, base::Unretained(this))); | 624 &SocketStreamTest::DoSwitchToSpdyTest, base::Unretained(this))); |
| 625 | 625 |
| 626 TestURLRequestContext context; | 626 TestURLRequestContext context; |
| 627 | 627 |
| 628 scoped_refptr<SocketStream> socket_stream( | 628 scoped_refptr<SocketStream> socket_stream( |
| 629 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); | 629 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); |
| 630 | 630 |
| 631 socket_stream->set_context(&context); | 631 socket_stream->set_context(&context); |
| 632 | 632 |
| 633 socket_stream->Connect(); | 633 socket_stream->Connect(); |
| 634 | 634 |
| 635 EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, test_callback.WaitForResult()); | 635 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, test_callback.WaitForResult()); |
| 636 | 636 |
| 637 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 637 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 638 ASSERT_EQ(2U, events.size()); | 638 ASSERT_EQ(2U, events.size()); |
| 639 | 639 |
| 640 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 640 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 641 events[0].event_type); | 641 events[0].event_type); |
| 642 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); | 642 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
| 643 EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, events[1].error_code); | 643 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, events[1].error_code); |
| 644 } | 644 } |
| 645 | 645 |
| 646 TEST_F(SocketStreamTest, SwitchAfterPending) { | 646 TEST_F(SocketStreamTest, SwitchAfterPending) { |
| 647 TestCompletionCallback test_callback; | 647 TestCompletionCallback test_callback; |
| 648 | 648 |
| 649 scoped_ptr<SocketStreamEventRecorder> delegate( | 649 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 650 new SocketStreamEventRecorder(test_callback.callback())); | 650 new SocketStreamEventRecorder(test_callback.callback())); |
| 651 delegate->SetOnStartOpenConnection(base::Bind( | 651 delegate->SetOnStartOpenConnection(base::Bind( |
| 652 &SocketStreamTest::DoIOPending, base::Unretained(this))); | 652 &SocketStreamTest::DoIOPending, base::Unretained(this))); |
| 653 | 653 |
| 654 TestURLRequestContext context; | 654 TestURLRequestContext context; |
| 655 | 655 |
| 656 scoped_refptr<SocketStream> socket_stream( | 656 scoped_refptr<SocketStream> socket_stream( |
| 657 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); | 657 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); |
| 658 | 658 |
| 659 socket_stream->set_context(&context); | 659 socket_stream->set_context(&context); |
| 660 | 660 |
| 661 socket_stream->Connect(); | 661 socket_stream->Connect(); |
| 662 io_test_callback_.WaitForResult(); | 662 io_test_callback_.WaitForResult(); |
| 663 EXPECT_EQ(net::SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, | 663 EXPECT_EQ(SocketStream::STATE_RESOLVE_PROTOCOL_COMPLETE, |
| 664 socket_stream->next_state_); | 664 socket_stream->next_state_); |
| 665 delegate->CompleteConnection(net::ERR_PROTOCOL_SWITCHED); | 665 delegate->CompleteConnection(ERR_PROTOCOL_SWITCHED); |
| 666 | 666 |
| 667 EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, test_callback.WaitForResult()); | 667 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, test_callback.WaitForResult()); |
| 668 | 668 |
| 669 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 669 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 670 ASSERT_EQ(2U, events.size()); | 670 ASSERT_EQ(2U, events.size()); |
| 671 | 671 |
| 672 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 672 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 673 events[0].event_type); | 673 events[0].event_type); |
| 674 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); | 674 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
| 675 EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, events[1].error_code); | 675 EXPECT_EQ(ERR_PROTOCOL_SWITCHED, events[1].error_code); |
| 676 } | 676 } |
| 677 | 677 |
| 678 // Test a connection though a secure proxy. | 678 // Test a connection though a secure proxy. |
| 679 TEST_F(SocketStreamTest, SecureProxyConnectError) { | 679 TEST_F(SocketStreamTest, SecureProxyConnectError) { |
| 680 MockClientSocketFactory mock_socket_factory; | 680 MockClientSocketFactory mock_socket_factory; |
| 681 MockWrite data_writes[] = { | 681 MockWrite data_writes[] = { |
| 682 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 682 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" |
| 683 "Host: example.com\r\n" | 683 "Host: example.com\r\n" |
| 684 "Proxy-Connection: keep-alive\r\n\r\n") | 684 "Proxy-Connection: keep-alive\r\n\r\n") |
| 685 }; | 685 }; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 715 socket_stream->Connect(); | 715 socket_stream->Connect(); |
| 716 | 716 |
| 717 test_callback.WaitForResult(); | 717 test_callback.WaitForResult(); |
| 718 | 718 |
| 719 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 719 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 720 ASSERT_EQ(3U, events.size()); | 720 ASSERT_EQ(3U, events.size()); |
| 721 | 721 |
| 722 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 722 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 723 events[0].event_type); | 723 events[0].event_type); |
| 724 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); | 724 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
| 725 EXPECT_EQ(net::ERR_SSL_PROTOCOL_ERROR, events[1].error_code); | 725 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, events[1].error_code); |
| 726 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[2].event_type); | 726 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[2].event_type); |
| 727 } | 727 } |
| 728 | 728 |
| 729 // Test a connection though a secure proxy. | 729 // Test a connection though a secure proxy. |
| 730 TEST_F(SocketStreamTest, SecureProxyConnect) { | 730 TEST_F(SocketStreamTest, SecureProxyConnect) { |
| 731 MockClientSocketFactory mock_socket_factory; | 731 MockClientSocketFactory mock_socket_factory; |
| 732 MockWrite data_writes[] = { | 732 MockWrite data_writes[] = { |
| 733 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" | 733 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" |
| 734 "Host: example.com\r\n" | 734 "Host: example.com\r\n" |
| 735 "Proxy-Connection: keep-alive\r\n\r\n") | 735 "Proxy-Connection: keep-alive\r\n\r\n") |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 | 767 |
| 768 test_callback.WaitForResult(); | 768 test_callback.WaitForResult(); |
| 769 | 769 |
| 770 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 770 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 771 ASSERT_EQ(4U, events.size()); | 771 ASSERT_EQ(4U, events.size()); |
| 772 | 772 |
| 773 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, | 773 EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
| 774 events[0].event_type); | 774 events[0].event_type); |
| 775 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); | 775 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
| 776 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[2].event_type); | 776 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[2].event_type); |
| 777 EXPECT_EQ(net::ERR_ABORTED, events[2].error_code); | 777 EXPECT_EQ(ERR_ABORTED, events[2].error_code); |
| 778 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); | 778 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); |
| 779 } | 779 } |
| 780 | 780 |
| 781 TEST_F(SocketStreamTest, BeforeConnectFailed) { | 781 TEST_F(SocketStreamTest, BeforeConnectFailed) { |
| 782 TestCompletionCallback test_callback; | 782 TestCompletionCallback test_callback; |
| 783 | 783 |
| 784 scoped_ptr<SocketStreamEventRecorder> delegate( | 784 scoped_ptr<SocketStreamEventRecorder> delegate( |
| 785 new SocketStreamEventRecorder(test_callback.callback())); | 785 new SocketStreamEventRecorder(test_callback.callback())); |
| 786 | 786 |
| 787 TestURLRequestContext context; | 787 TestURLRequestContext context; |
| 788 TestSocketStreamNetworkDelegate network_delegate; | 788 TestSocketStreamNetworkDelegate network_delegate; |
| 789 network_delegate.SetBeforeConnectResult(ERR_ACCESS_DENIED); | 789 network_delegate.SetBeforeConnectResult(ERR_ACCESS_DENIED); |
| 790 context.set_network_delegate(&network_delegate); | 790 context.set_network_delegate(&network_delegate); |
| 791 | 791 |
| 792 scoped_refptr<SocketStream> socket_stream( | 792 scoped_refptr<SocketStream> socket_stream( |
| 793 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); | 793 new SocketStream(GURL("ws://example.com/demo"), delegate.get())); |
| 794 | 794 |
| 795 socket_stream->set_context(&context); | 795 socket_stream->set_context(&context); |
| 796 | 796 |
| 797 socket_stream->Connect(); | 797 socket_stream->Connect(); |
| 798 | 798 |
| 799 test_callback.WaitForResult(); | 799 test_callback.WaitForResult(); |
| 800 | 800 |
| 801 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); | 801 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
| 802 ASSERT_EQ(2U, events.size()); | 802 ASSERT_EQ(2U, events.size()); |
| 803 | 803 |
| 804 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[0].event_type); | 804 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[0].event_type); |
| 805 EXPECT_EQ(net::ERR_ACCESS_DENIED, events[0].error_code); | 805 EXPECT_EQ(ERR_ACCESS_DENIED, events[0].error_code); |
| 806 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[1].event_type); | 806 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[1].event_type); |
| 807 } | 807 } |
| 808 | 808 |
| 809 } // namespace net | 809 } // namespace net |
| OLD | NEW |