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 12 matching lines...) Expand all Loading... |
23 #include "net/quic/crypto/quic_decrypter.h" | 23 #include "net/quic/crypto/quic_decrypter.h" |
24 #include "net/quic/crypto/quic_encrypter.h" | 24 #include "net/quic/crypto/quic_encrypter.h" |
25 #include "net/quic/crypto/quic_server_info.h" | 25 #include "net/quic/crypto/quic_server_info.h" |
26 #include "net/quic/quic_client_promised_info.h" | 26 #include "net/quic/quic_client_promised_info.h" |
27 #include "net/quic/quic_http_stream.h" | 27 #include "net/quic/quic_http_stream.h" |
28 #include "net/quic/quic_http_utils.h" | 28 #include "net/quic/quic_http_utils.h" |
29 #include "net/quic/quic_server_id.h" | 29 #include "net/quic/quic_server_id.h" |
30 #include "net/quic/test_tools/mock_clock.h" | 30 #include "net/quic/test_tools/mock_clock.h" |
31 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" | 31 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" |
32 #include "net/quic/test_tools/mock_random.h" | 32 #include "net/quic/test_tools/mock_random.h" |
| 33 #include "net/quic/test_tools/quic_config_peer.h" |
33 #include "net/quic/test_tools/quic_stream_factory_peer.h" | 34 #include "net/quic/test_tools/quic_stream_factory_peer.h" |
34 #include "net/quic/test_tools/quic_test_packet_maker.h" | 35 #include "net/quic/test_tools/quic_test_packet_maker.h" |
35 #include "net/quic/test_tools/quic_test_utils.h" | 36 #include "net/quic/test_tools/quic_test_utils.h" |
36 #include "net/quic/test_tools/test_task_runner.h" | 37 #include "net/quic/test_tools/test_task_runner.h" |
37 #include "net/socket/socket_test_util.h" | 38 #include "net/socket/socket_test_util.h" |
38 #include "net/spdy/spdy_session_test_util.h" | 39 #include "net/spdy/spdy_session_test_util.h" |
39 #include "net/spdy/spdy_test_utils.h" | 40 #include "net/spdy/spdy_test_utils.h" |
40 #include "net/ssl/channel_id_service.h" | 41 #include "net/ssl/channel_id_service.h" |
41 #include "net/ssl/default_channel_id_store.h" | 42 #include "net/ssl/default_channel_id_store.h" |
42 #include "net/test/cert_test_util.h" | 43 #include "net/test/cert_test_util.h" |
(...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1894 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 1895 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
1895 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 1896 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
1896 EXPECT_EQ(1u, session->GetNumActiveStreams()); | 1897 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
1897 | 1898 |
1898 stream.reset(); | 1899 stream.reset(); |
1899 | 1900 |
1900 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 1901 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
1901 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 1902 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
1902 } | 1903 } |
1903 | 1904 |
| 1905 TEST_P(QuicStreamFactoryTest, |
| 1906 OnNetworkChangeSoonToDisconnectConnectionMigrationDisabled) { |
| 1907 InitializeConnectionMigrationTest( |
| 1908 {kDefaultNetworkForTests, kNewNetworkForTests}); |
| 1909 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 1910 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 1911 |
| 1912 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 1913 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket( |
| 1914 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED)); |
| 1915 MockWrite writes[] = { |
| 1916 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1), |
| 1917 }; |
| 1918 SequencedSocketData socket_data(reads, arraysize(reads), writes, |
| 1919 arraysize(writes)); |
| 1920 socket_factory_.AddSocketDataProvider(&socket_data); |
| 1921 |
| 1922 // Create request and QuicHttpStream. |
| 1923 QuicStreamRequest request(factory_.get()); |
| 1924 EXPECT_EQ(ERR_IO_PENDING, |
| 1925 request.Request(host_port_pair_, privacy_mode_, |
| 1926 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 1927 callback_.callback())); |
| 1928 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 1929 scoped_ptr<QuicHttpStream> stream = request.CreateStream(); |
| 1930 EXPECT_TRUE(stream.get()); |
| 1931 |
| 1932 // Cause QUIC stream to be created. |
| 1933 HttpRequestInfo request_info; |
| 1934 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
| 1935 net_log_, CompletionCallback())); |
| 1936 |
| 1937 // Ensure that session is alive and active. |
| 1938 QuicChromiumClientSession* session = |
| 1939 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_); |
| 1940 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 1941 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 1942 |
| 1943 // Set session config to have connection migration disabled. |
| 1944 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config()); |
| 1945 EXPECT_TRUE(session->config()->DisableConnectionMigration()); |
| 1946 |
| 1947 // Trigger connection migration. Since there is a non-migratable stream, |
| 1948 // this should cause session to continue but be marked as going away. |
| 1949 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 1950 ->NotifyNetworkSoonToDisconnect(kDefaultNetworkForTests); |
| 1951 |
| 1952 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 1953 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 1954 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 1955 |
| 1956 stream.reset(); |
| 1957 |
| 1958 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 1959 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 1960 } |
| 1961 |
1904 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) { | 1962 TEST_P(QuicStreamFactoryTest, OnNetworkChangeDisconnectedNonMigratableStream) { |
1905 InitializeConnectionMigrationTest( | 1963 InitializeConnectionMigrationTest( |
1906 {kDefaultNetworkForTests, kNewNetworkForTests}); | 1964 {kDefaultNetworkForTests, kNewNetworkForTests}); |
1907 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 1965 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
1908 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 1966 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
1909 | 1967 |
1910 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 1968 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
1911 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket( | 1969 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket( |
1912 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); | 1970 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); |
1913 MockWrite writes[] = { | 1971 MockWrite writes[] = { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1945 scoped_mock_network_change_notifier_->mock_network_change_notifier() | 2003 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
1946 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); | 2004 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
1947 | 2005 |
1948 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2006 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
1949 EXPECT_FALSE(HasActiveSession(host_port_pair_)); | 2007 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
1950 | 2008 |
1951 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2009 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
1952 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2010 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
1953 } | 2011 } |
1954 | 2012 |
| 2013 TEST_P(QuicStreamFactoryTest, |
| 2014 OnNetworkChangeDisconnectedConnectionMigrationDisabled) { |
| 2015 InitializeConnectionMigrationTest( |
| 2016 {kDefaultNetworkForTests, kNewNetworkForTests}); |
| 2017 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 2018 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 2019 |
| 2020 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 2021 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket( |
| 2022 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT)); |
| 2023 MockWrite writes[] = { |
| 2024 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1), |
| 2025 }; |
| 2026 SequencedSocketData socket_data(reads, arraysize(reads), writes, |
| 2027 arraysize(writes)); |
| 2028 socket_factory_.AddSocketDataProvider(&socket_data); |
| 2029 |
| 2030 // Create request and QuicHttpStream. |
| 2031 QuicStreamRequest request(factory_.get()); |
| 2032 EXPECT_EQ(ERR_IO_PENDING, |
| 2033 request.Request(host_port_pair_, privacy_mode_, |
| 2034 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 2035 callback_.callback())); |
| 2036 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 2037 scoped_ptr<QuicHttpStream> stream = request.CreateStream(); |
| 2038 EXPECT_TRUE(stream.get()); |
| 2039 |
| 2040 // Cause QUIC stream to be created. |
| 2041 HttpRequestInfo request_info; |
| 2042 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
| 2043 net_log_, CompletionCallback())); |
| 2044 |
| 2045 // Ensure that session is alive and active. |
| 2046 QuicChromiumClientSession* session = |
| 2047 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_); |
| 2048 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2049 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 2050 |
| 2051 // Set session config to have connection migration disabled. |
| 2052 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config()); |
| 2053 EXPECT_TRUE(session->config()->DisableConnectionMigration()); |
| 2054 |
| 2055 // Trigger connection migration. Since there is a non-migratable stream, |
| 2056 // this should cause a RST_STREAM frame to be emitted with |
| 2057 // QUIC_RST_ACKNOWLEDGEMENT error code, and the session will be closed. |
| 2058 scoped_mock_network_change_notifier_->mock_network_change_notifier() |
| 2059 ->NotifyNetworkDisconnected(kDefaultNetworkForTests); |
| 2060 |
| 2061 EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2062 EXPECT_FALSE(HasActiveSession(host_port_pair_)); |
| 2063 |
| 2064 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 2065 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 2066 } |
| 2067 |
1955 TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) { | 2068 TEST_P(QuicStreamFactoryTest, OnNetworkChangeSoonToDisconnectNoOpenStreams) { |
1956 InitializeConnectionMigrationTest( | 2069 InitializeConnectionMigrationTest( |
1957 {kDefaultNetworkForTests, kNewNetworkForTests}); | 2070 {kDefaultNetworkForTests, kNewNetworkForTests}); |
1958 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 2071 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
1959 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2072 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
1960 | 2073 |
1961 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 2074 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
1962 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u); | 2075 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0u); |
1963 socket_factory_.AddSocketDataProvider(&socket_data); | 2076 socket_factory_.AddSocketDataProvider(&socket_data); |
1964 | 2077 |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2256 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); | 2369 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
2257 EXPECT_TRUE(HasActiveSession(host_port_pair_)); | 2370 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
2258 EXPECT_EQ(1u, session->GetNumActiveStreams()); | 2371 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
2259 | 2372 |
2260 stream.reset(); | 2373 stream.reset(); |
2261 | 2374 |
2262 EXPECT_TRUE(socket_data.AllReadDataConsumed()); | 2375 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
2263 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); | 2376 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
2264 } | 2377 } |
2265 | 2378 |
| 2379 TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) { |
| 2380 InitializeConnectionMigrationTest( |
| 2381 {kDefaultNetworkForTests, kNewNetworkForTests}); |
| 2382 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
| 2383 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
| 2384 |
| 2385 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 2386 scoped_ptr<QuicEncryptedPacket> client_rst(maker_.MakeRstPacket( |
| 2387 1, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED)); |
| 2388 MockWrite writes[] = { |
| 2389 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 1), |
| 2390 }; |
| 2391 SequencedSocketData socket_data(reads, arraysize(reads), writes, |
| 2392 arraysize(writes)); |
| 2393 socket_factory_.AddSocketDataProvider(&socket_data); |
| 2394 |
| 2395 // Create request and QuicHttpStream. |
| 2396 QuicStreamRequest request(factory_.get()); |
| 2397 EXPECT_EQ(ERR_IO_PENDING, |
| 2398 request.Request(host_port_pair_, privacy_mode_, |
| 2399 /*cert_verify_flags=*/0, url_, "GET", net_log_, |
| 2400 callback_.callback())); |
| 2401 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 2402 scoped_ptr<QuicHttpStream> stream = request.CreateStream(); |
| 2403 EXPECT_TRUE(stream.get()); |
| 2404 |
| 2405 // Cause QUIC stream to be created. |
| 2406 HttpRequestInfo request_info; |
| 2407 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, |
| 2408 net_log_, CompletionCallback())); |
| 2409 |
| 2410 // Ensure that session is alive and active. |
| 2411 QuicChromiumClientSession* session = |
| 2412 QuicStreamFactoryPeer::GetActiveSession(factory_.get(), host_port_pair_); |
| 2413 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2414 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 2415 |
| 2416 // Set session config to have connection migration disabled. |
| 2417 QuicConfigPeer::SetReceivedDisableConnectionMigration(session->config()); |
| 2418 EXPECT_TRUE(session->config()->DisableConnectionMigration()); |
| 2419 |
| 2420 // Trigger connection migration. Since there is a non-migratable stream, |
| 2421 // this should cause session to be continue without migrating. |
| 2422 session->OnPathDegrading(); |
| 2423 |
| 2424 // Run the message loop so that data queued in the new socket is read by the |
| 2425 // packet reader. |
| 2426 base::RunLoop().RunUntilIdle(); |
| 2427 |
| 2428 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); |
| 2429 EXPECT_TRUE(HasActiveSession(host_port_pair_)); |
| 2430 EXPECT_EQ(1u, session->GetNumActiveStreams()); |
| 2431 |
| 2432 stream.reset(); |
| 2433 |
| 2434 EXPECT_TRUE(socket_data.AllReadDataConsumed()); |
| 2435 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); |
| 2436 } |
| 2437 |
2266 TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) { | 2438 TEST_P(QuicStreamFactoryTest, OnSSLConfigChanged) { |
2267 Initialize(); | 2439 Initialize(); |
2268 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); | 2440 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); |
2269 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2441 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
2270 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); | 2442 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); |
2271 | 2443 |
2272 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 2444 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
2273 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); | 2445 scoped_ptr<QuicEncryptedPacket> rst(ConstructRstPacket()); |
2274 std::vector<MockWrite> writes; | 2446 std::vector<MockWrite> writes; |
2275 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); | 2447 writes.push_back(MockWrite(ASYNC, rst->data(), rst->length(), 1)); |
(...skipping 1632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3908 EXPECT_TRUE(stream2.get()); | 4080 EXPECT_TRUE(stream2.get()); |
3909 | 4081 |
3910 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); | 4082 EXPECT_TRUE(socket_data1.AllReadDataConsumed()); |
3911 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); | 4083 EXPECT_TRUE(socket_data1.AllWriteDataConsumed()); |
3912 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); | 4084 EXPECT_TRUE(socket_data2.AllReadDataConsumed()); |
3913 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); | 4085 EXPECT_TRUE(socket_data2.AllWriteDataConsumed()); |
3914 } | 4086 } |
3915 | 4087 |
3916 } // namespace test | 4088 } // namespace test |
3917 } // namespace net | 4089 } // namespace net |
OLD | NEW |