| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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(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(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(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(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 |
| OLD | NEW |