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

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

Issue 2766603004: QUIC: mark QUIC handshake failed if connection is closed after CryptoConnect (Closed)
Patch Set: Test retrying requests won't hang in QuicStreamFactoryTest Created 3 years, 9 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
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/chromium/quic_stream_factory.h" 5 #include "net/quic/chromium/quic_stream_factory.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <ostream> 8 #include <ostream>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 migrate_sessions_on_network_change_ = true; 309 migrate_sessions_on_network_change_ = true;
310 migrate_sessions_early_ = true; 310 migrate_sessions_early_ = true;
311 Initialize(); 311 Initialize();
312 } 312 }
313 313
314 bool HasActiveSession(const HostPortPair& host_port_pair) { 314 bool HasActiveSession(const HostPortPair& host_port_pair) {
315 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED); 315 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
316 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id); 316 return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id);
317 } 317 }
318 318
319 bool HasActiveJob(const HostPortPair& host_port_pair,
320 const PrivacyMode privacy_mode) {
321 QuicServerId server_id(host_port_pair, privacy_mode);
322 return QuicStreamFactoryPeer::HasActiveJob(factory_.get(), server_id);
323 }
324
319 bool HasActiveCertVerifierJob(const QuicServerId& server_id) { 325 bool HasActiveCertVerifierJob(const QuicServerId& server_id) {
320 return QuicStreamFactoryPeer::HasActiveCertVerifierJob(factory_.get(), 326 return QuicStreamFactoryPeer::HasActiveCertVerifierJob(factory_.get(),
321 server_id); 327 server_id);
322 } 328 }
323 329
324 QuicChromiumClientSession* GetActiveSession( 330 QuicChromiumClientSession* GetActiveSession(
325 const HostPortPair& host_port_pair) { 331 const HostPortPair& host_port_pair) {
326 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED); 332 QuicServerId server_id(host_port_pair, PRIVACY_MODE_DISABLED);
327 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id); 333 return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id);
328 } 334 }
(...skipping 1467 matching lines...) Expand 10 before | Expand all | Expand 10 after
1796 EXPECT_THAT(callback_.WaitForResult(), IsOk()); 1802 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1797 stream = request2.CreateStream(); 1803 stream = request2.CreateStream();
1798 stream.reset(); // Will reset stream 3. 1804 stream.reset(); // Will reset stream 3.
1799 1805
1800 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 1806 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1801 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 1807 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1802 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); 1808 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1803 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); 1809 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1804 } 1810 }
1805 1811
1812 // Regression test for crbug.com/700617. Test a write error during the
1813 // crypto handshake will not hang QuicStreamFactory::Job and should
1814 // report QUIC_HANDSHAKE_FAILED to upper layers. Subsequent
1815 // QuicStreamRequest should succeed without hanging.
1816 TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnect) {
1817 Initialize();
1818 // Use unmocked crypto stream to do crypto connect.
1819 crypto_client_stream_factory_.set_handshake_mode(
1820 MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM);
1821
1822 MockQuicData socket_data;
1823 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1824 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1825 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
1826 socket_data.AddSocketDataToFactory(&socket_factory_);
1827
1828 // Create request, should fail after synchronous host resolution completes.
Ryan Hamilton 2017/03/22 19:24:38 Host resolution is async in this test, right? Perh
Zhongyi Shi 2017/03/22 20:27:50 Good catch! I was copying the comment from the nex
1829 QuicStreamRequest request(factory_.get());
1830 EXPECT_EQ(ERR_IO_PENDING,
1831 request.Request(host_port_pair_, privacy_mode_,
1832 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1833 callback_.callback()));
1834 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
1835 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1836 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1837
1838 // Verify new requests can be sent normally without hanging.
1839 crypto_client_stream_factory_.set_handshake_mode(
1840 MockCryptoClientStream::COLD_START);
1841 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1842 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1843 MockQuicData socket_data2;
1844 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1845 socket_data2.AddWrite(
1846 ConstructSettingsPacket(1, SETTINGS_MAX_HEADER_LIST_SIZE,
1847 kDefaultMaxUncompressedHeaderSize, nullptr));
1848 socket_data2.AddSocketDataToFactory(&socket_factory_);
1849
1850 QuicStreamRequest request2(factory_.get());
1851 EXPECT_EQ(ERR_IO_PENDING,
1852 request2.Request(host_port_pair_, privacy_mode_,
1853 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1854 callback_.callback()));
1855 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1856 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1857 // Run the message loop to complete host resolution.
1858 base::RunLoop().RunUntilIdle();
1859
1860 // Complete handshake. QuicStreamFactory::Job should complete and succeed.
1861 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1862 QuicSession::HANDSHAKE_CONFIRMED);
1863 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1864 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1865 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1866
1867 // Create QuicHttpStream.
1868 std::unique_ptr<QuicHttpStream> stream = request2.CreateStream();
1869 EXPECT_TRUE(stream.get());
1870 stream.reset();
1871 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1872 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1873 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1874 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1875 }
1876
1877 TEST_P(QuicStreamFactoryTest, RetryAfterWriteErrorInCryptoConnect) {
Ryan Hamilton 2017/03/22 19:24:38 Is the only delta between this test and the previo
Zhongyi Shi 2017/03/22 20:27:51 Done. Yeah, the only difference is mode of DNS res
1878 Initialize();
1879 // Use unmocked crypto stream to do crypto connect.
1880 crypto_client_stream_factory_.set_handshake_mode(
1881 MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM);
1882 host_resolver_.set_synchronous_mode(true);
1883 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
1884 "192.168.0.1", "");
1885
1886 MockQuicData socket_data;
1887 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1888 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
1889 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
1890 socket_data.AddSocketDataToFactory(&socket_factory_);
1891
1892 // Create request, should fail immediately.
1893 QuicStreamRequest request(factory_.get());
1894 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
1895 request.Request(host_port_pair_, privacy_mode_,
1896 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1897 callback_.callback()));
1898 // Check no active session, or active jobs left for this server.
1899 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1900 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1901
1902 // Verify new requests can be sent normally without hanging.
1903 crypto_client_stream_factory_.set_handshake_mode(
1904 MockCryptoClientStream::COLD_START);
1905 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1906 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1907 MockQuicData socket_data2;
1908 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1909 socket_data2.AddWrite(
1910 ConstructSettingsPacket(1, SETTINGS_MAX_HEADER_LIST_SIZE,
1911 kDefaultMaxUncompressedHeaderSize, nullptr));
1912 socket_data2.AddSocketDataToFactory(&socket_factory_);
1913
1914 QuicStreamRequest request2(factory_.get());
1915 EXPECT_EQ(ERR_IO_PENDING,
1916 request2.Request(host_port_pair_, privacy_mode_,
1917 /*cert_verify_flags=*/0, url_, "GET", net_log_,
1918 callback_.callback()));
1919 EXPECT_FALSE(HasActiveSession(host_port_pair_));
1920 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
1921
1922 // Complete handshake.
1923 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
1924 QuicSession::HANDSHAKE_CONFIRMED);
1925 EXPECT_THAT(callback_.WaitForResult(), IsOk());
1926 EXPECT_TRUE(HasActiveSession(host_port_pair_));
1927 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_));
1928
1929 // Create QuicHttpStream.
1930 std::unique_ptr<QuicHttpStream> stream = request2.CreateStream();
1931 EXPECT_TRUE(stream.get());
1932 stream.reset();
1933 EXPECT_TRUE(socket_data.AllReadDataConsumed());
1934 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
1935 EXPECT_TRUE(socket_data2.AllReadDataConsumed());
1936 EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
1937 }
1938
1806 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { 1939 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) {
1807 close_sessions_on_ip_change_ = true; 1940 close_sessions_on_ip_change_ = true;
1808 Initialize(); 1941 Initialize();
1809 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 1942 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
1810 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1943 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1811 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1944 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1812 1945
1813 MockQuicData socket_data; 1946 MockQuicData socket_data;
1814 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1947 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1815 socket_data.AddWrite( 1948 socket_data.AddWrite(
(...skipping 3865 matching lines...) Expand 10 before | Expand all | Expand 10 after
5681 // Clear all cached states. 5814 // Clear all cached states.
5682 factory_->ClearCachedStatesInCryptoConfig( 5815 factory_->ClearCachedStatesInCryptoConfig(
5683 base::Callback<bool(const GURL&)>()); 5816 base::Callback<bool(const GURL&)>());
5684 EXPECT_TRUE(test_cases[0].state->certs().empty()); 5817 EXPECT_TRUE(test_cases[0].state->certs().empty());
5685 EXPECT_TRUE(test_cases[1].state->certs().empty()); 5818 EXPECT_TRUE(test_cases[1].state->certs().empty());
5686 EXPECT_TRUE(test_cases[2].state->certs().empty()); 5819 EXPECT_TRUE(test_cases[2].state->certs().empty());
5687 } 5820 }
5688 5821
5689 } // namespace test 5822 } // namespace test
5690 } // namespace net 5823 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_chromium_client_session.cc ('k') | net/quic/test_tools/mock_crypto_client_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698