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

Side by Side Diff: net/quic/quic_stream_factory_test.cc

Issue 1208933004: QUIC - disable QUIC under recent pathological connection errors. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Revised after fourth round of review feedback. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_stream_factory.cc ('k') | net/quic/quic_utils.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 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/quic/quic_stream_factory.h" 5 #include "net/quic/quic_stream_factory.h"
6 6
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "base/strings/string_util.h" 8 #include "base/strings/string_util.h"
9 #include "base/thread_task_runner_handle.h" 9 #include "base/thread_task_runner_handle.h"
10 #include "net/base/test_data_directory.h" 10 #include "net/base/test_data_directory.h"
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 } 145 }
146 146
147 static bool IsQuicDisabled(QuicStreamFactory* factory, uint16 port) { 147 static bool IsQuicDisabled(QuicStreamFactory* factory, uint16 port) {
148 return factory->IsQuicDisabled(port); 148 return factory->IsQuicDisabled(port);
149 } 149 }
150 150
151 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory, 151 static size_t GetNumberOfActiveJobs(QuicStreamFactory* factory,
152 const QuicServerId& server_id) { 152 const QuicServerId& server_id) {
153 return (factory->active_jobs_[server_id]).size(); 153 return (factory->active_jobs_[server_id]).size();
154 } 154 }
155
156 static void SetThresholdTimeoutsWithOpenStreams(
157 QuicStreamFactory* factory,
158 int threshold_timeouts_with_open_streams) {
159 factory->threshold_timeouts_with_open_streams_ =
160 threshold_timeouts_with_open_streams;
161 }
162
163 static int GetNumTimeoutsWithOpenStreams(QuicStreamFactory* factory) {
164 return factory->num_timeouts_with_open_streams_;
165 }
166
167 static void SetThresholdPublicResetsPostHandshake(
168 QuicStreamFactory* factory,
169 int threshold_public_resets_post_handshake) {
170 factory->threshold_public_resets_post_handshake_ =
171 threshold_public_resets_post_handshake;
172 }
173
174 static int GetNumPublicResetsPostHandshake(QuicStreamFactory* factory) {
175 return factory->num_public_resets_post_handshake_;
176 }
155 }; 177 };
156 178
157 class MockQuicServerInfo : public QuicServerInfo { 179 class MockQuicServerInfo : public QuicServerInfo {
158 public: 180 public:
159 MockQuicServerInfo(const QuicServerId& server_id) 181 MockQuicServerInfo(const QuicServerId& server_id)
160 : QuicServerInfo(server_id) {} 182 : QuicServerInfo(server_id) {}
161 ~MockQuicServerInfo() override {} 183 ~MockQuicServerInfo() override {}
162 184
163 void Start() override {} 185 void Start() override {}
164 186
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 /*enable_port_selection=*/true, 237 /*enable_port_selection=*/true,
216 /*always_require_handshake_confirmation=*/false, 238 /*always_require_handshake_confirmation=*/false,
217 /*disable_connection_pooling=*/false, 239 /*disable_connection_pooling=*/false,
218 /*load_server_info_timeout_srtt_multiplier=*/0.0f, 240 /*load_server_info_timeout_srtt_multiplier=*/0.0f,
219 /*enable_connection_racing=*/false, 241 /*enable_connection_racing=*/false,
220 /*enable_non_blocking_io=*/true, 242 /*enable_non_blocking_io=*/true,
221 /*disable_disk_cache=*/false, 243 /*disable_disk_cache=*/false,
222 /*prefer_aes=*/false, 244 /*prefer_aes=*/false,
223 /*max_number_of_lossy_connections=*/0, 245 /*max_number_of_lossy_connections=*/0,
224 /*packet_loss_threshold=*/1.0f, 246 /*packet_loss_threshold=*/1.0f,
247 /*max_disabled_reasons=*/3,
248 /*threshold_timeouts_with_open_streams=*/2,
249 /*threshold_pulic_resets_post_handshake=*/2,
225 /*receive_buffer_size=*/0, 250 /*receive_buffer_size=*/0,
226 QuicTagVector()), 251 QuicTagVector()),
227 host_port_pair_(kDefaultServerHostName, kDefaultServerPort), 252 host_port_pair_(kDefaultServerHostName, kDefaultServerPort),
228 is_https_(false), 253 is_https_(false),
229 privacy_mode_(PRIVACY_MODE_DISABLED) { 254 privacy_mode_(PRIVACY_MODE_DISABLED) {
230 factory_.set_require_confirmation(false); 255 factory_.set_require_confirmation(false);
231 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); 256 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
232 QuicStreamFactoryPeer::SetEnableConnectionRacing( 257 QuicStreamFactoryPeer::SetEnableConnectionRacing(
233 &factory_, GetParam().enable_connection_racing); 258 &factory_, GetParam().enable_connection_racing);
234 } 259 }
(...skipping 1497 matching lines...) Expand 10 before | Expand all | Expand 10 after
1732 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1757 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1733 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1758 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1734 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 1759 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1735 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 1760 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1736 EXPECT_TRUE(socket_data3.AllReadDataConsumed()); 1761 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
1737 EXPECT_TRUE(socket_data3.AllWriteDataConsumed()); 1762 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
1738 EXPECT_TRUE(socket_data4.AllReadDataConsumed()); 1763 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
1739 EXPECT_TRUE(socket_data4.AllWriteDataConsumed()); 1764 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
1740 } 1765 }
1741 1766
1767 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfTwo) {
1768 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1769 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1770 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1771 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_, 2);
1772 EXPECT_FALSE(
1773 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1774 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1775 &factory_, host_port_pair_.port()));
1776
1777 MockRead reads[] = {
1778 MockRead(ASYNC, OK, 0) // EOF
1779 };
1780 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1781 socket_factory_.AddSocketDataProvider(&socket_data);
1782 socket_data.StopAfter(1);
1783
1784 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1785 socket_factory_.AddSocketDataProvider(&socket_data2);
1786 socket_data2.StopAfter(1);
1787
1788 HostPortPair server2("mail.example.org", kDefaultServerPort);
1789
1790 crypto_client_stream_factory_.set_handshake_mode(
1791 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1792 host_resolver_.set_synchronous_mode(true);
1793 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1794 "192.168.0.1", "");
1795 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1796
1797 QuicStreamRequest request(&factory_);
1798 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1799 /*cert_verify_flags=*/0, host_port_pair_.host(),
1800 "GET", net_log_, callback_.callback()));
1801
1802 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1803 &factory_, host_port_pair_, is_https_);
1804
1805 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1806 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1807 // Need to spin the loop now to ensure that
1808 // QuicStreamFactory::OnSessionClosed() runs.
1809 base::RunLoop run_loop;
1810 run_loop.RunUntilIdle();
1811
1812 EXPECT_EQ(1,
1813 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
1814 EXPECT_FALSE(
1815 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1816
1817 // Test two-in-a-row public reset post handshakes..
1818 DVLOG(1) << "Create 2nd session and trigger public reset post handshake";
1819 TestCompletionCallback callback2;
1820 QuicStreamRequest request2(&factory_);
1821 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
1822 /*cert_verify_flags=*/0, server2.host(), "GET",
1823 net_log_, callback2.callback()));
1824 QuicClientSession* session2 =
1825 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
1826
1827 session2->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1828 // Need to spin the loop now to ensure that
1829 // QuicStreamFactory::OnSessionClosed() runs.
1830 base::RunLoop run_loop2;
1831 run_loop2.RunUntilIdle();
1832 EXPECT_EQ(2,
1833 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
1834 EXPECT_TRUE(
1835 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1836 EXPECT_EQ(QuicClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
1837 factory_.QuicDisabledReason(host_port_pair_.port()));
1838
1839 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1840 EXPECT_TRUE(stream.get());
1841 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1842 EXPECT_TRUE(stream2.get());
1843 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1844 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1845 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1846 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1847 }
1848
1849 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfTwo) {
1850 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1851 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1852 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1853 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_, 2);
1854 EXPECT_FALSE(
1855 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1856 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1857 &factory_, host_port_pair_.port()));
1858
1859 MockRead reads[] = {
1860 MockRead(ASYNC, OK, 0) // EOF
1861 };
1862 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1863 socket_factory_.AddSocketDataProvider(&socket_data);
1864 socket_data.StopAfter(1);
1865
1866 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1867 socket_factory_.AddSocketDataProvider(&socket_data2);
1868 socket_data2.StopAfter(1);
1869
1870 HostPortPair server2("mail.example.org", kDefaultServerPort);
1871
1872 crypto_client_stream_factory_.set_handshake_mode(
1873 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1874 host_resolver_.set_synchronous_mode(true);
1875 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1876 "192.168.0.1", "");
1877 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1878
1879 QuicStreamRequest request(&factory_);
1880 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1881 /*cert_verify_flags=*/0, host_port_pair_.host(),
1882 "GET", net_log_, callback_.callback()));
1883
1884 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1885 &factory_, host_port_pair_, is_https_);
1886
1887 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
1888 EXPECT_TRUE(stream.get());
1889 HttpRequestInfo request_info;
1890 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
1891 net_log_, CompletionCallback()));
1892
1893 DVLOG(1)
1894 << "Created 1st session and initialized a stream. Now trigger timeout";
1895 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
1896 // Need to spin the loop now to ensure that
1897 // QuicStreamFactory::OnSessionClosed() runs.
1898 base::RunLoop run_loop;
1899 run_loop.RunUntilIdle();
1900
1901 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
1902 EXPECT_FALSE(
1903 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1904
1905 // Test two-in-a-row timeouts with open streams.
1906 DVLOG(1) << "Create 2nd session and timeout with open stream";
1907 TestCompletionCallback callback2;
1908 QuicStreamRequest request2(&factory_);
1909 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
1910 /*cert_verify_flags=*/0, server2.host(), "GET",
1911 net_log_, callback2.callback()));
1912 QuicClientSession* session2 =
1913 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
1914
1915 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
1916 EXPECT_TRUE(stream2.get());
1917 EXPECT_EQ(OK, stream2->InitializeStream(&request_info, DEFAULT_PRIORITY,
1918 net_log_, CompletionCallback()));
1919
1920 session2->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
1921 // Need to spin the loop now to ensure that
1922 // QuicStreamFactory::OnSessionClosed() runs.
1923 base::RunLoop run_loop2;
1924 run_loop2.RunUntilIdle();
1925 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
1926 EXPECT_TRUE(
1927 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1928 EXPECT_EQ(QuicClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
1929 factory_.QuicDisabledReason(host_port_pair_.port()));
1930
1931 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1932 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1933 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1934 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1935 }
1936
1937 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfThree) {
1938 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
1939 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
1940 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
1941 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_, 2);
1942 EXPECT_FALSE(
1943 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1944 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
1945 &factory_, host_port_pair_.port()));
1946
1947 MockRead reads[] = {
1948 MockRead(ASYNC, OK, 0) // EOF
1949 };
1950 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
1951 socket_factory_.AddSocketDataProvider(&socket_data);
1952 socket_data.StopAfter(1);
1953
1954 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
1955 socket_factory_.AddSocketDataProvider(&socket_data2);
1956 socket_data2.StopAfter(1);
1957
1958 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
1959 socket_factory_.AddSocketDataProvider(&socket_data3);
1960 socket_data3.StopAfter(1);
1961
1962 HostPortPair server2("mail.example.org", kDefaultServerPort);
1963 HostPortPair server3("docs.example.org", kDefaultServerPort);
1964
1965 crypto_client_stream_factory_.set_handshake_mode(
1966 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1967 host_resolver_.set_synchronous_mode(true);
1968 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1969 "192.168.0.1", "");
1970 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
1971 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
1972
1973 // Test first and third out of three public reset post handshakes.
1974 QuicStreamRequest request(&factory_);
1975 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
1976 /*cert_verify_flags=*/0, host_port_pair_.host(),
1977 "GET", net_log_, callback_.callback()));
1978
1979 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
1980 &factory_, host_port_pair_, is_https_);
1981
1982 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
1983 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
1984 // Need to spin the loop now to ensure that
1985 // QuicStreamFactory::OnSessionClosed() runs.
1986 base::RunLoop run_loop;
1987 run_loop.RunUntilIdle();
1988
1989 EXPECT_EQ(1,
1990 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
1991 EXPECT_FALSE(
1992 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
1993
1994 DVLOG(1) << "Create 2nd session without disable trigger";
1995 TestCompletionCallback callback2;
1996 QuicStreamRequest request2(&factory_);
1997 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
1998 /*cert_verify_flags=*/0, server2.host(), "GET",
1999 net_log_, callback2.callback()));
2000 QuicClientSession* session2 =
2001 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
2002
2003 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2004 // Need to spin the loop now to ensure that
2005 // QuicStreamFactory::OnSessionClosed() runs.
2006 base::RunLoop run_loop2;
2007 run_loop2.RunUntilIdle();
2008 EXPECT_EQ(1,
2009 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2010 EXPECT_FALSE(
2011 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2012
2013 DVLOG(1) << "Create 3rd session with public reset post handshake,"
2014 << " will disable QUIC";
2015 TestCompletionCallback callback3;
2016 QuicStreamRequest request3(&factory_);
2017 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
2018 /*cert_verify_flags=*/0, server3.host(), "GET",
2019 net_log_, callback3.callback()));
2020 QuicClientSession* session3 =
2021 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
2022
2023 session3->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2024 // Need to spin the loop now to ensure that
2025 // QuicStreamFactory::OnSessionClosed() runs.
2026 base::RunLoop run_loop3;
2027 run_loop3.RunUntilIdle();
2028 EXPECT_EQ(2,
2029 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2030 EXPECT_TRUE(
2031 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2032 EXPECT_EQ(QuicClientSession::QUIC_DISABLED_PUBLIC_RESET_POST_HANDSHAKE,
2033 factory_.QuicDisabledReason(host_port_pair_.port()));
2034
2035 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2036 EXPECT_TRUE(stream.get());
2037 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2038 EXPECT_TRUE(stream2.get());
2039 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2040 EXPECT_TRUE(stream3.get());
2041
2042 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2043 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2044 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2045 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2046 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2047 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2048 }
2049
2050 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfThree) {
2051 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
2052 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
2053 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
2054 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_, 2);
2055 EXPECT_FALSE(
2056 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2057 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2058 &factory_, host_port_pair_.port()));
2059
2060 MockRead reads[] = {
2061 MockRead(ASYNC, OK, 0) // EOF
2062 };
2063 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2064 socket_factory_.AddSocketDataProvider(&socket_data);
2065 socket_data.StopAfter(1);
2066
2067 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2068 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2069 socket_factory_.AddSocketDataProvider(&socket_data2);
2070 socket_data2.StopAfter(1);
2071
2072 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2073 socket_factory_.AddSocketDataProvider(&socket_data3);
2074 socket_data3.StopAfter(1);
2075
2076 HostPortPair server2("mail.example.org", kDefaultServerPort);
2077 HostPortPair server3("docs.example.org", kDefaultServerPort);
2078
2079 crypto_client_stream_factory_.set_handshake_mode(
2080 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2081 host_resolver_.set_synchronous_mode(true);
2082 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2083 "192.168.0.1", "");
2084 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2085 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2086
2087 // Test first and third out of three timeouts with open streams.
2088 QuicStreamRequest request(&factory_);
2089 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
2090 /*cert_verify_flags=*/0, host_port_pair_.host(),
2091 "GET", net_log_, callback_.callback()));
2092
2093 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
2094 &factory_, host_port_pair_, is_https_);
2095
2096 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2097 EXPECT_TRUE(stream.get());
2098 HttpRequestInfo request_info;
2099 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2100 net_log_, CompletionCallback()));
2101
2102 DVLOG(1)
2103 << "Created 1st session and initialized a stream. Now trigger timeout";
2104 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2105 // Need to spin the loop now to ensure that
2106 // QuicStreamFactory::OnSessionClosed() runs.
2107 base::RunLoop run_loop;
2108 run_loop.RunUntilIdle();
2109
2110 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2111 EXPECT_FALSE(
2112 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2113
2114 // Test two-in-a-row timeouts with open streams.
2115 DVLOG(1) << "Create 2nd session without timeout";
2116 TestCompletionCallback callback2;
2117 QuicStreamRequest request2(&factory_);
2118 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
2119 /*cert_verify_flags=*/0, server2.host(), "GET",
2120 net_log_, callback2.callback()));
2121 QuicClientSession* session2 =
2122 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
2123
2124 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2125 // Need to spin the loop now to ensure that
2126 // QuicStreamFactory::OnSessionClosed() runs.
2127 base::RunLoop run_loop2;
2128 run_loop2.RunUntilIdle();
2129 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2130 EXPECT_FALSE(
2131 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2132
2133 DVLOG(1) << "Create 3rd session with timeout with open streams,"
2134 << " will disable QUIC";
2135
2136 TestCompletionCallback callback3;
2137 QuicStreamRequest request3(&factory_);
2138 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
2139 /*cert_verify_flags=*/0, server3.host(), "GET",
2140 net_log_, callback3.callback()));
2141 QuicClientSession* session3 =
2142 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
2143
2144 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2145 EXPECT_TRUE(stream3.get());
2146 EXPECT_EQ(OK, stream3->InitializeStream(&request_info, DEFAULT_PRIORITY,
2147 net_log_, CompletionCallback()));
2148 session3->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2149 // Need to spin the loop now to ensure that
2150 // QuicStreamFactory::OnSessionClosed() runs.
2151 base::RunLoop run_loop3;
2152 run_loop3.RunUntilIdle();
2153 EXPECT_EQ(2, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2154 EXPECT_TRUE(
2155 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2156 EXPECT_EQ(QuicClientSession::QUIC_DISABLED_TIMEOUT_WITH_OPEN_STREAMS,
2157 factory_.QuicDisabledReason(host_port_pair_.port()));
2158
2159 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2160 EXPECT_TRUE(stream2.get());
2161 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2162 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2163 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2164 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2165 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2166 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2167 }
2168
2169 TEST_P(QuicStreamFactoryTest, PublicResetPostHandshakeTwoOfFour) {
2170 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
2171 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
2172 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
2173 QuicStreamFactoryPeer::SetThresholdPublicResetsPostHandshake(&factory_, 2);
2174 EXPECT_FALSE(
2175 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2176 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2177 &factory_, host_port_pair_.port()));
2178
2179 MockRead reads[] = {
2180 MockRead(ASYNC, OK, 0) // EOF
2181 };
2182 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2183 socket_factory_.AddSocketDataProvider(&socket_data);
2184 socket_data.StopAfter(1);
2185
2186 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2187 socket_factory_.AddSocketDataProvider(&socket_data2);
2188 socket_data2.StopAfter(1);
2189
2190 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2191 socket_factory_.AddSocketDataProvider(&socket_data3);
2192 socket_data3.StopAfter(1);
2193
2194 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2195 socket_factory_.AddSocketDataProvider(&socket_data4);
2196 socket_data4.StopAfter(1);
2197
2198 HostPortPair server2("mail.example.org", kDefaultServerPort);
2199 HostPortPair server3("docs.example.org", kDefaultServerPort);
2200 HostPortPair server4("images.example.org", kDefaultServerPort);
2201
2202 crypto_client_stream_factory_.set_handshake_mode(
2203 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2204 host_resolver_.set_synchronous_mode(true);
2205 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2206 "192.168.0.1", "");
2207 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2208 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2209 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2210
2211 // Test first and fourth out of four public reset post handshakes.
2212 QuicStreamRequest request(&factory_);
2213 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
2214 /*cert_verify_flags=*/0, host_port_pair_.host(),
2215 "GET", net_log_, callback_.callback()));
2216
2217 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
2218 &factory_, host_port_pair_, is_https_);
2219
2220 DVLOG(1) << "Created 1st session. Now trigger public reset post handshake";
2221 session->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2222 // Need to spin the loop now to ensure that
2223 // QuicStreamFactory::OnSessionClosed() runs.
2224 base::RunLoop run_loop;
2225 run_loop.RunUntilIdle();
2226
2227 EXPECT_EQ(1,
2228 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2229 EXPECT_FALSE(
2230 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2231
2232 DVLOG(1) << "Create 2nd and 3rd sessions without disable trigger";
2233 TestCompletionCallback callback2;
2234 QuicStreamRequest request2(&factory_);
2235 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
2236 /*cert_verify_flags=*/0, server2.host(), "GET",
2237 net_log_, callback2.callback()));
2238 QuicClientSession* session2 =
2239 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
2240
2241 session2->connection()->CloseConnection(QUIC_NO_ERROR, false);
2242 // Need to spin the loop now to ensure that
2243 // QuicStreamFactory::OnSessionClosed() runs.
2244 base::RunLoop run_loop2;
2245 run_loop2.RunUntilIdle();
2246 EXPECT_EQ(1,
2247 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2248 EXPECT_FALSE(
2249 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2250
2251 TestCompletionCallback callback3;
2252 QuicStreamRequest request3(&factory_);
2253 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
2254 /*cert_verify_flags=*/0, server3.host(), "GET",
2255 net_log_, callback3.callback()));
2256 QuicClientSession* session3 =
2257 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
2258
2259 session3->connection()->CloseConnection(QUIC_NO_ERROR, false);
2260 // Need to spin the loop now to ensure that
2261 // QuicStreamFactory::OnSessionClosed() runs.
2262 base::RunLoop run_loop3;
2263 run_loop3.RunUntilIdle();
2264 EXPECT_EQ(1,
2265 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2266 EXPECT_FALSE(
2267 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2268
2269 DVLOG(1) << "Create 4rd session with public reset post handshake,"
2270 << " will not disable QUIC";
2271 TestCompletionCallback callback4;
2272 QuicStreamRequest request4(&factory_);
2273 EXPECT_EQ(OK, request4.Request(server4, is_https_, privacy_mode_,
2274 /*cert_verify_flags=*/0, server4.host(), "GET",
2275 net_log_, callback4.callback()));
2276 QuicClientSession* session4 =
2277 QuicStreamFactoryPeer::GetActiveSession(&factory_, server4, is_https_);
2278
2279 session4->connection()->CloseConnection(QUIC_PUBLIC_RESET, true);
2280 // Need to spin the loop now to ensure that
2281 // QuicStreamFactory::OnSessionClosed() runs.
2282 base::RunLoop run_loop4;
2283 run_loop4.RunUntilIdle();
2284 EXPECT_EQ(1,
2285 QuicStreamFactoryPeer::GetNumPublicResetsPostHandshake(&factory_));
2286 EXPECT_FALSE(
2287 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2288
2289 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2290 EXPECT_TRUE(stream.get());
2291 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2292 EXPECT_TRUE(stream2.get());
2293 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2294 EXPECT_TRUE(stream3.get());
2295 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2296 EXPECT_TRUE(stream4.get());
2297
2298 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2299 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2300 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2301 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2302 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2303 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2304 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2305 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2306 }
2307
2308 TEST_P(QuicStreamFactoryTest, TimeoutsWithOpenStreamsTwoOfFour) {
2309 factory_.set_quic_server_info_factory(&quic_server_info_factory_);
2310 QuicStreamFactoryPeer::SetTaskRunner(&factory_, runner_.get());
2311 QuicStreamFactoryPeer::SetDisableDiskCache(&factory_, true);
2312 QuicStreamFactoryPeer::SetThresholdTimeoutsWithOpenStreams(&factory_, 2);
2313 EXPECT_FALSE(
2314 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2315 EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumberOfLossyConnections(
2316 &factory_, host_port_pair_.port()));
2317
2318 MockRead reads[] = {
2319 MockRead(ASYNC, OK, 0) // EOF
2320 };
2321 DeterministicSocketData socket_data(reads, arraysize(reads), nullptr, 0);
2322 socket_factory_.AddSocketDataProvider(&socket_data);
2323 socket_data.StopAfter(1);
2324
2325 // DeterministicSocketData socket_data2(nullptr, 0, nullptr, 0);
2326 DeterministicSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
2327 socket_factory_.AddSocketDataProvider(&socket_data2);
2328 socket_data2.StopAfter(1);
2329
2330 DeterministicSocketData socket_data3(reads, arraysize(reads), nullptr, 0);
2331 socket_factory_.AddSocketDataProvider(&socket_data3);
2332 socket_data3.StopAfter(1);
2333
2334 DeterministicSocketData socket_data4(reads, arraysize(reads), nullptr, 0);
2335 socket_factory_.AddSocketDataProvider(&socket_data4);
2336 socket_data4.StopAfter(1);
2337
2338 HostPortPair server2("mail.example.org", kDefaultServerPort);
2339 HostPortPair server3("docs.example.org", kDefaultServerPort);
2340 HostPortPair server4("images.example.org", kDefaultServerPort);
2341
2342 crypto_client_stream_factory_.set_handshake_mode(
2343 MockCryptoClientStream::CONFIRM_HANDSHAKE);
2344 host_resolver_.set_synchronous_mode(true);
2345 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
2346 "192.168.0.1", "");
2347 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
2348 host_resolver_.rules()->AddIPLiteralRule(server3.host(), "192.168.0.1", "");
2349 host_resolver_.rules()->AddIPLiteralRule(server4.host(), "192.168.0.1", "");
2350
2351 // Test first and fourth out of three timeouts with open streams.
2352 QuicStreamRequest request(&factory_);
2353 EXPECT_EQ(OK, request.Request(host_port_pair_, is_https_, privacy_mode_,
2354 /*cert_verify_flags=*/0, host_port_pair_.host(),
2355 "GET", net_log_, callback_.callback()));
2356
2357 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession(
2358 &factory_, host_port_pair_, is_https_);
2359
2360 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream();
2361 EXPECT_TRUE(stream.get());
2362 HttpRequestInfo request_info;
2363 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
2364 net_log_, CompletionCallback()));
2365
2366 DVLOG(1)
2367 << "Created 1st session and initialized a stream. Now trigger timeout";
2368 session->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2369 // Need to spin the loop now to ensure that
2370 // QuicStreamFactory::OnSessionClosed() runs.
2371 base::RunLoop run_loop;
2372 run_loop.RunUntilIdle();
2373
2374 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2375 EXPECT_FALSE(
2376 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2377
2378 DVLOG(1) << "Create 2nd and 3rd sessions without timeout";
2379 TestCompletionCallback callback2;
2380 QuicStreamRequest request2(&factory_);
2381 EXPECT_EQ(OK, request2.Request(server2, is_https_, privacy_mode_,
2382 /*cert_verify_flags=*/0, server2.host(), "GET",
2383 net_log_, callback2.callback()));
2384 QuicClientSession* session2 =
2385 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_);
2386
2387 session2->connection()->CloseConnection(QUIC_NO_ERROR, true);
2388 // Need to spin the loop now to ensure that
2389 // QuicStreamFactory::OnSessionClosed() runs.
2390 base::RunLoop run_loop2;
2391 run_loop2.RunUntilIdle();
2392 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2393 EXPECT_FALSE(
2394 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2395
2396 TestCompletionCallback callback3;
2397 QuicStreamRequest request3(&factory_);
2398 EXPECT_EQ(OK, request3.Request(server3, is_https_, privacy_mode_,
2399 /*cert_verify_flags=*/0, server3.host(), "GET",
2400 net_log_, callback3.callback()));
2401 QuicClientSession* session3 =
2402 QuicStreamFactoryPeer::GetActiveSession(&factory_, server3, is_https_);
2403
2404 session3->connection()->CloseConnection(QUIC_NO_ERROR, true);
2405 // Need to spin the loop now to ensure that
2406 // QuicStreamFactory::OnSessionClosed() runs.
2407 base::RunLoop run_loop3;
2408 run_loop3.RunUntilIdle();
2409 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2410 EXPECT_FALSE(
2411 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2412
2413 DVLOG(1) << "Create 4th session with timeout with open streams,"
2414 << " will not disable QUIC";
2415
2416 TestCompletionCallback callback4;
2417 QuicStreamRequest request4(&factory_);
2418 EXPECT_EQ(OK, request4.Request(server4, is_https_, privacy_mode_,
2419 /*cert_verify_flags=*/0, server4.host(), "GET",
2420 net_log_, callback4.callback()));
2421 QuicClientSession* session4 =
2422 QuicStreamFactoryPeer::GetActiveSession(&factory_, server4, is_https_);
2423
2424 scoped_ptr<QuicHttpStream> stream4 = request4.ReleaseStream();
2425 EXPECT_TRUE(stream4.get());
2426 EXPECT_EQ(OK, stream4->InitializeStream(&request_info, DEFAULT_PRIORITY,
2427 net_log_, CompletionCallback()));
2428 session4->connection()->CloseConnection(QUIC_CONNECTION_TIMED_OUT, false);
2429 // Need to spin the loop now to ensure that
2430 // QuicStreamFactory::OnSessionClosed() runs.
2431 base::RunLoop run_loop4;
2432 run_loop4.RunUntilIdle();
2433 EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumTimeoutsWithOpenStreams(&factory_));
2434 EXPECT_FALSE(
2435 QuicStreamFactoryPeer::IsQuicDisabled(&factory_, host_port_pair_.port()));
2436
2437 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream();
2438 EXPECT_TRUE(stream2.get());
2439 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream();
2440 EXPECT_TRUE(stream3.get());
2441 EXPECT_TRUE(socket_data.AllReadDataConsumed());
2442 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
2443 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
2444 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
2445 EXPECT_TRUE(socket_data3.AllReadDataConsumed());
2446 EXPECT_TRUE(socket_data3.AllWriteDataConsumed());
2447 EXPECT_TRUE(socket_data4.AllReadDataConsumed());
2448 EXPECT_TRUE(socket_data4.AllWriteDataConsumed());
2449 }
2450
1742 } // namespace test 2451 } // namespace test
1743 } // namespace net 2452 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_stream_factory.cc ('k') | net/quic/quic_utils.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698