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 "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
10 #include <ws2tcpip.h> | 10 #include <ws2tcpip.h> |
(...skipping 29 matching lines...) Expand all Loading... |
40 PRE_USER, | 40 PRE_USER, |
41 PRE_PASSWD, | 41 PRE_PASSWD, |
42 PRE_SYST, | 42 PRE_SYST, |
43 PRE_PWD, | 43 PRE_PWD, |
44 PRE_TYPE, | 44 PRE_TYPE, |
45 PRE_PASV, | 45 PRE_PASV, |
46 PRE_SIZE, | 46 PRE_SIZE, |
47 PRE_MDTM, | 47 PRE_MDTM, |
48 PRE_LIST, | 48 PRE_LIST, |
49 PRE_RETR, | 49 PRE_RETR, |
50 PRE_PASV2, | |
51 PRE_CWD, | 50 PRE_CWD, |
52 PRE_QUIT, | 51 PRE_QUIT, |
53 QUIT | 52 QUIT |
54 }; | 53 }; |
55 | 54 |
56 FtpMockControlSocket() | 55 FtpMockControlSocket() |
57 : failure_injection_state_(NONE), | 56 : failure_injection_state_(NONE), |
58 multiline_welcome_(false) { | 57 multiline_welcome_(false) { |
59 Init(); | 58 Init(); |
60 } | 59 } |
(...skipping 15 matching lines...) Expand all Loading... |
76 case PRE_SYST: | 75 case PRE_SYST: |
77 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); | 76 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); |
78 case PRE_PWD: | 77 case PRE_PWD: |
79 return Verify("PWD\r\n", data, PRE_TYPE, | 78 return Verify("PWD\r\n", data, PRE_TYPE, |
80 "257 \"/\" is your current location\r\n"); | 79 "257 \"/\" is your current location\r\n"); |
81 case PRE_TYPE: | 80 case PRE_TYPE: |
82 return Verify("TYPE I\r\n", data, PRE_PASV, | 81 return Verify("TYPE I\r\n", data, PRE_PASV, |
83 "200 TYPE is now 8-bit binary\r\n"); | 82 "200 TYPE is now 8-bit binary\r\n"); |
84 case PRE_PASV: | 83 case PRE_PASV: |
85 return Verify("PASV\r\n", data, PRE_SIZE, | 84 return Verify("PASV\r\n", data, PRE_SIZE, |
86 "227 Entering Passive Mode (127,0,0,1,123,456)\r\n"); | 85 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
87 case PRE_QUIT: | 86 case PRE_QUIT: |
88 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); | 87 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); |
89 default: | 88 default: |
90 return MockWriteResult(true, ERR_UNEXPECTED); | 89 return MockWriteResult(true, ERR_UNEXPECTED); |
91 } | 90 } |
92 } | 91 } |
93 | 92 |
94 void InjectFailure(State state, State next_state, const char* response) { | 93 void InjectFailure(State state, State next_state, const char* response) { |
95 DCHECK_EQ(NONE, failure_injection_state_); | 94 DCHECK_EQ(NONE, failure_injection_state_); |
96 DCHECK_NE(NONE, state); | 95 DCHECK_NE(NONE, state); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 if (InjectFault()) | 163 if (InjectFault()) |
165 return MockWriteResult(true, data.length()); | 164 return MockWriteResult(true, data.length()); |
166 switch (state()) { | 165 switch (state()) { |
167 case PRE_SIZE: | 166 case PRE_SIZE: |
168 return Verify("SIZE /\r\n", data, PRE_MDTM, | 167 return Verify("SIZE /\r\n", data, PRE_MDTM, |
169 "550 I can only retrieve regular files\r\n"); | 168 "550 I can only retrieve regular files\r\n"); |
170 case PRE_MDTM: | 169 case PRE_MDTM: |
171 return Verify("MDTM /\r\n", data, PRE_RETR, | 170 return Verify("MDTM /\r\n", data, PRE_RETR, |
172 "213 20070221112533\r\n"); | 171 "213 20070221112533\r\n"); |
173 case PRE_RETR: | 172 case PRE_RETR: |
174 return Verify("RETR /\r\n", data, PRE_PASV2, | 173 return Verify("RETR /\r\n", data, PRE_CWD, |
175 "550 Can't download directory\r\n"); | 174 "550 Can't download directory\r\n"); |
176 case PRE_PASV2: | |
177 // Parser should also accept format without parentheses. | |
178 return Verify("PASV\r\n", data, PRE_CWD, | |
179 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | |
180 case PRE_CWD: | 175 case PRE_CWD: |
181 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); | 176 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); |
182 case PRE_LIST: | 177 case PRE_LIST: |
183 // TODO(phajdan.jr): Also test with "150 Accepted Data Connection". | 178 // TODO(phajdan.jr): Also test with "150 Accepted Data Connection". |
184 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); | 179 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); |
185 default: | 180 default: |
186 return FtpMockControlSocket::OnWrite(data); | 181 return FtpMockControlSocket::OnWrite(data); |
187 } | 182 } |
188 } | 183 } |
189 | 184 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 class FtpMockControlSocketFileDownloadRetrFail | 286 class FtpMockControlSocketFileDownloadRetrFail |
292 : public FtpMockControlSocketFileDownload { | 287 : public FtpMockControlSocketFileDownload { |
293 public: | 288 public: |
294 FtpMockControlSocketFileDownloadRetrFail() { | 289 FtpMockControlSocketFileDownloadRetrFail() { |
295 } | 290 } |
296 | 291 |
297 virtual MockWriteResult OnWrite(const std::string& data) { | 292 virtual MockWriteResult OnWrite(const std::string& data) { |
298 if (InjectFault()) | 293 if (InjectFault()) |
299 return MockWriteResult(true, data.length()); | 294 return MockWriteResult(true, data.length()); |
300 switch (state()) { | 295 switch (state()) { |
301 case PRE_PASV2: | |
302 return Verify("PASV\r\n", data, PRE_CWD, | |
303 "227 Entering Passive Mode (127,0,0,1,123,456)\r\n"); | |
304 case PRE_CWD: | 296 case PRE_CWD: |
305 return Verify("CWD /file\r\n", data, PRE_QUIT, | 297 return Verify("CWD /file\r\n", data, PRE_QUIT, |
306 "550 file is a directory\r\n"); | 298 "550 file is a directory\r\n"); |
307 default: | 299 default: |
308 return FtpMockControlSocketFileDownload::OnWrite(data); | 300 return FtpMockControlSocketFileDownload::OnWrite(data); |
309 } | 301 } |
310 } | 302 } |
311 | 303 |
312 private: | 304 private: |
313 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketFileDownloadRetrFail); | 305 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketFileDownloadRetrFail); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 return info; | 376 return info; |
385 } | 377 } |
386 | 378 |
387 void ExecuteTransaction(FtpMockControlSocket* ctrl_socket, | 379 void ExecuteTransaction(FtpMockControlSocket* ctrl_socket, |
388 const char* request, | 380 const char* request, |
389 int expected_result) { | 381 int expected_result) { |
390 std::string mock_data("mock-data"); | 382 std::string mock_data("mock-data"); |
391 MockRead data_reads[] = { | 383 MockRead data_reads[] = { |
392 MockRead(mock_data.c_str()), | 384 MockRead(mock_data.c_str()), |
393 }; | 385 }; |
394 // TODO(phajdan.jr): FTP transaction should not open two data sockets. | 386 StaticMockSocket data_socket(data_reads, NULL); |
395 StaticMockSocket data_socket1(data_reads, NULL); | |
396 StaticMockSocket data_socket2(data_reads, NULL); | |
397 mock_socket_factory_.AddMockSocket(ctrl_socket); | 387 mock_socket_factory_.AddMockSocket(ctrl_socket); |
398 mock_socket_factory_.AddMockSocket(&data_socket1); | 388 mock_socket_factory_.AddMockSocket(&data_socket); |
399 mock_socket_factory_.AddMockSocket(&data_socket2); | |
400 FtpRequestInfo request_info = GetRequestInfo(request); | 389 FtpRequestInfo request_info = GetRequestInfo(request); |
401 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 390 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
402 ASSERT_EQ(ERR_IO_PENDING, | 391 ASSERT_EQ(ERR_IO_PENDING, |
403 transaction_.Start(&request_info, &callback_, NULL)); | 392 transaction_.Start(&request_info, &callback_, NULL)); |
404 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 393 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
405 EXPECT_EQ(expected_result, callback_.WaitForResult()); | 394 EXPECT_EQ(expected_result, callback_.WaitForResult()); |
406 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state()); | 395 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state()); |
407 if (expected_result == OK) { | 396 if (expected_result == OK) { |
408 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 397 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
409 memset(io_buffer->data(), 0, kBufferSize); | 398 memset(io_buffer->data(), 0, kBufferSize); |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) { | 756 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) { |
768 FtpMockControlSocketDirectoryListing ctrl_socket; | 757 FtpMockControlSocketDirectoryListing ctrl_socket; |
769 TransactionFailHelper(&ctrl_socket, | 758 TransactionFailHelper(&ctrl_socket, |
770 "ftp://host", | 759 "ftp://host", |
771 FtpMockControlSocket::PRE_MDTM, | 760 FtpMockControlSocket::PRE_MDTM, |
772 FtpMockControlSocket::PRE_RETR, | 761 FtpMockControlSocket::PRE_RETR, |
773 "500 failed mdtm\r\n", | 762 "500 failed mdtm\r\n", |
774 OK); | 763 OK); |
775 } | 764 } |
776 | 765 |
777 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPasv2) { | |
778 FtpMockControlSocketDirectoryListing ctrl_socket; | |
779 TransactionFailHelper(&ctrl_socket, | |
780 "ftp://host", | |
781 FtpMockControlSocket::PRE_PASV2, | |
782 FtpMockControlSocket::PRE_QUIT, | |
783 "500 failed pasv\r\n", | |
784 ERR_FAILED); | |
785 } | |
786 | |
787 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { | 766 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { |
788 FtpMockControlSocketDirectoryListing ctrl_socket; | 767 FtpMockControlSocketDirectoryListing ctrl_socket; |
789 TransactionFailHelper(&ctrl_socket, | 768 TransactionFailHelper(&ctrl_socket, |
790 "ftp://host", | 769 "ftp://host", |
791 FtpMockControlSocket::PRE_CWD, | 770 FtpMockControlSocket::PRE_CWD, |
792 FtpMockControlSocket::PRE_QUIT, | 771 FtpMockControlSocket::PRE_QUIT, |
793 "500 failed cwd\r\n", | 772 "500 failed cwd\r\n", |
794 ERR_FAILED); | 773 ERR_FAILED); |
795 } | 774 } |
796 | 775 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
892 FtpMockControlSocket::PRE_QUIT, | 871 FtpMockControlSocket::PRE_QUIT, |
893 "500 failed retr\r\n", | 872 "500 failed retr\r\n", |
894 ERR_FAILED); | 873 ERR_FAILED); |
895 } | 874 } |
896 | 875 |
897 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { | 876 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { |
898 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; | 877 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; |
899 TransactionFailHelper(&ctrl_socket, | 878 TransactionFailHelper(&ctrl_socket, |
900 "ftp://host/file", | 879 "ftp://host/file", |
901 FtpMockControlSocket::PRE_RETR, | 880 FtpMockControlSocket::PRE_RETR, |
902 FtpMockControlSocket::PRE_PASV2, | 881 FtpMockControlSocket::PRE_CWD, |
903 "550 cannot open file\r\n", | 882 "550 cannot open file\r\n", |
904 ERR_FILE_NOT_FOUND); | 883 ERR_FILE_NOT_FOUND); |
905 } | 884 } |
906 | 885 |
907 } // namespace net | 886 } // namespace net |
OLD | NEW |