diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-30 07:46:42 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-30 07:46:42 +0000 |
commit | 8c3d836472137bc907e3346bbccd97ff29b547bb (patch) | |
tree | c8dd498595a776d094823863e61e84e6a76422a0 /net/ftp | |
parent | 489ab8a147a5d5c78757f2910e0b598453c61962 (diff) | |
download | chromium_src-8c3d836472137bc907e3346bbccd97ff29b547bb.zip chromium_src-8c3d836472137bc907e3346bbccd97ff29b547bb.tar.gz chromium_src-8c3d836472137bc907e3346bbccd97ff29b547bb.tar.bz2 |
Refactor FTP unit tests.
This is needed to write a fix for the bug below.
BUG=56734
TEST=changing tests, and only tests (net_unittests)
Review URL: http://codereview.chromium.org/3412039
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61034 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/ftp')
-rw-r--r-- | net/ftp/ftp_network_transaction_unittest.cc | 1271 |
1 files changed, 530 insertions, 741 deletions
diff --git a/net/ftp/ftp_network_transaction_unittest.cc b/net/ftp/ftp_network_transaction_unittest.cc index 8b877a9..4c5bd6c 100644 --- a/net/ftp/ftp_network_transaction_unittest.cc +++ b/net/ftp/ftp_network_transaction_unittest.cc @@ -50,584 +50,236 @@ class FtpSocketDataProvider : public DynamicSocketDataProvider { QUIT }; - FtpSocketDataProvider() - : failure_injection_state_(NONE), - multiline_welcome_(false), - data_type_('I') { + FtpSocketDataProvider() { Init(); + AddDefaultTransitions(); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_USER: - return Verify("USER anonymous\r\n", data, PRE_PASSWD, - "331 Password needed\r\n"); - case PRE_PASSWD: - { - const char* response_one = "230 Welcome\r\n"; - const char* response_multi = "230- One\r\n230- Two\r\n230 Three\r\n"; - return Verify("PASS chrome@example.com\r\n", data, PRE_SYST, - multiline_welcome_ ? response_multi : response_one); - } - case PRE_SYST: - return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); - case PRE_PWD: - return Verify("PWD\r\n", data, PRE_TYPE, - "257 \"/\" is your current location\r\n"); - case PRE_TYPE: - return Verify(std::string("TYPE ") + data_type_ + "\r\n", data, - PRE_EPSV, "200 TYPE set successfully\r\n"); - case PRE_EPSV: - return Verify("EPSV\r\n", data, PRE_SIZE, - "227 Entering Extended Passive Mode (|||31744|)\r\n"); - case PRE_NOPASV: - // Use unallocated 599 FTP error code to make sure it falls into the - // generic ERR_FTP_FAILED bucket. - return Verify("PASV\r\n", data, PRE_QUIT, - "599 fail\r\n"); - case PRE_QUIT: - return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); - default: - NOTREACHED() << "State not handled " << state(); - return MockWriteResult(true, ERR_UNEXPECTED); - } - } - - void InjectFailure(State state, State next_state, const char* response) { - DCHECK_EQ(NONE, failure_injection_state_); - DCHECK_NE(NONE, state); - DCHECK_NE(NONE, next_state); - DCHECK_NE(state, next_state); - failure_injection_state_ = state; - failure_injection_next_state_ = next_state; - fault_response_ = response; - } - - State state() const { - return state_; - } - - virtual void Reset() { - DynamicSocketDataProvider::Reset(); - Init(); - } - - void set_multiline_welcome(bool multiline) { - multiline_welcome_ = multiline; - } - - void set_data_type(char data_type) { - data_type_ = data_type; - } - - protected: - void Init() { - state_ = PRE_USER; - SimulateRead("220 host TestFTPd\r\n"); - } - - // If protocol fault injection has been requested, adjusts state and mocked - // read and returns true. - bool InjectFault() { - if (state_ != failure_injection_state_) - return false; - SimulateRead(fault_response_); - state_ = failure_injection_next_state_; - return true; - } - - MockWriteResult Verify(const std::string& expected, - const std::string& data, - State next_state, - const char* next_read, - const size_t next_read_length) { - EXPECT_EQ(expected, data); - if (expected == data) { - state_ = next_state; - SimulateRead(next_read, next_read_length); - return MockWriteResult(true, data.length()); - } - return MockWriteResult(true, ERR_UNEXPECTED); - } - - MockWriteResult Verify(const std::string& expected, - const std::string& data, - State next_state, - const char* next_read) { - return Verify(expected, data, next_state, - next_read, std::strlen(next_read)); - } - - - private: - State state_; - State failure_injection_state_; - State failure_injection_next_state_; - const char* fault_response_; - - // If true, we will send multiple 230 lines as response after PASS. - bool multiline_welcome_; - - // Data type to be used for TYPE command. - char data_type_; - - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProvider); -}; - -class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { - public: - FtpSocketDataProviderDirectoryListing() { + void AddTransition(State from, const std::string& input, + State to, const std::string& response) { + transitions_[from] = Transition(input, to, response); } virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_SIZE: - return Verify("SIZE /\r\n", data, PRE_CWD, - "550 I can only retrieve regular files\r\n"); - case PRE_CWD: - return Verify("CWD /\r\n", data, PRE_MLSD, "200 OK\r\n"); - case PRE_MLSD: - return Verify("MLSD\r\n", data, PRE_QUIT, - "150 Accepted data connection\r\n" - "226 MLSD complete\r\n"); - case PRE_LIST: - return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); - default: - return FtpSocketDataProvider::OnWrite(data); + if (!ContainsKey(transitions_, state())) { + NOTREACHED() << "State not handled: " << state(); + return MockWriteResult(true, ERR_UNEXPECTED); } - } - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing); -}; - -class FtpSocketDataProviderDirectoryListingWithPasvFallback - : public FtpSocketDataProviderDirectoryListing { - public: - FtpSocketDataProviderDirectoryListingWithPasvFallback() { + Transition t(transitions_[state()]); + return Verify(t.input, data, t.state, t.response); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_EPSV: - return Verify("EPSV\r\n", data, PRE_PASV, - "500 no EPSV for you\r\n"); - case PRE_PASV: - return Verify("PASV\r\n", data, PRE_SIZE, - "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); - default: - return FtpSocketDataProviderDirectoryListing::OnWrite(data); - } + void PrepareMockDirectoryListing() { + AddTransition(PRE_SIZE, "SIZE /\r\n", + PRE_CWD, "550 I can only retrieve regular files\r\n"); + AddTransition(PRE_CWD, "CWD /\r\n", + PRE_MLSD, "200 OK\r\n"); + AddTransition(PRE_MLSD, "MLSD\r\n", + PRE_QUIT, "150 Accepted data connection\r\n" + "226 MLSD complete\r\n"); + AddTransition(PRE_LIST, "LIST\r\n", + PRE_QUIT, "200 OK\r\n"); } - private: - DISALLOW_COPY_AND_ASSIGN( - FtpSocketDataProviderDirectoryListingWithPasvFallback); -}; - -class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { - public: - FtpSocketDataProviderVMSDirectoryListing() { + void PrepareMockDirectoryListingWithPasvFallback() { + PrepareMockDirectoryListing(); + AddTransition(PRE_EPSV, "EPSV\r\n", + PRE_PASV, "500 Command not understood\r\n"); + AddTransition(PRE_PASV, "PASV\r\n", + PRE_SIZE, "227 Passive Mode 127,0,0,1,123,456\r\n"); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_SYST: - return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); - case PRE_PWD: - return Verify("PWD\r\n", data, PRE_TYPE, - "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); - case PRE_EPSV: - return Verify("EPSV\r\n", data, PRE_PASV, "500 Invalid command\r\n"); - case PRE_PASV: - return Verify("PASV\r\n", data, PRE_SIZE, - "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); - case PRE_SIZE: - return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD, - "550 I can only retrieve regular files\r\n"); - case PRE_CWD: - return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_MLSD, - "200 OK\r\n"); - case PRE_MLSD: - return Verify("MLSD\r\n", data, PRE_LIST, "500 Invalid command\r\n"); - case PRE_LIST: - return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); - default: - return FtpSocketDataProvider::OnWrite(data); - } + void PrepareMockVMSDirectoryListing() { + AddTransition(PRE_SYST, "SYST\r\n", + PRE_PWD, "215 VMS\r\n"); + AddTransition(PRE_PWD, "PWD\r\n", + PRE_TYPE, "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); + AddTransition(PRE_EPSV, "EPSV\r\n", + PRE_PASV, "500 Invalid command\r\n"); + AddTransition(PRE_PASV, "PASV\r\n", + PRE_SIZE, "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); + AddTransition(PRE_SIZE, "SIZE ANONYMOUS_ROOT:[000000]dir\r\n", + PRE_CWD, "550 I can only retrieve regular files\r\n"); + AddTransition(PRE_CWD, "CWD ANONYMOUS_ROOT:[dir]\r\n", + PRE_MLSD, "200 OK\r\n"); + AddTransition(PRE_MLSD, "MLSD\r\n", + PRE_LIST, "500 Invalid command\r\n"); + AddTransition(PRE_LIST, "LIST *.*;0\r\n", + PRE_QUIT, "200 OK\r\n"); } - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing); -}; - -class FtpSocketDataProviderVMSDirectoryListingRootDirectory - : public FtpSocketDataProvider { - public: - FtpSocketDataProviderVMSDirectoryListingRootDirectory() { + void PrepareMockVMSDirectoryListingRootDirectory() { + PrepareMockVMSDirectoryListing(); + AddTransition(PRE_SIZE, "SIZE ANONYMOUS_ROOT\r\n", + PRE_CWD, "550 I can only retrieve regular files\r\n"); + AddTransition(PRE_CWD, "CWD ANONYMOUS_ROOT:[000000]\r\n", + PRE_MLSD, "200 OK\r\n"); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_SYST: - return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); - case PRE_PWD: - return Verify("PWD\r\n", data, PRE_TYPE, - "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); - case PRE_EPSV: - return Verify("EPSV\r\n", data, PRE_PASV, - "500 EPSV command unknown\r\n"); - case PRE_PASV: - return Verify("PASV\r\n", data, PRE_SIZE, - "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); - case PRE_SIZE: - return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD, - "550 I can only retrieve regular files\r\n"); - case PRE_CWD: - return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_MLSD, - "200 OK\r\n"); - case PRE_MLSD: - return Verify("MLSD\r\n", data, PRE_LIST, "500 Invalid command\r\n"); - case PRE_LIST: - return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); - default: - return FtpSocketDataProvider::OnWrite(data); - } + void PrepareMockFileDownload() { + AddTransition(PRE_SIZE, "SIZE /file\r\n", + PRE_RETR, "213 18\r\n"); + AddTransition(PRE_RETR, "RETR /file\r\n", + PRE_QUIT, "200 OK\r\n"); } - private: - DISALLOW_COPY_AND_ASSIGN( - FtpSocketDataProviderVMSDirectoryListingRootDirectory); -}; - -class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { - public: - FtpSocketDataProviderFileDownload() { + void PrepareMockFileDownloadWithPasvFallback() { + PrepareMockFileDownload(); + AddTransition(PRE_EPSV, "EPSV\r\n", + PRE_PASV, "500 Invalid command\r\n"); + AddTransition(PRE_PASV, "PASV\r\n", + PRE_SIZE, "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_SIZE: - return Verify("SIZE /file\r\n", data, PRE_RETR, - "213 18\r\n"); - case PRE_RETR: - return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); - default: - return FtpSocketDataProvider::OnWrite(data); - } + void PrepareMockVMSFileDownload() { + AddTransition(PRE_SYST, "SYST\r\n", + PRE_PWD, "215 VMS\r\n"); + AddTransition(PRE_PWD, "PWD\r\n", + PRE_TYPE, "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); + AddTransition(PRE_EPSV, "EPSV\r\n", + PRE_PASV, "500 Invalid command\r\n"); + AddTransition(PRE_PASV, "PASV\r\n", + PRE_SIZE, "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); + AddTransition(PRE_SIZE, "SIZE ANONYMOUS_ROOT:[000000]file\r\n", + PRE_RETR, "213 18\r\n"); + AddTransition(PRE_RETR, "RETR ANONYMOUS_ROOT:[000000]file\r\n", + PRE_QUIT, "200 OK\r\n"); } - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); -}; - -class FtpSocketDataProviderFileDownloadWithPasvFallback - : public FtpSocketDataProviderFileDownload { - public: - FtpSocketDataProviderFileDownloadWithPasvFallback() { + void PrepareMockFileDownloadEscaping() { + PrepareMockFileDownload(); + AddTransition(PRE_SIZE, "SIZE / !\"#$%y\200\201\r\n", + PRE_RETR, "213 18\r\n"); + AddTransition(PRE_RETR, "RETR / !\"#$%y\200\201\r\n", + PRE_QUIT, "200 OK\r\n"); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_EPSV: - return Verify("EPSV\r\n", data, PRE_PASV, - "500 No can do\r\n"); - case PRE_PASV: - return Verify("PASV\r\n", data, PRE_SIZE, - "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); - default: - return FtpSocketDataProviderFileDownload::OnWrite(data); - } + void PrepareMockFileDownloadTransferStarting() { + PrepareMockFileDownload(); + AddTransition(PRE_RETR, "RETR /file\r\n", + PRE_QUIT, "125-Data connection already open.\r\n" + "125 Transfer starting.\r\n" + "226 Transfer complete.\r\n"); } - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); -}; - -class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { - public: - FtpSocketDataProviderVMSFileDownload() { + void PrepareMockDirectoryListingTransferStarting() { + PrepareMockDirectoryListing(); + AddTransition(PRE_LIST, "LIST\r\n", + PRE_QUIT, "125-Data connection already open.\r\n" + "125 Transfer starting.\r\n" + "226 Transfer complete.\r\n"); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_SYST: - return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); - case PRE_PWD: - return Verify("PWD\r\n", data, PRE_TYPE, - "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); - case PRE_EPSV: - return Verify("EPSV\r\n", data, PRE_PASV, - "500 EPSV command unknown\r\n"); - case PRE_PASV: - return Verify("PASV\r\n", data, PRE_SIZE, - "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); - case PRE_SIZE: - return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_RETR, - "213 18\r\n"); - case PRE_RETR: - return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, - "200 OK\r\n"); - default: - return FtpSocketDataProvider::OnWrite(data); - } + void PrepareMockFileDownloadEvilEpsv(const std::string& epsv_response, + State next_state) { + PrepareMockFileDownload(); + AddTransition(PRE_EPSV, "EPSV\r\n", + next_state, epsv_response); } - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload); -}; - -class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload { - public: - FtpSocketDataProviderEscaping() { + void PrepareMockFileDownloadEvilPasv(const std::string& pasv_response, + State next_state) { + PrepareMockFileDownloadWithPasvFallback(); + AddTransition(PRE_PASV, "PASV\r\n", + next_state, pasv_response); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_SIZE: - return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_RETR, - "213 18\r\n"); - case PRE_RETR: - return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, - "200 OK\r\n"); - default: - return FtpSocketDataProviderFileDownload::OnWrite(data); - } + void PrepareMockFileDownloadEvilSize(const std::string& size_response, + State next_state) { + PrepareMockFileDownload(); + AddTransition(PRE_SIZE, "SIZE /file\r\n", + next_state, size_response); } - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping); -}; - -class FtpSocketDataProviderFileDownloadTransferStarting - : public FtpSocketDataProviderFileDownload { - public: - FtpSocketDataProviderFileDownloadTransferStarting() { + void PrepareMockFileDownloadEvilLogin(const std::string& user, + const std::string& password) { + PrepareMockFileDownload(); + AddTransition(PRE_USER, std::string("USER ") + user + "\r\n", + PRE_PASSWD, "331 Password needed\r\n"); + AddTransition(PRE_PASSWD, std::string("PASS ") + password + "\r\n", + PRE_SYST, "230 Welcome\r\n"); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_RETR: - return Verify("RETR /file\r\n", data, PRE_QUIT, - "125-Data connection already open.\r\n" - "125 Transfer starting.\r\n" - "226 Transfer complete.\r\n"); - default: - return FtpSocketDataProviderFileDownload::OnWrite(data); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadTransferStarting); -}; - -class FtpSocketDataProviderDirectoryListingTransferStarting - : public FtpSocketDataProviderDirectoryListing { - public: - FtpSocketDataProviderDirectoryListingTransferStarting() { + State state() const { + return state_; } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_LIST: - return Verify("LIST\r\n", data, PRE_QUIT, - "125-Data connection already open.\r\n" - "125 Transfer starting.\r\n" - "226 Transfer complete.\r\n"); - default: - return FtpSocketDataProviderDirectoryListing::OnWrite(data); - } + virtual void Reset() { + DynamicSocketDataProvider::Reset(); + Init(); } - private: - DISALLOW_COPY_AND_ASSIGN( - FtpSocketDataProviderDirectoryListingTransferStarting); -}; - -class FtpSocketDataProviderFileDownloadInvalidResponse - : public FtpSocketDataProviderFileDownload { - public: - FtpSocketDataProviderFileDownloadInvalidResponse() { + protected: + void Init() { + state_ = PRE_USER; + SimulateRead("220 host TestFTPd\r\n"); } - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_SIZE: - // Use unallocated 599 FTP error code to make sure it falls into the - // generic ERR_FTP_FAILED bucket. - return Verify("SIZE /file\r\n", data, PRE_QUIT, - "599 Evil Response\r\n" - "599 More Evil\r\n"); - default: - return FtpSocketDataProviderFileDownload::OnWrite(data); - } + void AddDefaultTransitions() { + AddTransition(PRE_USER, "USER anonymous\r\n", + PRE_PASSWD, "331 Password needed\r\n"); + AddTransition(PRE_PASSWD, "PASS chrome@example.com\r\n", + PRE_SYST, "230 Welcome!\r\n"); + AddTransition(PRE_SYST, "SYST\r\n", + PRE_PWD, "215 UNIX\r\n"); + AddTransition(PRE_PWD, "PWD\r\n", + PRE_TYPE, "257 \"/\" is your current location\r\n"); + AddTransition(PRE_TYPE, "TYPE I\r\n", + PRE_EPSV, "200 TYPE set successfully\r\n"); + AddTransition(PRE_EPSV, "EPSV\r\n", + PRE_SIZE, "227 Entering Passive Mode (|||31744|)\r\n"); + // Use unallocated 599 FTP error code to make sure it falls into the + // generic ERR_FTP_FAILED bucket. + AddTransition(PRE_NOPASV, "PASV\r\n", + PRE_QUIT, "599 fail\r\n"); + AddTransition(PRE_QUIT, "QUIT\r\n", + QUIT, "221 Goodbye.\r\n"); } - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse); -}; - -class FtpSocketDataProviderEvilEpsv : public FtpSocketDataProviderFileDownload { - public: - FtpSocketDataProviderEvilEpsv(const char* epsv_response, - State expected_state) - : epsv_response_(epsv_response), - epsv_response_length_(std::strlen(epsv_response)), - expected_state_(expected_state) {} - - FtpSocketDataProviderEvilEpsv(const char* epsv_response, - size_t epsv_response_length, - State expected_state) - : epsv_response_(epsv_response), - epsv_response_length_(epsv_response_length), - expected_state_(expected_state) {} - - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) + MockWriteResult Verify(const std::string& expected, + const std::string& data, + State next_state, + const char* next_read, + const size_t next_read_length) { + EXPECT_EQ(expected, data); + if (expected == data) { + state_ = next_state; + SimulateRead(next_read, next_read_length); return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_EPSV: - return Verify("EPSV\r\n", data, expected_state_, - epsv_response_, epsv_response_length_); - default: - return FtpSocketDataProviderFileDownload::OnWrite(data); } + return MockWriteResult(true, ERR_UNEXPECTED); } - private: - const char* epsv_response_; - const size_t epsv_response_length_; - const State expected_state_; - - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilEpsv); -}; - -class FtpSocketDataProviderEvilPasv - : public FtpSocketDataProviderFileDownloadWithPasvFallback { - public: - explicit FtpSocketDataProviderEvilPasv(const char* pasv_response, - State expected_state) - : pasv_response_(pasv_response), - expected_state_(expected_state) { - } - - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_PASV: - return Verify("PASV\r\n", data, expected_state_, pasv_response_); - default: - return FtpSocketDataProviderFileDownloadWithPasvFallback::OnWrite(data); - } + MockWriteResult Verify(const std::string& expected, + const std::string& data, + State next_state, + const std::string& next_read) { + return Verify(expected, data, next_state, + next_read.data(), next_read.size()); } private: - const char* pasv_response_; - const State expected_state_; - - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilPasv); -}; - -class FtpSocketDataProviderEvilSize : public FtpSocketDataProviderFileDownload { - public: - FtpSocketDataProviderEvilSize(const char* size_response, State expected_state) - : size_response_(size_response), - expected_state_(expected_state) { - } - - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_SIZE: - return Verify("SIZE /file\r\n", data, expected_state_, size_response_); - default: - return FtpSocketDataProviderFileDownload::OnWrite(data); + struct Transition { + Transition() : state(NONE) { } - } - - private: - const char* size_response_; - const State expected_state_; - - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilSize); -}; -class FtpSocketDataProviderEvilLogin - : public FtpSocketDataProviderFileDownload { - public: - FtpSocketDataProviderEvilLogin(const char* expected_user, - const char* expected_password) - : expected_user_(expected_user), - expected_password_(expected_password) { - } - - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_USER: - return Verify(std::string("USER ") + expected_user_ + "\r\n", data, - PRE_PASSWD, "331 Password needed\r\n"); - case PRE_PASSWD: - return Verify(std::string("PASS ") + expected_password_ + "\r\n", data, - PRE_SYST, "230 Welcome\r\n"); - default: - return FtpSocketDataProviderFileDownload::OnWrite(data); + Transition(const std::string& i, State s, const std::string& r) + : input(i), + state(s), + response(r) { } - } - - private: - const char* expected_user_; - const char* expected_password_; - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilLogin); -}; + std::string input; + State state; + std::string response; + }; -class FtpSocketDataProviderCloseConnection : public FtpSocketDataProvider { - public: - FtpSocketDataProviderCloseConnection() { - } + State state_; - virtual MockWriteResult OnWrite(const std::string& data) { - if (InjectFault()) - return MockWriteResult(true, data.length()); - switch (state()) { - case PRE_USER: - return Verify("USER anonymous\r\n", data, - PRE_QUIT, ""); - default: - return FtpSocketDataProvider::OnWrite(data); - } - } + std::map<State, Transition> transitions_; - private: - DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderCloseConnection); + DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProvider); }; class FtpNetworkTransactionTest : public PlatformTest { @@ -686,16 +338,6 @@ class FtpNetworkTransactionTest : public PlatformTest { EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); } - void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, - const char* request, - FtpSocketDataProvider::State state, - FtpSocketDataProvider::State next_state, - const char* response, - int expected_result) { - ctrl_socket->InjectFailure(state, next_state, response); - ExecuteTransaction(ctrl_socket, request, expected_result); - } - scoped_refptr<MockHostResolver> host_resolver_; scoped_refptr<FtpNetworkSession> session_; MockClientSocketFactory mock_socket_factory_; @@ -718,18 +360,22 @@ TEST_F(FtpNetworkTransactionTest, FailedLookup) { TEST_F(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { host_resolver_->rules()->AddSimulatedFailure("[::1]"); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilSize( + "213 99999999999999999999999999999999\r\n", + FtpSocketDataProvider::PRE_QUIT); + // We start a transaction that is expected to fail with ERR_INVALID_RESPONSE. // The important part of this test is to make sure that we don't fail with // ERR_NAME_NOT_RESOLVED, since that would mean the decorated hostname // was used. - FtpSocketDataProviderEvilSize ctrl_socket( - "213 99999999999999999999999999999999\r\n", - FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://[::1]/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + ExecuteTransaction(&ctrl_socket, "ftp://host", OK); EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); @@ -737,7 +383,9 @@ TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { - FtpSocketDataProviderDirectoryListingWithPasvFallback ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListingWithPasvFallback(); + ExecuteTransaction(&ctrl_socket, "ftp://host", OK); EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); @@ -745,7 +393,9 @@ TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + ExecuteTransaction(&ctrl_socket, "ftp://host;type=d", OK); EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); @@ -753,50 +403,73 @@ TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { - FtpSocketDataProviderDirectoryListing ctrl_socket; - ctrl_socket.set_multiline_welcome(true); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PASSWD, + "PASS chrome@example.com\r\n", + FtpSocketDataProvider::PRE_SYST, + "230-Welcome!\r\n" + "230-Second line\r\n" + "230 Last line\r\n"); + ExecuteTransaction(&ctrl_socket, "ftp://host", OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads2) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); ctrl_socket.set_short_read_limit(2); ExecuteTransaction(&ctrl_socket, "ftp://host", OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads5) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); ctrl_socket.set_short_read_limit(5); ExecuteTransaction(&ctrl_socket, "ftp://host", OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcomeShort) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PASSWD, + "PASS chrome@example.com\r\n", + FtpSocketDataProvider::PRE_SYST, + "230-Welcome!\r\n" + "230-Second line\r\n" + "230 Last line\r\n"); + // The client will not consume all three 230 lines. That's good, we want to // test that scenario. ctrl_socket.allow_unconsumed_reads(true); - ctrl_socket.set_multiline_welcome(true); ctrl_socket.set_short_read_limit(5); + ExecuteTransaction(&ctrl_socket, "ftp://host", OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionVMS) { - FtpSocketDataProviderVMSDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockVMSDirectoryListing(); ExecuteTransaction(&ctrl_socket, "ftp://host/dir", OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionVMSRootDirectory) { - FtpSocketDataProviderVMSDirectoryListingRootDirectory ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockVMSDirectoryListingRootDirectory(); ExecuteTransaction(&ctrl_socket, "ftp://host", OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionTransferStarting) { - FtpSocketDataProviderDirectoryListingTransferStarting ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListingTransferStarting(); ExecuteTransaction(&ctrl_socket, "ftp://host", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransaction) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); // We pass an artificial value of 18 as a response to the SIZE command. @@ -804,7 +477,8 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransaction) { } TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithPasvFallback) { - FtpSocketDataProviderFileDownloadWithPasvFallback ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadWithPasvFallback(); ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); // We pass an artificial value of 18 as a response to the SIZE command. @@ -812,8 +486,14 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithPasvFallback) { } TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { - FtpSocketDataProviderFileDownload ctrl_socket; - ctrl_socket.set_data_type('A'); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_TYPE, + "TYPE A\r\n", + FtpSocketDataProvider::PRE_EPSV, + "200 TYPE set successfully\r\n"); + ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=a", OK); // We pass an artificial value of 18 as a response to the SIZE command. @@ -821,7 +501,9 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { } TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeI) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=i", OK); // We pass an artificial value of 18 as a response to the SIZE command. @@ -829,74 +511,105 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeI) { } TEST_F(FtpNetworkTransactionTest, DownloadTransactionMultilineWelcome) { - FtpSocketDataProviderFileDownload ctrl_socket; - ctrl_socket.set_multiline_welcome(true); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PASSWD, + "PASS chrome@example.com\r\n", + FtpSocketDataProvider::PRE_SYST, + "230-Welcome!\r\n" + "230-Second line\r\n" + "230 Last line\r\n"); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads2) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); ctrl_socket.set_short_read_limit(2); ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads5) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); ctrl_socket.set_short_read_limit(5); ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionVMS) { - FtpSocketDataProviderVMSFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockVMSFileDownload(); ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { - FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadTransferStarting(); ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { - FtpSocketDataProviderFileDownloadInvalidResponse ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + // Use unallocated 599 FTP error code to make sure it falls into the + // generic ERR_FTP_FAILED bucket. + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_SIZE, + "SIZE /file\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 Evil Response\r\n" + "599 More Evil\r\n"); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvReallyBadFormat) { - FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilPasv("227 Portscan (127,0,0,\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort1) { - FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,0,22)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilPasv( + "227 Portscan (127,0,0,1,0,22)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort2) { + FtpSocketDataProvider ctrl_socket; // Still unsafe. 1 * 256 + 2 = 258, which is < 1024. - FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,1,2)\r\n", - FtpSocketDataProvider::PRE_QUIT); + ctrl_socket.PrepareMockFileDownloadEvilPasv( + "227 Portscan (127,0,0,1,1,2)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort3) { + FtpSocketDataProvider ctrl_socket; // Still unsafe. 3 * 256 + 4 = 772, which is < 1024. - FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,3,4)\r\n", - FtpSocketDataProvider::PRE_QUIT); + ctrl_socket.PrepareMockFileDownloadEvilPasv( + "227 Portscan (127,0,0,1,3,4)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort4) { + FtpSocketDataProvider ctrl_socket; // Unsafe. 8 * 256 + 1 = 2049, which is used by nfs. - FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,8,1)\r\n", - FtpSocketDataProvider::PRE_QUIT); + ctrl_socket.PrepareMockFileDownloadEvilPasv( + "227 Portscan (127,0,0,1,8,1)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { - FtpSocketDataProviderEvilPasv ctrl_socket( - "227 Portscan (10,1,2,3,4,123,456)\r\n", FtpSocketDataProvider::PRE_SIZE); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilPasv( + "227 Portscan (10,1,2,3,4,123,456)\r\n", + FtpSocketDataProvider::PRE_SIZE); std::string mock_data("mock-data"); MockRead data_reads[] = { MockRead(mock_data.c_str()), @@ -930,102 +643,121 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan (|||22)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat2) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan (||\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat3) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat4) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||||)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan (||||)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) { const char response[] = "227 Portscan (\0\0\031773\0)\r\n"; - FtpSocketDataProviderEvilEpsv ctrl_socket(response, sizeof(response)-1, - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv( + std::string(response, sizeof(response) - 1), + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan (|||22|)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort2) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||258|)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan (|||258|)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort3) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||772|)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan (|||772|)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort4) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||2049|)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan (|||2049|)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvWeirdSep) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$31744$)\r\n", - FtpSocketDataProvider::PRE_SIZE); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan ($$$31744$)\r\n", + FtpSocketDataProvider::PRE_SIZE); ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvWeirdSepUnsafePort) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$317$)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv("227 Portscan ($$$317$)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvIllegalHost) { - FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|2|::1|31744|)\r\n", - FtpSocketDataProvider::PRE_QUIT); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilEpsv( + "227 Portscan (|2|::1|31744|)\r\n", + FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { - FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilLogin("hello%0Aworld", "test"); ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { - FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilLogin("test", "hello%0Dworld"); ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionSpaceInLogin) { - FtpSocketDataProviderEvilLogin ctrl_socket("hello world", "test"); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilLogin("hello world", "test"); ExecuteTransaction(&ctrl_socket, "ftp://hello%20world:test@host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionSpaceInPassword) { - FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello world"); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilLogin("test", "hello world"); ExecuteTransaction(&ctrl_socket, "ftp://test:hello%20world@host/file", OK); } TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { FtpSocketDataProvider ctrl_socket1; - ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, + ctrl_socket1.AddTransition(FtpSocketDataProvider::PRE_PASSWD, + "PASS chrome@example.com\r\n", FtpSocketDataProvider::PRE_QUIT, "530 Login authentication failed\r\n"); mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); @@ -1056,7 +788,8 @@ TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { FtpSocketDataProvider ctrl_socket1; - ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, + ctrl_socket1.AddTransition(FtpSocketDataProvider::PRE_PASSWD, + "PASS chrome@example.com\r\n", FtpSocketDataProvider::PRE_QUIT, "530 Login authentication failed\r\n"); mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); @@ -1088,15 +821,17 @@ TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { } TEST_F(FtpNetworkTransactionTest, Escaping) { - FtpSocketDataProviderEscaping ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEscaping(); ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", OK); } // Test for http://crbug.com/23794. TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { + FtpSocketDataProvider ctrl_socket; // Try to overflow int64 in the response. - FtpSocketDataProviderEvilSize ctrl_socket( + ctrl_socket.PrepareMockFileDownloadEvilSize( "213 99999999999999999999999999999999\r\n", FtpSocketDataProvider::PRE_QUIT); ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); @@ -1105,7 +840,8 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { // Test for http://crbug.com/36360. TEST_F(FtpNetworkTransactionTest, DownloadTransactionBigSize) { // Pass a valid, but large file size. The transaction should not fail. - FtpSocketDataProviderEvilSize ctrl_socket( + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownloadEvilSize( "213 3204427776\r\n", FtpSocketDataProvider::PRE_RETR); ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); @@ -1115,236 +851,289 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionBigSize) { // Regression test for http://crbug.com/25023. TEST_F(FtpNetworkTransactionTest, CloseConnection) { - FtpSocketDataProviderCloseConnection ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_USER, + "USER anonymous\r\n", + FtpSocketDataProvider::PRE_QUIT, + ""); ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_USER, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_USER, + "USER anonymous\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPass) { - FtpSocketDataProviderDirectoryListing ctrl_socket; - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_PASSWD, - FtpSocketDataProvider::PRE_QUIT, - "530 Login authentication failed\r\n", - ERR_FTP_FAILED); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PASSWD, + "PASS chrome@example.com\r\n", + FtpSocketDataProvider::PRE_QUIT, + "530 Login authentication failed\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FTP_FAILED); } // Regression test for http://crbug.com/38707. TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPass503) { - FtpSocketDataProviderDirectoryListing ctrl_socket; - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_PASSWD, - FtpSocketDataProvider::PRE_QUIT, - "503 Bad sequence of commands\r\n", - ERR_FTP_BAD_COMMAND_SEQUENCE); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PASSWD, + "PASS chrome@example.com\r\n", + FtpSocketDataProvider::PRE_QUIT, + "503 Bad sequence of commands\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FTP_BAD_COMMAND_SEQUENCE); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailSyst) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_SYST, - FtpSocketDataProvider::PRE_PWD, - "599 fail\r\n", - OK); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_SYST, + "SYST\r\n", + FtpSocketDataProvider::PRE_PWD, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPwd) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_PWD, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PWD, + "PWD\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailType) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_TYPE, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_TYPE, + "TYPE I\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailEpsv) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_EPSV, - FtpSocketDataProvider::PRE_NOPASV, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_EPSV, + "EPSV\r\n", + FtpSocketDataProvider::PRE_NOPASV, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { - FtpSocketDataProviderDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_CWD, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_CWD, + "CWD /\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFileNotFound) { - FtpSocketDataProviderDirectoryListing ctrl_socket; - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_CWD, - FtpSocketDataProvider::PRE_QUIT, - "550 cannot open file\r\n", - ERR_FILE_NOT_FOUND); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_CWD, + "CWD /\r\n", + FtpSocketDataProvider::PRE_QUIT, + "550 Cannot open file\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FILE_NOT_FOUND); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMlsd) { - FtpSocketDataProviderDirectoryListing ctrl_socket; - TransactionFailHelper(&ctrl_socket, - "ftp://host", - FtpSocketDataProvider::PRE_MLSD, - FtpSocketDataProvider::PRE_LIST, - "500 Unrecognized command\r\n", - OK); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_MLSD, + "MLSD\r\n", + FtpSocketDataProvider::PRE_LIST, + "500 Unrecognized command\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailList) { - FtpSocketDataProviderVMSDirectoryListing ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockDirectoryListing(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_MLSD, + "MLSD\r\n", + FtpSocketDataProvider::PRE_LIST, + "500 Unrecognized command\r\n"); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host/dir", - FtpSocketDataProvider::PRE_LIST, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_LIST, + "LIST\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailUser) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host/file", - FtpSocketDataProvider::PRE_USER, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_USER, + "USER anonymous\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailPass) { - FtpSocketDataProviderFileDownload ctrl_socket; - TransactionFailHelper(&ctrl_socket, - "ftp://host/file", - FtpSocketDataProvider::PRE_PASSWD, - FtpSocketDataProvider::PRE_QUIT, - "530 Login authentication failed\r\n", - ERR_FTP_FAILED); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PASSWD, + "PASS chrome@example.com\r\n", + FtpSocketDataProvider::PRE_QUIT, + "530 Login authentication failed\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailSyst) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host/file", - FtpSocketDataProvider::PRE_SYST, - FtpSocketDataProvider::PRE_PWD, - "599 fail\r\n", - OK); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_SYST, + "SYST\r\n", + FtpSocketDataProvider::PRE_PWD, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailPwd) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host/file", - FtpSocketDataProvider::PRE_PWD, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PWD, + "PWD\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailType) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host/file", - FtpSocketDataProvider::PRE_TYPE, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_TYPE, + "TYPE I\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailEpsv) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host/file", - FtpSocketDataProvider::PRE_EPSV, - FtpSocketDataProvider::PRE_NOPASV, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_EPSV, + "EPSV\r\n", + FtpSocketDataProvider::PRE_NOPASV, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { - FtpSocketDataProviderFileDownload ctrl_socket; + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + // Use unallocated 599 FTP error code to make sure it falls into the generic // ERR_FTP_FAILED bucket. - TransactionFailHelper(&ctrl_socket, - "ftp://host/file", - FtpSocketDataProvider::PRE_RETR, - FtpSocketDataProvider::PRE_QUIT, - "599 fail\r\n", - ERR_FTP_FAILED); + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_RETR, + "RETR /file\r\n", + FtpSocketDataProvider::PRE_QUIT, + "599 fail\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { - FtpSocketDataProviderFileDownload ctrl_socket; - TransactionFailHelper(&ctrl_socket, - "ftp://host/file;type=i", - FtpSocketDataProvider::PRE_SIZE, - FtpSocketDataProvider::PRE_QUIT, - "550 File Not Found\r\n", - ERR_FTP_FAILED); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + + // Use unallocated 599 FTP error code to make sure it falls into the generic + // ERR_FTP_FAILED bucket. + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_SIZE, + "SIZE /file\r\n", + FtpSocketDataProvider::PRE_QUIT, + "550 File Not Found\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=i", ERR_FTP_FAILED); } // Test for http://crbug.com/38845. TEST_F(FtpNetworkTransactionTest, ZeroLengthDirInPWD) { - FtpSocketDataProviderFileDownload ctrl_socket; - TransactionFailHelper(&ctrl_socket, - "ftp://host/file", - FtpSocketDataProvider::PRE_PWD, - FtpSocketDataProvider::PRE_TYPE, - "257 \"\"\r\n", - OK); + FtpSocketDataProvider ctrl_socket; + ctrl_socket.PrepareMockFileDownload(); + + // Use unallocated 599 FTP error code to make sure it falls into the generic + // ERR_FTP_FAILED bucket. + ctrl_socket.AddTransition(FtpSocketDataProvider::PRE_PWD, + "PWD\r\n", + FtpSocketDataProvider::PRE_TYPE, + "257 \"\"\r\n"); + + ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); } } // namespace net |