| 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/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 Loading... |
| 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 Loading... |
| 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, |
| 1817 WriteErrorInCryptoConnectWithAsyncHostResolution) { |
| 1818 Initialize(); |
| 1819 // Use unmocked crypto stream to do crypto connect. |
| 1820 crypto_client_stream_factory_.set_handshake_mode( |
| 1821 MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM); |
| 1822 |
| 1823 MockQuicData socket_data; |
| 1824 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1825 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect. |
| 1826 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); |
| 1827 socket_data.AddSocketDataToFactory(&socket_factory_); |
| 1828 |
| 1829 // Create request, should fail after the write of the CHLO fails. |
| 1830 QuicStreamRequest request(factory_.get()); |
| 1831 EXPECT_EQ(ERR_IO_PENDING, |
| 1832 request.Request(host_port_pair_, privacy_mode_, |
| 1833 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 1834 callback_.callback())); |
| 1835 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult()); |
| 1836 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 1837 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); |
| 1838 |
| 1839 // Verify new requests can be sent normally without hanging. |
| 1840 crypto_client_stream_factory_.set_handshake_mode( |
| 1841 MockCryptoClientStream::COLD_START); |
| 1842 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 1843 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1844 MockQuicData socket_data2; |
| 1845 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1846 socket_data2.AddWrite( |
| 1847 ConstructSettingsPacket(1, SETTINGS_MAX_HEADER_LIST_SIZE, |
| 1848 kDefaultMaxUncompressedHeaderSize, nullptr)); |
| 1849 socket_data2.AddSocketDataToFactory(&socket_factory_); |
| 1850 |
| 1851 QuicStreamRequest request2(factory_.get()); |
| 1852 EXPECT_EQ(ERR_IO_PENDING, |
| 1853 request2.Request(host_port_pair_, privacy_mode_, |
| 1854 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 1855 callback_.callback())); |
| 1856 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 1857 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_)); |
| 1858 // Run the message loop to complete host resolution. |
| 1859 base::RunLoop().RunUntilIdle(); |
| 1860 |
| 1861 // Complete handshake. QuicStreamFactory::Job should complete and succeed. |
| 1862 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
| 1863 QuicSession::HANDSHAKE_CONFIRMED); |
| 1864 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 1865 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 1866 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); |
| 1867 |
| 1868 // Create QuicHttpStream. |
| 1869 std::unique_ptr<QuicHttpStream> stream = request2.CreateStream(); |
| 1870 EXPECT_TRUE(stream.get()); |
| 1871 stream.reset(); |
| 1872 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 1873 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 1874 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
| 1875 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
| 1876 } |
| 1877 |
| 1878 TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) { |
| 1879 Initialize(); |
| 1880 // Use unmocked crypto stream to do crypto connect. |
| 1881 crypto_client_stream_factory_.set_handshake_mode( |
| 1882 MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM); |
| 1883 host_resolver_.set_synchronous_mode(true); |
| 1884 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), |
| 1885 "192.168.0.1", ""); |
| 1886 |
| 1887 MockQuicData socket_data; |
| 1888 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1889 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect. |
| 1890 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); |
| 1891 socket_data.AddSocketDataToFactory(&socket_factory_); |
| 1892 |
| 1893 // Create request, should fail immediately. |
| 1894 QuicStreamRequest request(factory_.get()); |
| 1895 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, |
| 1896 request.Request(host_port_pair_, privacy_mode_, |
| 1897 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 1898 callback_.callback())); |
| 1899 // Check no active session, or active jobs left for this server. |
| 1900 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 1901 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); |
| 1902 |
| 1903 // Verify new requests can be sent normally without hanging. |
| 1904 crypto_client_stream_factory_.set_handshake_mode( |
| 1905 MockCryptoClientStream::COLD_START); |
| 1906 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 1907 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1908 MockQuicData socket_data2; |
| 1909 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1910 socket_data2.AddWrite( |
| 1911 ConstructSettingsPacket(1, SETTINGS_MAX_HEADER_LIST_SIZE, |
| 1912 kDefaultMaxUncompressedHeaderSize, nullptr)); |
| 1913 socket_data2.AddSocketDataToFactory(&socket_factory_); |
| 1914 |
| 1915 QuicStreamRequest request2(factory_.get()); |
| 1916 EXPECT_EQ(ERR_IO_PENDING, |
| 1917 request2.Request(host_port_pair_, privacy_mode_, |
| 1918 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 1919 callback_.callback())); |
| 1920 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 1921 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_)); |
| 1922 |
| 1923 // Complete handshake. |
| 1924 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
| 1925 QuicSession::HANDSHAKE_CONFIRMED); |
| 1926 EXPECT_THAT(callback_.WaitForResult(), IsOk()); |
| 1927 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 1928 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); |
| 1929 |
| 1930 // Create QuicHttpStream. |
| 1931 std::unique_ptr<QuicHttpStream> stream = request2.CreateStream(); |
| 1932 EXPECT_TRUE(stream.get()); |
| 1933 stream.reset(); |
| 1934 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 1935 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 1936 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
| 1937 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
| 1938 } |
| 1939 |
| 1806 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { | 1940 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { |
| 1807 close_sessions_on_ip_change_ = true; | 1941 close_sessions_on_ip_change_ = true; |
| 1808 Initialize(); | 1942 Initialize(); |
| 1809 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1943 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 1810 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1944 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1811 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1945 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1812 | 1946 |
| 1813 MockQuicData socket_data; | 1947 MockQuicData socket_data; |
| 1814 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 1948 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1815 socket_data.AddWrite( | 1949 socket_data.AddWrite( |
| (...skipping 3865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5681 // Clear all cached states. | 5815 // Clear all cached states. |
| 5682 factory_->ClearCachedStatesInCryptoConfig( | 5816 factory_->ClearCachedStatesInCryptoConfig( |
| 5683 base::Callback<bool(const GURL&)>()); | 5817 base::Callback<bool(const GURL&)>()); |
| 5684 EXPECT_TRUE(test_cases[0].state->certs().empty()); | 5818 EXPECT_TRUE(test_cases[0].state->certs().empty()); |
| 5685 EXPECT_TRUE(test_cases[1].state->certs().empty()); | 5819 EXPECT_TRUE(test_cases[1].state->certs().empty()); |
| 5686 EXPECT_TRUE(test_cases[2].state->certs().empty()); | 5820 EXPECT_TRUE(test_cases[2].state->certs().empty()); |
| 5687 } | 5821 } |
| 5688 | 5822 |
| 5689 } // namespace test | 5823 } // namespace test |
| 5690 } // namespace net | 5824 } // namespace net |
| OLD | NEW |