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. 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 Loading... | |
| 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 |
| OLD | NEW |