OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/macros.h" | 10 #include "base/macros.h" |
11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "net/base/host_port_pair.h" | 14 #include "net/base/host_port_pair.h" |
15 #include "net/base/io_buffer.h" | 15 #include "net/base/io_buffer.h" |
16 #include "net/base/test_completion_callback.h" | 16 #include "net/base/test_completion_callback.h" |
17 #include "net/dns/mock_host_resolver.h" | 17 #include "net/dns/mock_host_resolver.h" |
18 #include "net/ftp/ftp_request_info.h" | 18 #include "net/ftp/ftp_request_info.h" |
19 #include "net/socket/socket_test_util.h" | 19 #include "net/socket/socket_test_util.h" |
| 20 #include "net/test/gtest_util.h" |
| 21 #include "testing/gmock/include/gmock/gmock.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
21 #include "testing/platform_test.h" | 23 #include "testing/platform_test.h" |
22 | 24 |
| 25 using net::test::IsError; |
| 26 using net::test::IsOk; |
| 27 |
23 namespace { | 28 namespace { |
24 | 29 |
25 // Size we use for IOBuffers used to receive data from the test data socket. | 30 // Size we use for IOBuffers used to receive data from the test data socket. |
26 const int kBufferSize = 128; | 31 const int kBufferSize = 128; |
27 | 32 |
28 } // namespace | 33 } // namespace |
29 | 34 |
30 namespace net { | 35 namespace net { |
31 | 36 |
32 class FtpSocketDataProvider : public SocketDataProvider { | 37 class FtpSocketDataProvider : public SocketDataProvider { |
(...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
938 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); | 943 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); |
939 scoped_refptr<RuleBasedHostResolverProc> rules( | 944 scoped_refptr<RuleBasedHostResolverProc> rules( |
940 new RuleBasedHostResolverProc(NULL)); | 945 new RuleBasedHostResolverProc(NULL)); |
941 rules->AddSimulatedFailure("badhost"); | 946 rules->AddSimulatedFailure("badhost"); |
942 host_resolver_->set_rules(rules.get()); | 947 host_resolver_->set_rules(rules.get()); |
943 | 948 |
944 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 949 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
945 ASSERT_EQ(ERR_IO_PENDING, | 950 ASSERT_EQ(ERR_IO_PENDING, |
946 transaction_.Start(&request_info, callback_.callback(), | 951 transaction_.Start(&request_info, callback_.callback(), |
947 BoundNetLog())); | 952 BoundNetLog())); |
948 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); | 953 ASSERT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED)); |
949 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 954 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
950 } | 955 } |
951 | 956 |
952 // Check that when determining the host, the square brackets decorating IPv6 | 957 // Check that when determining the host, the square brackets decorating IPv6 |
953 // literals in URLs are stripped. | 958 // literals in URLs are stripped. |
954 TEST_P(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { | 959 TEST_P(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { |
955 // This test only makes sense for IPv6 connections. | 960 // This test only makes sense for IPv6 connections. |
956 if (GetFamily() != AF_INET6) | 961 if (GetFamily() != AF_INET6) |
957 return; | 962 return; |
958 | 963 |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1169 NULL, 0); | 1174 NULL, 0); |
1170 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); | 1175 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
1171 mock_socket_factory_.AddSocketDataProvider(&data_socket1); | 1176 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
1172 mock_socket_factory_.AddSocketDataProvider(&data_socket2); | 1177 mock_socket_factory_.AddSocketDataProvider(&data_socket2); |
1173 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1178 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1174 | 1179 |
1175 // Start the transaction. | 1180 // Start the transaction. |
1176 ASSERT_EQ(ERR_IO_PENDING, | 1181 ASSERT_EQ(ERR_IO_PENDING, |
1177 transaction_.Start(&request_info, callback_.callback(), | 1182 transaction_.Start(&request_info, callback_.callback(), |
1178 BoundNetLog())); | 1183 BoundNetLog())); |
1179 ASSERT_EQ(OK, callback_.WaitForResult()); | 1184 ASSERT_THAT(callback_.WaitForResult(), IsOk()); |
1180 | 1185 |
1181 // The transaction fires the callback when we can start reading data. That | 1186 // The transaction fires the callback when we can start reading data. That |
1182 // means that the data socket should be open. | 1187 // means that the data socket should be open. |
1183 MockTCPClientSocket* data_socket = | 1188 MockTCPClientSocket* data_socket = |
1184 static_cast<MockTCPClientSocket*>(transaction_.data_socket_.get()); | 1189 static_cast<MockTCPClientSocket*>(transaction_.data_socket_.get()); |
1185 ASSERT_TRUE(data_socket); | 1190 ASSERT_TRUE(data_socket); |
1186 ASSERT_TRUE(data_socket->IsConnected()); | 1191 ASSERT_TRUE(data_socket->IsConnected()); |
1187 | 1192 |
1188 // Even if the PASV response specified some other address, we connect | 1193 // Even if the PASV response specified some other address, we connect |
1189 // to the address we used for control connection (which could be 127.0.0.1 | 1194 // to the address we used for control connection (which could be 127.0.0.1 |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1354 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1359 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
1355 FtpSocketDataProvider::PRE_QUIT, | 1360 FtpSocketDataProvider::PRE_QUIT, |
1356 "530 Login authentication failed\r\n"); | 1361 "530 Login authentication failed\r\n"); |
1357 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1362 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
1358 | 1363 |
1359 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1364 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1360 | 1365 |
1361 ASSERT_EQ(ERR_IO_PENDING, | 1366 ASSERT_EQ(ERR_IO_PENDING, |
1362 transaction_.Start(&request_info, callback_.callback(), | 1367 transaction_.Start(&request_info, callback_.callback(), |
1363 BoundNetLog())); | 1368 BoundNetLog())); |
1364 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); | 1369 ASSERT_THAT(callback_.WaitForResult(), IsError(ERR_FTP_FAILED)); |
1365 | 1370 |
1366 MockRead ctrl_reads[] = { | 1371 MockRead ctrl_reads[] = { |
1367 MockRead("220 host TestFTPd\r\n"), | 1372 MockRead("220 host TestFTPd\r\n"), |
1368 MockRead("221 Goodbye!\r\n"), | 1373 MockRead("221 Goodbye!\r\n"), |
1369 MockRead(SYNCHRONOUS, OK), | 1374 MockRead(SYNCHRONOUS, OK), |
1370 }; | 1375 }; |
1371 MockWrite ctrl_writes[] = { | 1376 MockWrite ctrl_writes[] = { |
1372 MockWrite("QUIT\r\n"), | 1377 MockWrite("QUIT\r\n"), |
1373 }; | 1378 }; |
1374 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 1379 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
1375 ctrl_writes, arraysize(ctrl_writes)); | 1380 ctrl_writes, arraysize(ctrl_writes)); |
1376 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 1381 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
1377 ASSERT_EQ(ERR_IO_PENDING, | 1382 ASSERT_EQ(ERR_IO_PENDING, |
1378 transaction_.RestartWithAuth( | 1383 transaction_.RestartWithAuth( |
1379 AuthCredentials( | 1384 AuthCredentials( |
1380 base::ASCIIToUTF16("foo\nownz0red"), | 1385 base::ASCIIToUTF16("foo\nownz0red"), |
1381 base::ASCIIToUTF16("innocent")), | 1386 base::ASCIIToUTF16("innocent")), |
1382 callback_.callback())); | 1387 callback_.callback())); |
1383 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1388 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_MALFORMED_IDENTITY)); |
1384 } | 1389 } |
1385 | 1390 |
1386 TEST_P(FtpNetworkTransactionTest, EvilRestartPassword) { | 1391 TEST_P(FtpNetworkTransactionTest, EvilRestartPassword) { |
1387 FtpSocketDataProvider ctrl_socket1; | 1392 FtpSocketDataProvider ctrl_socket1; |
1388 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, | 1393 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
1389 FtpSocketDataProvider::PRE_QUIT, | 1394 FtpSocketDataProvider::PRE_QUIT, |
1390 "530 Login authentication failed\r\n"); | 1395 "530 Login authentication failed\r\n"); |
1391 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); | 1396 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
1392 | 1397 |
1393 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 1398 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
1394 | 1399 |
1395 ASSERT_EQ(ERR_IO_PENDING, | 1400 ASSERT_EQ(ERR_IO_PENDING, |
1396 transaction_.Start(&request_info, callback_.callback(), | 1401 transaction_.Start(&request_info, callback_.callback(), |
1397 BoundNetLog())); | 1402 BoundNetLog())); |
1398 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); | 1403 ASSERT_THAT(callback_.WaitForResult(), IsError(ERR_FTP_FAILED)); |
1399 | 1404 |
1400 MockRead ctrl_reads[] = { | 1405 MockRead ctrl_reads[] = { |
1401 MockRead("220 host TestFTPd\r\n"), | 1406 MockRead("220 host TestFTPd\r\n"), |
1402 MockRead("331 User okay, send password\r\n"), | 1407 MockRead("331 User okay, send password\r\n"), |
1403 MockRead("221 Goodbye!\r\n"), | 1408 MockRead("221 Goodbye!\r\n"), |
1404 MockRead(SYNCHRONOUS, OK), | 1409 MockRead(SYNCHRONOUS, OK), |
1405 }; | 1410 }; |
1406 MockWrite ctrl_writes[] = { | 1411 MockWrite ctrl_writes[] = { |
1407 MockWrite("USER innocent\r\n"), | 1412 MockWrite("USER innocent\r\n"), |
1408 MockWrite("QUIT\r\n"), | 1413 MockWrite("QUIT\r\n"), |
1409 }; | 1414 }; |
1410 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), | 1415 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
1411 ctrl_writes, arraysize(ctrl_writes)); | 1416 ctrl_writes, arraysize(ctrl_writes)); |
1412 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); | 1417 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
1413 ASSERT_EQ(ERR_IO_PENDING, | 1418 ASSERT_EQ(ERR_IO_PENDING, |
1414 transaction_.RestartWithAuth( | 1419 transaction_.RestartWithAuth( |
1415 AuthCredentials(base::ASCIIToUTF16("innocent"), | 1420 AuthCredentials(base::ASCIIToUTF16("innocent"), |
1416 base::ASCIIToUTF16("foo\nownz0red")), | 1421 base::ASCIIToUTF16("foo\nownz0red")), |
1417 callback_.callback())); | 1422 callback_.callback())); |
1418 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 1423 EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_MALFORMED_IDENTITY)); |
1419 } | 1424 } |
1420 | 1425 |
1421 TEST_P(FtpNetworkTransactionTest, Escaping) { | 1426 TEST_P(FtpNetworkTransactionTest, Escaping) { |
1422 FtpSocketDataProviderEscaping ctrl_socket; | 1427 FtpSocketDataProviderEscaping ctrl_socket; |
1423 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", | 1428 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", |
1424 OK); | 1429 OK); |
1425 } | 1430 } |
1426 | 1431 |
1427 // Test for http://crbug.com/23794. | 1432 // Test for http://crbug.com/23794. |
1428 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { | 1433 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1653 FtpSocketDataProvider::PRE_TYPE, | 1658 FtpSocketDataProvider::PRE_TYPE, |
1654 "257 \"\"\r\n", | 1659 "257 \"\"\r\n", |
1655 OK); | 1660 OK); |
1656 } | 1661 } |
1657 | 1662 |
1658 INSTANTIATE_TEST_CASE_P(FTP, | 1663 INSTANTIATE_TEST_CASE_P(FTP, |
1659 FtpNetworkTransactionTest, | 1664 FtpNetworkTransactionTest, |
1660 ::testing::Values(AF_INET, AF_INET6)); | 1665 ::testing::Values(AF_INET, AF_INET6)); |
1661 | 1666 |
1662 } // namespace net | 1667 } // namespace net |
OLD | NEW |