OLD | NEW |
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/ftp/ftp_network_transaction.h" | 5 #include "net/ftp/ftp_network_transaction.h" |
6 | 6 |
7 #include "base/ref_counted.h" | 7 #include "base/ref_counted.h" |
8 #include "net/base/host_resolver.h" | 8 #include "net/base/host_resolver.h" |
9 #include "net/base/host_resolver_unittest.h" | 9 #include "net/base/host_resolver_unittest.h" |
10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 transaction_(session_.get(), &mock_socket_factory_) { | 228 transaction_(session_.get(), &mock_socket_factory_) { |
229 } | 229 } |
230 | 230 |
231 protected: | 231 protected: |
232 FtpRequestInfo GetRequestInfo(const std::string& url) { | 232 FtpRequestInfo GetRequestInfo(const std::string& url) { |
233 FtpRequestInfo info; | 233 FtpRequestInfo info; |
234 info.url = GURL(url); | 234 info.url = GURL(url); |
235 return info; | 235 return info; |
236 } | 236 } |
237 | 237 |
238 void TransactionFailHelper(FtpMockControlSocket* ctrl_socket, | 238 void ExecuteTransaction(FtpMockControlSocket* ctrl_socket, |
239 const char* request, | 239 const char* request, |
240 FtpMockControlSocket::State state, | 240 int expected_result) { |
241 FtpMockControlSocket::State next_state, | 241 std::string mock_data("mock-data"); |
242 const char* response, | 242 MockRead data_reads[] = { |
243 int expected_result) { | 243 MockRead(mock_data.c_str()), |
244 ctrl_socket->InjectFailure(state, next_state, response); | 244 }; |
245 StaticMockSocket data_socket1; | 245 // TODO(phajdan.jr): FTP transaction should not open two data sockets. |
246 StaticMockSocket data_socket2; | 246 StaticMockSocket data_socket1(data_reads, NULL); |
| 247 StaticMockSocket data_socket2(data_reads, NULL); |
247 mock_socket_factory_.AddMockSocket(ctrl_socket); | 248 mock_socket_factory_.AddMockSocket(ctrl_socket); |
248 mock_socket_factory_.AddMockSocket(&data_socket1); | 249 mock_socket_factory_.AddMockSocket(&data_socket1); |
249 mock_socket_factory_.AddMockSocket(&data_socket2); | 250 mock_socket_factory_.AddMockSocket(&data_socket2); |
250 FtpRequestInfo request_info = GetRequestInfo(request); | 251 FtpRequestInfo request_info = GetRequestInfo(request); |
251 ASSERT_EQ(ERR_IO_PENDING, transaction_.Start(&request_info, &callback_)); | 252 ASSERT_EQ(ERR_IO_PENDING, transaction_.Start(&request_info, &callback_)); |
252 EXPECT_EQ(expected_result, callback_.WaitForResult()); | 253 EXPECT_EQ(expected_result, callback_.WaitForResult()); |
253 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state()); | 254 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state()); |
| 255 if (expected_result == OK) { |
| 256 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
| 257 memset(io_buffer->data(), 0, kBufferSize); |
| 258 ASSERT_EQ(ERR_IO_PENDING, |
| 259 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); |
| 260 EXPECT_EQ(static_cast<int>(mock_data.length()), |
| 261 callback_.WaitForResult()); |
| 262 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
| 263 } |
| 264 } |
| 265 |
| 266 void TransactionFailHelper(FtpMockControlSocket* ctrl_socket, |
| 267 const char* request, |
| 268 FtpMockControlSocket::State state, |
| 269 FtpMockControlSocket::State next_state, |
| 270 const char* response, |
| 271 int expected_result) { |
| 272 ctrl_socket->InjectFailure(state, next_state, response); |
| 273 ExecuteTransaction(ctrl_socket, request, expected_result); |
254 } | 274 } |
255 | 275 |
256 scoped_refptr<FtpNetworkSession> session_; | 276 scoped_refptr<FtpNetworkSession> session_; |
257 MockClientSocketFactory mock_socket_factory_; | 277 MockClientSocketFactory mock_socket_factory_; |
258 FtpNetworkTransaction transaction_; | 278 FtpNetworkTransaction transaction_; |
259 TestCompletionCallback callback_; | 279 TestCompletionCallback callback_; |
260 }; | 280 }; |
261 | 281 |
262 TEST_F(FtpNetworkTransactionTest, FailedLookup) { | 282 TEST_F(FtpNetworkTransactionTest, FailedLookup) { |
263 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); | 283 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); |
264 scoped_refptr<RuleBasedHostMapper> mapper(new RuleBasedHostMapper()); | 284 scoped_refptr<RuleBasedHostMapper> mapper(new RuleBasedHostMapper()); |
265 mapper->AddSimulatedFailure("badhost"); | 285 mapper->AddSimulatedFailure("badhost"); |
266 ScopedHostMapper scoped_mapper(mapper.get()); | 286 ScopedHostMapper scoped_mapper(mapper.get()); |
267 ASSERT_EQ(ERR_IO_PENDING, transaction_.Start(&request_info, &callback_)); | 287 ASSERT_EQ(ERR_IO_PENDING, transaction_.Start(&request_info, &callback_)); |
268 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); | 288 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); |
269 } | 289 } |
270 | 290 |
271 TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { | 291 TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { |
272 FtpMockControlSocketDirectoryListing ctrl_socket; | 292 FtpMockControlSocketDirectoryListing ctrl_socket; |
273 std::string test_string("mock-directory-listing"); | 293 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
274 MockRead data_reads[] = { | 294 } |
275 MockRead(test_string.c_str()), | 295 |
276 }; | 296 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads2) { |
277 // TODO(phajdan.jr): FTP transaction should not open two data sockets. | 297 FtpMockControlSocketDirectoryListing ctrl_socket; |
278 StaticMockSocket data_socket1; | 298 ctrl_socket.set_short_read_limit(2); |
279 StaticMockSocket data_socket2(data_reads, NULL); | 299 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
280 mock_socket_factory_.AddMockSocket(&ctrl_socket); | 300 } |
281 mock_socket_factory_.AddMockSocket(&data_socket1); | 301 |
282 mock_socket_factory_.AddMockSocket(&data_socket2); | 302 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads5) { |
283 FtpRequestInfo request_info = GetRequestInfo("ftp://host"); | 303 FtpMockControlSocketDirectoryListing ctrl_socket; |
284 ASSERT_EQ(ERR_IO_PENDING, transaction_.Start(&request_info, &callback_)); | 304 ctrl_socket.set_short_read_limit(5); |
285 EXPECT_EQ(OK, callback_.WaitForResult()); | 305 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
286 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket.state()); | |
287 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | |
288 memset(io_buffer->data(), 0, kBufferSize); | |
289 EXPECT_EQ(ERR_IO_PENDING, | |
290 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | |
291 EXPECT_EQ(static_cast<int>(test_string.length()), callback_.WaitForResult()); | |
292 EXPECT_EQ(test_string, std::string(io_buffer->data(), test_string.length())); | |
293 } | 306 } |
294 | 307 |
295 TEST_F(FtpNetworkTransactionTest, DownloadTransaction) { | 308 TEST_F(FtpNetworkTransactionTest, DownloadTransaction) { |
296 FtpMockControlSocketFileDownload ctrl_socket; | 309 FtpMockControlSocketFileDownload ctrl_socket; |
297 std::string test_string("mock-file-contents"); | 310 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
298 MockRead data_reads[] = { | 311 } |
299 MockRead(test_string.c_str()), | 312 |
300 }; | 313 TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads2) { |
301 StaticMockSocket data_socket(data_reads, NULL); | 314 FtpMockControlSocketFileDownload ctrl_socket; |
302 mock_socket_factory_.AddMockSocket(&ctrl_socket); | 315 ctrl_socket.set_short_read_limit(2); |
303 mock_socket_factory_.AddMockSocket(&data_socket); | 316 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
304 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 317 } |
305 ASSERT_EQ(ERR_IO_PENDING, transaction_.Start(&request_info, &callback_)); | 318 |
306 EXPECT_EQ(OK, callback_.WaitForResult()); | 319 TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads5) { |
307 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket.state()); | 320 FtpMockControlSocketFileDownload ctrl_socket; |
308 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 321 ctrl_socket.set_short_read_limit(5); |
309 memset(io_buffer->data(), 0, kBufferSize); | 322 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
310 EXPECT_EQ(ERR_IO_PENDING, | |
311 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | |
312 EXPECT_EQ(static_cast<int>(test_string.length()), callback_.WaitForResult()); | |
313 EXPECT_EQ(test_string, std::string(io_buffer->data(), test_string.length())); | |
314 } | 323 } |
315 | 324 |
316 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { | 325 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { |
317 FtpMockControlSocketDirectoryListing ctrl_socket; | 326 FtpMockControlSocketDirectoryListing ctrl_socket; |
318 TransactionFailHelper(&ctrl_socket, | 327 TransactionFailHelper(&ctrl_socket, |
319 "ftp://host", | 328 "ftp://host", |
320 FtpMockControlSocket::PRE_USER, | 329 FtpMockControlSocket::PRE_USER, |
321 FtpMockControlSocket::PRE_QUIT, | 330 FtpMockControlSocket::PRE_QUIT, |
322 "500 no such user\r\n", | 331 "500 no such user\r\n", |
323 ERR_FAILED); | 332 ERR_FAILED); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; | 506 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; |
498 TransactionFailHelper(&ctrl_socket, | 507 TransactionFailHelper(&ctrl_socket, |
499 "ftp://host/file", | 508 "ftp://host/file", |
500 FtpMockControlSocket::PRE_RETR, | 509 FtpMockControlSocket::PRE_RETR, |
501 FtpMockControlSocket::PRE_PASV2, | 510 FtpMockControlSocket::PRE_PASV2, |
502 "500 failed retr\r\n", | 511 "500 failed retr\r\n", |
503 ERR_FAILED); | 512 ERR_FAILED); |
504 } | 513 } |
505 | 514 |
506 } // namespace net | 515 } // namespace net |
OLD | NEW |