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/socks5_client_socket.h" | 5 #include "net/socket/socks5_client_socket.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <iterator> | 8 #include <iterator> |
9 #include <map> | 9 #include <map> |
10 | 10 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 StreamSocket* tcp_sock_; | 52 StreamSocket* tcp_sock_; |
53 TestCompletionCallback callback_; | 53 TestCompletionCallback callback_; |
54 scoped_ptr<MockHostResolver> host_resolver_; | 54 scoped_ptr<MockHostResolver> host_resolver_; |
55 scoped_ptr<SocketDataProvider> data_; | 55 scoped_ptr<SocketDataProvider> data_; |
56 | 56 |
57 private: | 57 private: |
58 DISALLOW_COPY_AND_ASSIGN(SOCKS5ClientSocketTest); | 58 DISALLOW_COPY_AND_ASSIGN(SOCKS5ClientSocketTest); |
59 }; | 59 }; |
60 | 60 |
61 SOCKS5ClientSocketTest::SOCKS5ClientSocketTest() | 61 SOCKS5ClientSocketTest::SOCKS5ClientSocketTest() |
62 : kNwPort(base::HostToNet16(80)), | 62 : kNwPort(base::HostToNet16(80)), host_resolver_(new MockHostResolver) { |
63 host_resolver_(new MockHostResolver) { | |
64 } | 63 } |
65 | 64 |
66 // Set up platform before every test case | 65 // Set up platform before every test case |
67 void SOCKS5ClientSocketTest::SetUp() { | 66 void SOCKS5ClientSocketTest::SetUp() { |
68 PlatformTest::SetUp(); | 67 PlatformTest::SetUp(); |
69 | 68 |
70 // Resolve the "localhost" AddressList used by the TCP connection to connect. | 69 // Resolve the "localhost" AddressList used by the TCP connection to connect. |
71 HostResolver::RequestInfo info(HostPortPair("www.socks-proxy.com", 1080)); | 70 HostResolver::RequestInfo info(HostPortPair("www.socks-proxy.com", 1080)); |
72 TestCompletionCallback callback; | 71 TestCompletionCallback callback; |
73 int rv = host_resolver_->Resolve(info, | 72 int rv = host_resolver_->Resolve(info, |
74 DEFAULT_PRIORITY, | 73 DEFAULT_PRIORITY, |
75 &address_list_, | 74 &address_list_, |
76 callback.callback(), | 75 callback.callback(), |
77 NULL, | 76 NULL, |
78 BoundNetLog()); | 77 BoundNetLog()); |
79 ASSERT_EQ(ERR_IO_PENDING, rv); | 78 ASSERT_EQ(ERR_IO_PENDING, rv); |
80 rv = callback.WaitForResult(); | 79 rv = callback.WaitForResult(); |
81 ASSERT_EQ(OK, rv); | 80 ASSERT_EQ(OK, rv); |
82 } | 81 } |
83 | 82 |
84 scoped_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket( | 83 scoped_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket( |
85 MockRead reads[], | 84 MockRead reads[], |
86 size_t reads_count, | 85 size_t reads_count, |
87 MockWrite writes[], | 86 MockWrite writes[], |
88 size_t writes_count, | 87 size_t writes_count, |
89 const std::string& hostname, | 88 const std::string& hostname, |
90 int port, | 89 int port, |
91 NetLog* net_log) { | 90 NetLog* net_log) { |
92 TestCompletionCallback callback; | 91 TestCompletionCallback callback; |
93 data_.reset(new StaticSocketDataProvider(reads, reads_count, | 92 data_.reset( |
94 writes, writes_count)); | 93 new StaticSocketDataProvider(reads, reads_count, writes, writes_count)); |
95 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get()); | 94 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get()); |
96 | 95 |
97 int rv = tcp_sock_->Connect(callback.callback()); | 96 int rv = tcp_sock_->Connect(callback.callback()); |
98 EXPECT_EQ(ERR_IO_PENDING, rv); | 97 EXPECT_EQ(ERR_IO_PENDING, rv); |
99 rv = callback.WaitForResult(); | 98 rv = callback.WaitForResult(); |
100 EXPECT_EQ(OK, rv); | 99 EXPECT_EQ(OK, rv); |
101 EXPECT_TRUE(tcp_sock_->IsConnected()); | 100 EXPECT_TRUE(tcp_sock_->IsConnected()); |
102 | 101 |
103 scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); | 102 scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
104 // |connection| takes ownership of |tcp_sock_|, but keep a | 103 // |connection| takes ownership of |tcp_sock_|, but keep a |
105 // non-owning pointer to it. | 104 // non-owning pointer to it. |
106 connection->SetSocket(scoped_ptr<StreamSocket>(tcp_sock_)); | 105 connection->SetSocket(scoped_ptr<StreamSocket>(tcp_sock_)); |
107 return scoped_ptr<SOCKS5ClientSocket>(new SOCKS5ClientSocket( | 106 return scoped_ptr<SOCKS5ClientSocket>(new SOCKS5ClientSocket( |
108 connection.Pass(), | 107 connection.Pass(), |
109 HostResolver::RequestInfo(HostPortPair(hostname, port)))); | 108 HostResolver::RequestInfo(HostPortPair(hostname, port)))); |
110 } | 109 } |
111 | 110 |
112 // Tests a complete SOCKS5 handshake and the disconnection. | 111 // Tests a complete SOCKS5 handshake and the disconnection. |
113 TEST_F(SOCKS5ClientSocketTest, CompleteHandshake) { | 112 TEST_F(SOCKS5ClientSocketTest, CompleteHandshake) { |
114 const std::string payload_write = "random data"; | 113 const std::string payload_write = "random data"; |
115 const std::string payload_read = "moar random data"; | 114 const std::string payload_read = "moar random data"; |
116 | 115 |
117 const char kOkRequest[] = { | 116 const char kOkRequest[] = { |
118 0x05, // Version | 117 0x05, // Version |
119 0x01, // Command (CONNECT) | 118 0x01, // Command (CONNECT) |
120 0x00, // Reserved. | 119 0x00, // Reserved. |
121 0x03, // Address type (DOMAINNAME). | 120 0x03, // Address type (DOMAINNAME). |
122 0x09, // Length of domain (9) | 121 0x09, // Length of domain (9) |
123 // Domain string: | 122 // Domain string: |
124 'l', 'o', 'c', 'a', 'l', 'h', 'o', 's', 't', | 123 'l', 'o', 'c', 'a', 'l', 'h', |
125 0x00, 0x50, // 16-bit port (80) | 124 'o', 's', 't', 0x00, 0x50, // 16-bit port (80) |
126 }; | 125 }; |
127 | 126 |
128 MockWrite data_writes[] = { | 127 MockWrite data_writes[] = { |
129 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 128 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
130 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)), | 129 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)), |
131 MockWrite(ASYNC, payload_write.data(), payload_write.size()) }; | 130 MockWrite(ASYNC, payload_write.data(), payload_write.size())}; |
132 MockRead data_reads[] = { | 131 MockRead data_reads[] = { |
133 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 132 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
134 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength), | 133 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength), |
135 MockRead(ASYNC, payload_read.data(), payload_read.size()) }; | 134 MockRead(ASYNC, payload_read.data(), payload_read.size())}; |
136 | 135 |
137 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 136 user_sock_ = BuildMockSocket(data_reads, |
138 data_writes, arraysize(data_writes), | 137 arraysize(data_reads), |
139 "localhost", 80, &net_log_); | 138 data_writes, |
| 139 arraysize(data_writes), |
| 140 "localhost", |
| 141 80, |
| 142 &net_log_); |
140 | 143 |
141 // At this state the TCP connection is completed but not the SOCKS handshake. | 144 // At this state the TCP connection is completed but not the SOCKS handshake. |
142 EXPECT_TRUE(tcp_sock_->IsConnected()); | 145 EXPECT_TRUE(tcp_sock_->IsConnected()); |
143 EXPECT_FALSE(user_sock_->IsConnected()); | 146 EXPECT_FALSE(user_sock_->IsConnected()); |
144 | 147 |
145 int rv = user_sock_->Connect(callback_.callback()); | 148 int rv = user_sock_->Connect(callback_.callback()); |
146 EXPECT_EQ(ERR_IO_PENDING, rv); | 149 EXPECT_EQ(ERR_IO_PENDING, rv); |
147 EXPECT_FALSE(user_sock_->IsConnected()); | 150 EXPECT_FALSE(user_sock_->IsConnected()); |
148 | 151 |
149 CapturingNetLog::CapturedEntryList net_log_entries; | 152 CapturingNetLog::CapturedEntryList net_log_entries; |
150 net_log_.GetEntries(&net_log_entries); | 153 net_log_.GetEntries(&net_log_entries); |
151 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 154 EXPECT_TRUE( |
152 NetLog::TYPE_SOCKS5_CONNECT)); | 155 LogContainsBeginEvent(net_log_entries, 0, NetLog::TYPE_SOCKS5_CONNECT)); |
153 | 156 |
154 rv = callback_.WaitForResult(); | 157 rv = callback_.WaitForResult(); |
155 | 158 |
156 EXPECT_EQ(OK, rv); | 159 EXPECT_EQ(OK, rv); |
157 EXPECT_TRUE(user_sock_->IsConnected()); | 160 EXPECT_TRUE(user_sock_->IsConnected()); |
158 | 161 |
159 net_log_.GetEntries(&net_log_entries); | 162 net_log_.GetEntries(&net_log_entries); |
160 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 163 EXPECT_TRUE( |
161 NetLog::TYPE_SOCKS5_CONNECT)); | 164 LogContainsEndEvent(net_log_entries, -1, NetLog::TYPE_SOCKS5_CONNECT)); |
162 | 165 |
163 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); | 166 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); |
164 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 167 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
165 rv = user_sock_->Write( | 168 rv = user_sock_->Write( |
166 buffer.get(), payload_write.size(), callback_.callback()); | 169 buffer.get(), payload_write.size(), callback_.callback()); |
167 EXPECT_EQ(ERR_IO_PENDING, rv); | 170 EXPECT_EQ(ERR_IO_PENDING, rv); |
168 rv = callback_.WaitForResult(); | 171 rv = callback_.WaitForResult(); |
169 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 172 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
170 | 173 |
171 buffer = new IOBuffer(payload_read.size()); | 174 buffer = new IOBuffer(payload_read.size()); |
(...skipping 20 matching lines...) Expand all Loading... |
192 }; | 195 }; |
193 | 196 |
194 std::string request(kSOCKS5DomainRequest, arraysize(kSOCKS5DomainRequest)); | 197 std::string request(kSOCKS5DomainRequest, arraysize(kSOCKS5DomainRequest)); |
195 request.push_back(hostname.size()); | 198 request.push_back(hostname.size()); |
196 request.append(hostname); | 199 request.append(hostname); |
197 request.append(reinterpret_cast<const char*>(&kNwPort), sizeof(kNwPort)); | 200 request.append(reinterpret_cast<const char*>(&kNwPort), sizeof(kNwPort)); |
198 | 201 |
199 for (int i = 0; i < 2; ++i) { | 202 for (int i = 0; i < 2; ++i) { |
200 MockWrite data_writes[] = { | 203 MockWrite data_writes[] = { |
201 MockWrite(SYNCHRONOUS, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 204 MockWrite(SYNCHRONOUS, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
202 MockWrite(SYNCHRONOUS, request.data(), request.size()) | 205 MockWrite(SYNCHRONOUS, request.data(), request.size())}; |
203 }; | |
204 MockRead data_reads[] = { | 206 MockRead data_reads[] = { |
205 MockRead(SYNCHRONOUS, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 207 MockRead(SYNCHRONOUS, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
206 MockRead(SYNCHRONOUS, kSOCKS5OkResponse, kSOCKS5OkResponseLength) | 208 MockRead(SYNCHRONOUS, kSOCKS5OkResponse, kSOCKS5OkResponseLength)}; |
207 }; | |
208 | 209 |
209 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 210 user_sock_ = BuildMockSocket(data_reads, |
210 data_writes, arraysize(data_writes), | 211 arraysize(data_reads), |
211 hostname, 80, NULL); | 212 data_writes, |
| 213 arraysize(data_writes), |
| 214 hostname, |
| 215 80, |
| 216 NULL); |
212 | 217 |
213 int rv = user_sock_->Connect(callback_.callback()); | 218 int rv = user_sock_->Connect(callback_.callback()); |
214 EXPECT_EQ(OK, rv); | 219 EXPECT_EQ(OK, rv); |
215 EXPECT_TRUE(user_sock_->IsConnected()); | 220 EXPECT_TRUE(user_sock_->IsConnected()); |
216 | 221 |
217 user_sock_->Disconnect(); | 222 user_sock_->Disconnect(); |
218 EXPECT_FALSE(user_sock_->IsConnected()); | 223 EXPECT_FALSE(user_sock_->IsConnected()); |
219 } | 224 } |
220 } | 225 } |
221 | 226 |
222 // Test that we fail trying to connect to a hosname longer than 255 bytes. | 227 // Test that we fail trying to connect to a hosname longer than 255 bytes. |
223 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { | 228 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { |
224 // Create a string of length 256, where each character is 'x'. | 229 // Create a string of length 256, where each character is 'x'. |
225 std::string large_host_name; | 230 std::string large_host_name; |
226 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); | 231 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); |
227 | 232 |
228 // Create a SOCKS socket, with mock transport socket. | 233 // Create a SOCKS socket, with mock transport socket. |
229 MockWrite data_writes[] = {MockWrite()}; | 234 MockWrite data_writes[] = {MockWrite()}; |
230 MockRead data_reads[] = {MockRead()}; | 235 MockRead data_reads[] = {MockRead()}; |
231 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 236 user_sock_ = BuildMockSocket(data_reads, |
232 data_writes, arraysize(data_writes), | 237 arraysize(data_reads), |
233 large_host_name, 80, NULL); | 238 data_writes, |
| 239 arraysize(data_writes), |
| 240 large_host_name, |
| 241 80, |
| 242 NULL); |
234 | 243 |
235 // Try to connect -- should fail (without having read/written anything to | 244 // Try to connect -- should fail (without having read/written anything to |
236 // the transport socket first) because the hostname is too long. | 245 // the transport socket first) because the hostname is too long. |
237 TestCompletionCallback callback; | 246 TestCompletionCallback callback; |
238 int rv = user_sock_->Connect(callback.callback()); | 247 int rv = user_sock_->Connect(callback.callback()); |
239 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); | 248 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); |
240 } | 249 } |
241 | 250 |
242 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { | 251 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { |
243 const std::string hostname = "www.google.com"; | 252 const std::string hostname = "www.google.com"; |
244 | 253 |
245 const char kOkRequest[] = { | 254 const char kOkRequest[] = { |
246 0x05, // Version | 255 0x05, // Version |
247 0x01, // Command (CONNECT) | 256 0x01, // Command (CONNECT) |
248 0x00, // Reserved. | 257 0x00, // Reserved. |
249 0x03, // Address type (DOMAINNAME). | 258 0x03, // Address type (DOMAINNAME). |
250 0x0E, // Length of domain (14) | 259 0x0E, // Length of domain (14) |
251 // Domain string: | 260 // Domain string: |
252 'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', | 261 'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', |
253 0x00, 0x50, // 16-bit port (80) | 262 'l', 'e', '.', 'c', 'o', 'm', 0x00, 0x50, // 16-bit port (80) |
254 }; | 263 }; |
255 | 264 |
256 // Test for partial greet request write | 265 // Test for partial greet request write |
257 { | 266 { |
258 const char partial1[] = { 0x05, 0x01 }; | 267 const char partial1[] = {0x05, 0x01}; |
259 const char partial2[] = { 0x00 }; | 268 const char partial2[] = {0x00}; |
260 MockWrite data_writes[] = { | 269 MockWrite data_writes[] = { |
261 MockWrite(ASYNC, arraysize(partial1)), | 270 MockWrite(ASYNC, arraysize(partial1)), |
262 MockWrite(ASYNC, partial2, arraysize(partial2)), | 271 MockWrite(ASYNC, partial2, arraysize(partial2)), |
263 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; | 272 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest))}; |
264 MockRead data_reads[] = { | 273 MockRead data_reads[] = { |
265 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 274 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
266 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 275 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength)}; |
267 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 276 user_sock_ = BuildMockSocket(data_reads, |
268 data_writes, arraysize(data_writes), | 277 arraysize(data_reads), |
269 hostname, 80, &net_log_); | 278 data_writes, |
| 279 arraysize(data_writes), |
| 280 hostname, |
| 281 80, |
| 282 &net_log_); |
270 int rv = user_sock_->Connect(callback_.callback()); | 283 int rv = user_sock_->Connect(callback_.callback()); |
271 EXPECT_EQ(ERR_IO_PENDING, rv); | 284 EXPECT_EQ(ERR_IO_PENDING, rv); |
272 | 285 |
273 CapturingNetLog::CapturedEntryList net_log_entries; | 286 CapturingNetLog::CapturedEntryList net_log_entries; |
274 net_log_.GetEntries(&net_log_entries); | 287 net_log_.GetEntries(&net_log_entries); |
275 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 288 EXPECT_TRUE( |
276 NetLog::TYPE_SOCKS5_CONNECT)); | 289 LogContainsBeginEvent(net_log_entries, 0, NetLog::TYPE_SOCKS5_CONNECT)); |
277 | 290 |
278 rv = callback_.WaitForResult(); | 291 rv = callback_.WaitForResult(); |
279 EXPECT_EQ(OK, rv); | 292 EXPECT_EQ(OK, rv); |
280 EXPECT_TRUE(user_sock_->IsConnected()); | 293 EXPECT_TRUE(user_sock_->IsConnected()); |
281 | 294 |
282 net_log_.GetEntries(&net_log_entries); | 295 net_log_.GetEntries(&net_log_entries); |
283 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 296 EXPECT_TRUE( |
284 NetLog::TYPE_SOCKS5_CONNECT)); | 297 LogContainsEndEvent(net_log_entries, -1, NetLog::TYPE_SOCKS5_CONNECT)); |
285 } | 298 } |
286 | 299 |
287 // Test for partial greet response read | 300 // Test for partial greet response read |
288 { | 301 { |
289 const char partial1[] = { 0x05 }; | 302 const char partial1[] = {0x05}; |
290 const char partial2[] = { 0x00 }; | 303 const char partial2[] = {0x00}; |
291 MockWrite data_writes[] = { | 304 MockWrite data_writes[] = { |
292 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 305 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
293 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; | 306 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest))}; |
294 MockRead data_reads[] = { | 307 MockRead data_reads[] = { |
295 MockRead(ASYNC, partial1, arraysize(partial1)), | 308 MockRead(ASYNC, partial1, arraysize(partial1)), |
296 MockRead(ASYNC, partial2, arraysize(partial2)), | 309 MockRead(ASYNC, partial2, arraysize(partial2)), |
297 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 310 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength)}; |
298 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 311 user_sock_ = BuildMockSocket(data_reads, |
299 data_writes, arraysize(data_writes), | 312 arraysize(data_reads), |
300 hostname, 80, &net_log_); | 313 data_writes, |
| 314 arraysize(data_writes), |
| 315 hostname, |
| 316 80, |
| 317 &net_log_); |
301 int rv = user_sock_->Connect(callback_.callback()); | 318 int rv = user_sock_->Connect(callback_.callback()); |
302 EXPECT_EQ(ERR_IO_PENDING, rv); | 319 EXPECT_EQ(ERR_IO_PENDING, rv); |
303 | 320 |
304 CapturingNetLog::CapturedEntryList net_log_entries; | 321 CapturingNetLog::CapturedEntryList net_log_entries; |
305 net_log_.GetEntries(&net_log_entries); | 322 net_log_.GetEntries(&net_log_entries); |
306 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 323 EXPECT_TRUE( |
307 NetLog::TYPE_SOCKS5_CONNECT)); | 324 LogContainsBeginEvent(net_log_entries, 0, NetLog::TYPE_SOCKS5_CONNECT)); |
308 rv = callback_.WaitForResult(); | 325 rv = callback_.WaitForResult(); |
309 EXPECT_EQ(OK, rv); | 326 EXPECT_EQ(OK, rv); |
310 EXPECT_TRUE(user_sock_->IsConnected()); | 327 EXPECT_TRUE(user_sock_->IsConnected()); |
311 net_log_.GetEntries(&net_log_entries); | 328 net_log_.GetEntries(&net_log_entries); |
312 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 329 EXPECT_TRUE( |
313 NetLog::TYPE_SOCKS5_CONNECT)); | 330 LogContainsEndEvent(net_log_entries, -1, NetLog::TYPE_SOCKS5_CONNECT)); |
314 } | 331 } |
315 | 332 |
316 // Test for partial handshake request write. | 333 // Test for partial handshake request write. |
317 { | 334 { |
318 const int kSplitPoint = 3; // Break handshake write into two parts. | 335 const int kSplitPoint = 3; // Break handshake write into two parts. |
319 MockWrite data_writes[] = { | 336 MockWrite data_writes[] = { |
320 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 337 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
321 MockWrite(ASYNC, kOkRequest, kSplitPoint), | 338 MockWrite(ASYNC, kOkRequest, kSplitPoint), |
322 MockWrite(ASYNC, kOkRequest + kSplitPoint, | 339 MockWrite(ASYNC, |
323 arraysize(kOkRequest) - kSplitPoint) | 340 kOkRequest + kSplitPoint, |
324 }; | 341 arraysize(kOkRequest) - kSplitPoint)}; |
325 MockRead data_reads[] = { | 342 MockRead data_reads[] = { |
326 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 343 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
327 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 344 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength)}; |
328 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 345 user_sock_ = BuildMockSocket(data_reads, |
329 data_writes, arraysize(data_writes), | 346 arraysize(data_reads), |
330 hostname, 80, &net_log_); | 347 data_writes, |
| 348 arraysize(data_writes), |
| 349 hostname, |
| 350 80, |
| 351 &net_log_); |
331 int rv = user_sock_->Connect(callback_.callback()); | 352 int rv = user_sock_->Connect(callback_.callback()); |
332 EXPECT_EQ(ERR_IO_PENDING, rv); | 353 EXPECT_EQ(ERR_IO_PENDING, rv); |
333 CapturingNetLog::CapturedEntryList net_log_entries; | 354 CapturingNetLog::CapturedEntryList net_log_entries; |
334 net_log_.GetEntries(&net_log_entries); | 355 net_log_.GetEntries(&net_log_entries); |
335 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 356 EXPECT_TRUE( |
336 NetLog::TYPE_SOCKS5_CONNECT)); | 357 LogContainsBeginEvent(net_log_entries, 0, NetLog::TYPE_SOCKS5_CONNECT)); |
337 rv = callback_.WaitForResult(); | 358 rv = callback_.WaitForResult(); |
338 EXPECT_EQ(OK, rv); | 359 EXPECT_EQ(OK, rv); |
339 EXPECT_TRUE(user_sock_->IsConnected()); | 360 EXPECT_TRUE(user_sock_->IsConnected()); |
340 net_log_.GetEntries(&net_log_entries); | 361 net_log_.GetEntries(&net_log_entries); |
341 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 362 EXPECT_TRUE( |
342 NetLog::TYPE_SOCKS5_CONNECT)); | 363 LogContainsEndEvent(net_log_entries, -1, NetLog::TYPE_SOCKS5_CONNECT)); |
343 } | 364 } |
344 | 365 |
345 // Test for partial handshake response read | 366 // Test for partial handshake response read |
346 { | 367 { |
347 const int kSplitPoint = 6; // Break the handshake read into two parts. | 368 const int kSplitPoint = 6; // Break the handshake read into two parts. |
348 MockWrite data_writes[] = { | 369 MockWrite data_writes[] = { |
349 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 370 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
350 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) | 371 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest))}; |
351 }; | |
352 MockRead data_reads[] = { | 372 MockRead data_reads[] = { |
353 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 373 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
354 MockRead(ASYNC, kSOCKS5OkResponse, kSplitPoint), | 374 MockRead(ASYNC, kSOCKS5OkResponse, kSplitPoint), |
355 MockRead(ASYNC, kSOCKS5OkResponse + kSplitPoint, | 375 MockRead(ASYNC, |
356 kSOCKS5OkResponseLength - kSplitPoint) | 376 kSOCKS5OkResponse + kSplitPoint, |
357 }; | 377 kSOCKS5OkResponseLength - kSplitPoint)}; |
358 | 378 |
359 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 379 user_sock_ = BuildMockSocket(data_reads, |
360 data_writes, arraysize(data_writes), | 380 arraysize(data_reads), |
361 hostname, 80, &net_log_); | 381 data_writes, |
| 382 arraysize(data_writes), |
| 383 hostname, |
| 384 80, |
| 385 &net_log_); |
362 int rv = user_sock_->Connect(callback_.callback()); | 386 int rv = user_sock_->Connect(callback_.callback()); |
363 EXPECT_EQ(ERR_IO_PENDING, rv); | 387 EXPECT_EQ(ERR_IO_PENDING, rv); |
364 CapturingNetLog::CapturedEntryList net_log_entries; | 388 CapturingNetLog::CapturedEntryList net_log_entries; |
365 net_log_.GetEntries(&net_log_entries); | 389 net_log_.GetEntries(&net_log_entries); |
366 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 390 EXPECT_TRUE( |
367 NetLog::TYPE_SOCKS5_CONNECT)); | 391 LogContainsBeginEvent(net_log_entries, 0, NetLog::TYPE_SOCKS5_CONNECT)); |
368 rv = callback_.WaitForResult(); | 392 rv = callback_.WaitForResult(); |
369 EXPECT_EQ(OK, rv); | 393 EXPECT_EQ(OK, rv); |
370 EXPECT_TRUE(user_sock_->IsConnected()); | 394 EXPECT_TRUE(user_sock_->IsConnected()); |
371 net_log_.GetEntries(&net_log_entries); | 395 net_log_.GetEntries(&net_log_entries); |
372 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 396 EXPECT_TRUE( |
373 NetLog::TYPE_SOCKS5_CONNECT)); | 397 LogContainsEndEvent(net_log_entries, -1, NetLog::TYPE_SOCKS5_CONNECT)); |
374 } | 398 } |
375 } | 399 } |
376 | 400 |
377 } // namespace | 401 } // namespace |
378 | 402 |
379 } // namespace net | 403 } // namespace net |
OLD | NEW |