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

Side by Side Diff: net/ftp/ftp_network_transaction_unittest.cc

Issue 598071: Really connect to the same server in FTP network transaction. (Closed)
Patch Set: updates Created 10 years, 10 months 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/ftp/ftp_network_transaction.cc ('k') | net/proxy/proxy_resolver_js_bindings_unittest.cc » ('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/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 #include "base/ref_counted.h" 9 #include "base/ref_counted.h"
10 #include "net/base/io_buffer.h" 10 #include "net/base/io_buffer.h"
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 StaticSocketDataProvider data1(data_reads, arraysize(data_reads), NULL, 0); 603 StaticSocketDataProvider data1(data_reads, arraysize(data_reads), NULL, 0);
604 StaticSocketDataProvider data2(data_reads, arraysize(data_reads), NULL, 0); 604 StaticSocketDataProvider data2(data_reads, arraysize(data_reads), NULL, 0);
605 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); 605 mock_socket_factory_.AddSocketDataProvider(ctrl_socket);
606 mock_socket_factory_.AddSocketDataProvider(&data1); 606 mock_socket_factory_.AddSocketDataProvider(&data1);
607 mock_socket_factory_.AddSocketDataProvider(&data2); 607 mock_socket_factory_.AddSocketDataProvider(&data2);
608 FtpRequestInfo request_info = GetRequestInfo(request); 608 FtpRequestInfo request_info = GetRequestInfo(request);
609 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 609 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
610 ASSERT_EQ(ERR_IO_PENDING, 610 ASSERT_EQ(ERR_IO_PENDING,
611 transaction_.Start(&request_info, &callback_, NULL)); 611 transaction_.Start(&request_info, &callback_, NULL));
612 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); 612 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState());
613 EXPECT_EQ(expected_result, callback_.WaitForResult()); 613 ASSERT_EQ(expected_result, callback_.WaitForResult());
614 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); 614 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state());
615 if (expected_result == OK) { 615 if (expected_result == OK) {
616 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); 616 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize));
617 memset(io_buffer->data(), 0, kBufferSize); 617 memset(io_buffer->data(), 0, kBufferSize);
618 ASSERT_EQ(ERR_IO_PENDING, 618 ASSERT_EQ(ERR_IO_PENDING,
619 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); 619 transaction_.Read(io_buffer.get(), kBufferSize, &callback_));
620 EXPECT_EQ(static_cast<int>(mock_data.length()), 620 ASSERT_EQ(static_cast<int>(mock_data.length()),
621 callback_.WaitForResult()); 621 callback_.WaitForResult());
622 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); 622 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length()));
623 if (transaction_.GetResponseInfo()->is_directory_listing) { 623 if (transaction_.GetResponseInfo()->is_directory_listing) {
624 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); 624 EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size);
625 } else { 625 } else {
626 // We pass an artificial value of 18 as a response to the SIZE command. 626 // We pass an artificial value of 18 as a response to the SIZE command.
627 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); 627 EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size);
628 } 628 }
629 } 629 }
630 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 630 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
(...skipping 15 matching lines...) Expand all
646 FtpNetworkTransaction transaction_; 646 FtpNetworkTransaction transaction_;
647 TestCompletionCallback callback_; 647 TestCompletionCallback callback_;
648 }; 648 };
649 649
650 TEST_F(FtpNetworkTransactionTest, FailedLookup) { 650 TEST_F(FtpNetworkTransactionTest, FailedLookup) {
651 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); 651 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost");
652 host_resolver_->rules()->AddSimulatedFailure("badhost"); 652 host_resolver_->rules()->AddSimulatedFailure("badhost");
653 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 653 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
654 ASSERT_EQ(ERR_IO_PENDING, 654 ASSERT_EQ(ERR_IO_PENDING,
655 transaction_.Start(&request_info, &callback_, NULL)); 655 transaction_.Start(&request_info, &callback_, NULL));
656 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); 656 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
657 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 657 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
658 } 658 }
659 659
660 TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { 660 TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) {
661 FtpSocketDataProviderDirectoryListing ctrl_socket; 661 FtpSocketDataProviderDirectoryListing ctrl_socket;
662 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); 662 ExecuteTransaction(&ctrl_socket, "ftp://host", OK);
663 } 663 }
664 664
665 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { 665 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) {
666 FtpSocketDataProviderDirectoryListing ctrl_socket; 666 FtpSocketDataProviderDirectoryListing ctrl_socket;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 }; 741 };
742 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), 742 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads),
743 NULL, 0); 743 NULL, 0);
744 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); 744 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket);
745 mock_socket_factory_.AddSocketDataProvider(&data_socket1); 745 mock_socket_factory_.AddSocketDataProvider(&data_socket1);
746 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); 746 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file");
747 747
748 // Start the transaction. 748 // Start the transaction.
749 ASSERT_EQ(ERR_IO_PENDING, 749 ASSERT_EQ(ERR_IO_PENDING,
750 transaction_.Start(&request_info, &callback_, NULL)); 750 transaction_.Start(&request_info, &callback_, NULL));
751 EXPECT_EQ(OK, callback_.WaitForResult()); 751 ASSERT_EQ(OK, callback_.WaitForResult());
752 752
753 // The transaction fires the callback when we can start reading data. 753 // The transaction fires the callback when we can start reading data.
754 EXPECT_EQ(FtpSocketDataProvider::PRE_QUIT, ctrl_socket.state()); 754 EXPECT_EQ(FtpSocketDataProvider::PRE_QUIT, ctrl_socket.state());
755 EXPECT_EQ(LOAD_STATE_SENDING_REQUEST, transaction_.GetLoadState()); 755 EXPECT_EQ(LOAD_STATE_SENDING_REQUEST, transaction_.GetLoadState());
756 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); 756 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize));
757 memset(io_buffer->data(), 0, kBufferSize); 757 memset(io_buffer->data(), 0, kBufferSize);
758 ASSERT_EQ(ERR_IO_PENDING, 758 ASSERT_EQ(ERR_IO_PENDING,
759 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); 759 transaction_.Read(io_buffer.get(), kBufferSize, &callback_));
760 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); 760 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState());
761 EXPECT_EQ(static_cast<int>(mock_data.length()), 761 ASSERT_EQ(static_cast<int>(mock_data.length()),
762 callback_.WaitForResult()); 762 callback_.WaitForResult());
763 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); 763 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState());
764 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); 764 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length()));
765 765
766 // FTP server should disconnect the data socket. It is also a signal for the 766 // FTP server should disconnect the data socket. It is also a signal for the
767 // FtpNetworkTransaction that the data transfer is finished. 767 // FtpNetworkTransaction that the data transfer is finished.
768 ClientSocket* data_socket = mock_socket_factory_.GetMockTCPClientSocket(1); 768 ClientSocket* data_socket = mock_socket_factory_.GetMockTCPClientSocket(1);
769 ASSERT_TRUE(data_socket); 769 ASSERT_TRUE(data_socket);
770 data_socket->Disconnect(); 770 data_socket->Disconnect();
771 771
772 // We should issue Reads until one returns EOF... 772 // We should issue Reads until one returns EOF...
773 ASSERT_EQ(ERR_IO_PENDING, 773 ASSERT_EQ(ERR_IO_PENDING,
774 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); 774 transaction_.Read(io_buffer.get(), kBufferSize, &callback_));
775 775
776 // Make sure the transaction finishes cleanly. 776 // Make sure the transaction finishes cleanly.
777 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 777 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
778 EXPECT_EQ(OK, callback_.WaitForResult()); 778 ASSERT_EQ(OK, callback_.WaitForResult());
779 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket.state()); 779 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket.state());
780 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 780 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
781 } 781 }
782 782
783 TEST_F(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { 783 TEST_F(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) {
784 FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; 784 FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket;
785 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); 785 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK);
786 } 786 }
787 787
788 TEST_F(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { 788 TEST_F(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 }; 826 };
827 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), 827 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads),
828 NULL, 0); 828 NULL, 0);
829 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); 829 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket);
830 mock_socket_factory_.AddSocketDataProvider(&data_socket1); 830 mock_socket_factory_.AddSocketDataProvider(&data_socket1);
831 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); 831 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file");
832 832
833 // Start the transaction. 833 // Start the transaction.
834 ASSERT_EQ(ERR_IO_PENDING, 834 ASSERT_EQ(ERR_IO_PENDING,
835 transaction_.Start(&request_info, &callback_, NULL)); 835 transaction_.Start(&request_info, &callback_, NULL));
836 EXPECT_EQ(OK, callback_.WaitForResult()); 836 ASSERT_EQ(OK, callback_.WaitForResult());
837 837
838 // The transaction fires the callback when we can start reading data. That 838 // The transaction fires the callback when we can start reading data. That
839 // means that the data socket should be open. 839 // means that the data socket should be open.
840 MockTCPClientSocket* data_socket = 840 MockTCPClientSocket* data_socket =
841 mock_socket_factory_.GetMockTCPClientSocket(1); 841 mock_socket_factory_.GetMockTCPClientSocket(1);
842 ASSERT_TRUE(data_socket); 842 ASSERT_TRUE(data_socket);
843 ASSERT_TRUE(data_socket->IsConnected()); 843 ASSERT_TRUE(data_socket->IsConnected());
844 844
845 // Even if the PASV response specified some other address, we connect 845 // Even if the PASV response specified some other address, we connect
846 // to the address we used for control connection. 846 // to the address we used for control connection (which could be 127.0.0.1
847 EXPECT_EQ("127.0.0.1", NetAddressToString(data_socket->addresses().head())); 847 // or ::1 depending on whether we use IPv6).
848 848 const struct addrinfo* addrinfo = data_socket->addresses().head();
849 // Make sure we have only one host entry in the AddressList. 849 while (addrinfo) {
850 EXPECT_FALSE(data_socket->addresses().head()->ai_next); 850 EXPECT_NE("1.2.3.4", NetAddressToString(addrinfo));
851 addrinfo = addrinfo->ai_next;
852 }
851 } 853 }
852 854
853 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { 855 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) {
854 FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); 856 FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test");
855 ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); 857 ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK);
856 } 858 }
857 859
858 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { 860 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) {
859 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); 861 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld");
860 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); 862 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK);
(...skipping 13 matching lines...) Expand all
874 FtpSocketDataProvider ctrl_socket1; 876 FtpSocketDataProvider ctrl_socket1;
875 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, 877 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD,
876 FtpSocketDataProvider::PRE_QUIT, 878 FtpSocketDataProvider::PRE_QUIT,
877 "530 Login authentication failed\r\n"); 879 "530 Login authentication failed\r\n");
878 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); 880 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1);
879 881
880 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); 882 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file");
881 883
882 ASSERT_EQ(ERR_IO_PENDING, 884 ASSERT_EQ(ERR_IO_PENDING,
883 transaction_.Start(&request_info, &callback_, NULL)); 885 transaction_.Start(&request_info, &callback_, NULL));
884 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); 886 ASSERT_EQ(ERR_FAILED, callback_.WaitForResult());
885 887
886 MockRead ctrl_reads[] = { 888 MockRead ctrl_reads[] = {
887 MockRead("220 host TestFTPd\r\n"), 889 MockRead("220 host TestFTPd\r\n"),
888 MockRead("221 Goodbye!\r\n"), 890 MockRead("221 Goodbye!\r\n"),
889 MockRead(false, OK), 891 MockRead(false, OK),
890 }; 892 };
891 MockWrite ctrl_writes[] = { 893 MockWrite ctrl_writes[] = {
892 MockWrite("QUIT\r\n"), 894 MockWrite("QUIT\r\n"),
893 }; 895 };
894 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), 896 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads),
895 ctrl_writes, arraysize(ctrl_writes)); 897 ctrl_writes, arraysize(ctrl_writes));
896 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); 898 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2);
897 ASSERT_EQ(ERR_IO_PENDING, transaction_.RestartWithAuth(L"foo\nownz0red", 899 ASSERT_EQ(ERR_IO_PENDING, transaction_.RestartWithAuth(L"foo\nownz0red",
898 L"innocent", 900 L"innocent",
899 &callback_)); 901 &callback_));
900 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); 902 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult());
901 } 903 }
902 904
903 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { 905 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) {
904 FtpSocketDataProvider ctrl_socket1; 906 FtpSocketDataProvider ctrl_socket1;
905 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, 907 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD,
906 FtpSocketDataProvider::PRE_QUIT, 908 FtpSocketDataProvider::PRE_QUIT,
907 "530 Login authentication failed\r\n"); 909 "530 Login authentication failed\r\n");
908 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); 910 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1);
909 911
910 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); 912 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file");
911 913
912 ASSERT_EQ(ERR_IO_PENDING, 914 ASSERT_EQ(ERR_IO_PENDING,
913 transaction_.Start(&request_info, &callback_, NULL)); 915 transaction_.Start(&request_info, &callback_, NULL));
914 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); 916 ASSERT_EQ(ERR_FAILED, callback_.WaitForResult());
915 917
916 MockRead ctrl_reads[] = { 918 MockRead ctrl_reads[] = {
917 MockRead("220 host TestFTPd\r\n"), 919 MockRead("220 host TestFTPd\r\n"),
918 MockRead("331 User okay, send password\r\n"), 920 MockRead("331 User okay, send password\r\n"),
919 MockRead("221 Goodbye!\r\n"), 921 MockRead("221 Goodbye!\r\n"),
920 MockRead(false, OK), 922 MockRead(false, OK),
921 }; 923 };
922 MockWrite ctrl_writes[] = { 924 MockWrite ctrl_writes[] = {
923 MockWrite("USER innocent\r\n"), 925 MockWrite("USER innocent\r\n"),
924 MockWrite("QUIT\r\n"), 926 MockWrite("QUIT\r\n"),
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 FtpSocketDataProviderFileDownloadRetrFail ctrl_socket; 1169 FtpSocketDataProviderFileDownloadRetrFail ctrl_socket;
1168 TransactionFailHelper(&ctrl_socket, 1170 TransactionFailHelper(&ctrl_socket,
1169 "ftp://host/file", 1171 "ftp://host/file",
1170 FtpSocketDataProvider::PRE_RETR, 1172 FtpSocketDataProvider::PRE_RETR,
1171 FtpSocketDataProvider::PRE_PASV2, 1173 FtpSocketDataProvider::PRE_PASV2,
1172 "550 cannot open file\r\n", 1174 "550 cannot open file\r\n",
1173 ERR_FILE_NOT_FOUND); 1175 ERR_FILE_NOT_FOUND);
1174 } 1176 }
1175 1177
1176 } // namespace net 1178 } // namespace net
OLDNEW
« no previous file with comments | « net/ftp/ftp_network_transaction.cc ('k') | net/proxy/proxy_resolver_js_bindings_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698