OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 MockRead(false, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 775 MockRead(false, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
776 MockRead(mock_data.c_str()), | 776 MockRead(mock_data.c_str()), |
777 }; | 777 }; |
778 StaticSocketDataProvider data_socket(data_reads, arraysize(data_reads), | 778 StaticSocketDataProvider data_socket(data_reads, arraysize(data_reads), |
779 NULL, 0); | 779 NULL, 0); |
780 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); | 780 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); |
781 mock_socket_factory_.AddSocketDataProvider(&data_socket); | 781 mock_socket_factory_.AddSocketDataProvider(&data_socket); |
782 FtpRequestInfo request_info = GetRequestInfo(request); | 782 FtpRequestInfo request_info = GetRequestInfo(request); |
783 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 783 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
784 ASSERT_EQ(ERR_IO_PENDING, | 784 ASSERT_EQ(ERR_IO_PENDING, |
785 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 785 transaction_.Start(&request_info, callback_.callback(), |
| 786 BoundNetLog())); |
786 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 787 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
787 ASSERT_EQ(expected_result, callback_.WaitForResult()); | 788 ASSERT_EQ(expected_result, callback_.WaitForResult()); |
788 if (expected_result == OK) { | 789 if (expected_result == OK) { |
789 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 790 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
790 memset(io_buffer->data(), 0, kBufferSize); | 791 memset(io_buffer->data(), 0, kBufferSize); |
791 ASSERT_EQ(ERR_IO_PENDING, | 792 ASSERT_EQ(ERR_IO_PENDING, |
792 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | 793 transaction_.Read(io_buffer.get(), kBufferSize, |
| 794 callback_.callback())); |
793 ASSERT_EQ(static_cast<int>(mock_data.length()), | 795 ASSERT_EQ(static_cast<int>(mock_data.length()), |
794 callback_.WaitForResult()); | 796 callback_.WaitForResult()); |
795 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); | 797 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
796 | 798 |
797 // Do another Read to detect that the data socket is now closed. | 799 // Do another Read to detect that the data socket is now closed. |
798 int rv = transaction_.Read(io_buffer.get(), kBufferSize, &callback_); | 800 int rv = transaction_.Read(io_buffer.get(), kBufferSize, |
| 801 callback_.callback()); |
799 if (rv == ERR_IO_PENDING) { | 802 if (rv == ERR_IO_PENDING) { |
800 EXPECT_EQ(0, callback_.WaitForResult()); | 803 EXPECT_EQ(0, callback_.WaitForResult()); |
801 } else { | 804 } else { |
802 EXPECT_EQ(0, rv); | 805 EXPECT_EQ(0, rv); |
803 } | 806 } |
804 } | 807 } |
805 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); | 808 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); |
806 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 809 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
807 } | 810 } |
808 | 811 |
809 void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, | 812 void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, |
810 const char* request, | 813 const char* request, |
811 FtpSocketDataProvider::State state, | 814 FtpSocketDataProvider::State state, |
812 FtpSocketDataProvider::State next_state, | 815 FtpSocketDataProvider::State next_state, |
813 const char* response, | 816 const char* response, |
814 int expected_result) { | 817 int expected_result) { |
815 ctrl_socket->InjectFailure(state, next_state, response); | 818 ctrl_socket->InjectFailure(state, next_state, response); |
816 ExecuteTransaction(ctrl_socket, request, expected_result); | 819 ExecuteTransaction(ctrl_socket, request, expected_result); |
817 } | 820 } |
818 | 821 |
819 scoped_ptr<MockHostResolver> host_resolver_; | 822 scoped_ptr<MockHostResolver> host_resolver_; |
820 scoped_refptr<FtpNetworkSession> session_; | 823 scoped_refptr<FtpNetworkSession> session_; |
821 MockClientSocketFactory mock_socket_factory_; | 824 MockClientSocketFactory mock_socket_factory_; |
822 FtpNetworkTransaction transaction_; | 825 FtpNetworkTransaction transaction_; |
823 TestOldCompletionCallback callback_; | 826 TestCompletionCallback callback_; |
824 }; | 827 }; |
825 | 828 |
826 TEST_F(FtpNetworkTransactionTest, FailedLookup) { | 829 TEST_F(FtpNetworkTransactionTest, FailedLookup) { |
827 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); | 830 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); |
828 host_resolver_->rules()->AddSimulatedFailure("badhost"); | 831 host_resolver_->rules()->AddSimulatedFailure("badhost"); |
829 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 832 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
830 ASSERT_EQ(ERR_IO_PENDING, | 833 ASSERT_EQ(ERR_IO_PENDING, |
831 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 834 transaction_.Start(&request_info, callback_.callback(), |
| 835 BoundNetLog())); |
832 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); | 836 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); |
833 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 837 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
834 } | 838 } |
835 | 839 |
836 // Check that when determining the host, the square brackets decorating IPv6 | 840 // Check that when determining the host, the square brackets decorating IPv6 |
837 // literals in URLs are stripped. | 841 // literals in URLs are stripped. |
838 TEST_F(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { | 842 TEST_F(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { |
839 host_resolver_->rules()->AddSimulatedFailure("[::1]"); | 843 host_resolver_->rules()->AddSimulatedFailure("[::1]"); |
840 | 844 |
841 // We start a transaction that is expected to fail with ERR_INVALID_RESPONSE. | 845 // We start a transaction that is expected to fail with ERR_INVALID_RESPONSE. |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 MockRead(mock_data.c_str()), | 1048 MockRead(mock_data.c_str()), |
1045 }; | 1049 }; |
1046 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), | 1050 StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), |
1047 NULL, 0); | 1051 NULL, 0); |
1048 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); | 1052 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
1049 mock_socket_factory_.AddSocketDataProvider(&data_socket1); | 1053 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
1050 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1054 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1051 | 1055 |
1052 // Start the transaction. | 1056 // Start the transaction. |
1053 ASSERT_EQ(ERR_IO_PENDING, | 1057 ASSERT_EQ(ERR_IO_PENDING, |
1054 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 1058 transaction_.Start(&request_info, callback_.callback(), |
| 1059 BoundNetLog())); |
1055 ASSERT_EQ(OK, callback_.WaitForResult()); | 1060 ASSERT_EQ(OK, callback_.WaitForResult()); |
1056 | 1061 |
1057 // The transaction fires the callback when we can start reading data. That | 1062 // The transaction fires the callback when we can start reading data. That |
1058 // means that the data socket should be open. | 1063 // means that the data socket should be open. |
1059 MockTCPClientSocket* data_socket = | 1064 MockTCPClientSocket* data_socket = |
1060 mock_socket_factory_.GetMockTCPClientSocket(1); | 1065 mock_socket_factory_.GetMockTCPClientSocket(1); |
1061 ASSERT_TRUE(data_socket); | 1066 ASSERT_TRUE(data_socket); |
1062 ASSERT_TRUE(data_socket->IsConnected()); | 1067 ASSERT_TRUE(data_socket->IsConnected()); |
1063 | 1068 |
1064 // Even if the PASV response specified some other address, we connect | 1069 // Even if the PASV response specified some other address, we connect |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { | 1173 TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { |
1169 FtpSocketDataProvider ctrl_socket1; | 1174 FtpSocketDataProvider ctrl_socket1; |
1170 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1175 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
1171 FtpSocketDataProvider::PRE_QUIT, | 1176 FtpSocketDataProvider::PRE_QUIT, |
1172 "530 Login authentication failed\r\n"); | 1177 "530 Login authentication failed\r\n"); |
1173 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1178 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
1174 | 1179 |
1175 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1180 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1176 | 1181 |
1177 ASSERT_EQ(ERR_IO_PENDING, | 1182 ASSERT_EQ(ERR_IO_PENDING, |
1178 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 1183 transaction_.Start(&request_info, callback_.callback(), |
| 1184 BoundNetLog())); |
1179 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); | 1185 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); |
1180 | 1186 |
1181 MockRead ctrl_reads[] = { | 1187 MockRead ctrl_reads[] = { |
1182 MockRead("220 host TestFTPd\r\n"), | 1188 MockRead("220 host TestFTPd\r\n"), |
1183 MockRead("221 Goodbye!\r\n"), | 1189 MockRead("221 Goodbye!\r\n"), |
1184 MockRead(false, OK), | 1190 MockRead(false, OK), |
1185 }; | 1191 }; |
1186 MockWrite ctrl_writes[] = { | 1192 MockWrite ctrl_writes[] = { |
1187 MockWrite("QUIT\r\n"), | 1193 MockWrite("QUIT\r\n"), |
1188 }; | 1194 }; |
1189 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 1195 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
1190 ctrl_writes, arraysize(ctrl_writes)); | 1196 ctrl_writes, arraysize(ctrl_writes)); |
1191 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 1197 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
1192 ASSERT_EQ(ERR_IO_PENDING, | 1198 ASSERT_EQ(ERR_IO_PENDING, |
1193 transaction_.RestartWithAuth( | 1199 transaction_.RestartWithAuth( |
1194 AuthCredentials( | 1200 AuthCredentials( |
1195 ASCIIToUTF16("foo\nownz0red"), | 1201 ASCIIToUTF16("foo\nownz0red"), |
1196 ASCIIToUTF16("innocent")), | 1202 ASCIIToUTF16("innocent")), |
1197 &callback_)); | 1203 callback_.callback())); |
1198 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1204 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
1199 } | 1205 } |
1200 | 1206 |
1201 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { | 1207 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { |
1202 FtpSocketDataProvider ctrl_socket1; | 1208 FtpSocketDataProvider ctrl_socket1; |
1203 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1209 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
1204 FtpSocketDataProvider::PRE_QUIT, | 1210 FtpSocketDataProvider::PRE_QUIT, |
1205 "530 Login authentication failed\r\n"); | 1211 "530 Login authentication failed\r\n"); |
1206 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1212 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
1207 | 1213 |
1208 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1214 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1209 | 1215 |
1210 ASSERT_EQ(ERR_IO_PENDING, | 1216 ASSERT_EQ(ERR_IO_PENDING, |
1211 transaction_.Start(&request_info, &callback_, BoundNetLog())); | 1217 transaction_.Start(&request_info, callback_.callback(), |
| 1218 BoundNetLog())); |
1212 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); | 1219 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); |
1213 | 1220 |
1214 MockRead ctrl_reads[] = { | 1221 MockRead ctrl_reads[] = { |
1215 MockRead("220 host TestFTPd\r\n"), | 1222 MockRead("220 host TestFTPd\r\n"), |
1216 MockRead("331 User okay, send password\r\n"), | 1223 MockRead("331 User okay, send password\r\n"), |
1217 MockRead("221 Goodbye!\r\n"), | 1224 MockRead("221 Goodbye!\r\n"), |
1218 MockRead(false, OK), | 1225 MockRead(false, OK), |
1219 }; | 1226 }; |
1220 MockWrite ctrl_writes[] = { | 1227 MockWrite ctrl_writes[] = { |
1221 MockWrite("USER innocent\r\n"), | 1228 MockWrite("USER innocent\r\n"), |
1222 MockWrite("QUIT\r\n"), | 1229 MockWrite("QUIT\r\n"), |
1223 }; | 1230 }; |
1224 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 1231 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
1225 ctrl_writes, arraysize(ctrl_writes)); | 1232 ctrl_writes, arraysize(ctrl_writes)); |
1226 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 1233 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
1227 ASSERT_EQ(ERR_IO_PENDING, | 1234 ASSERT_EQ(ERR_IO_PENDING, |
1228 transaction_.RestartWithAuth( | 1235 transaction_.RestartWithAuth( |
1229 AuthCredentials(ASCIIToUTF16("innocent"), | 1236 AuthCredentials(ASCIIToUTF16("innocent"), |
1230 ASCIIToUTF16("foo\nownz0red")), | 1237 ASCIIToUTF16("foo\nownz0red")), |
1231 &callback_)); | 1238 callback_.callback())); |
1232 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1239 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
1233 } | 1240 } |
1234 | 1241 |
1235 TEST_F(FtpNetworkTransactionTest, Escaping) { | 1242 TEST_F(FtpNetworkTransactionTest, Escaping) { |
1236 FtpSocketDataProviderEscaping ctrl_socket; | 1243 FtpSocketDataProviderEscaping ctrl_socket; |
1237 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", | 1244 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", |
1238 OK); | 1245 OK); |
1239 } | 1246 } |
1240 | 1247 |
1241 // Test for http://crbug.com/23794. | 1248 // Test for http://crbug.com/23794. |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1461 FtpSocketDataProviderFileDownload ctrl_socket; | 1468 FtpSocketDataProviderFileDownload ctrl_socket; |
1462 TransactionFailHelper(&ctrl_socket, | 1469 TransactionFailHelper(&ctrl_socket, |
1463 "ftp://host/file", | 1470 "ftp://host/file", |
1464 FtpSocketDataProvider::PRE_PWD, | 1471 FtpSocketDataProvider::PRE_PWD, |
1465 FtpSocketDataProvider::PRE_TYPE, | 1472 FtpSocketDataProvider::PRE_TYPE, |
1466 "257 \"\"\r\n", | 1473 "257 \"\"\r\n", |
1467 OK); | 1474 OK); |
1468 } | 1475 } |
1469 | 1476 |
1470 } // namespace net | 1477 } // namespace net |
OLD | NEW |