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 #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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |