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 #include <utility> | 10 #include <utility> |
11 | 11 |
12 #include "base/macros.h" | 12 #include "base/macros.h" |
13 #include "base/sys_byteorder.h" | 13 #include "base/sys_byteorder.h" |
14 #include "net/base/address_list.h" | 14 #include "net/base/address_list.h" |
15 #include "net/base/test_completion_callback.h" | 15 #include "net/base/test_completion_callback.h" |
16 #include "net/base/winsock_init.h" | 16 #include "net/base/winsock_init.h" |
17 #include "net/dns/mock_host_resolver.h" | 17 #include "net/dns/mock_host_resolver.h" |
18 #include "net/log/net_log.h" | 18 #include "net/log/net_log.h" |
19 #include "net/log/test_net_log.h" | 19 #include "net/log/test_net_log.h" |
20 #include "net/log/test_net_log_entry.h" | 20 #include "net/log/test_net_log_entry.h" |
21 #include "net/log/test_net_log_util.h" | 21 #include "net/log/test_net_log_util.h" |
22 #include "net/socket/client_socket_factory.h" | 22 #include "net/socket/client_socket_factory.h" |
23 #include "net/socket/socket_test_util.h" | 23 #include "net/socket/socket_test_util.h" |
24 #include "net/socket/tcp_client_socket.h" | 24 #include "net/socket/tcp_client_socket.h" |
| 25 #include "net/test/gtest_util.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" |
25 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
26 #include "testing/platform_test.h" | 28 #include "testing/platform_test.h" |
27 | 29 |
| 30 using net::test::IsError; |
| 31 using net::test::IsOk; |
| 32 |
28 //----------------------------------------------------------------------------- | 33 //----------------------------------------------------------------------------- |
29 | 34 |
30 namespace net { | 35 namespace net { |
31 | 36 |
32 namespace { | 37 namespace { |
33 | 38 |
34 // Base class to test SOCKS5ClientSocket | 39 // Base class to test SOCKS5ClientSocket |
35 class SOCKS5ClientSocketTest : public PlatformTest { | 40 class SOCKS5ClientSocketTest : public PlatformTest { |
36 public: | 41 public: |
37 SOCKS5ClientSocketTest(); | 42 SOCKS5ClientSocketTest(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 | 79 |
75 // Resolve the "localhost" AddressList used by the TCP connection to connect. | 80 // Resolve the "localhost" AddressList used by the TCP connection to connect. |
76 HostResolver::RequestInfo info(HostPortPair("www.socks-proxy.com", 1080)); | 81 HostResolver::RequestInfo info(HostPortPair("www.socks-proxy.com", 1080)); |
77 TestCompletionCallback callback; | 82 TestCompletionCallback callback; |
78 int rv = host_resolver_->Resolve(info, | 83 int rv = host_resolver_->Resolve(info, |
79 DEFAULT_PRIORITY, | 84 DEFAULT_PRIORITY, |
80 &address_list_, | 85 &address_list_, |
81 callback.callback(), | 86 callback.callback(), |
82 NULL, | 87 NULL, |
83 BoundNetLog()); | 88 BoundNetLog()); |
84 ASSERT_EQ(ERR_IO_PENDING, rv); | 89 ASSERT_THAT(rv, IsError(ERR_IO_PENDING)); |
85 rv = callback.WaitForResult(); | 90 rv = callback.WaitForResult(); |
86 ASSERT_EQ(OK, rv); | 91 ASSERT_THAT(rv, IsOk()); |
87 } | 92 } |
88 | 93 |
89 std::unique_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket( | 94 std::unique_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket( |
90 MockRead reads[], | 95 MockRead reads[], |
91 size_t reads_count, | 96 size_t reads_count, |
92 MockWrite writes[], | 97 MockWrite writes[], |
93 size_t writes_count, | 98 size_t writes_count, |
94 const std::string& hostname, | 99 const std::string& hostname, |
95 int port, | 100 int port, |
96 NetLog* net_log) { | 101 NetLog* net_log) { |
97 TestCompletionCallback callback; | 102 TestCompletionCallback callback; |
98 data_.reset(new StaticSocketDataProvider(reads, reads_count, | 103 data_.reset(new StaticSocketDataProvider(reads, reads_count, |
99 writes, writes_count)); | 104 writes, writes_count)); |
100 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get()); | 105 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get()); |
101 | 106 |
102 int rv = tcp_sock_->Connect(callback.callback()); | 107 int rv = tcp_sock_->Connect(callback.callback()); |
103 EXPECT_EQ(ERR_IO_PENDING, rv); | 108 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
104 rv = callback.WaitForResult(); | 109 rv = callback.WaitForResult(); |
105 EXPECT_EQ(OK, rv); | 110 EXPECT_THAT(rv, IsOk()); |
106 EXPECT_TRUE(tcp_sock_->IsConnected()); | 111 EXPECT_TRUE(tcp_sock_->IsConnected()); |
107 | 112 |
108 std::unique_ptr<ClientSocketHandle> connection(new ClientSocketHandle); | 113 std::unique_ptr<ClientSocketHandle> connection(new ClientSocketHandle); |
109 // |connection| takes ownership of |tcp_sock_|, but keep a | 114 // |connection| takes ownership of |tcp_sock_|, but keep a |
110 // non-owning pointer to it. | 115 // non-owning pointer to it. |
111 connection->SetSocket(std::unique_ptr<StreamSocket>(tcp_sock_)); | 116 connection->SetSocket(std::unique_ptr<StreamSocket>(tcp_sock_)); |
112 return std::unique_ptr<SOCKS5ClientSocket>(new SOCKS5ClientSocket( | 117 return std::unique_ptr<SOCKS5ClientSocket>(new SOCKS5ClientSocket( |
113 std::move(connection), | 118 std::move(connection), |
114 HostResolver::RequestInfo(HostPortPair(hostname, port)))); | 119 HostResolver::RequestInfo(HostPortPair(hostname, port)))); |
115 } | 120 } |
(...skipping 25 matching lines...) Expand all Loading... |
141 | 146 |
142 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 147 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
143 data_writes, arraysize(data_writes), | 148 data_writes, arraysize(data_writes), |
144 "localhost", 80, &net_log_); | 149 "localhost", 80, &net_log_); |
145 | 150 |
146 // At this state the TCP connection is completed but not the SOCKS handshake. | 151 // At this state the TCP connection is completed but not the SOCKS handshake. |
147 EXPECT_TRUE(tcp_sock_->IsConnected()); | 152 EXPECT_TRUE(tcp_sock_->IsConnected()); |
148 EXPECT_FALSE(user_sock_->IsConnected()); | 153 EXPECT_FALSE(user_sock_->IsConnected()); |
149 | 154 |
150 int rv = user_sock_->Connect(callback_.callback()); | 155 int rv = user_sock_->Connect(callback_.callback()); |
151 EXPECT_EQ(ERR_IO_PENDING, rv); | 156 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
152 EXPECT_FALSE(user_sock_->IsConnected()); | 157 EXPECT_FALSE(user_sock_->IsConnected()); |
153 | 158 |
154 TestNetLogEntry::List net_log_entries; | 159 TestNetLogEntry::List net_log_entries; |
155 net_log_.GetEntries(&net_log_entries); | 160 net_log_.GetEntries(&net_log_entries); |
156 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 161 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
157 NetLog::TYPE_SOCKS5_CONNECT)); | 162 NetLog::TYPE_SOCKS5_CONNECT)); |
158 | 163 |
159 rv = callback_.WaitForResult(); | 164 rv = callback_.WaitForResult(); |
160 | 165 |
161 EXPECT_EQ(OK, rv); | 166 EXPECT_THAT(rv, IsOk()); |
162 EXPECT_TRUE(user_sock_->IsConnected()); | 167 EXPECT_TRUE(user_sock_->IsConnected()); |
163 | 168 |
164 net_log_.GetEntries(&net_log_entries); | 169 net_log_.GetEntries(&net_log_entries); |
165 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 170 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
166 NetLog::TYPE_SOCKS5_CONNECT)); | 171 NetLog::TYPE_SOCKS5_CONNECT)); |
167 | 172 |
168 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); | 173 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size())); |
169 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 174 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
170 rv = user_sock_->Write( | 175 rv = user_sock_->Write( |
171 buffer.get(), payload_write.size(), callback_.callback()); | 176 buffer.get(), payload_write.size(), callback_.callback()); |
172 EXPECT_EQ(ERR_IO_PENDING, rv); | 177 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
173 rv = callback_.WaitForResult(); | 178 rv = callback_.WaitForResult(); |
174 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 179 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
175 | 180 |
176 buffer = new IOBuffer(payload_read.size()); | 181 buffer = new IOBuffer(payload_read.size()); |
177 rv = | 182 rv = |
178 user_sock_->Read(buffer.get(), payload_read.size(), callback_.callback()); | 183 user_sock_->Read(buffer.get(), payload_read.size(), callback_.callback()); |
179 EXPECT_EQ(ERR_IO_PENDING, rv); | 184 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
180 rv = callback_.WaitForResult(); | 185 rv = callback_.WaitForResult(); |
181 EXPECT_EQ(static_cast<int>(payload_read.size()), rv); | 186 EXPECT_EQ(static_cast<int>(payload_read.size()), rv); |
182 EXPECT_EQ(payload_read, std::string(buffer->data(), payload_read.size())); | 187 EXPECT_EQ(payload_read, std::string(buffer->data(), payload_read.size())); |
183 | 188 |
184 user_sock_->Disconnect(); | 189 user_sock_->Disconnect(); |
185 EXPECT_FALSE(tcp_sock_->IsConnected()); | 190 EXPECT_FALSE(tcp_sock_->IsConnected()); |
186 EXPECT_FALSE(user_sock_->IsConnected()); | 191 EXPECT_FALSE(user_sock_->IsConnected()); |
187 } | 192 } |
188 | 193 |
189 // Test that you can call Connect() again after having called Disconnect(). | 194 // Test that you can call Connect() again after having called Disconnect(). |
(...skipping 19 matching lines...) Expand all Loading... |
209 MockRead data_reads[] = { | 214 MockRead data_reads[] = { |
210 MockRead(SYNCHRONOUS, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 215 MockRead(SYNCHRONOUS, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
211 MockRead(SYNCHRONOUS, kSOCKS5OkResponse, kSOCKS5OkResponseLength) | 216 MockRead(SYNCHRONOUS, kSOCKS5OkResponse, kSOCKS5OkResponseLength) |
212 }; | 217 }; |
213 | 218 |
214 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 219 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
215 data_writes, arraysize(data_writes), | 220 data_writes, arraysize(data_writes), |
216 hostname, 80, NULL); | 221 hostname, 80, NULL); |
217 | 222 |
218 int rv = user_sock_->Connect(callback_.callback()); | 223 int rv = user_sock_->Connect(callback_.callback()); |
219 EXPECT_EQ(OK, rv); | 224 EXPECT_THAT(rv, IsOk()); |
220 EXPECT_TRUE(user_sock_->IsConnected()); | 225 EXPECT_TRUE(user_sock_->IsConnected()); |
221 | 226 |
222 user_sock_->Disconnect(); | 227 user_sock_->Disconnect(); |
223 EXPECT_FALSE(user_sock_->IsConnected()); | 228 EXPECT_FALSE(user_sock_->IsConnected()); |
224 } | 229 } |
225 } | 230 } |
226 | 231 |
227 // Test that we fail trying to connect to a hosname longer than 255 bytes. | 232 // Test that we fail trying to connect to a hosname longer than 255 bytes. |
228 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { | 233 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { |
229 // Create a string of length 256, where each character is 'x'. | 234 // Create a string of length 256, where each character is 'x'. |
230 std::string large_host_name; | 235 std::string large_host_name; |
231 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); | 236 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); |
232 | 237 |
233 // Create a SOCKS socket, with mock transport socket. | 238 // Create a SOCKS socket, with mock transport socket. |
234 MockWrite data_writes[] = {MockWrite()}; | 239 MockWrite data_writes[] = {MockWrite()}; |
235 MockRead data_reads[] = {MockRead()}; | 240 MockRead data_reads[] = {MockRead()}; |
236 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 241 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
237 data_writes, arraysize(data_writes), | 242 data_writes, arraysize(data_writes), |
238 large_host_name, 80, NULL); | 243 large_host_name, 80, NULL); |
239 | 244 |
240 // Try to connect -- should fail (without having read/written anything to | 245 // Try to connect -- should fail (without having read/written anything to |
241 // the transport socket first) because the hostname is too long. | 246 // the transport socket first) because the hostname is too long. |
242 TestCompletionCallback callback; | 247 TestCompletionCallback callback; |
243 int rv = user_sock_->Connect(callback.callback()); | 248 int rv = user_sock_->Connect(callback.callback()); |
244 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); | 249 EXPECT_THAT(rv, IsError(ERR_SOCKS_CONNECTION_FAILED)); |
245 } | 250 } |
246 | 251 |
247 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { | 252 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { |
248 const std::string hostname = "www.google.com"; | 253 const std::string hostname = "www.google.com"; |
249 | 254 |
250 const char kOkRequest[] = { | 255 const char kOkRequest[] = { |
251 0x05, // Version | 256 0x05, // Version |
252 0x01, // Command (CONNECT) | 257 0x01, // Command (CONNECT) |
253 0x00, // Reserved. | 258 0x00, // Reserved. |
254 0x03, // Address type (DOMAINNAME). | 259 0x03, // Address type (DOMAINNAME). |
(...skipping 11 matching lines...) Expand all Loading... |
266 MockWrite(ASYNC, partial1, arraysize(partial1)), | 271 MockWrite(ASYNC, partial1, arraysize(partial1)), |
267 MockWrite(ASYNC, partial2, arraysize(partial2)), | 272 MockWrite(ASYNC, partial2, arraysize(partial2)), |
268 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; | 273 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; |
269 MockRead data_reads[] = { | 274 MockRead data_reads[] = { |
270 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 275 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
271 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 276 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
272 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 277 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
273 data_writes, arraysize(data_writes), | 278 data_writes, arraysize(data_writes), |
274 hostname, 80, &net_log_); | 279 hostname, 80, &net_log_); |
275 int rv = user_sock_->Connect(callback_.callback()); | 280 int rv = user_sock_->Connect(callback_.callback()); |
276 EXPECT_EQ(ERR_IO_PENDING, rv); | 281 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
277 | 282 |
278 TestNetLogEntry::List net_log_entries; | 283 TestNetLogEntry::List net_log_entries; |
279 net_log_.GetEntries(&net_log_entries); | 284 net_log_.GetEntries(&net_log_entries); |
280 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 285 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
281 NetLog::TYPE_SOCKS5_CONNECT)); | 286 NetLog::TYPE_SOCKS5_CONNECT)); |
282 | 287 |
283 rv = callback_.WaitForResult(); | 288 rv = callback_.WaitForResult(); |
284 EXPECT_EQ(OK, rv); | 289 EXPECT_THAT(rv, IsOk()); |
285 EXPECT_TRUE(user_sock_->IsConnected()); | 290 EXPECT_TRUE(user_sock_->IsConnected()); |
286 | 291 |
287 net_log_.GetEntries(&net_log_entries); | 292 net_log_.GetEntries(&net_log_entries); |
288 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 293 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
289 NetLog::TYPE_SOCKS5_CONNECT)); | 294 NetLog::TYPE_SOCKS5_CONNECT)); |
290 } | 295 } |
291 | 296 |
292 // Test for partial greet response read | 297 // Test for partial greet response read |
293 { | 298 { |
294 const char partial1[] = { 0x05 }; | 299 const char partial1[] = { 0x05 }; |
295 const char partial2[] = { 0x00 }; | 300 const char partial2[] = { 0x00 }; |
296 MockWrite data_writes[] = { | 301 MockWrite data_writes[] = { |
297 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 302 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
298 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; | 303 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) }; |
299 MockRead data_reads[] = { | 304 MockRead data_reads[] = { |
300 MockRead(ASYNC, partial1, arraysize(partial1)), | 305 MockRead(ASYNC, partial1, arraysize(partial1)), |
301 MockRead(ASYNC, partial2, arraysize(partial2)), | 306 MockRead(ASYNC, partial2, arraysize(partial2)), |
302 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 307 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
303 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 308 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
304 data_writes, arraysize(data_writes), | 309 data_writes, arraysize(data_writes), |
305 hostname, 80, &net_log_); | 310 hostname, 80, &net_log_); |
306 int rv = user_sock_->Connect(callback_.callback()); | 311 int rv = user_sock_->Connect(callback_.callback()); |
307 EXPECT_EQ(ERR_IO_PENDING, rv); | 312 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
308 | 313 |
309 TestNetLogEntry::List net_log_entries; | 314 TestNetLogEntry::List net_log_entries; |
310 net_log_.GetEntries(&net_log_entries); | 315 net_log_.GetEntries(&net_log_entries); |
311 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 316 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
312 NetLog::TYPE_SOCKS5_CONNECT)); | 317 NetLog::TYPE_SOCKS5_CONNECT)); |
313 rv = callback_.WaitForResult(); | 318 rv = callback_.WaitForResult(); |
314 EXPECT_EQ(OK, rv); | 319 EXPECT_THAT(rv, IsOk()); |
315 EXPECT_TRUE(user_sock_->IsConnected()); | 320 EXPECT_TRUE(user_sock_->IsConnected()); |
316 net_log_.GetEntries(&net_log_entries); | 321 net_log_.GetEntries(&net_log_entries); |
317 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 322 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
318 NetLog::TYPE_SOCKS5_CONNECT)); | 323 NetLog::TYPE_SOCKS5_CONNECT)); |
319 } | 324 } |
320 | 325 |
321 // Test for partial handshake request write. | 326 // Test for partial handshake request write. |
322 { | 327 { |
323 const int kSplitPoint = 3; // Break handshake write into two parts. | 328 const int kSplitPoint = 3; // Break handshake write into two parts. |
324 MockWrite data_writes[] = { | 329 MockWrite data_writes[] = { |
325 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 330 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
326 MockWrite(ASYNC, kOkRequest, kSplitPoint), | 331 MockWrite(ASYNC, kOkRequest, kSplitPoint), |
327 MockWrite(ASYNC, kOkRequest + kSplitPoint, | 332 MockWrite(ASYNC, kOkRequest + kSplitPoint, |
328 arraysize(kOkRequest) - kSplitPoint) | 333 arraysize(kOkRequest) - kSplitPoint) |
329 }; | 334 }; |
330 MockRead data_reads[] = { | 335 MockRead data_reads[] = { |
331 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 336 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
332 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; | 337 MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) }; |
333 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 338 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
334 data_writes, arraysize(data_writes), | 339 data_writes, arraysize(data_writes), |
335 hostname, 80, &net_log_); | 340 hostname, 80, &net_log_); |
336 int rv = user_sock_->Connect(callback_.callback()); | 341 int rv = user_sock_->Connect(callback_.callback()); |
337 EXPECT_EQ(ERR_IO_PENDING, rv); | 342 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
338 TestNetLogEntry::List net_log_entries; | 343 TestNetLogEntry::List net_log_entries; |
339 net_log_.GetEntries(&net_log_entries); | 344 net_log_.GetEntries(&net_log_entries); |
340 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 345 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
341 NetLog::TYPE_SOCKS5_CONNECT)); | 346 NetLog::TYPE_SOCKS5_CONNECT)); |
342 rv = callback_.WaitForResult(); | 347 rv = callback_.WaitForResult(); |
343 EXPECT_EQ(OK, rv); | 348 EXPECT_THAT(rv, IsOk()); |
344 EXPECT_TRUE(user_sock_->IsConnected()); | 349 EXPECT_TRUE(user_sock_->IsConnected()); |
345 net_log_.GetEntries(&net_log_entries); | 350 net_log_.GetEntries(&net_log_entries); |
346 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 351 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
347 NetLog::TYPE_SOCKS5_CONNECT)); | 352 NetLog::TYPE_SOCKS5_CONNECT)); |
348 } | 353 } |
349 | 354 |
350 // Test for partial handshake response read | 355 // Test for partial handshake response read |
351 { | 356 { |
352 const int kSplitPoint = 6; // Break the handshake read into two parts. | 357 const int kSplitPoint = 6; // Break the handshake read into two parts. |
353 MockWrite data_writes[] = { | 358 MockWrite data_writes[] = { |
354 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), | 359 MockWrite(ASYNC, kSOCKS5GreetRequest, kSOCKS5GreetRequestLength), |
355 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) | 360 MockWrite(ASYNC, kOkRequest, arraysize(kOkRequest)) |
356 }; | 361 }; |
357 MockRead data_reads[] = { | 362 MockRead data_reads[] = { |
358 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), | 363 MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength), |
359 MockRead(ASYNC, kSOCKS5OkResponse, kSplitPoint), | 364 MockRead(ASYNC, kSOCKS5OkResponse, kSplitPoint), |
360 MockRead(ASYNC, kSOCKS5OkResponse + kSplitPoint, | 365 MockRead(ASYNC, kSOCKS5OkResponse + kSplitPoint, |
361 kSOCKS5OkResponseLength - kSplitPoint) | 366 kSOCKS5OkResponseLength - kSplitPoint) |
362 }; | 367 }; |
363 | 368 |
364 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), | 369 user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads), |
365 data_writes, arraysize(data_writes), | 370 data_writes, arraysize(data_writes), |
366 hostname, 80, &net_log_); | 371 hostname, 80, &net_log_); |
367 int rv = user_sock_->Connect(callback_.callback()); | 372 int rv = user_sock_->Connect(callback_.callback()); |
368 EXPECT_EQ(ERR_IO_PENDING, rv); | 373 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
369 TestNetLogEntry::List net_log_entries; | 374 TestNetLogEntry::List net_log_entries; |
370 net_log_.GetEntries(&net_log_entries); | 375 net_log_.GetEntries(&net_log_entries); |
371 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, | 376 EXPECT_TRUE(LogContainsBeginEvent(net_log_entries, 0, |
372 NetLog::TYPE_SOCKS5_CONNECT)); | 377 NetLog::TYPE_SOCKS5_CONNECT)); |
373 rv = callback_.WaitForResult(); | 378 rv = callback_.WaitForResult(); |
374 EXPECT_EQ(OK, rv); | 379 EXPECT_THAT(rv, IsOk()); |
375 EXPECT_TRUE(user_sock_->IsConnected()); | 380 EXPECT_TRUE(user_sock_->IsConnected()); |
376 net_log_.GetEntries(&net_log_entries); | 381 net_log_.GetEntries(&net_log_entries); |
377 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, | 382 EXPECT_TRUE(LogContainsEndEvent(net_log_entries, -1, |
378 NetLog::TYPE_SOCKS5_CONNECT)); | 383 NetLog::TYPE_SOCKS5_CONNECT)); |
379 } | 384 } |
380 } | 385 } |
381 | 386 |
382 } // namespace | 387 } // namespace |
383 | 388 |
384 } // namespace net | 389 } // namespace net |
OLD | NEW |