Chromium Code Reviews| 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. | |
| 1815 TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnect) { | |
| 1816 Initialize(); | |
| 1817 crypto_client_stream_factory_.set_handshake_mode( | |
| 1818 MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM); | |
| 1819 | |
| 1820 MockQuicData socket_data; | |
| 1821 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
| 1822 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); | |
| 1823 socket_data.AddSocketDataToFactory(&socket_factory_); | |
| 1824 | |
| 1825 // Create request and QuicHttpStream. | |
| 1826 QuicStreamRequest request(factory_.get()); | |
| 1827 EXPECT_EQ(ERR_IO_PENDING, | |
| 1828 request.Request(host_port_pair_, privacy_mode_, | |
| 1829 /*cert_verify_flags=*/0, url_, "GET", net_log_, | |
| 1830 callback_.callback())); | |
| 1831 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult()); | |
| 1832 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
| 1833 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); | |
| 1834 } | |
| 1835 | |
| 1836 TEST_P(QuicStreamFactoryTest, RetryAfterWriteErrorInCryptoConnect) { | |
| 1837 Initialize(); | |
| 1838 // Use unmocked crypto stream to do crypto connect. | |
| 1839 crypto_client_stream_factory_.set_handshake_mode( | |
| 1840 MockCryptoClientStream::USE_DEFAULT_CRYPTO_STREAM); | |
| 1841 host_resolver_.set_synchronous_mode(true); | |
| 1842 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(), | |
| 1843 "192.168.0.1", ""); | |
| 1844 | |
| 1845 MockQuicData socket_data; | |
| 1846 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
| 1847 // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect. | |
| 1848 socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE); | |
| 1849 socket_data.AddSocketDataToFactory(&socket_factory_); | |
| 1850 | |
| 1851 // Create request, should fail immediately. | |
|
Ryan Hamilton
2017/03/22 14:13:01
It would be nice if the comments in this test and
Zhongyi Shi
2017/03/22 18:53:10
Done.
| |
| 1852 QuicStreamRequest request(factory_.get()); | |
| 1853 EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, | |
| 1854 request.Request(host_port_pair_, privacy_mode_, | |
| 1855 /*cert_verify_flags=*/0, url_, "GET", net_log_, | |
| 1856 callback_.callback())); | |
| 1857 // Check no active session, or active jobs left for this server. | |
| 1858 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
| 1859 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); | |
| 1860 | |
| 1861 // Verify new requests can be sent normally without hanging. | |
| 1862 crypto_client_stream_factory_.set_handshake_mode( | |
| 1863 MockCryptoClientStream::COLD_START); | |
| 1864 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | |
| 1865 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | |
| 1866 MockQuicData socket_data2; | |
| 1867 socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | |
| 1868 socket_data2.AddWrite( | |
| 1869 ConstructSettingsPacket(1, SETTINGS_MAX_HEADER_LIST_SIZE, | |
| 1870 kDefaultMaxUncompressedHeaderSize, nullptr)); | |
| 1871 socket_data2.AddSocketDataToFactory(&socket_factory_); | |
| 1872 | |
| 1873 QuicStreamRequest request2(factory_.get()); | |
| 1874 EXPECT_EQ(ERR_IO_PENDING, | |
| 1875 request2.Request(host_port_pair_, privacy_mode_, | |
| 1876 /*cert_verify_flags=*/0, url_, "GET", net_log_, | |
| 1877 callback_.callback())); | |
| 1878 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | |
| 1879 EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_)); | |
| 1880 // Complete handshake. | |
| 1881 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( | |
| 1882 QuicSession::HANDSHAKE_CONFIRMED); | |
| 1883 EXPECT_THAT(callback_.WaitForResult(), IsOk()); | |
| 1884 | |
| 1885 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | |
| 1886 EXPECT_FALSE(HasActiveJob(host_port_pair_, privacy_mode_)); | |
| 1887 | |
| 1888 // Create QuicHttpStream. | |
| 1889 std::unique_ptr<QuicHttpStream> stream = request2.CreateStream(); | |
| 1890 EXPECT_TRUE(stream.get()); | |
| 1891 stream.reset(); | |
| 1892 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | |
| 1893 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | |
| 1894 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | |
| 1895 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | |
| 1896 } | |
| 1897 | |
| 1806 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { | 1898 TEST_P(QuicStreamFactoryTest, OnIPAddressChanged) { |
| 1807 close_sessions_on_ip_change_ = true; | 1899 close_sessions_on_ip_change_ = true; |
| 1808 Initialize(); | 1900 Initialize(); |
| 1809 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1901 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 1810 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1902 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1811 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1903 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1812 | 1904 |
| 1813 MockQuicData socket_data; | 1905 MockQuicData socket_data; |
| 1814 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); | 1906 socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); |
| 1815 socket_data.AddWrite( | 1907 socket_data.AddWrite( |
| (...skipping 3865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5681 // Clear all cached states. | 5773 // Clear all cached states. |
| 5682 factory_->ClearCachedStatesInCryptoConfig( | 5774 factory_->ClearCachedStatesInCryptoConfig( |
| 5683 base::Callback<bool(const GURL&)>()); | 5775 base::Callback<bool(const GURL&)>()); |
| 5684 EXPECT_TRUE(test_cases[0].state->certs().empty()); | 5776 EXPECT_TRUE(test_cases[0].state->certs().empty()); |
| 5685 EXPECT_TRUE(test_cases[1].state->certs().empty()); | 5777 EXPECT_TRUE(test_cases[1].state->certs().empty()); |
| 5686 EXPECT_TRUE(test_cases[2].state->certs().empty()); | 5778 EXPECT_TRUE(test_cases[2].state->certs().empty()); |
| 5687 } | 5779 } |
| 5688 | 5780 |
| 5689 } // namespace test | 5781 } // namespace test |
| 5690 } // namespace net | 5782 } // namespace net |
| OLD | NEW |