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 |