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 "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <windows.h> | 8 #include <windows.h> |
9 #include <shlobj.h> | 9 #include <shlobj.h> |
10 #endif | 10 #endif |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 #include "net/proxy/proxy_service.h" | 65 #include "net/proxy/proxy_service.h" |
66 #include "net/socket/ssl_client_socket.h" | 66 #include "net/socket/ssl_client_socket.h" |
67 #include "net/ssl/ssl_cipher_suite_names.h" | 67 #include "net/ssl/ssl_cipher_suite_names.h" |
68 #include "net/ssl/ssl_connection_status_flags.h" | 68 #include "net/ssl/ssl_connection_status_flags.h" |
69 #include "net/test/cert_test_util.h" | 69 #include "net/test/cert_test_util.h" |
70 #include "net/test/spawned_test_server/spawned_test_server.h" | 70 #include "net/test/spawned_test_server/spawned_test_server.h" |
71 #include "net/url_request/data_protocol_handler.h" | 71 #include "net/url_request/data_protocol_handler.h" |
72 #include "net/url_request/static_http_user_agent_settings.h" | 72 #include "net/url_request/static_http_user_agent_settings.h" |
73 #include "net/url_request/url_request.h" | 73 #include "net/url_request/url_request.h" |
74 #include "net/url_request/url_request_http_job.h" | 74 #include "net/url_request/url_request_http_job.h" |
| 75 #include "net/url_request/url_request_intercepting_job_factory.h" |
| 76 #include "net/url_request/url_request_interceptor.h" |
75 #include "net/url_request/url_request_job_factory_impl.h" | 77 #include "net/url_request/url_request_job_factory_impl.h" |
76 #include "net/url_request/url_request_redirect_job.h" | 78 #include "net/url_request/url_request_redirect_job.h" |
77 #include "net/url_request/url_request_test_job.h" | 79 #include "net/url_request/url_request_test_job.h" |
78 #include "net/url_request/url_request_test_util.h" | 80 #include "net/url_request/url_request_test_util.h" |
79 #include "testing/gtest/include/gtest/gtest.h" | 81 #include "testing/gtest/include/gtest/gtest.h" |
80 #include "testing/platform_test.h" | 82 #include "testing/platform_test.h" |
81 | 83 |
82 #if !defined(DISABLE_FILE_SUPPORT) | 84 #if !defined(DISABLE_FILE_SUPPORT) |
83 #include "net/base/filename_util.h" | 85 #include "net/base/filename_util.h" |
84 #include "net/url_request/file_protocol_handler.h" | 86 #include "net/url_request/file_protocol_handler.h" |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 return protocol_handler_; | 630 return protocol_handler_; |
629 } | 631 } |
630 | 632 |
631 protected: | 633 protected: |
632 CapturingNetLog net_log_; | 634 CapturingNetLog net_log_; |
633 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. | 635 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. |
634 URLRequestJobFactoryImpl job_factory_; | 636 URLRequestJobFactoryImpl job_factory_; |
635 TestURLRequestContext default_context_; | 637 TestURLRequestContext default_context_; |
636 }; | 638 }; |
637 | 639 |
| 640 |
638 TEST_F(URLRequestTest, AboutBlankTest) { | 641 TEST_F(URLRequestTest, AboutBlankTest) { |
639 TestDelegate d; | 642 TestDelegate d; |
640 { | 643 { |
641 scoped_ptr<URLRequest> r(default_context_.CreateRequest( | 644 scoped_ptr<URLRequest> r(default_context_.CreateRequest( |
642 GURL("about:blank"), DEFAULT_PRIORITY, &d, NULL)); | 645 GURL("about:blank"), DEFAULT_PRIORITY, &d, NULL)); |
643 | 646 |
644 r->Start(); | 647 r->Start(); |
645 EXPECT_TRUE(r->is_pending()); | 648 EXPECT_TRUE(r->is_pending()); |
646 | 649 |
647 base::RunLoop().Run(); | 650 base::RunLoop().Run(); |
(...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1567 | 1570 |
1568 // Check the interceptor got called as expected | 1571 // Check the interceptor got called as expected |
1569 EXPECT_TRUE(interceptor.did_cancel_then_restart_main_); | 1572 EXPECT_TRUE(interceptor.did_cancel_then_restart_main_); |
1570 EXPECT_FALSE(interceptor.did_intercept_final_); | 1573 EXPECT_FALSE(interceptor.did_intercept_final_); |
1571 | 1574 |
1572 // Check we see a canceled request | 1575 // Check we see a canceled request |
1573 EXPECT_FALSE(req->status().is_success()); | 1576 EXPECT_FALSE(req->status().is_success()); |
1574 EXPECT_EQ(URLRequestStatus::CANCELED, req->status().status()); | 1577 EXPECT_EQ(URLRequestStatus::CANCELED, req->status().status()); |
1575 } | 1578 } |
1576 | 1579 |
| 1580 // An Interceptor for use with interceptor tests |
| 1581 class MockURLRequestInterceptor : public URLRequestInterceptor { |
| 1582 public: |
| 1583 MockURLRequestInterceptor() |
| 1584 : intercept_main_request_(false), restart_main_request_(false), |
| 1585 cancel_main_request_(false), cancel_then_restart_main_request_(false), |
| 1586 simulate_main_network_error_(false), |
| 1587 intercept_redirect_(false), cancel_redirect_request_(false), |
| 1588 intercept_final_response_(false), cancel_final_request_(false), |
| 1589 use_url_request_http_job_(false), |
| 1590 did_intercept_main_(false), did_restart_main_(false), |
| 1591 did_cancel_main_(false), did_cancel_then_restart_main_(false), |
| 1592 did_simulate_error_main_(false), |
| 1593 did_intercept_redirect_(false), did_cancel_redirect_(false), |
| 1594 did_intercept_final_(false), did_cancel_final_(false) { |
| 1595 } |
| 1596 |
| 1597 ~MockURLRequestInterceptor() override { |
| 1598 } |
| 1599 |
| 1600 virtual URLRequestJob* MaybeInterceptRequest( |
| 1601 URLRequest* request, |
| 1602 NetworkDelegate* network_delegate) override { |
| 1603 if (restart_main_request_) { |
| 1604 restart_main_request_ = false; |
| 1605 did_restart_main_ = true; |
| 1606 return new RestartTestJob(request, network_delegate); |
| 1607 } |
| 1608 if (cancel_main_request_) { |
| 1609 cancel_main_request_ = false; |
| 1610 did_cancel_main_ = true; |
| 1611 return new CancelTestJob(request, network_delegate); |
| 1612 } |
| 1613 if (cancel_then_restart_main_request_) { |
| 1614 cancel_then_restart_main_request_ = false; |
| 1615 did_cancel_then_restart_main_ = true; |
| 1616 return new CancelThenRestartTestJob(request, network_delegate); |
| 1617 } |
| 1618 if (simulate_main_network_error_) { |
| 1619 simulate_main_network_error_ = false; |
| 1620 did_simulate_error_main_ = true; |
| 1621 // will error since the requeted url is not one of its canned urls |
| 1622 if (use_url_request_http_job_) { |
| 1623 return URLRequestHttpJob::Factory(request, network_delegate, "http"); |
| 1624 } |
| 1625 return new URLRequestTestJob(request, network_delegate, true); |
| 1626 } |
| 1627 if (!intercept_main_request_) |
| 1628 return NULL; |
| 1629 intercept_main_request_ = false; |
| 1630 did_intercept_main_ = true; |
| 1631 URLRequestTestJob* job = new URLRequestTestJob(request, |
| 1632 network_delegate, |
| 1633 main_headers_, |
| 1634 main_data_, |
| 1635 true); |
| 1636 job->set_load_timing_info(main_request_load_timing_info_); |
| 1637 return job; |
| 1638 } |
| 1639 |
| 1640 URLRequestJob* MaybeInterceptRedirect(URLRequest* request, |
| 1641 NetworkDelegate* network_delegate, |
| 1642 const GURL& location) override { |
| 1643 if (cancel_redirect_request_) { |
| 1644 cancel_redirect_request_ = false; |
| 1645 did_cancel_redirect_ = true; |
| 1646 return new CancelTestJob(request, network_delegate); |
| 1647 } |
| 1648 if (!intercept_redirect_) |
| 1649 return NULL; |
| 1650 intercept_redirect_ = false; |
| 1651 did_intercept_redirect_ = true; |
| 1652 if (use_url_request_http_job_) { |
| 1653 return URLRequestHttpJob::Factory(request, network_delegate, "http"); |
| 1654 } |
| 1655 return new URLRequestTestJob(request, |
| 1656 network_delegate, |
| 1657 redirect_headers_, |
| 1658 redirect_data_, |
| 1659 true); |
| 1660 } |
| 1661 |
| 1662 URLRequestJob* MaybeInterceptResponse( |
| 1663 URLRequest* request, |
| 1664 NetworkDelegate* network_delegate) override { |
| 1665 if (cancel_final_request_) { |
| 1666 cancel_final_request_ = false; |
| 1667 did_cancel_final_ = true; |
| 1668 return new CancelTestJob(request, network_delegate); |
| 1669 } |
| 1670 if (!intercept_final_response_) |
| 1671 return NULL; |
| 1672 intercept_final_response_ = false; |
| 1673 did_intercept_final_ = true; |
| 1674 if (use_url_request_http_job_) { |
| 1675 return URLRequestHttpJob::Factory(request, network_delegate, "http"); |
| 1676 } |
| 1677 return new URLRequestTestJob(request, |
| 1678 network_delegate, |
| 1679 final_headers_, |
| 1680 final_data_, |
| 1681 true); |
| 1682 } |
| 1683 |
| 1684 // Whether to intercept the main request, and if so the response to return and |
| 1685 // the LoadTimingInfo to use. |
| 1686 bool intercept_main_request_; |
| 1687 std::string main_headers_; |
| 1688 std::string main_data_; |
| 1689 LoadTimingInfo main_request_load_timing_info_; |
| 1690 |
| 1691 // Other actions we take at MaybeIntercept time |
| 1692 bool restart_main_request_; |
| 1693 bool cancel_main_request_; |
| 1694 bool cancel_then_restart_main_request_; |
| 1695 bool simulate_main_network_error_; |
| 1696 |
| 1697 // Whether to intercept redirects, and if so the response to return. |
| 1698 bool intercept_redirect_; |
| 1699 std::string redirect_headers_; |
| 1700 std::string redirect_data_; |
| 1701 |
| 1702 // Other actions we can take at MaybeInterceptRedirect time |
| 1703 bool cancel_redirect_request_; |
| 1704 |
| 1705 // Whether to intercept final response, and if so the response to return. |
| 1706 bool intercept_final_response_; |
| 1707 std::string final_headers_; |
| 1708 std::string final_data_; |
| 1709 |
| 1710 // Other actions we can take at MaybeInterceptResponse time |
| 1711 bool cancel_final_request_; |
| 1712 |
| 1713 bool use_url_request_http_job_; |
| 1714 |
| 1715 // If we did something or not |
| 1716 bool did_intercept_main_; |
| 1717 bool did_restart_main_; |
| 1718 bool did_cancel_main_; |
| 1719 bool did_cancel_then_restart_main_; |
| 1720 bool did_simulate_error_main_; |
| 1721 bool did_intercept_redirect_; |
| 1722 bool did_cancel_redirect_; |
| 1723 bool did_intercept_final_; |
| 1724 bool did_cancel_final_; |
| 1725 |
| 1726 // Static getters for canned response header and data strings |
| 1727 |
| 1728 static std::string ok_data() { |
| 1729 return URLRequestTestJob::test_data_1(); |
| 1730 } |
| 1731 |
| 1732 static std::string ok_headers() { |
| 1733 return URLRequestTestJob::test_headers(); |
| 1734 } |
| 1735 |
| 1736 static std::string redirect_data() { |
| 1737 return std::string(); |
| 1738 } |
| 1739 |
| 1740 static std::string redirect_headers() { |
| 1741 return URLRequestTestJob::test_redirect_headers(); |
| 1742 } |
| 1743 |
| 1744 static std::string error_data() { |
| 1745 return std::string("ohhh nooooo mr. bill!"); |
| 1746 } |
| 1747 |
| 1748 static std::string error_headers() { |
| 1749 return URLRequestTestJob::test_error_headers(); |
| 1750 } |
| 1751 }; |
| 1752 |
| 1753 // Inherit PlatformTest since we require the autorelease pool on Mac OS X. |
| 1754 class URLRequestInterceptorTest : public PlatformTest { |
| 1755 public: |
| 1756 URLRequestInterceptorTest() : default_context_(true) { |
| 1757 default_context_.set_network_delegate(&default_network_delegate_); |
| 1758 default_context_.set_net_log(&net_log_); |
| 1759 job_factory_impl_ = new URLRequestJobFactoryImpl(); |
| 1760 job_factory_.reset(job_factory_impl_); |
| 1761 job_factory_impl_->SetProtocolHandler("data", new DataProtocolHandler); |
| 1762 #if !defined(DISABLE_FILE_SUPPORT) |
| 1763 job_factory_impl_->SetProtocolHandler( |
| 1764 "file", new FileProtocolHandler(base::MessageLoopProxy::current())); |
| 1765 #endif |
| 1766 interceptor_ = new MockURLRequestInterceptor(); |
| 1767 job_factory_.reset(new URLRequestInterceptingJobFactory( |
| 1768 job_factory_.Pass(), make_scoped_ptr(interceptor_))); |
| 1769 default_context_.set_job_factory(job_factory_.get()); |
| 1770 default_context_.Init(); |
| 1771 } |
| 1772 ~URLRequestInterceptorTest() override { |
| 1773 // URLRequestJobs may post clean-up tasks on destruction. |
| 1774 base::RunLoop().RunUntilIdle(); |
| 1775 } |
| 1776 |
| 1777 protected: |
| 1778 CapturingNetLog net_log_; |
| 1779 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. |
| 1780 URLRequestJobFactoryImpl* job_factory_impl_; |
| 1781 scoped_ptr<URLRequestJobFactory> job_factory_; |
| 1782 TestURLRequestContext default_context_; |
| 1783 MockURLRequestInterceptor* interceptor_; |
| 1784 }; |
| 1785 |
| 1786 |
| 1787 TEST_F(URLRequestInterceptorTest, Intercept) { |
| 1788 // intercept the main request and respond with a simple response |
| 1789 interceptor_->intercept_main_request_ = true; |
| 1790 interceptor_->main_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 1791 interceptor_->main_data_ = MockURLRequestInterceptor::ok_data(); |
| 1792 TestDelegate d; |
| 1793 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 1794 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 1795 base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data(); |
| 1796 base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data(); |
| 1797 base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data(); |
| 1798 req->SetUserData(NULL, user_data0); |
| 1799 req->SetUserData(&user_data1, user_data1); |
| 1800 req->SetUserData(&user_data2, user_data2); |
| 1801 req->set_method("GET"); |
| 1802 req->Start(); |
| 1803 base::RunLoop().Run(); |
| 1804 |
| 1805 // Make sure we can retrieve our specific user data |
| 1806 EXPECT_EQ(user_data0, req->GetUserData(NULL)); |
| 1807 EXPECT_EQ(user_data1, req->GetUserData(&user_data1)); |
| 1808 EXPECT_EQ(user_data2, req->GetUserData(&user_data2)); |
| 1809 |
| 1810 // Check we got one good response |
| 1811 EXPECT_TRUE(req->status().is_success()); |
| 1812 EXPECT_EQ(200, req->response_headers()->response_code()); |
| 1813 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received()); |
| 1814 EXPECT_EQ(1, d.response_started_count()); |
| 1815 EXPECT_EQ(0, d.received_redirect_count()); |
| 1816 } |
| 1817 |
| 1818 TEST_F(URLRequestInterceptorTest, InterceptRedirect) { |
| 1819 // intercept the main request and respond with a redirect |
| 1820 interceptor_->intercept_main_request_ = true; |
| 1821 interceptor_->main_headers_ = MockURLRequestInterceptor::redirect_headers(); |
| 1822 interceptor_->main_data_ = MockURLRequestInterceptor::redirect_data(); |
| 1823 |
| 1824 // intercept that redirect and respond a final OK response |
| 1825 interceptor_->intercept_redirect_ = true; |
| 1826 interceptor_->redirect_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 1827 interceptor_->redirect_data_ = MockURLRequestInterceptor::ok_data(); |
| 1828 |
| 1829 TestDelegate d; |
| 1830 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 1831 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 1832 req->set_method("GET"); |
| 1833 req->Start(); |
| 1834 base::RunLoop().Run(); |
| 1835 |
| 1836 // Check the interceptor got called as expected |
| 1837 EXPECT_TRUE(interceptor_->did_intercept_main_); |
| 1838 EXPECT_TRUE(interceptor_->did_intercept_redirect_); |
| 1839 |
| 1840 // Check we got one good response |
| 1841 EXPECT_TRUE(req->status().is_success()); |
| 1842 if (req->status().is_success()) { |
| 1843 EXPECT_EQ(200, req->response_headers()->response_code()); |
| 1844 } |
| 1845 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received()); |
| 1846 EXPECT_EQ(1, d.response_started_count()); |
| 1847 EXPECT_EQ(0, d.received_redirect_count()); |
| 1848 } |
| 1849 |
| 1850 TEST_F(URLRequestInterceptorTest, InterceptServerError) { |
| 1851 // intercept the main request to generate a server error response |
| 1852 interceptor_->intercept_main_request_ = true; |
| 1853 interceptor_->main_headers_ = MockURLRequestInterceptor::error_headers(); |
| 1854 interceptor_->main_data_ = MockURLRequestInterceptor::error_data(); |
| 1855 |
| 1856 // intercept that error and respond with an OK response |
| 1857 interceptor_->intercept_final_response_ = true; |
| 1858 interceptor_->final_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 1859 interceptor_->final_data_ = MockURLRequestInterceptor::ok_data(); |
| 1860 |
| 1861 TestDelegate d; |
| 1862 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 1863 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 1864 req->set_method("GET"); |
| 1865 req->Start(); |
| 1866 base::RunLoop().Run(); |
| 1867 |
| 1868 // Check the interceptor got called as expected |
| 1869 EXPECT_TRUE(interceptor_->did_intercept_main_); |
| 1870 EXPECT_TRUE(interceptor_->did_intercept_final_); |
| 1871 |
| 1872 // Check we got one good response |
| 1873 EXPECT_TRUE(req->status().is_success()); |
| 1874 EXPECT_EQ(200, req->response_headers()->response_code()); |
| 1875 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received()); |
| 1876 EXPECT_EQ(1, d.response_started_count()); |
| 1877 EXPECT_EQ(0, d.received_redirect_count()); |
| 1878 } |
| 1879 |
| 1880 TEST_F(URLRequestInterceptorTest, InterceptNetworkError) { |
| 1881 // intercept the main request to simulate a network error |
| 1882 interceptor_->simulate_main_network_error_ = true; |
| 1883 |
| 1884 // intercept that error and respond with an OK response |
| 1885 interceptor_->intercept_final_response_ = true; |
| 1886 interceptor_->final_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 1887 interceptor_->final_data_ = MockURLRequestInterceptor::ok_data(); |
| 1888 |
| 1889 TestDelegate d; |
| 1890 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 1891 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 1892 req->set_method("GET"); |
| 1893 req->Start(); |
| 1894 base::RunLoop().Run(); |
| 1895 |
| 1896 // Check the interceptor got called as expected |
| 1897 EXPECT_TRUE(interceptor_->did_simulate_error_main_); |
| 1898 EXPECT_TRUE(interceptor_->did_intercept_final_); |
| 1899 |
| 1900 // Check we received one good response |
| 1901 EXPECT_TRUE(req->status().is_success()); |
| 1902 EXPECT_EQ(200, req->response_headers()->response_code()); |
| 1903 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received()); |
| 1904 EXPECT_EQ(1, d.response_started_count()); |
| 1905 EXPECT_EQ(0, d.received_redirect_count()); |
| 1906 } |
| 1907 |
| 1908 TEST_F(URLRequestInterceptorTest, InterceptRestartRequired) { |
| 1909 // restart the main request |
| 1910 interceptor_->restart_main_request_ = true; |
| 1911 |
| 1912 // then intercept the new main request and respond with an OK response |
| 1913 interceptor_->intercept_main_request_ = true; |
| 1914 interceptor_->main_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 1915 interceptor_->main_data_ = MockURLRequestInterceptor::ok_data(); |
| 1916 |
| 1917 TestDelegate d; |
| 1918 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 1919 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 1920 req->set_method("GET"); |
| 1921 req->Start(); |
| 1922 base::RunLoop().Run(); |
| 1923 |
| 1924 // Check the interceptor got called as expected |
| 1925 EXPECT_TRUE(interceptor_->did_restart_main_); |
| 1926 EXPECT_TRUE(interceptor_->did_intercept_main_); |
| 1927 |
| 1928 // Check we received one good response |
| 1929 EXPECT_TRUE(req->status().is_success()); |
| 1930 if (req->status().is_success()) { |
| 1931 EXPECT_EQ(200, req->response_headers()->response_code()); |
| 1932 } |
| 1933 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received()); |
| 1934 EXPECT_EQ(1, d.response_started_count()); |
| 1935 EXPECT_EQ(0, d.received_redirect_count()); |
| 1936 } |
| 1937 |
| 1938 TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelMain) { |
| 1939 // intercept the main request and cancel from within the restarted job |
| 1940 interceptor_->cancel_main_request_ = true; |
| 1941 |
| 1942 // setup to intercept final response and override it with an OK response |
| 1943 interceptor_->intercept_final_response_ = true; |
| 1944 interceptor_->final_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 1945 interceptor_->final_data_ = MockURLRequestInterceptor::ok_data(); |
| 1946 |
| 1947 TestDelegate d; |
| 1948 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 1949 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 1950 req->set_method("GET"); |
| 1951 req->Start(); |
| 1952 base::RunLoop().Run(); |
| 1953 |
| 1954 // Check the interceptor got called as expected |
| 1955 EXPECT_TRUE(interceptor_->did_cancel_main_); |
| 1956 EXPECT_FALSE(interceptor_->did_intercept_final_); |
| 1957 |
| 1958 // Check we see a canceled request |
| 1959 EXPECT_FALSE(req->status().is_success()); |
| 1960 EXPECT_EQ(URLRequestStatus::CANCELED, req->status().status()); |
| 1961 } |
| 1962 |
| 1963 TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelRedirect) { |
| 1964 // intercept the main request and respond with a redirect |
| 1965 interceptor_->intercept_main_request_ = true; |
| 1966 interceptor_->main_headers_ = MockURLRequestInterceptor::redirect_headers(); |
| 1967 interceptor_->main_data_ = MockURLRequestInterceptor::redirect_data(); |
| 1968 |
| 1969 // intercept the redirect and cancel from within that job |
| 1970 interceptor_->cancel_redirect_request_ = true; |
| 1971 |
| 1972 // setup to intercept final response and override it with an OK response |
| 1973 interceptor_->intercept_final_response_ = true; |
| 1974 interceptor_->final_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 1975 interceptor_->final_data_ = MockURLRequestInterceptor::ok_data(); |
| 1976 |
| 1977 TestDelegate d; |
| 1978 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 1979 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 1980 req->set_method("GET"); |
| 1981 req->Start(); |
| 1982 base::RunLoop().Run(); |
| 1983 |
| 1984 // Check the interceptor got called as expected |
| 1985 EXPECT_TRUE(interceptor_->did_intercept_main_); |
| 1986 EXPECT_TRUE(interceptor_->did_cancel_redirect_); |
| 1987 EXPECT_FALSE(interceptor_->did_intercept_final_); |
| 1988 |
| 1989 // Check we see a canceled request |
| 1990 EXPECT_FALSE(req->status().is_success()); |
| 1991 EXPECT_EQ(URLRequestStatus::CANCELED, req->status().status()); |
| 1992 } |
| 1993 |
| 1994 TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelFinal) { |
| 1995 // intercept the main request to simulate a network error |
| 1996 interceptor_->simulate_main_network_error_ = true; |
| 1997 |
| 1998 // setup to intercept final response and cancel from within that job |
| 1999 interceptor_->cancel_final_request_ = true; |
| 2000 |
| 2001 TestDelegate d; |
| 2002 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 2003 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 2004 req->set_method("GET"); |
| 2005 req->Start(); |
| 2006 base::RunLoop().Run(); |
| 2007 |
| 2008 // Check the interceptor got called as expected |
| 2009 EXPECT_TRUE(interceptor_->did_simulate_error_main_); |
| 2010 EXPECT_TRUE(interceptor_->did_cancel_final_); |
| 2011 |
| 2012 // Check we see a canceled request |
| 2013 EXPECT_FALSE(req->status().is_success()); |
| 2014 EXPECT_EQ(URLRequestStatus::CANCELED, req->status().status()); |
| 2015 } |
| 2016 |
| 2017 TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelInRestart) { |
| 2018 // intercept the main request and cancel then restart from within that job |
| 2019 interceptor_->cancel_then_restart_main_request_ = true; |
| 2020 |
| 2021 // setup to intercept final response and override it with an OK response |
| 2022 interceptor_->intercept_final_response_ = true; |
| 2023 interceptor_->final_headers_ = TestInterceptor::ok_headers(); |
| 2024 interceptor_->final_data_ = TestInterceptor::ok_data(); |
| 2025 |
| 2026 TestDelegate d; |
| 2027 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 2028 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 2029 req->set_method("GET"); |
| 2030 req->Start(); |
| 2031 base::RunLoop().Run(); |
| 2032 |
| 2033 // Check the interceptor got called as expected |
| 2034 EXPECT_TRUE(interceptor_->did_cancel_then_restart_main_); |
| 2035 EXPECT_FALSE(interceptor_->did_intercept_final_); |
| 2036 |
| 2037 // Check we see a canceled request |
| 2038 EXPECT_FALSE(req->status().is_success()); |
| 2039 EXPECT_EQ(URLRequestStatus::CANCELED, req->status().status()); |
| 2040 } |
| 2041 |
| 2042 |
1577 LoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing, | 2043 LoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing, |
1578 URLRequestContext* context) { | 2044 URLRequestContext* context) { |
1579 TestInterceptor interceptor; | 2045 TestInterceptor interceptor; |
1580 interceptor.intercept_main_request_ = true; | 2046 interceptor.intercept_main_request_ = true; |
1581 interceptor.main_request_load_timing_info_ = job_load_timing; | 2047 interceptor.main_request_load_timing_info_ = job_load_timing; |
1582 TestDelegate d; | 2048 TestDelegate d; |
1583 scoped_ptr<URLRequest> req(context->CreateRequest( | 2049 scoped_ptr<URLRequest> req(context->CreateRequest( |
1584 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); | 2050 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
| 2051 req->Start(); |
| 2052 base::RunLoop().Run(); |
| 2053 |
| 2054 LoadTimingInfo resulting_load_timing; |
| 2055 req->GetLoadTimingInfo(&resulting_load_timing); |
| 2056 |
| 2057 // None of these should be modified by the URLRequest. |
| 2058 EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused); |
| 2059 EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id); |
| 2060 EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start); |
| 2061 EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end); |
| 2062 EXPECT_EQ(job_load_timing.receive_headers_end, |
| 2063 resulting_load_timing.receive_headers_end); |
| 2064 |
| 2065 return resulting_load_timing; |
| 2066 } |
| 2067 |
| 2068 // "Normal" LoadTimingInfo as returned by a job. Everything is in order, not |
| 2069 // reused. |connect_time_flags| is used to indicate if there should be dns |
| 2070 // or SSL times, and |used_proxy| is used for proxy times. |
| 2071 LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now, |
| 2072 int connect_time_flags, |
| 2073 bool used_proxy) { |
| 2074 LoadTimingInfo load_timing; |
| 2075 load_timing.socket_log_id = 1; |
| 2076 |
| 2077 if (used_proxy) { |
| 2078 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); |
| 2079 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); |
| 2080 } |
| 2081 |
| 2082 LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing; |
| 2083 if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) { |
| 2084 connect_timing.dns_start = now + base::TimeDelta::FromDays(3); |
| 2085 connect_timing.dns_end = now + base::TimeDelta::FromDays(4); |
| 2086 } |
| 2087 connect_timing.connect_start = now + base::TimeDelta::FromDays(5); |
| 2088 if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) { |
| 2089 connect_timing.ssl_start = now + base::TimeDelta::FromDays(6); |
| 2090 connect_timing.ssl_end = now + base::TimeDelta::FromDays(7); |
| 2091 } |
| 2092 connect_timing.connect_end = now + base::TimeDelta::FromDays(8); |
| 2093 |
| 2094 load_timing.send_start = now + base::TimeDelta::FromDays(9); |
| 2095 load_timing.send_end = now + base::TimeDelta::FromDays(10); |
| 2096 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); |
| 2097 return load_timing; |
| 2098 } |
| 2099 |
| 2100 // Same as above, but in the case of a reused socket. |
| 2101 LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now, |
| 2102 bool used_proxy) { |
| 2103 LoadTimingInfo load_timing; |
| 2104 load_timing.socket_log_id = 1; |
| 2105 load_timing.socket_reused = true; |
| 2106 |
| 2107 if (used_proxy) { |
| 2108 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); |
| 2109 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); |
| 2110 } |
| 2111 |
| 2112 load_timing.send_start = now + base::TimeDelta::FromDays(9); |
| 2113 load_timing.send_end = now + base::TimeDelta::FromDays(10); |
| 2114 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); |
| 2115 return load_timing; |
| 2116 } |
| 2117 |
| 2118 // Basic test that the intercept + load timing tests work. |
| 2119 TEST_F(URLRequestTest, InterceptLoadTiming) { |
| 2120 base::TimeTicks now = base::TimeTicks::Now(); |
| 2121 LoadTimingInfo job_load_timing = |
| 2122 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false); |
| 2123 |
| 2124 LoadTimingInfo load_timing_result = |
| 2125 RunLoadTimingTest(job_load_timing, &default_context_); |
| 2126 |
| 2127 // Nothing should have been changed by the URLRequest. |
| 2128 EXPECT_EQ(job_load_timing.proxy_resolve_start, |
| 2129 load_timing_result.proxy_resolve_start); |
| 2130 EXPECT_EQ(job_load_timing.proxy_resolve_end, |
| 2131 load_timing_result.proxy_resolve_end); |
| 2132 EXPECT_EQ(job_load_timing.connect_timing.dns_start, |
| 2133 load_timing_result.connect_timing.dns_start); |
| 2134 EXPECT_EQ(job_load_timing.connect_timing.dns_end, |
| 2135 load_timing_result.connect_timing.dns_end); |
| 2136 EXPECT_EQ(job_load_timing.connect_timing.connect_start, |
| 2137 load_timing_result.connect_timing.connect_start); |
| 2138 EXPECT_EQ(job_load_timing.connect_timing.connect_end, |
| 2139 load_timing_result.connect_timing.connect_end); |
| 2140 EXPECT_EQ(job_load_timing.connect_timing.ssl_start, |
| 2141 load_timing_result.connect_timing.ssl_start); |
| 2142 EXPECT_EQ(job_load_timing.connect_timing.ssl_end, |
| 2143 load_timing_result.connect_timing.ssl_end); |
| 2144 |
| 2145 // Redundant sanity check. |
| 2146 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES); |
| 2147 } |
| 2148 |
| 2149 // Another basic test, with proxy and SSL times, but no DNS times. |
| 2150 TEST_F(URLRequestTest, InterceptLoadTimingProxy) { |
| 2151 base::TimeTicks now = base::TimeTicks::Now(); |
| 2152 LoadTimingInfo job_load_timing = |
| 2153 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true); |
| 2154 |
| 2155 LoadTimingInfo load_timing_result = |
| 2156 RunLoadTimingTest(job_load_timing, &default_context_); |
| 2157 |
| 2158 // Nothing should have been changed by the URLRequest. |
| 2159 EXPECT_EQ(job_load_timing.proxy_resolve_start, |
| 2160 load_timing_result.proxy_resolve_start); |
| 2161 EXPECT_EQ(job_load_timing.proxy_resolve_end, |
| 2162 load_timing_result.proxy_resolve_end); |
| 2163 EXPECT_EQ(job_load_timing.connect_timing.dns_start, |
| 2164 load_timing_result.connect_timing.dns_start); |
| 2165 EXPECT_EQ(job_load_timing.connect_timing.dns_end, |
| 2166 load_timing_result.connect_timing.dns_end); |
| 2167 EXPECT_EQ(job_load_timing.connect_timing.connect_start, |
| 2168 load_timing_result.connect_timing.connect_start); |
| 2169 EXPECT_EQ(job_load_timing.connect_timing.connect_end, |
| 2170 load_timing_result.connect_timing.connect_end); |
| 2171 EXPECT_EQ(job_load_timing.connect_timing.ssl_start, |
| 2172 load_timing_result.connect_timing.ssl_start); |
| 2173 EXPECT_EQ(job_load_timing.connect_timing.ssl_end, |
| 2174 load_timing_result.connect_timing.ssl_end); |
| 2175 |
| 2176 // Redundant sanity check. |
| 2177 TestLoadTimingNotReusedWithProxy(load_timing_result, |
| 2178 CONNECT_TIMING_HAS_SSL_TIMES); |
| 2179 } |
| 2180 |
| 2181 // Make sure that URLRequest correctly adjusts proxy times when they're before |
| 2182 // |request_start|, due to already having a connected socket. This happens in |
| 2183 // the case of reusing a SPDY session. The connected socket is not considered |
| 2184 // reused in this test (May be a preconnect). |
| 2185 // |
| 2186 // To mix things up from the test above, assumes DNS times but no SSL times. |
| 2187 TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) { |
| 2188 base::TimeTicks now = base::TimeTicks::Now(); |
| 2189 LoadTimingInfo job_load_timing = |
| 2190 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true); |
| 2191 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6); |
| 2192 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5); |
| 2193 job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4); |
| 2194 job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3); |
| 2195 job_load_timing.connect_timing.connect_start = |
| 2196 now - base::TimeDelta::FromDays(2); |
| 2197 job_load_timing.connect_timing.connect_end = |
| 2198 now - base::TimeDelta::FromDays(1); |
| 2199 |
| 2200 LoadTimingInfo load_timing_result = |
| 2201 RunLoadTimingTest(job_load_timing, &default_context_); |
| 2202 |
| 2203 // Proxy times, connect times, and DNS times should all be replaced with |
| 2204 // request_start. |
| 2205 EXPECT_EQ(load_timing_result.request_start, |
| 2206 load_timing_result.proxy_resolve_start); |
| 2207 EXPECT_EQ(load_timing_result.request_start, |
| 2208 load_timing_result.proxy_resolve_end); |
| 2209 EXPECT_EQ(load_timing_result.request_start, |
| 2210 load_timing_result.connect_timing.dns_start); |
| 2211 EXPECT_EQ(load_timing_result.request_start, |
| 2212 load_timing_result.connect_timing.dns_end); |
| 2213 EXPECT_EQ(load_timing_result.request_start, |
| 2214 load_timing_result.connect_timing.connect_start); |
| 2215 EXPECT_EQ(load_timing_result.request_start, |
| 2216 load_timing_result.connect_timing.connect_end); |
| 2217 |
| 2218 // Other times should have been left null. |
| 2219 TestLoadTimingNotReusedWithProxy(load_timing_result, |
| 2220 CONNECT_TIMING_HAS_DNS_TIMES); |
| 2221 } |
| 2222 |
| 2223 // Same as above, but in the reused case. |
| 2224 TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) { |
| 2225 base::TimeTicks now = base::TimeTicks::Now(); |
| 2226 LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true); |
| 2227 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4); |
| 2228 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3); |
| 2229 |
| 2230 LoadTimingInfo load_timing_result = |
| 2231 RunLoadTimingTest(job_load_timing, &default_context_); |
| 2232 |
| 2233 // Proxy times and connect times should all be replaced with request_start. |
| 2234 EXPECT_EQ(load_timing_result.request_start, |
| 2235 load_timing_result.proxy_resolve_start); |
| 2236 EXPECT_EQ(load_timing_result.request_start, |
| 2237 load_timing_result.proxy_resolve_end); |
| 2238 |
| 2239 // Other times should have been left null. |
| 2240 TestLoadTimingReusedWithProxy(load_timing_result); |
| 2241 } |
| 2242 |
| 2243 // Make sure that URLRequest correctly adjusts connect times when they're before |
| 2244 // |request_start|, due to reusing a connected socket. The connected socket is |
| 2245 // not considered reused in this test (May be a preconnect). |
| 2246 // |
| 2247 // To mix things up, the request has SSL times, but no DNS times. |
| 2248 TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) { |
| 2249 base::TimeTicks now = base::TimeTicks::Now(); |
| 2250 LoadTimingInfo job_load_timing = |
| 2251 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false); |
| 2252 job_load_timing.connect_timing.connect_start = |
| 2253 now - base::TimeDelta::FromDays(1); |
| 2254 job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2); |
| 2255 job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3); |
| 2256 job_load_timing.connect_timing.connect_end = |
| 2257 now - base::TimeDelta::FromDays(4); |
| 2258 |
| 2259 LoadTimingInfo load_timing_result = |
| 2260 RunLoadTimingTest(job_load_timing, &default_context_); |
| 2261 |
| 2262 // Connect times, and SSL times should be replaced with request_start. |
| 2263 EXPECT_EQ(load_timing_result.request_start, |
| 2264 load_timing_result.connect_timing.connect_start); |
| 2265 EXPECT_EQ(load_timing_result.request_start, |
| 2266 load_timing_result.connect_timing.ssl_start); |
| 2267 EXPECT_EQ(load_timing_result.request_start, |
| 2268 load_timing_result.connect_timing.ssl_end); |
| 2269 EXPECT_EQ(load_timing_result.request_start, |
| 2270 load_timing_result.connect_timing.connect_end); |
| 2271 |
| 2272 // Other times should have been left null. |
| 2273 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES); |
| 2274 } |
| 2275 |
| 2276 // Make sure that URLRequest correctly adjusts connect times when they're before |
| 2277 // |request_start|, due to reusing a connected socket in the case that there |
| 2278 // are also proxy times. The connected socket is not considered reused in this |
| 2279 // test (May be a preconnect). |
| 2280 // |
| 2281 // In this test, there are no SSL or DNS times. |
| 2282 TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) { |
| 2283 base::TimeTicks now = base::TimeTicks::Now(); |
| 2284 LoadTimingInfo job_load_timing = |
| 2285 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true); |
| 2286 job_load_timing.connect_timing.connect_start = |
| 2287 now - base::TimeDelta::FromDays(1); |
| 2288 job_load_timing.connect_timing.connect_end = |
| 2289 now - base::TimeDelta::FromDays(2); |
| 2290 |
| 2291 LoadTimingInfo load_timing_result = |
| 2292 RunLoadTimingTest(job_load_timing, &default_context_); |
| 2293 |
| 2294 // Connect times should be replaced with proxy_resolve_end. |
| 2295 EXPECT_EQ(load_timing_result.proxy_resolve_end, |
| 2296 load_timing_result.connect_timing.connect_start); |
| 2297 EXPECT_EQ(load_timing_result.proxy_resolve_end, |
| 2298 load_timing_result.connect_timing.connect_end); |
| 2299 |
| 2300 // Other times should have been left null. |
| 2301 TestLoadTimingNotReusedWithProxy(load_timing_result, |
| 2302 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); |
| 2303 } |
| 2304 |
| 2305 LoadTimingInfo RunURLRequestInterceptorLoadTimingTest( |
| 2306 const LoadTimingInfo& job_load_timing, |
| 2307 URLRequestContext* context, |
| 2308 MockURLRequestInterceptor* interceptor) { |
| 2309 interceptor->intercept_main_request_ = true; |
| 2310 interceptor->main_request_load_timing_info_ = job_load_timing; |
| 2311 TestDelegate d; |
| 2312 scoped_ptr<URLRequest> req(context->CreateRequest( |
| 2313 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d, NULL)); |
1585 req->Start(); | 2314 req->Start(); |
1586 base::RunLoop().Run(); | 2315 base::RunLoop().Run(); |
1587 | 2316 |
1588 LoadTimingInfo resulting_load_timing; | 2317 LoadTimingInfo resulting_load_timing; |
1589 req->GetLoadTimingInfo(&resulting_load_timing); | 2318 req->GetLoadTimingInfo(&resulting_load_timing); |
1590 | 2319 |
1591 // None of these should be modified by the URLRequest. | 2320 // None of these should be modified by the URLRequest. |
1592 EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused); | 2321 EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused); |
1593 EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id); | 2322 EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id); |
1594 EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start); | 2323 EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start); |
1595 EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end); | 2324 EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end); |
1596 EXPECT_EQ(job_load_timing.receive_headers_end, | 2325 EXPECT_EQ(job_load_timing.receive_headers_end, |
1597 resulting_load_timing.receive_headers_end); | 2326 resulting_load_timing.receive_headers_end); |
1598 | 2327 |
1599 return resulting_load_timing; | 2328 return resulting_load_timing; |
1600 } | 2329 } |
1601 | 2330 |
1602 // "Normal" LoadTimingInfo as returned by a job. Everything is in order, not | |
1603 // reused. |connect_time_flags| is used to indicate if there should be dns | |
1604 // or SSL times, and |used_proxy| is used for proxy times. | |
1605 LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now, | |
1606 int connect_time_flags, | |
1607 bool used_proxy) { | |
1608 LoadTimingInfo load_timing; | |
1609 load_timing.socket_log_id = 1; | |
1610 | |
1611 if (used_proxy) { | |
1612 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); | |
1613 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); | |
1614 } | |
1615 | |
1616 LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing; | |
1617 if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) { | |
1618 connect_timing.dns_start = now + base::TimeDelta::FromDays(3); | |
1619 connect_timing.dns_end = now + base::TimeDelta::FromDays(4); | |
1620 } | |
1621 connect_timing.connect_start = now + base::TimeDelta::FromDays(5); | |
1622 if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) { | |
1623 connect_timing.ssl_start = now + base::TimeDelta::FromDays(6); | |
1624 connect_timing.ssl_end = now + base::TimeDelta::FromDays(7); | |
1625 } | |
1626 connect_timing.connect_end = now + base::TimeDelta::FromDays(8); | |
1627 | |
1628 load_timing.send_start = now + base::TimeDelta::FromDays(9); | |
1629 load_timing.send_end = now + base::TimeDelta::FromDays(10); | |
1630 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); | |
1631 return load_timing; | |
1632 } | |
1633 | |
1634 // Same as above, but in the case of a reused socket. | |
1635 LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now, | |
1636 bool used_proxy) { | |
1637 LoadTimingInfo load_timing; | |
1638 load_timing.socket_log_id = 1; | |
1639 load_timing.socket_reused = true; | |
1640 | |
1641 if (used_proxy) { | |
1642 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); | |
1643 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); | |
1644 } | |
1645 | |
1646 load_timing.send_start = now + base::TimeDelta::FromDays(9); | |
1647 load_timing.send_end = now + base::TimeDelta::FromDays(10); | |
1648 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); | |
1649 return load_timing; | |
1650 } | |
1651 | |
1652 // Basic test that the intercept + load timing tests work. | 2331 // Basic test that the intercept + load timing tests work. |
1653 TEST_F(URLRequestTest, InterceptLoadTiming) { | 2332 TEST_F(URLRequestInterceptorTest, InterceptLoadTiming) { |
1654 base::TimeTicks now = base::TimeTicks::Now(); | 2333 base::TimeTicks now = base::TimeTicks::Now(); |
1655 LoadTimingInfo job_load_timing = | 2334 LoadTimingInfo job_load_timing = |
1656 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false); | 2335 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false); |
1657 | 2336 |
1658 LoadTimingInfo load_timing_result = | 2337 LoadTimingInfo load_timing_result = |
1659 RunLoadTimingTest(job_load_timing, &default_context_); | 2338 RunURLRequestInterceptorLoadTimingTest( |
| 2339 job_load_timing, &default_context_, interceptor_); |
1660 | 2340 |
1661 // Nothing should have been changed by the URLRequest. | 2341 // Nothing should have been changed by the URLRequest. |
1662 EXPECT_EQ(job_load_timing.proxy_resolve_start, | 2342 EXPECT_EQ(job_load_timing.proxy_resolve_start, |
1663 load_timing_result.proxy_resolve_start); | 2343 load_timing_result.proxy_resolve_start); |
1664 EXPECT_EQ(job_load_timing.proxy_resolve_end, | 2344 EXPECT_EQ(job_load_timing.proxy_resolve_end, |
1665 load_timing_result.proxy_resolve_end); | 2345 load_timing_result.proxy_resolve_end); |
1666 EXPECT_EQ(job_load_timing.connect_timing.dns_start, | 2346 EXPECT_EQ(job_load_timing.connect_timing.dns_start, |
1667 load_timing_result.connect_timing.dns_start); | 2347 load_timing_result.connect_timing.dns_start); |
1668 EXPECT_EQ(job_load_timing.connect_timing.dns_end, | 2348 EXPECT_EQ(job_load_timing.connect_timing.dns_end, |
1669 load_timing_result.connect_timing.dns_end); | 2349 load_timing_result.connect_timing.dns_end); |
1670 EXPECT_EQ(job_load_timing.connect_timing.connect_start, | 2350 EXPECT_EQ(job_load_timing.connect_timing.connect_start, |
1671 load_timing_result.connect_timing.connect_start); | 2351 load_timing_result.connect_timing.connect_start); |
1672 EXPECT_EQ(job_load_timing.connect_timing.connect_end, | 2352 EXPECT_EQ(job_load_timing.connect_timing.connect_end, |
1673 load_timing_result.connect_timing.connect_end); | 2353 load_timing_result.connect_timing.connect_end); |
1674 EXPECT_EQ(job_load_timing.connect_timing.ssl_start, | 2354 EXPECT_EQ(job_load_timing.connect_timing.ssl_start, |
1675 load_timing_result.connect_timing.ssl_start); | 2355 load_timing_result.connect_timing.ssl_start); |
1676 EXPECT_EQ(job_load_timing.connect_timing.ssl_end, | 2356 EXPECT_EQ(job_load_timing.connect_timing.ssl_end, |
1677 load_timing_result.connect_timing.ssl_end); | 2357 load_timing_result.connect_timing.ssl_end); |
1678 | 2358 |
1679 // Redundant sanity check. | 2359 // Redundant sanity check. |
1680 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES); | 2360 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES); |
1681 } | 2361 } |
1682 | 2362 |
1683 // Another basic test, with proxy and SSL times, but no DNS times. | 2363 // Another basic test, with proxy and SSL times, but no DNS times. |
1684 TEST_F(URLRequestTest, InterceptLoadTimingProxy) { | 2364 TEST_F(URLRequestInterceptorTest, InterceptLoadTimingProxy) { |
1685 base::TimeTicks now = base::TimeTicks::Now(); | 2365 base::TimeTicks now = base::TimeTicks::Now(); |
1686 LoadTimingInfo job_load_timing = | 2366 LoadTimingInfo job_load_timing = |
1687 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true); | 2367 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true); |
1688 | 2368 |
1689 LoadTimingInfo load_timing_result = | 2369 LoadTimingInfo load_timing_result = |
1690 RunLoadTimingTest(job_load_timing, &default_context_); | 2370 RunURLRequestInterceptorLoadTimingTest( |
| 2371 job_load_timing, &default_context_, interceptor_); |
1691 | 2372 |
1692 // Nothing should have been changed by the URLRequest. | 2373 // Nothing should have been changed by the URLRequest. |
1693 EXPECT_EQ(job_load_timing.proxy_resolve_start, | 2374 EXPECT_EQ(job_load_timing.proxy_resolve_start, |
1694 load_timing_result.proxy_resolve_start); | 2375 load_timing_result.proxy_resolve_start); |
1695 EXPECT_EQ(job_load_timing.proxy_resolve_end, | 2376 EXPECT_EQ(job_load_timing.proxy_resolve_end, |
1696 load_timing_result.proxy_resolve_end); | 2377 load_timing_result.proxy_resolve_end); |
1697 EXPECT_EQ(job_load_timing.connect_timing.dns_start, | 2378 EXPECT_EQ(job_load_timing.connect_timing.dns_start, |
1698 load_timing_result.connect_timing.dns_start); | 2379 load_timing_result.connect_timing.dns_start); |
1699 EXPECT_EQ(job_load_timing.connect_timing.dns_end, | 2380 EXPECT_EQ(job_load_timing.connect_timing.dns_end, |
1700 load_timing_result.connect_timing.dns_end); | 2381 load_timing_result.connect_timing.dns_end); |
(...skipping 10 matching lines...) Expand all Loading... |
1711 TestLoadTimingNotReusedWithProxy(load_timing_result, | 2392 TestLoadTimingNotReusedWithProxy(load_timing_result, |
1712 CONNECT_TIMING_HAS_SSL_TIMES); | 2393 CONNECT_TIMING_HAS_SSL_TIMES); |
1713 } | 2394 } |
1714 | 2395 |
1715 // Make sure that URLRequest correctly adjusts proxy times when they're before | 2396 // Make sure that URLRequest correctly adjusts proxy times when they're before |
1716 // |request_start|, due to already having a connected socket. This happens in | 2397 // |request_start|, due to already having a connected socket. This happens in |
1717 // the case of reusing a SPDY session. The connected socket is not considered | 2398 // the case of reusing a SPDY session. The connected socket is not considered |
1718 // reused in this test (May be a preconnect). | 2399 // reused in this test (May be a preconnect). |
1719 // | 2400 // |
1720 // To mix things up from the test above, assumes DNS times but no SSL times. | 2401 // To mix things up from the test above, assumes DNS times but no SSL times. |
1721 TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) { | 2402 TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyProxyResolution) { |
1722 base::TimeTicks now = base::TimeTicks::Now(); | 2403 base::TimeTicks now = base::TimeTicks::Now(); |
1723 LoadTimingInfo job_load_timing = | 2404 LoadTimingInfo job_load_timing = |
1724 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true); | 2405 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true); |
1725 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6); | 2406 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6); |
1726 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5); | 2407 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5); |
1727 job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4); | 2408 job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4); |
1728 job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3); | 2409 job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3); |
1729 job_load_timing.connect_timing.connect_start = | 2410 job_load_timing.connect_timing.connect_start = |
1730 now - base::TimeDelta::FromDays(2); | 2411 now - base::TimeDelta::FromDays(2); |
1731 job_load_timing.connect_timing.connect_end = | 2412 job_load_timing.connect_timing.connect_end = |
1732 now - base::TimeDelta::FromDays(1); | 2413 now - base::TimeDelta::FromDays(1); |
1733 | 2414 |
1734 LoadTimingInfo load_timing_result = | 2415 LoadTimingInfo load_timing_result = |
1735 RunLoadTimingTest(job_load_timing, &default_context_); | 2416 RunURLRequestInterceptorLoadTimingTest( |
| 2417 job_load_timing, &default_context_, interceptor_); |
1736 | 2418 |
1737 // Proxy times, connect times, and DNS times should all be replaced with | 2419 // Proxy times, connect times, and DNS times should all be replaced with |
1738 // request_start. | 2420 // request_start. |
1739 EXPECT_EQ(load_timing_result.request_start, | 2421 EXPECT_EQ(load_timing_result.request_start, |
1740 load_timing_result.proxy_resolve_start); | 2422 load_timing_result.proxy_resolve_start); |
1741 EXPECT_EQ(load_timing_result.request_start, | 2423 EXPECT_EQ(load_timing_result.request_start, |
1742 load_timing_result.proxy_resolve_end); | 2424 load_timing_result.proxy_resolve_end); |
1743 EXPECT_EQ(load_timing_result.request_start, | 2425 EXPECT_EQ(load_timing_result.request_start, |
1744 load_timing_result.connect_timing.dns_start); | 2426 load_timing_result.connect_timing.dns_start); |
1745 EXPECT_EQ(load_timing_result.request_start, | 2427 EXPECT_EQ(load_timing_result.request_start, |
1746 load_timing_result.connect_timing.dns_end); | 2428 load_timing_result.connect_timing.dns_end); |
1747 EXPECT_EQ(load_timing_result.request_start, | 2429 EXPECT_EQ(load_timing_result.request_start, |
1748 load_timing_result.connect_timing.connect_start); | 2430 load_timing_result.connect_timing.connect_start); |
1749 EXPECT_EQ(load_timing_result.request_start, | 2431 EXPECT_EQ(load_timing_result.request_start, |
1750 load_timing_result.connect_timing.connect_end); | 2432 load_timing_result.connect_timing.connect_end); |
1751 | 2433 |
1752 // Other times should have been left null. | 2434 // Other times should have been left null. |
1753 TestLoadTimingNotReusedWithProxy(load_timing_result, | 2435 TestLoadTimingNotReusedWithProxy(load_timing_result, |
1754 CONNECT_TIMING_HAS_DNS_TIMES); | 2436 CONNECT_TIMING_HAS_DNS_TIMES); |
1755 } | 2437 } |
1756 | 2438 |
1757 // Same as above, but in the reused case. | 2439 // Same as above, but in the reused case. |
1758 TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) { | 2440 TEST_F(URLRequestInterceptorTest, |
| 2441 InterceptLoadTimingEarlyProxyResolutionReused) { |
1759 base::TimeTicks now = base::TimeTicks::Now(); | 2442 base::TimeTicks now = base::TimeTicks::Now(); |
1760 LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true); | 2443 LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true); |
1761 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4); | 2444 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4); |
1762 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3); | 2445 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3); |
1763 | 2446 |
1764 LoadTimingInfo load_timing_result = | 2447 LoadTimingInfo load_timing_result = |
1765 RunLoadTimingTest(job_load_timing, &default_context_); | 2448 RunURLRequestInterceptorLoadTimingTest( |
| 2449 job_load_timing, &default_context_, interceptor_); |
1766 | 2450 |
1767 // Proxy times and connect times should all be replaced with request_start. | 2451 // Proxy times and connect times should all be replaced with request_start. |
1768 EXPECT_EQ(load_timing_result.request_start, | 2452 EXPECT_EQ(load_timing_result.request_start, |
1769 load_timing_result.proxy_resolve_start); | 2453 load_timing_result.proxy_resolve_start); |
1770 EXPECT_EQ(load_timing_result.request_start, | 2454 EXPECT_EQ(load_timing_result.request_start, |
1771 load_timing_result.proxy_resolve_end); | 2455 load_timing_result.proxy_resolve_end); |
1772 | 2456 |
1773 // Other times should have been left null. | 2457 // Other times should have been left null. |
1774 TestLoadTimingReusedWithProxy(load_timing_result); | 2458 TestLoadTimingReusedWithProxy(load_timing_result); |
1775 } | 2459 } |
1776 | 2460 |
1777 // Make sure that URLRequest correctly adjusts connect times when they're before | 2461 // Make sure that URLRequest correctly adjusts connect times when they're before |
1778 // |request_start|, due to reusing a connected socket. The connected socket is | 2462 // |request_start|, due to reusing a connected socket. The connected socket is |
1779 // not considered reused in this test (May be a preconnect). | 2463 // not considered reused in this test (May be a preconnect). |
1780 // | 2464 // |
1781 // To mix things up, the request has SSL times, but no DNS times. | 2465 // To mix things up, the request has SSL times, but no DNS times. |
1782 TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) { | 2466 TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyConnect) { |
1783 base::TimeTicks now = base::TimeTicks::Now(); | 2467 base::TimeTicks now = base::TimeTicks::Now(); |
1784 LoadTimingInfo job_load_timing = | 2468 LoadTimingInfo job_load_timing = |
1785 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false); | 2469 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false); |
1786 job_load_timing.connect_timing.connect_start = | 2470 job_load_timing.connect_timing.connect_start = |
1787 now - base::TimeDelta::FromDays(1); | 2471 now - base::TimeDelta::FromDays(1); |
1788 job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2); | 2472 job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2); |
1789 job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3); | 2473 job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3); |
1790 job_load_timing.connect_timing.connect_end = | 2474 job_load_timing.connect_timing.connect_end = |
1791 now - base::TimeDelta::FromDays(4); | 2475 now - base::TimeDelta::FromDays(4); |
1792 | 2476 |
1793 LoadTimingInfo load_timing_result = | 2477 LoadTimingInfo load_timing_result = |
1794 RunLoadTimingTest(job_load_timing, &default_context_); | 2478 RunURLRequestInterceptorLoadTimingTest( |
| 2479 job_load_timing, &default_context_, interceptor_); |
1795 | 2480 |
1796 // Connect times, and SSL times should be replaced with request_start. | 2481 // Connect times, and SSL times should be replaced with request_start. |
1797 EXPECT_EQ(load_timing_result.request_start, | 2482 EXPECT_EQ(load_timing_result.request_start, |
1798 load_timing_result.connect_timing.connect_start); | 2483 load_timing_result.connect_timing.connect_start); |
1799 EXPECT_EQ(load_timing_result.request_start, | 2484 EXPECT_EQ(load_timing_result.request_start, |
1800 load_timing_result.connect_timing.ssl_start); | 2485 load_timing_result.connect_timing.ssl_start); |
1801 EXPECT_EQ(load_timing_result.request_start, | 2486 EXPECT_EQ(load_timing_result.request_start, |
1802 load_timing_result.connect_timing.ssl_end); | 2487 load_timing_result.connect_timing.ssl_end); |
1803 EXPECT_EQ(load_timing_result.request_start, | 2488 EXPECT_EQ(load_timing_result.request_start, |
1804 load_timing_result.connect_timing.connect_end); | 2489 load_timing_result.connect_timing.connect_end); |
1805 | 2490 |
1806 // Other times should have been left null. | 2491 // Other times should have been left null. |
1807 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES); | 2492 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES); |
1808 } | 2493 } |
1809 | 2494 |
1810 // Make sure that URLRequest correctly adjusts connect times when they're before | 2495 // Make sure that URLRequest correctly adjusts connect times when they're before |
1811 // |request_start|, due to reusing a connected socket in the case that there | 2496 // |request_start|, due to reusing a connected socket in the case that there |
1812 // are also proxy times. The connected socket is not considered reused in this | 2497 // are also proxy times. The connected socket is not considered reused in this |
1813 // test (May be a preconnect). | 2498 // test (May be a preconnect). |
1814 // | 2499 // |
1815 // In this test, there are no SSL or DNS times. | 2500 // In this test, there are no SSL or DNS times. |
1816 TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) { | 2501 TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyConnectWithProxy) { |
1817 base::TimeTicks now = base::TimeTicks::Now(); | 2502 base::TimeTicks now = base::TimeTicks::Now(); |
1818 LoadTimingInfo job_load_timing = | 2503 LoadTimingInfo job_load_timing = |
1819 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true); | 2504 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true); |
1820 job_load_timing.connect_timing.connect_start = | 2505 job_load_timing.connect_timing.connect_start = |
1821 now - base::TimeDelta::FromDays(1); | 2506 now - base::TimeDelta::FromDays(1); |
1822 job_load_timing.connect_timing.connect_end = | 2507 job_load_timing.connect_timing.connect_end = |
1823 now - base::TimeDelta::FromDays(2); | 2508 now - base::TimeDelta::FromDays(2); |
1824 | 2509 |
1825 LoadTimingInfo load_timing_result = | 2510 LoadTimingInfo load_timing_result = |
1826 RunLoadTimingTest(job_load_timing, &default_context_); | 2511 RunURLRequestInterceptorLoadTimingTest( |
| 2512 job_load_timing, &default_context_, interceptor_); |
1827 | 2513 |
1828 // Connect times should be replaced with proxy_resolve_end. | 2514 // Connect times should be replaced with proxy_resolve_end. |
1829 EXPECT_EQ(load_timing_result.proxy_resolve_end, | 2515 EXPECT_EQ(load_timing_result.proxy_resolve_end, |
1830 load_timing_result.connect_timing.connect_start); | 2516 load_timing_result.connect_timing.connect_start); |
1831 EXPECT_EQ(load_timing_result.proxy_resolve_end, | 2517 EXPECT_EQ(load_timing_result.proxy_resolve_end, |
1832 load_timing_result.connect_timing.connect_end); | 2518 load_timing_result.connect_timing.connect_end); |
1833 | 2519 |
1834 // Other times should have been left null. | 2520 // Other times should have been left null. |
1835 TestLoadTimingNotReusedWithProxy(load_timing_result, | 2521 TestLoadTimingNotReusedWithProxy(load_timing_result, |
1836 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); | 2522 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); |
(...skipping 4602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6439 scoped_ptr<URLRequest> req(context.CreateRequest( | 7125 scoped_ptr<URLRequest> req(context.CreateRequest( |
6440 GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d, NULL)); | 7126 GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d, NULL)); |
6441 req->Start(); | 7127 req->Start(); |
6442 base::RunLoop().Run(); | 7128 base::RunLoop().Run(); |
6443 | 7129 |
6444 EXPECT_TRUE(d.request_failed()); | 7130 EXPECT_TRUE(d.request_failed()); |
6445 EXPECT_EQ(URLRequestStatus::FAILED, req->status().status()); | 7131 EXPECT_EQ(URLRequestStatus::FAILED, req->status().status()); |
6446 EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, req->status().error()); | 7132 EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, req->status().error()); |
6447 } | 7133 } |
6448 | 7134 |
| 7135 class URLRequestInterceptorTestHTTP : public URLRequestInterceptorTest { |
| 7136 public: |
| 7137 URLRequestInterceptorTestHTTP() |
| 7138 : test_server_(base::FilePath(FILE_PATH_LITERAL( |
| 7139 "net/data/url_request_unittest"))) { |
| 7140 } |
| 7141 |
| 7142 protected: |
| 7143 // Requests |redirect_url|, which must return a HTTP 3xx redirect. |
| 7144 // |request_method| is the method to use for the initial request. |
| 7145 // |redirect_method| is the method that is expected to be used for the second |
| 7146 // request, after redirection. |
| 7147 // If |include_data| is true, data is uploaded with the request. The |
| 7148 // response body is expected to match it exactly, if and only if |
| 7149 // |request_method| == |redirect_method|. |
| 7150 void HTTPRedirectMethodTest(const GURL& redirect_url, |
| 7151 const std::string& request_method, |
| 7152 const std::string& redirect_method, |
| 7153 bool include_data) { |
| 7154 static const char kData[] = "hello world"; |
| 7155 TestDelegate d; |
| 7156 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 7157 redirect_url, DEFAULT_PRIORITY, &d, NULL)); |
| 7158 req->set_method(request_method); |
| 7159 if (include_data) { |
| 7160 req->set_upload(CreateSimpleUploadData(kData)); |
| 7161 HttpRequestHeaders headers; |
| 7162 headers.SetHeader(HttpRequestHeaders::kContentLength, |
| 7163 base::UintToString(arraysize(kData) - 1)); |
| 7164 req->SetExtraRequestHeaders(headers); |
| 7165 } |
| 7166 req->Start(); |
| 7167 base::RunLoop().Run(); |
| 7168 EXPECT_EQ(redirect_method, req->method()); |
| 7169 EXPECT_EQ(URLRequestStatus::SUCCESS, req->status().status()); |
| 7170 EXPECT_EQ(OK, req->status().error()); |
| 7171 if (include_data) { |
| 7172 if (request_method == redirect_method) { |
| 7173 EXPECT_EQ(kData, d.data_received()); |
| 7174 } else { |
| 7175 EXPECT_NE(kData, d.data_received()); |
| 7176 } |
| 7177 } |
| 7178 if (HasFailure()) |
| 7179 LOG(WARNING) << "Request method was: " << request_method; |
| 7180 } |
| 7181 |
| 7182 void HTTPUploadDataOperationTest(const std::string& method) { |
| 7183 const int kMsgSize = 20000; // multiple of 10 |
| 7184 const int kIterations = 50; |
| 7185 char* uploadBytes = new char[kMsgSize+1]; |
| 7186 char* ptr = uploadBytes; |
| 7187 char marker = 'a'; |
| 7188 for (int idx = 0; idx < kMsgSize/10; idx++) { |
| 7189 memcpy(ptr, "----------", 10); |
| 7190 ptr += 10; |
| 7191 if (idx % 100 == 0) { |
| 7192 ptr--; |
| 7193 *ptr++ = marker; |
| 7194 if (++marker > 'z') |
| 7195 marker = 'a'; |
| 7196 } |
| 7197 } |
| 7198 uploadBytes[kMsgSize] = '\0'; |
| 7199 |
| 7200 for (int i = 0; i < kIterations; ++i) { |
| 7201 TestDelegate d; |
| 7202 scoped_ptr<URLRequest> r(default_context_.CreateRequest( |
| 7203 test_server_.GetURL("echo"), DEFAULT_PRIORITY, &d, NULL)); |
| 7204 r->set_method(method.c_str()); |
| 7205 |
| 7206 r->set_upload(CreateSimpleUploadData(uploadBytes)); |
| 7207 |
| 7208 r->Start(); |
| 7209 EXPECT_TRUE(r->is_pending()); |
| 7210 |
| 7211 base::RunLoop().Run(); |
| 7212 |
| 7213 ASSERT_EQ(1, d.response_started_count()) |
| 7214 << "request failed: " << r->status().status() |
| 7215 << ", os error: " << r->status().error(); |
| 7216 |
| 7217 EXPECT_FALSE(d.received_data_before_response()); |
| 7218 EXPECT_EQ(uploadBytes, d.data_received()); |
| 7219 } |
| 7220 delete[] uploadBytes; |
| 7221 } |
| 7222 |
| 7223 void AddChunksToUpload(URLRequest* r) { |
| 7224 r->AppendChunkToUpload("a", 1, false); |
| 7225 r->AppendChunkToUpload("bcd", 3, false); |
| 7226 r->AppendChunkToUpload("this is a longer chunk than before.", 35, false); |
| 7227 r->AppendChunkToUpload("\r\n\r\n", 4, false); |
| 7228 r->AppendChunkToUpload("0", 1, false); |
| 7229 r->AppendChunkToUpload("2323", 4, true); |
| 7230 } |
| 7231 |
| 7232 void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) { |
| 7233 // This should match the chunks sent by AddChunksToUpload(). |
| 7234 const std::string expected_data = |
| 7235 "abcdthis is a longer chunk than before.\r\n\r\n02323"; |
| 7236 |
| 7237 ASSERT_EQ(1, d->response_started_count()) |
| 7238 << "request failed: " << r->status().status() |
| 7239 << ", os error: " << r->status().error(); |
| 7240 |
| 7241 EXPECT_FALSE(d->received_data_before_response()); |
| 7242 |
| 7243 EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received())); |
| 7244 EXPECT_EQ(expected_data, d->data_received()); |
| 7245 } |
| 7246 |
| 7247 bool DoManyCookiesRequest(int num_cookies) { |
| 7248 TestDelegate d; |
| 7249 scoped_ptr<URLRequest> r(default_context_.CreateRequest( |
| 7250 test_server_.GetURL("set-many-cookies?" + |
| 7251 base::IntToString(num_cookies)), |
| 7252 DEFAULT_PRIORITY, &d, NULL)); |
| 7253 |
| 7254 r->Start(); |
| 7255 EXPECT_TRUE(r->is_pending()); |
| 7256 |
| 7257 base::RunLoop().Run(); |
| 7258 |
| 7259 bool is_success = r->status().is_success(); |
| 7260 |
| 7261 if (!is_success) { |
| 7262 EXPECT_TRUE(r->status().error() == ERR_RESPONSE_HEADERS_TOO_BIG); |
| 7263 // The test server appears to be unable to handle subsequent requests |
| 7264 // after this error is triggered. Force it to restart. |
| 7265 EXPECT_TRUE(test_server_.Stop()); |
| 7266 EXPECT_TRUE(test_server_.Start()); |
| 7267 } |
| 7268 |
| 7269 return is_success; |
| 7270 } |
| 7271 |
| 7272 LocalHttpTestServer test_server_; |
| 7273 }; |
| 7274 |
| 7275 TEST_F(URLRequestInterceptorTestHTTP, |
| 7276 NetworkDelegateNotificationOnRedirectIntercept) { |
| 7277 interceptor_->intercept_redirect_ = true; |
| 7278 interceptor_->redirect_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 7279 interceptor_->redirect_data_ = MockURLRequestInterceptor::ok_data(); |
| 7280 |
| 7281 ASSERT_TRUE(test_server_.Start()); |
| 7282 |
| 7283 TestDelegate d; |
| 7284 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 7285 test_server_.GetURL("files/redirect-test.html"), DEFAULT_PRIORITY, |
| 7286 &d, NULL)); |
| 7287 req->Start(); |
| 7288 base::RunLoop().Run(); |
| 7289 |
| 7290 EXPECT_TRUE(interceptor_->did_intercept_redirect_); |
| 7291 // Check we got one good response |
| 7292 EXPECT_TRUE(req->status().is_success()); |
| 7293 if (req->status().is_success()) { |
| 7294 EXPECT_EQ(200, req->response_headers()->response_code()); |
| 7295 } |
| 7296 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received()); |
| 7297 EXPECT_EQ(1, d.response_started_count()); |
| 7298 EXPECT_EQ(0, d.received_redirect_count()); |
| 7299 |
| 7300 EXPECT_EQ(1, default_network_delegate_.created_requests()); |
| 7301 EXPECT_EQ(1, default_network_delegate_.before_send_headers_count()); |
| 7302 EXPECT_EQ(1, default_network_delegate_.headers_received_count()); |
| 7303 } |
| 7304 |
| 7305 TEST_F(URLRequestInterceptorTestHTTP, |
| 7306 NetworkDelegateNotificationOnErrorIntercept) { |
| 7307 // Intercept that error and respond with an OK response. |
| 7308 interceptor_->intercept_final_response_ = true; |
| 7309 interceptor_->final_headers_ = MockURLRequestInterceptor::ok_headers(); |
| 7310 interceptor_->final_data_ = MockURLRequestInterceptor::ok_data(); |
| 7311 default_network_delegate_.set_can_be_intercepted_on_error(true); |
| 7312 |
| 7313 ASSERT_TRUE(test_server_.Start()); |
| 7314 |
| 7315 TestDelegate d; |
| 7316 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 7317 test_server_.GetURL("files/two-content-lengths.html"), DEFAULT_PRIORITY, |
| 7318 &d, NULL)); |
| 7319 req->set_method("GET"); |
| 7320 req->Start(); |
| 7321 base::RunLoop().Run(); |
| 7322 |
| 7323 EXPECT_TRUE(interceptor_->did_intercept_final_); |
| 7324 |
| 7325 // Check we received one good response. |
| 7326 EXPECT_TRUE(req->status().is_success()); |
| 7327 EXPECT_EQ(200, req->response_headers()->response_code()); |
| 7328 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received()); |
| 7329 EXPECT_EQ(1, d.response_started_count()); |
| 7330 EXPECT_EQ(0, d.received_redirect_count()); |
| 7331 |
| 7332 EXPECT_EQ(1, default_network_delegate_.created_requests()); |
| 7333 EXPECT_EQ(1, default_network_delegate_.before_send_headers_count()); |
| 7334 EXPECT_EQ(0, default_network_delegate_.headers_received_count()); |
| 7335 } |
| 7336 |
| 7337 TEST_F(URLRequestInterceptorTestHTTP, |
| 7338 NetworkDelegateNotificationOnResponseIntercept) { |
| 7339 // Intercept that error and respond with an OK response. |
| 7340 interceptor_->intercept_final_response_ = true; |
| 7341 |
| 7342 // Intercept with a real URLRequestHttpJob. |
| 7343 interceptor_->use_url_request_http_job_ = true; |
| 7344 |
| 7345 ASSERT_TRUE(test_server_.Start()); |
| 7346 |
| 7347 TestDelegate d; |
| 7348 scoped_ptr<URLRequest> req(default_context_.CreateRequest( |
| 7349 test_server_.GetURL("files/simple.html"), DEFAULT_PRIORITY, |
| 7350 &d, NULL)); |
| 7351 req->set_method("GET"); |
| 7352 req->Start(); |
| 7353 base::RunLoop().Run(); |
| 7354 |
| 7355 EXPECT_TRUE(interceptor_->did_intercept_final_); |
| 7356 |
| 7357 // Check we received one good response. |
| 7358 EXPECT_TRUE(req->status().is_success()); |
| 7359 EXPECT_EQ(200, req->response_headers()->response_code()); |
| 7360 EXPECT_EQ("hello", d.data_received()); |
| 7361 EXPECT_EQ(1, d.response_started_count()); |
| 7362 EXPECT_EQ(0, d.received_redirect_count()); |
| 7363 |
| 7364 EXPECT_EQ(1, default_network_delegate_.created_requests()); |
| 7365 EXPECT_EQ(2, default_network_delegate_.before_send_headers_count()); |
| 7366 EXPECT_EQ(2, default_network_delegate_.headers_received_count()); |
| 7367 } |
| 7368 |
| 7369 |
6449 class HTTPSRequestTest : public testing::Test { | 7370 class HTTPSRequestTest : public testing::Test { |
6450 public: | 7371 public: |
6451 HTTPSRequestTest() : default_context_(true) { | 7372 HTTPSRequestTest() : default_context_(true) { |
6452 default_context_.set_network_delegate(&default_network_delegate_); | 7373 default_context_.set_network_delegate(&default_network_delegate_); |
6453 default_context_.Init(); | 7374 default_context_.Init(); |
6454 } | 7375 } |
6455 ~HTTPSRequestTest() override {} | 7376 ~HTTPSRequestTest() override {} |
6456 | 7377 |
6457 protected: | 7378 protected: |
6458 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. | 7379 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. |
(...skipping 1828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8287 | 9208 |
8288 EXPECT_FALSE(r->is_pending()); | 9209 EXPECT_FALSE(r->is_pending()); |
8289 EXPECT_EQ(1, d->response_started_count()); | 9210 EXPECT_EQ(1, d->response_started_count()); |
8290 EXPECT_FALSE(d->received_data_before_response()); | 9211 EXPECT_FALSE(d->received_data_before_response()); |
8291 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); | 9212 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); |
8292 } | 9213 } |
8293 } | 9214 } |
8294 #endif // !defined(DISABLE_FTP_SUPPORT) | 9215 #endif // !defined(DISABLE_FTP_SUPPORT) |
8295 | 9216 |
8296 } // namespace net | 9217 } // namespace net |
OLD | NEW |