| 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 |