Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: net/socket/socks_client_socket_unittest.cc

Issue 344026: Add LoadLog to ClientSocket::Connect(). (Closed)
Patch Set: Minor build fixups and fixed mac bug. Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/socket/socks_client_socket.cc ('k') | net/socket/ssl_client_socket_mac.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/socks_client_socket.h" 5 #include "net/socket/socks_client_socket.h"
6 6
7 #include "net/base/address_list.h" 7 #include "net/base/address_list.h"
8 #include "net/base/load_log.h"
9 #include "net/base/load_log_unittest.h"
8 #include "net/base/mock_host_resolver.h" 10 #include "net/base/mock_host_resolver.h"
9 #include "net/base/test_completion_callback.h" 11 #include "net/base/test_completion_callback.h"
10 #include "net/base/winsock_init.h" 12 #include "net/base/winsock_init.h"
11 #include "net/socket/client_socket_factory.h" 13 #include "net/socket/client_socket_factory.h"
12 #include "net/socket/tcp_client_socket.h" 14 #include "net/socket/tcp_client_socket.h"
13 #include "net/socket/socket_test_util.h" 15 #include "net/socket/socket_test_util.h"
14 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
15 #include "testing/platform_test.h" 17 #include "testing/platform_test.h"
16 18
17 //----------------------------------------------------------------------------- 19 //-----------------------------------------------------------------------------
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( 57 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket(
56 MockRead reads[], 58 MockRead reads[],
57 MockWrite writes[], 59 MockWrite writes[],
58 const std::string& hostname, 60 const std::string& hostname,
59 int port) { 61 int port) {
60 62
61 TestCompletionCallback callback; 63 TestCompletionCallback callback;
62 mock_socket_.reset(new StaticMockSocket(reads, writes)); 64 mock_socket_.reset(new StaticMockSocket(reads, writes));
63 tcp_sock_ = new MockTCPClientSocket(address_list_, mock_socket_.get()); 65 tcp_sock_ = new MockTCPClientSocket(address_list_, mock_socket_.get());
64 66
65 int rv = tcp_sock_->Connect(&callback); 67 int rv = tcp_sock_->Connect(&callback, NULL);
66 EXPECT_EQ(ERR_IO_PENDING, rv); 68 EXPECT_EQ(ERR_IO_PENDING, rv);
67 rv = callback.WaitForResult(); 69 rv = callback.WaitForResult();
68 EXPECT_EQ(OK, rv); 70 EXPECT_EQ(OK, rv);
69 EXPECT_TRUE(tcp_sock_->IsConnected()); 71 EXPECT_TRUE(tcp_sock_->IsConnected());
70 72
71 return new SOCKSClientSocket(tcp_sock_, 73 return new SOCKSClientSocket(tcp_sock_,
72 HostResolver::RequestInfo(hostname, port), 74 HostResolver::RequestInfo(hostname, port),
73 host_resolver_); 75 host_resolver_);
74 } 76 }
75 77
76 // Tests a complete handshake and the disconnection. 78 // Tests a complete handshake and the disconnection.
77 TEST_F(SOCKSClientSocketTest, CompleteHandshake) { 79 TEST_F(SOCKSClientSocketTest, CompleteHandshake) {
78 const std::string payload_write = "random data"; 80 const std::string payload_write = "random data";
79 const std::string payload_read = "moar random data"; 81 const std::string payload_read = "moar random data";
80 82
81 MockWrite data_writes[] = { 83 MockWrite data_writes[] = {
82 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), 84 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)),
83 MockWrite(true, payload_write.data(), payload_write.size()) }; 85 MockWrite(true, payload_write.data(), payload_write.size()) };
84 MockRead data_reads[] = { 86 MockRead data_reads[] = {
85 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)), 87 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)),
86 MockRead(true, payload_read.data(), payload_read.size()) }; 88 MockRead(true, payload_read.data(), payload_read.size()) };
87 89
88 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 90 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80));
89 91
90 // At this state the TCP connection is completed but not the SOCKS handshake. 92 // At this state the TCP connection is completed but not the SOCKS handshake.
91 EXPECT_TRUE(tcp_sock_->IsConnected()); 93 EXPECT_TRUE(tcp_sock_->IsConnected());
92 EXPECT_FALSE(user_sock_->IsConnected()); 94 EXPECT_FALSE(user_sock_->IsConnected());
93 95
94 int rv = user_sock_->Connect(&callback_); 96 scoped_refptr<LoadLog> log(new LoadLog);
97 int rv = user_sock_->Connect(&callback_, log);
95 EXPECT_EQ(ERR_IO_PENDING, rv); 98 EXPECT_EQ(ERR_IO_PENDING, rv);
99 EXPECT_TRUE(
100 LogContains(*log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
96 EXPECT_FALSE(user_sock_->IsConnected()); 101 EXPECT_FALSE(user_sock_->IsConnected());
97 rv = callback_.WaitForResult(); 102 rv = callback_.WaitForResult();
98 103
99 EXPECT_EQ(OK, rv); 104 EXPECT_EQ(OK, rv);
100 EXPECT_TRUE(user_sock_->IsConnected()); 105 EXPECT_TRUE(user_sock_->IsConnected());
101 EXPECT_EQ(SOCKSClientSocket::kSOCKS4, user_sock_->socks_version_); 106 EXPECT_EQ(SOCKSClientSocket::kSOCKS4, user_sock_->socks_version_);
107 EXPECT_TRUE(LogContains(
108 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
102 109
103 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); 110 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size());
104 memcpy(buffer->data(), payload_write.data(), payload_write.size()); 111 memcpy(buffer->data(), payload_write.data(), payload_write.size());
105 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); 112 rv = user_sock_->Write(buffer, payload_write.size(), &callback_);
106 EXPECT_EQ(ERR_IO_PENDING, rv); 113 EXPECT_EQ(ERR_IO_PENDING, rv);
107 rv = callback_.WaitForResult(); 114 rv = callback_.WaitForResult();
108 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); 115 EXPECT_EQ(static_cast<int>(payload_write.size()), rv);
109 116
110 buffer = new IOBuffer(payload_read.size()); 117 buffer = new IOBuffer(payload_read.size());
111 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); 118 rv = user_sock_->Read(buffer, payload_read.size(), &callback_);
(...skipping 28 matching lines...) Expand all
140 147
141 //--------------------------------------- 148 //---------------------------------------
142 149
143 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 150 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
144 MockWrite data_writes[] = { 151 MockWrite data_writes[] = {
145 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 152 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
146 MockRead data_reads[] = { 153 MockRead data_reads[] = {
147 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; 154 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) };
148 155
149 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 156 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80));
157 scoped_refptr<LoadLog> log(new LoadLog);
150 158
151 int rv = user_sock_->Connect(&callback_); 159 int rv = user_sock_->Connect(&callback_, log);
152 EXPECT_EQ(ERR_IO_PENDING, rv); 160 EXPECT_EQ(ERR_IO_PENDING, rv);
161 EXPECT_TRUE(LogContains(
162 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
153 rv = callback_.WaitForResult(); 163 rv = callback_.WaitForResult();
154 EXPECT_EQ(tests[i].fail_code, rv); 164 EXPECT_EQ(tests[i].fail_code, rv);
155 EXPECT_FALSE(user_sock_->IsConnected()); 165 EXPECT_FALSE(user_sock_->IsConnected());
156 EXPECT_TRUE(tcp_sock_->IsConnected()); 166 EXPECT_TRUE(tcp_sock_->IsConnected());
167 EXPECT_TRUE(LogContains(
168 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
157 } 169 }
158 } 170 }
159 171
160 // Tests scenario when the server sends the handshake response in 172 // Tests scenario when the server sends the handshake response in
161 // more than one packet. 173 // more than one packet.
162 TEST_F(SOCKSClientSocketTest, PartialServerReads) { 174 TEST_F(SOCKSClientSocketTest, PartialServerReads) {
163 const char kSOCKSPartialReply1[] = { 0x00 }; 175 const char kSOCKSPartialReply1[] = { 0x00 };
164 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; 176 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 };
165 177
166 MockWrite data_writes[] = { 178 MockWrite data_writes[] = {
167 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 179 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
168 MockRead data_reads[] = { 180 MockRead data_reads[] = {
169 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), 181 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)),
170 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; 182 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) };
171 183
172 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 184 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80));
185 scoped_refptr<LoadLog> log(new LoadLog);
173 186
174 int rv = user_sock_->Connect(&callback_); 187 int rv = user_sock_->Connect(&callback_, log);
175 EXPECT_EQ(ERR_IO_PENDING, rv); 188 EXPECT_EQ(ERR_IO_PENDING, rv);
189 EXPECT_TRUE(LogContains(
190 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
176 rv = callback_.WaitForResult(); 191 rv = callback_.WaitForResult();
177 EXPECT_EQ(OK, rv); 192 EXPECT_EQ(OK, rv);
178 EXPECT_TRUE(user_sock_->IsConnected()); 193 EXPECT_TRUE(user_sock_->IsConnected());
194 EXPECT_TRUE(LogContains(
195 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
179 } 196 }
180 197
181 // Tests scenario when the client sends the handshake request in 198 // Tests scenario when the client sends the handshake request in
182 // more than one packet. 199 // more than one packet.
183 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { 200 TEST_F(SOCKSClientSocketTest, PartialClientWrites) {
184 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; 201 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 };
185 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; 202 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 };
186 203
187 MockWrite data_writes[] = { 204 MockWrite data_writes[] = {
188 MockWrite(true, arraysize(kSOCKSPartialRequest1)), 205 MockWrite(true, arraysize(kSOCKSPartialRequest1)),
189 // simulate some empty writes 206 // simulate some empty writes
190 MockWrite(true, 0), 207 MockWrite(true, 0),
191 MockWrite(true, 0), 208 MockWrite(true, 0),
192 MockWrite(true, kSOCKSPartialRequest2, 209 MockWrite(true, kSOCKSPartialRequest2,
193 arraysize(kSOCKSPartialRequest2)) }; 210 arraysize(kSOCKSPartialRequest2)) };
194 MockRead data_reads[] = { 211 MockRead data_reads[] = {
195 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 212 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
196 213
197 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 214 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80));
215 scoped_refptr<LoadLog> log(new LoadLog);
198 216
199 int rv = user_sock_->Connect(&callback_); 217 int rv = user_sock_->Connect(&callback_, log);
200 EXPECT_EQ(ERR_IO_PENDING, rv); 218 EXPECT_EQ(ERR_IO_PENDING, rv);
219 EXPECT_TRUE(LogContains(
220 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
201 rv = callback_.WaitForResult(); 221 rv = callback_.WaitForResult();
202 EXPECT_EQ(OK, rv); 222 EXPECT_EQ(OK, rv);
203 EXPECT_TRUE(user_sock_->IsConnected()); 223 EXPECT_TRUE(user_sock_->IsConnected());
224 EXPECT_TRUE(LogContains(
225 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
204 } 226 }
205 227
206 // Tests the case when the server sends a smaller sized handshake data 228 // Tests the case when the server sends a smaller sized handshake data
207 // and closes the connection. 229 // and closes the connection.
208 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { 230 TEST_F(SOCKSClientSocketTest, FailedSocketRead) {
209 MockWrite data_writes[] = { 231 MockWrite data_writes[] = {
210 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 232 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
211 MockRead data_reads[] = { 233 MockRead data_reads[] = {
212 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), 234 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2),
213 // close connection unexpectedly 235 // close connection unexpectedly
214 MockRead(false, 0) }; 236 MockRead(false, 0) };
215 237
216 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 238 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80));
239 scoped_refptr<LoadLog> log(new LoadLog);
217 240
218 int rv = user_sock_->Connect(&callback_); 241 int rv = user_sock_->Connect(&callback_, log);
219 EXPECT_EQ(ERR_IO_PENDING, rv); 242 EXPECT_EQ(ERR_IO_PENDING, rv);
243 EXPECT_TRUE(LogContains(
244 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
220 rv = callback_.WaitForResult(); 245 rv = callback_.WaitForResult();
221 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); 246 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv);
222 EXPECT_FALSE(user_sock_->IsConnected()); 247 EXPECT_FALSE(user_sock_->IsConnected());
248 EXPECT_TRUE(LogContains(
249 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
223 } 250 }
224 251
225 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. 252 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A.
226 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { 253 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) {
227 const char hostname[] = "unresolved.ipv4.address"; 254 const char hostname[] = "unresolved.ipv4.address";
228 255
229 host_resolver_->rules()->AddSimulatedFailure(hostname); 256 host_resolver_->rules()->AddSimulatedFailure(hostname);
230 257
231 std::string request(kSOCKS4aInitialRequest, 258 std::string request(kSOCKS4aInitialRequest,
232 arraysize(kSOCKS4aInitialRequest)); 259 arraysize(kSOCKS4aInitialRequest));
233 request.append(hostname, arraysize(hostname)); 260 request.append(hostname, arraysize(hostname));
234 261
235 MockWrite data_writes[] = { 262 MockWrite data_writes[] = {
236 MockWrite(false, request.data(), request.size()) }; 263 MockWrite(false, request.data(), request.size()) };
237 MockRead data_reads[] = { 264 MockRead data_reads[] = {
238 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 265 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
239 266
240 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 267 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80));
268 scoped_refptr<LoadLog> log(new LoadLog);
241 269
242 int rv = user_sock_->Connect(&callback_); 270 int rv = user_sock_->Connect(&callback_, log);
243 EXPECT_EQ(ERR_IO_PENDING, rv); 271 EXPECT_EQ(ERR_IO_PENDING, rv);
272 EXPECT_TRUE(LogContains(
273 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
244 rv = callback_.WaitForResult(); 274 rv = callback_.WaitForResult();
245 EXPECT_EQ(OK, rv); 275 EXPECT_EQ(OK, rv);
246 EXPECT_TRUE(user_sock_->IsConnected()); 276 EXPECT_TRUE(user_sock_->IsConnected());
247 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); 277 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_);
278 EXPECT_TRUE(LogContains(
279 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
248 } 280 }
249 281
250 // Tries to connect to a domain that resolves to IPv6. 282 // Tries to connect to a domain that resolves to IPv6.
251 // Should revert to SOCKS4a. 283 // Should revert to SOCKS4a.
252 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { 284 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) {
253 const char hostname[] = "an.ipv6.address"; 285 const char hostname[] = "an.ipv6.address";
254 286
255 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); 287 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12");
256 288
257 std::string request(kSOCKS4aInitialRequest, 289 std::string request(kSOCKS4aInitialRequest,
258 arraysize(kSOCKS4aInitialRequest)); 290 arraysize(kSOCKS4aInitialRequest));
259 request.append(hostname, arraysize(hostname)); 291 request.append(hostname, arraysize(hostname));
260 292
261 MockWrite data_writes[] = { 293 MockWrite data_writes[] = {
262 MockWrite(false, request.data(), request.size()) }; 294 MockWrite(false, request.data(), request.size()) };
263 MockRead data_reads[] = { 295 MockRead data_reads[] = {
264 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 296 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
265 297
266 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 298 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80));
299 scoped_refptr<LoadLog> log(new LoadLog);
267 300
268 int rv = user_sock_->Connect(&callback_); 301 int rv = user_sock_->Connect(&callback_, log);
269 EXPECT_EQ(ERR_IO_PENDING, rv); 302 EXPECT_EQ(ERR_IO_PENDING, rv);
303 EXPECT_TRUE(LogContains(
304 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
270 rv = callback_.WaitForResult(); 305 rv = callback_.WaitForResult();
271 EXPECT_EQ(OK, rv); 306 EXPECT_EQ(OK, rv);
272 EXPECT_TRUE(user_sock_->IsConnected()); 307 EXPECT_TRUE(user_sock_->IsConnected());
273 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); 308 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_);
309 EXPECT_TRUE(LogContains(
310 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
274 } 311 }
275 312
276 } // namespace net 313 } // namespace net
277
OLDNEW
« no previous file with comments | « net/socket/socks_client_socket.cc ('k') | net/socket/ssl_client_socket_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698