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

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

Issue 1833093002: Disable connection migration if disabled in config sent by server. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@home
Patch Set: Unnecessary error code removed. Created 4 years, 8 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
« no previous file with comments | « net/quic/quic_stream_factory.cc ('k') | net/quic/test_tools/quic_config_peer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_stream_factory.cc ('k') | net/quic/test_tools/quic_config_peer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698