OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/socks5_client_socket.h" | 5 #include "net/socket/socks5_client_socket.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 | 9 |
10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" |
11 #include "net/base/net_log.h" | 11 #include "net/base/net_log.h" |
(...skipping 17 matching lines...) Expand all Loading... |
29 // Base class to test SOCKS5ClientSocket | 29 // Base class to test SOCKS5ClientSocket |
30 class SOCKS5ClientSocketTest : public PlatformTest { | 30 class SOCKS5ClientSocketTest : public PlatformTest { |
31 public: | 31 public: |
32 SOCKS5ClientSocketTest(); | 32 SOCKS5ClientSocketTest(); |
33 // Create a SOCKSClientSocket on top of a MockSocket. | 33 // Create a SOCKSClientSocket on top of a MockSocket. |
34 SOCKS5ClientSocket* BuildMockSocket(MockRead reads[], | 34 SOCKS5ClientSocket* BuildMockSocket(MockRead reads[], |
35 size_t reads_count, | 35 size_t reads_count, |
36 MockWrite writes[], | 36 MockWrite writes[], |
37 size_t writes_count, | 37 size_t writes_count, |
38 const std::string& hostname, | 38 const std::string& hostname, |
39 int port); | 39 int port, |
| 40 NetLog* net_log); |
40 | 41 |
41 virtual void SetUp(); | 42 virtual void SetUp(); |
42 | 43 |
43 protected: | 44 protected: |
44 const uint16 kNwPort; | 45 const uint16 kNwPort; |
| 46 CapturingNetLog net_log_; |
45 scoped_ptr<SOCKS5ClientSocket> user_sock_; | 47 scoped_ptr<SOCKS5ClientSocket> user_sock_; |
46 AddressList address_list_; | 48 AddressList address_list_; |
47 ClientSocket* tcp_sock_; | 49 ClientSocket* tcp_sock_; |
48 TestCompletionCallback callback_; | 50 TestCompletionCallback callback_; |
49 scoped_refptr<MockHostResolver> host_resolver_; | 51 scoped_refptr<MockHostResolver> host_resolver_; |
50 scoped_ptr<SocketDataProvider> data_; | 52 scoped_ptr<SocketDataProvider> data_; |
51 | 53 |
52 private: | 54 private: |
53 DISALLOW_COPY_AND_ASSIGN(SOCKS5ClientSocketTest); | 55 DISALLOW_COPY_AND_ASSIGN(SOCKS5ClientSocketTest); |
54 }; | 56 }; |
55 | 57 |
56 SOCKS5ClientSocketTest::SOCKS5ClientSocketTest() | 58 SOCKS5ClientSocketTest::SOCKS5ClientSocketTest() |
57 : kNwPort(htons(80)), host_resolver_(new MockHostResolver) { | 59 : kNwPort(htons(80)), |
| 60 net_log_(CapturingNetLog::kUnbounded), |
| 61 host_resolver_(new MockHostResolver) { |
58 } | 62 } |
59 | 63 |
60 // Set up platform before every test case | 64 // Set up platform before every test case |
61 void SOCKS5ClientSocketTest::SetUp() { | 65 void SOCKS5ClientSocketTest::SetUp() { |
62 PlatformTest::SetUp(); | 66 PlatformTest::SetUp(); |
63 | 67 |
64 // Resolve the "localhost" AddressList used by the TCP connection to connect. | 68 // Resolve the "localhost" AddressList used by the TCP connection to connect. |
65 HostResolver::RequestInfo info("www.socks-proxy.com", 1080); | 69 HostResolver::RequestInfo info("www.socks-proxy.com", 1080); |
66 int rv = host_resolver_->Resolve(info, &address_list_, NULL, NULL, NULL); | 70 int rv = host_resolver_->Resolve(info, &address_list_, NULL, NULL, NULL); |
67 ASSERT_EQ(OK, rv); | 71 ASSERT_EQ(OK, rv); |
68 } | 72 } |
69 | 73 |
70 SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket( | 74 SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket( |
71 MockRead reads[], | 75 MockRead reads[], |
72 size_t reads_count, | 76 size_t reads_count, |
73 MockWrite writes[], | 77 MockWrite writes[], |
74 size_t writes_count, | 78 size_t writes_count, |
75 const std::string& hostname, | 79 const std::string& hostname, |
76 int port) { | 80 int port, |
| 81 NetLog* net_log) { |
77 TestCompletionCallback callback; | 82 TestCompletionCallback callback; |
78 data_.reset(new StaticSocketDataProvider(reads, reads_count, | 83 data_.reset(new StaticSocketDataProvider(reads, reads_count, |
79 writes, writes_count)); | 84 writes, writes_count)); |
80 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); | 85 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get()); |
81 | 86 |
82 int rv = tcp_sock_->Connect(&callback, NULL); | 87 int rv = tcp_sock_->Connect(&callback); |
83 EXPECT_EQ(ERR_IO_PENDING, rv); | 88 EXPECT_EQ(ERR_IO_PENDING, rv); |
84 rv = callback.WaitForResult(); | 89 rv = callback.WaitForResult(); |
85 EXPECT_EQ(OK, rv); | 90 EXPECT_EQ(OK, rv); |
86 EXPECT_TRUE(tcp_sock_->IsConnected()); | 91 EXPECT_TRUE(tcp_sock_->IsConnected()); |
87 | 92 |
88 return new SOCKS5ClientSocket(tcp_sock_, | 93 return new SOCKS5ClientSocket(tcp_sock_, |
89 HostResolver::RequestInfo(hostname, port)); | 94 HostResolver::RequestInfo(hostname, port)); |
90 } | 95 } |
91 | 96 |
92 // Tests a complete SOCKS5 handshake and the disconnection. | 97 // Tests a complete SOCKS5 handshake and the disconnection. |
(...skipping 16 matching lines...) Expand all Loading... |
109 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 114 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
110 MockWrite(true, kOkRequest, arraysize(kOkRequest)), | 115 MockWrite(true, kOkRequest, arraysize(kOkRequest)), |
111 MockWrite(true, payload_write.data(), payload_write.size()) }; | 116 MockWrite(true, payload_write.data(), payload_write.size()) }; |
112 MockRead data_reads[] = { | 117 MockRead data_reads[] = { |
113 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 118 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
114 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength), | 119 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength), |
115 MockRead(true, payload_read.data(), payload_read.size()) }; | 120 MockRead(true, payload_read.data(), payload_read.size()) }; |
116 | 121 |
117 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 122 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
118 data_writes, arraysize(data_writes), | 123 data_writes, arraysize(data_writes), |
119 "localhost", 80)); | 124 "localhost", 80, &net_log_)); |
120 | 125 |
121 // At this state the TCP connection is completed but not the SOCKS handshake. | 126 // At this state the TCP connection is completed but not the SOCKS handshake. |
122 EXPECT_TRUE(tcp_sock_->IsConnected()); | 127 EXPECT_TRUE(tcp_sock_->IsConnected()); |
123 EXPECT_FALSE(user_sock_->IsConnected()); | 128 EXPECT_FALSE(user_sock_->IsConnected()); |
124 | 129 |
125 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 130 int rv = user_sock_->Connect(&callback_); |
126 int rv = user_sock_->Connect(&callback_, log.bound()); | |
127 EXPECT_EQ(ERR_IO_PENDING, rv); | 131 EXPECT_EQ(ERR_IO_PENDING, rv); |
128 EXPECT_FALSE(user_sock_->IsConnected()); | 132 EXPECT_FALSE(user_sock_->IsConnected()); |
129 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONNEC
T)); | 133 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 134 NetLog::TYPE_SOCKS5_CONNECT)); |
130 | 135 |
131 rv = callback_.WaitForResult(); | 136 rv = callback_.WaitForResult(); |
132 | 137 |
133 EXPECT_EQ(OK, rv); | 138 EXPECT_EQ(OK, rv); |
134 EXPECT_TRUE(user_sock_->IsConnected()); | 139 EXPECT_TRUE(user_sock_->IsConnected()); |
135 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNECT
)); | 140 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 141 NetLog::TYPE_SOCKS5_CONNECT)); |
136 | 142 |
137 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); | 143 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); |
138 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 144 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
139 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); | 145 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); |
140 EXPECT_EQ(ERR_IO_PENDING, rv); | 146 EXPECT_EQ(ERR_IO_PENDING, rv); |
141 rv = callback_.WaitForResult(); | 147 rv = callback_.WaitForResult(); |
142 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 148 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
143 | 149 |
144 buffer = new IOBuffer(payload_read.size()); | 150 buffer = new IOBuffer(payload_read.size()); |
145 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); | 151 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); |
(...skipping 27 matching lines...) Expand all Loading... |
173 MockWrite(false, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 179 MockWrite(false, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
174 MockWrite(false, request.data(), request.size()) | 180 MockWrite(false, request.data(), request.size()) |
175 }; | 181 }; |
176 MockRead data_reads[] = { | 182 MockRead data_reads[] = { |
177 MockRead(false, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 183 MockRead(false, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
178 MockRead(false, kSOCKS5OkResponse, kSOCKS5OkResponseLength) | 184 MockRead(false, kSOCKS5OkResponse, kSOCKS5OkResponseLength) |
179 }; | 185 }; |
180 | 186 |
181 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 187 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
182 data_writes, arraysize(data_writes), | 188 data_writes, arraysize(data_writes), |
183 hostname, 80)); | 189 hostname, 80, NULL)); |
184 | 190 |
185 int rv = user_sock_->Connect(&callback_, NULL); | 191 int rv = user_sock_->Connect(&callback_); |
186 EXPECT_EQ(OK, rv); | 192 EXPECT_EQ(OK, rv); |
187 EXPECT_TRUE(user_sock_->IsConnected()); | 193 EXPECT_TRUE(user_sock_->IsConnected()); |
188 | 194 |
189 user_sock_->Disconnect(); | 195 user_sock_->Disconnect(); |
190 EXPECT_FALSE(user_sock_->IsConnected()); | 196 EXPECT_FALSE(user_sock_->IsConnected()); |
191 } | 197 } |
192 } | 198 } |
193 | 199 |
194 // Test that we fail trying to connect to a hosname longer than 255 bytes. | 200 // Test that we fail trying to connect to a hosname longer than 255 bytes. |
195 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { | 201 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { |
196 // Create a string of length 256, where each character is 'x'. | 202 // Create a string of length 256, where each character is 'x'. |
197 std::string large_host_name; | 203 std::string large_host_name; |
198 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); | 204 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); |
199 | 205 |
200 // Create a SOCKS socket, with mock transport socket. | 206 // Create a SOCKS socket, with mock transport socket. |
201 MockWrite data_writes[] = {MockWrite()}; | 207 MockWrite data_writes[] = {MockWrite()}; |
202 MockRead data_reads[] = {MockRead()}; | 208 MockRead data_reads[] = {MockRead()}; |
203 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 209 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
204 data_writes, arraysize(data_writes), | 210 data_writes, arraysize(data_writes), |
205 large_host_name, 80)); | 211 large_host_name, 80, NULL)); |
206 | 212 |
207 // Try to connect -- should fail (without having read/written anything to | 213 // Try to connect -- should fail (without having read/written anything to |
208 // the transport socket first) because the hostname is too long. | 214 // the transport socket first) because the hostname is too long. |
209 TestCompletionCallback callback; | 215 TestCompletionCallback callback; |
210 int rv = user_sock_->Connect(&callback, NULL); | 216 int rv = user_sock_->Connect(&callback); |
211 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); | 217 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); |
212 } | 218 } |
213 | 219 |
214 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { | 220 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { |
215 const std::string hostname = "www.google.com"; | 221 const std::string hostname = "www.google.com"; |
216 | 222 |
217 const char kOkRequest[] = { | 223 const char kOkRequest[] = { |
218 0x05, // Version | 224 0x05, // Version |
219 0x01, // Command (CONNECT) | 225 0x01, // Command (CONNECT) |
220 0x00, // Reserved. | 226 0x00, // Reserved. |
(...skipping 10 matching lines...) Expand all Loading... |
231 const char partial2[] = { 0x00 }; | 237 const char partial2[] = { 0x00 }; |
232 MockWrite data_writes[] = { | 238 MockWrite data_writes[] = { |
233 MockWrite(true, arraysize(partial1)), | 239 MockWrite(true, arraysize(partial1)), |
234 MockWrite(true, partial2, arraysize(partial2)), | 240 MockWrite(true, partial2, arraysize(partial2)), |
235 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; | 241 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; |
236 MockRead data_reads[] = { | 242 MockRead data_reads[] = { |
237 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 243 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
238 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 244 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
239 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 245 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
240 data_writes, arraysize(data_writes), | 246 data_writes, arraysize(data_writes), |
241 hostname, 80)); | 247 hostname, 80, &net_log_)); |
242 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 248 int rv = user_sock_->Connect(&callback_); |
243 int rv = user_sock_->Connect(&callback_, log.bound()); | |
244 EXPECT_EQ(ERR_IO_PENDING, rv); | 249 EXPECT_EQ(ERR_IO_PENDING, rv); |
245 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); | 250 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 251 NetLog::TYPE_SOCKS5_CONNECT)); |
246 rv = callback_.WaitForResult(); | 252 rv = callback_.WaitForResult(); |
247 EXPECT_EQ(OK, rv); | 253 EXPECT_EQ(OK, rv); |
248 EXPECT_TRUE(user_sock_->IsConnected()); | 254 EXPECT_TRUE(user_sock_->IsConnected()); |
249 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); | 255 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 256 NetLog::TYPE_SOCKS5_CONNECT)); |
250 } | 257 } |
251 | 258 |
252 // Test for partial greet response read | 259 // Test for partial greet response read |
253 { | 260 { |
254 const char partial1[] = { 0x05 }; | 261 const char partial1[] = { 0x05 }; |
255 const char partial2[] = { 0x00 }; | 262 const char partial2[] = { 0x00 }; |
256 MockWrite data_writes[] = { | 263 MockWrite data_writes[] = { |
257 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 264 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
258 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; | 265 MockWrite(true, kOkRequest, arraysize(kOkRequest)) }; |
259 MockRead data_reads[] = { | 266 MockRead data_reads[] = { |
260 MockRead(true, partial1, arraysize(partial1)), | 267 MockRead(true, partial1, arraysize(partial1)), |
261 MockRead(true, partial2, arraysize(partial2)), | 268 MockRead(true, partial2, arraysize(partial2)), |
262 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 269 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
263 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 270 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
264 data_writes, arraysize(data_writes), | 271 data_writes, arraysize(data_writes), |
265 hostname, 80)); | 272 hostname, 80, &net_log_)); |
266 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 273 int rv = user_sock_->Connect(&callback_); |
267 int rv = user_sock_->Connect(&callback_, log.bound()); | |
268 EXPECT_EQ(ERR_IO_PENDING, rv); | 274 EXPECT_EQ(ERR_IO_PENDING, rv); |
269 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); | 275 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 276 NetLog::TYPE_SOCKS5_CONNECT)); |
270 rv = callback_.WaitForResult(); | 277 rv = callback_.WaitForResult(); |
271 EXPECT_EQ(OK, rv); | 278 EXPECT_EQ(OK, rv); |
272 EXPECT_TRUE(user_sock_->IsConnected()); | 279 EXPECT_TRUE(user_sock_->IsConnected()); |
273 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); | 280 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 281 NetLog::TYPE_SOCKS5_CONNECT)); |
274 } | 282 } |
275 | 283 |
276 // Test for partial handshake request write. | 284 // Test for partial handshake request write. |
277 { | 285 { |
278 const int kSplitPoint = 3; // Break handshake write into two parts. | 286 const int kSplitPoint = 3; // Break handshake write into two parts. |
279 MockWrite data_writes[] = { | 287 MockWrite data_writes[] = { |
280 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 288 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
281 MockWrite(true, kOkRequest, kSplitPoint), | 289 MockWrite(true, kOkRequest, kSplitPoint), |
282 MockWrite(true, kOkRequest + kSplitPoint, | 290 MockWrite(true, kOkRequest + kSplitPoint, |
283 arraysize(kOkRequest) - kSplitPoint) | 291 arraysize(kOkRequest) - kSplitPoint) |
284 }; | 292 }; |
285 MockRead data_reads[] = { | 293 MockRead data_reads[] = { |
286 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 294 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
287 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 295 MockRead(true, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
288 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 296 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
289 data_writes, arraysize(data_writes), | 297 data_writes, arraysize(data_writes), |
290 hostname, 80)); | 298 hostname, 80, &net_log_)); |
291 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 299 int rv = user_sock_->Connect(&callback_); |
292 int rv = user_sock_->Connect(&callback_, log.bound()); | |
293 EXPECT_EQ(ERR_IO_PENDING, rv); | 300 EXPECT_EQ(ERR_IO_PENDING, rv); |
294 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); | 301 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 302 NetLog::TYPE_SOCKS5_CONNECT)); |
295 rv = callback_.WaitForResult(); | 303 rv = callback_.WaitForResult(); |
296 EXPECT_EQ(OK, rv); | 304 EXPECT_EQ(OK, rv); |
297 EXPECT_TRUE(user_sock_->IsConnected()); | 305 EXPECT_TRUE(user_sock_->IsConnected()); |
298 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); | 306 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 307 NetLog::TYPE_SOCKS5_CONNECT)); |
299 } | 308 } |
300 | 309 |
301 // Test for partial handshake response read | 310 // Test for partial handshake response read |
302 { | 311 { |
303 const int kSplitPoint = 6; // Break the handshake read into two parts. | 312 const int kSplitPoint = 6; // Break the handshake read into two parts. |
304 MockWrite data_writes[] = { | 313 MockWrite data_writes[] = { |
305 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 314 MockWrite(true, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
306 MockWrite(true, kOkRequest, arraysize(kOkRequest)) | 315 MockWrite(true, kOkRequest, arraysize(kOkRequest)) |
307 }; | 316 }; |
308 MockRead data_reads[] = { | 317 MockRead data_reads[] = { |
309 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 318 MockRead(true, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
310 MockRead(true, kSOCKS5OkResponse, kSplitPoint), | 319 MockRead(true, kSOCKS5OkResponse, kSplitPoint), |
311 MockRead(true, kSOCKS5OkResponse + kSplitPoint, | 320 MockRead(true, kSOCKS5OkResponse + kSplitPoint, |
312 kSOCKS5OkResponseLength - kSplitPoint) | 321 kSOCKS5OkResponseLength - kSplitPoint) |
313 }; | 322 }; |
314 | 323 |
315 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), | 324 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads), |
316 data_writes, arraysize(data_writes), | 325 data_writes, arraysize(data_writes), |
317 hostname, 80)); | 326 hostname, 80, &net_log_)); |
318 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 327 int rv = user_sock_->Connect(&callback_); |
319 int rv = user_sock_->Connect(&callback_, log.bound()); | |
320 EXPECT_EQ(ERR_IO_PENDING, rv); | 328 EXPECT_EQ(ERR_IO_PENDING, rv); |
321 EXPECT_TRUE(LogContainsBeginEvent(log.entries(), 0, NetLog::TYPE_SOCKS5_CONN
ECT)); | 329 EXPECT_TRUE(LogContainsBeginEvent(net_log_.entries(), 0, |
| 330 NetLog::TYPE_SOCKS5_CONNECT)); |
322 rv = callback_.WaitForResult(); | 331 rv = callback_.WaitForResult(); |
323 EXPECT_EQ(OK, rv); | 332 EXPECT_EQ(OK, rv); |
324 EXPECT_TRUE(user_sock_->IsConnected()); | 333 EXPECT_TRUE(user_sock_->IsConnected()); |
325 EXPECT_TRUE(LogContainsEndEvent(log.entries(), -1, NetLog::TYPE_SOCKS5_CONNE
CT)); | 334 EXPECT_TRUE(LogContainsEndEvent(net_log_.entries(), -1, |
| 335 NetLog::TYPE_SOCKS5_CONNECT)); |
326 } | 336 } |
327 } | 337 } |
328 | 338 |
329 } // namespace | 339 } // namespace |
330 | 340 |
331 } // namespace net | 341 } // namespace net |
OLD | NEW |