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 <stddef.h> | 5 #include <stddef.h> |
6 #include <string> | 6 #include <string> |
7 #include <sys/epoll.h> | 7 #include <sys/epoll.h> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "base/memory/singleton.h" | 12 #include "base/memory/singleton.h" |
13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
14 #include "base/synchronization/waitable_event.h" | 14 #include "base/synchronization/waitable_event.h" |
15 #include "base/time/time.h" | 15 #include "base/time/time.h" |
16 #include "net/base/ip_endpoint.h" | 16 #include "net/base/ip_endpoint.h" |
17 #include "net/quic/congestion_control/tcp_cubic_sender.h" | 17 #include "net/quic/congestion_control/tcp_cubic_sender.h" |
18 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" | 18 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" |
19 #include "net/quic/crypto/null_encrypter.h" | 19 #include "net/quic/crypto/null_encrypter.h" |
20 #include "net/quic/quic_flags.h" | 20 #include "net/quic/quic_flags.h" |
21 #include "net/quic/quic_framer.h" | 21 #include "net/quic/quic_framer.h" |
22 #include "net/quic/quic_packet_creator.h" | 22 #include "net/quic/quic_packet_creator.h" |
23 #include "net/quic/quic_protocol.h" | 23 #include "net/quic/quic_protocol.h" |
24 #include "net/quic/quic_sent_packet_manager.h" | 24 #include "net/quic/quic_sent_packet_manager.h" |
25 #include "net/quic/quic_server_id.h" | 25 #include "net/quic/quic_server_id.h" |
| 26 #include "net/quic/quic_utils.h" |
26 #include "net/quic/test_tools/quic_connection_peer.h" | 27 #include "net/quic/test_tools/quic_connection_peer.h" |
27 #include "net/quic/test_tools/quic_flow_controller_peer.h" | 28 #include "net/quic/test_tools/quic_flow_controller_peer.h" |
| 29 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
28 #include "net/quic/test_tools/quic_session_peer.h" | 30 #include "net/quic/test_tools/quic_session_peer.h" |
29 #include "net/quic/test_tools/quic_test_utils.h" | 31 #include "net/quic/test_tools/quic_test_utils.h" |
30 #include "net/quic/test_tools/reliable_quic_stream_peer.h" | 32 #include "net/quic/test_tools/reliable_quic_stream_peer.h" |
31 #include "net/test/gtest_util.h" | 33 #include "net/test/gtest_util.h" |
32 #include "net/tools/epoll_server/epoll_server.h" | 34 #include "net/tools/epoll_server/epoll_server.h" |
33 #include "net/tools/quic/quic_epoll_connection_helper.h" | 35 #include "net/tools/quic/quic_epoll_connection_helper.h" |
34 #include "net/tools/quic/quic_in_memory_cache.h" | 36 #include "net/tools/quic/quic_in_memory_cache.h" |
35 #include "net/tools/quic/quic_packet_writer_wrapper.h" | 37 #include "net/tools/quic/quic_packet_writer_wrapper.h" |
36 #include "net/tools/quic/quic_server.h" | 38 #include "net/tools/quic/quic_server.h" |
37 #include "net/tools/quic/quic_socket_utils.h" | 39 #include "net/tools/quic/quic_socket_utils.h" |
38 #include "net/tools/quic/quic_spdy_client_stream.h" | 40 #include "net/tools/quic/quic_spdy_client_stream.h" |
39 #include "net/tools/quic/test_tools/http_message.h" | 41 #include "net/tools/quic/test_tools/http_message.h" |
40 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" | 42 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" |
41 #include "net/tools/quic/test_tools/quic_client_peer.h" | 43 #include "net/tools/quic/test_tools/quic_client_peer.h" |
42 #include "net/tools/quic/test_tools/quic_dispatcher_peer.h" | 44 #include "net/tools/quic/test_tools/quic_dispatcher_peer.h" |
43 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" | 45 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" |
44 #include "net/tools/quic/test_tools/quic_server_peer.h" | 46 #include "net/tools/quic/test_tools/quic_server_peer.h" |
45 #include "net/tools/quic/test_tools/quic_test_client.h" | 47 #include "net/tools/quic/test_tools/quic_test_client.h" |
46 #include "net/tools/quic/test_tools/server_thread.h" | 48 #include "net/tools/quic/test_tools/server_thread.h" |
47 #include "testing/gtest/include/gtest/gtest.h" | 49 #include "testing/gtest/include/gtest/gtest.h" |
48 | 50 |
49 using base::StringPiece; | 51 using base::StringPiece; |
50 using base::WaitableEvent; | 52 using base::WaitableEvent; |
51 using net::EpollServer; | 53 using net::EpollServer; |
52 using net::test::GenerateBody; | 54 using net::test::GenerateBody; |
53 using net::test::QuicConnectionPeer; | 55 using net::test::QuicConnectionPeer; |
54 using net::test::QuicFlowControllerPeer; | 56 using net::test::QuicFlowControllerPeer; |
| 57 using net::test::QuicSentPacketManagerPeer; |
55 using net::test::QuicSessionPeer; | 58 using net::test::QuicSessionPeer; |
56 using net::test::ReliableQuicStreamPeer; | 59 using net::test::ReliableQuicStreamPeer; |
57 using net::test::ValueRestore; | 60 using net::test::ValueRestore; |
58 using net::test::kClientDataStreamId1; | 61 using net::test::kClientDataStreamId1; |
59 using net::tools::test::PacketDroppingTestWriter; | 62 using net::tools::test::PacketDroppingTestWriter; |
60 using net::tools::test::QuicDispatcherPeer; | 63 using net::tools::test::QuicDispatcherPeer; |
61 using net::tools::test::QuicServerPeer; | 64 using net::tools::test::QuicServerPeer; |
62 using std::ostream; | 65 using std::ostream; |
63 using std::string; | 66 using std::string; |
64 using std::vector; | 67 using std::vector; |
65 | 68 |
66 namespace net { | 69 namespace net { |
67 namespace tools { | 70 namespace tools { |
68 namespace test { | 71 namespace test { |
69 namespace { | 72 namespace { |
70 | 73 |
71 const char* kFooResponseBody = "Artichoke hearts make me happy."; | 74 const char* kFooResponseBody = "Artichoke hearts make me happy."; |
72 const char* kBarResponseBody = "Palm hearts are pretty delicious, also."; | 75 const char* kBarResponseBody = "Palm hearts are pretty delicious, also."; |
73 | 76 |
74 // Run all tests with the cross products of all versions. | 77 // Run all tests with the cross products of all versions. |
75 struct TestParams { | 78 struct TestParams { |
76 TestParams(const QuicVersionVector& client_supported_versions, | 79 TestParams(const QuicVersionVector& client_supported_versions, |
77 const QuicVersionVector& server_supported_versions, | 80 const QuicVersionVector& server_supported_versions, |
78 QuicVersion negotiated_version, | 81 QuicVersion negotiated_version, |
79 bool use_pacing) | 82 bool use_pacing, |
| 83 bool use_fec, |
| 84 QuicTag congestion_control_tag) |
80 : client_supported_versions(client_supported_versions), | 85 : client_supported_versions(client_supported_versions), |
81 server_supported_versions(server_supported_versions), | 86 server_supported_versions(server_supported_versions), |
82 negotiated_version(negotiated_version), | 87 negotiated_version(negotiated_version), |
83 use_pacing(use_pacing) { | 88 use_pacing(use_pacing), |
| 89 use_fec(use_fec), |
| 90 congestion_control_tag(congestion_control_tag) { |
84 } | 91 } |
85 | 92 |
86 friend ostream& operator<<(ostream& os, const TestParams& p) { | 93 friend ostream& operator<<(ostream& os, const TestParams& p) { |
87 os << "{ server_supported_versions: " | 94 os << "{ server_supported_versions: " |
88 << QuicVersionVectorToString(p.server_supported_versions); | 95 << QuicVersionVectorToString(p.server_supported_versions); |
89 os << " client_supported_versions: " | 96 os << " client_supported_versions: " |
90 << QuicVersionVectorToString(p.client_supported_versions); | 97 << QuicVersionVectorToString(p.client_supported_versions); |
91 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version); | 98 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version); |
92 os << " use_pacing: " << p.use_pacing << " }"; | 99 os << " use_pacing: " << p.use_pacing; |
| 100 os << " use_fec: " << p.use_fec; |
| 101 os << " congestion_control_tag: " |
| 102 << QuicUtils::TagToString(p.congestion_control_tag) << " }"; |
93 return os; | 103 return os; |
94 } | 104 } |
95 | 105 |
96 QuicVersionVector client_supported_versions; | 106 QuicVersionVector client_supported_versions; |
97 QuicVersionVector server_supported_versions; | 107 QuicVersionVector server_supported_versions; |
98 QuicVersion negotiated_version; | 108 QuicVersion negotiated_version; |
99 bool use_pacing; | 109 bool use_pacing; |
| 110 bool use_fec; |
| 111 QuicTag congestion_control_tag; |
100 }; | 112 }; |
101 | 113 |
102 // Constructs various test permutations. | 114 // Constructs various test permutations. |
103 vector<TestParams> GetTestParams() { | 115 vector<TestParams> GetTestParams() { |
104 vector<TestParams> params; | 116 vector<TestParams> params; |
105 QuicVersionVector all_supported_versions = QuicSupportedVersions(); | 117 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
106 for (int use_pacing = 0; use_pacing < 2; ++use_pacing) { | 118 // TODO(rtenneti): Add kTBBR after BBR code is checked in. |
107 // Add an entry for server and client supporting all versions. | 119 // QuicTag congestion_control_tags[] = {kRENO, kTBBR, kQBIC}; |
108 params.push_back(TestParams(all_supported_versions, | 120 QuicTag congestion_control_tags[] = {kRENO, kQBIC}; |
109 all_supported_versions, | 121 for (size_t congestion_control_index = 0; |
110 all_supported_versions[0], | 122 congestion_control_index < arraysize(congestion_control_tags); |
111 use_pacing != 0)); | 123 congestion_control_index++) { |
| 124 QuicTag congestion_control_tag = |
| 125 congestion_control_tags[congestion_control_index]; |
| 126 for (int use_fec = 0; use_fec < 2; ++use_fec) { |
| 127 for (int use_pacing = 0; use_pacing < 2; ++use_pacing) { |
| 128 // Add an entry for server and client supporting all versions. |
| 129 params.push_back(TestParams(all_supported_versions, |
| 130 all_supported_versions, |
| 131 all_supported_versions[0], |
| 132 use_pacing != 0, |
| 133 use_fec != 0, |
| 134 congestion_control_tag)); |
112 | 135 |
113 // Test client supporting all versions and server supporting 1 version. | 136 // Test client supporting all versions and server supporting 1 version. |
114 // Simulate an old server and exercise version downgrade in the client. | 137 // Simulate an old server and exercise version downgrade in the client. |
115 // Protocol negotiation should occur. Skip the i = 0 case because it is | 138 // Protocol negotiation should occur. Skip the i = 0 case because it is |
116 // essentially the same as the default case. | 139 // essentially the same as the default case. |
117 for (size_t i = 1; i < all_supported_versions.size(); ++i) { | 140 for (size_t i = 1; i < all_supported_versions.size(); ++i) { |
118 QuicVersionVector server_supported_versions; | 141 QuicVersionVector server_supported_versions; |
119 server_supported_versions.push_back(all_supported_versions[i]); | 142 server_supported_versions.push_back(all_supported_versions[i]); |
120 if (all_supported_versions[i] >= QUIC_VERSION_18) { | 143 if (all_supported_versions[i] >= QUIC_VERSION_18) { |
121 // Until flow control is globally rolled out and we remove | 144 // Until flow control is globally rolled out and we remove |
122 // QUIC_VERSION_16, the server MUST support at least one QUIC version | 145 // QUIC_VERSION_16, the server MUST support at least one QUIC |
123 // that does not use flow control. | 146 // version that does not use flow control. |
124 server_supported_versions.push_back(QUIC_VERSION_16); | 147 server_supported_versions.push_back(QUIC_VERSION_16); |
| 148 } |
| 149 params.push_back(TestParams(all_supported_versions, |
| 150 server_supported_versions, |
| 151 server_supported_versions[0], |
| 152 use_pacing != 0, |
| 153 use_fec != 0, |
| 154 congestion_control_tag)); |
| 155 } |
125 } | 156 } |
126 params.push_back(TestParams(all_supported_versions, | |
127 server_supported_versions, | |
128 server_supported_versions[0], | |
129 use_pacing != 0)); | |
130 } | 157 } |
131 } | 158 } |
132 return params; | 159 return params; |
133 } | 160 } |
134 | 161 |
135 class ServerDelegate : public PacketDroppingTestWriter::Delegate { | 162 class ServerDelegate : public PacketDroppingTestWriter::Delegate { |
136 public: | 163 public: |
137 explicit ServerDelegate(QuicDispatcher* dispatcher) | 164 explicit ServerDelegate(QuicDispatcher* dispatcher) |
138 : dispatcher_(dispatcher) {} | 165 : dispatcher_(dispatcher) {} |
139 virtual ~ServerDelegate() {} | 166 virtual ~ServerDelegate() {} |
(...skipping 21 matching lines...) Expand all Loading... |
161 server_started_(false), | 188 server_started_(false), |
162 strike_register_no_startup_period_(false) { | 189 strike_register_no_startup_period_(false) { |
163 net::IPAddressNumber ip; | 190 net::IPAddressNumber ip; |
164 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); | 191 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); |
165 server_address_ = IPEndPoint(ip, 0); | 192 server_address_ = IPEndPoint(ip, 0); |
166 | 193 |
167 client_supported_versions_ = GetParam().client_supported_versions; | 194 client_supported_versions_ = GetParam().client_supported_versions; |
168 server_supported_versions_ = GetParam().server_supported_versions; | 195 server_supported_versions_ = GetParam().server_supported_versions; |
169 negotiated_version_ = GetParam().negotiated_version; | 196 negotiated_version_ = GetParam().negotiated_version; |
170 FLAGS_enable_quic_pacing = GetParam().use_pacing; | 197 FLAGS_enable_quic_pacing = GetParam().use_pacing; |
| 198 FLAGS_enable_quic_fec = GetParam().use_fec; |
171 | 199 |
172 if (negotiated_version_ >= QUIC_VERSION_19) { | 200 if (negotiated_version_ >= QUIC_VERSION_19) { |
173 FLAGS_enable_quic_connection_flow_control_2 = true; | 201 FLAGS_enable_quic_connection_flow_control_2 = true; |
174 } | 202 } |
175 VLOG(1) << "Using Configuration: " << GetParam(); | 203 VLOG(1) << "Using Configuration: " << GetParam(); |
176 | 204 |
177 client_config_.SetDefaults(); | 205 client_config_.SetDefaults(); |
178 server_config_.SetDefaults(); | 206 server_config_.SetDefaults(); |
179 | 207 |
180 // Use different flow control windows for client/server. | 208 // Use different flow control windows for client/server. |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 server_config_.SetInitialStreamFlowControlWindowToSend(window); | 277 server_config_.SetInitialStreamFlowControlWindowToSend(window); |
250 } | 278 } |
251 | 279 |
252 void set_server_initial_session_flow_control_receive_window(uint32 window) { | 280 void set_server_initial_session_flow_control_receive_window(uint32 window) { |
253 CHECK(server_thread_.get() == NULL); | 281 CHECK(server_thread_.get() == NULL); |
254 DLOG(INFO) << "Setting server initial session flow control window: " | 282 DLOG(INFO) << "Setting server initial session flow control window: " |
255 << window; | 283 << window; |
256 server_config_.SetInitialSessionFlowControlWindowToSend(window); | 284 server_config_.SetInitialSessionFlowControlWindowToSend(window); |
257 } | 285 } |
258 | 286 |
| 287 const QuicSentPacketManager * |
| 288 GetSentPacketManagerFromFirstServerSession() const { |
| 289 QuicDispatcher* dispatcher = |
| 290 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 291 QuicSession* session = dispatcher->session_map().begin()->second; |
| 292 return &session->connection()->sent_packet_manager(); |
| 293 } |
| 294 |
259 bool Initialize() { | 295 bool Initialize() { |
| 296 QuicTagVector copt; |
| 297 |
| 298 // TODO(nimia): Consider setting the congestion control algorithm for the |
| 299 // client as well according to the test parameter. |
| 300 copt.push_back(GetParam().congestion_control_tag); |
| 301 |
| 302 if (GetParam().use_fec) { |
| 303 // Set FEC config in client's connection options and in client session. |
| 304 copt.push_back(kFHDR); |
| 305 } |
| 306 |
| 307 client_config_.SetConnectionOptionsToSend(copt); |
| 308 |
260 // Start the server first, because CreateQuicClient() attempts | 309 // Start the server first, because CreateQuicClient() attempts |
261 // to connect to the server. | 310 // to connect to the server. |
262 StartServer(); | 311 StartServer(); |
263 client_.reset(CreateQuicClient(client_writer_)); | 312 client_.reset(CreateQuicClient(client_writer_)); |
| 313 if (GetParam().use_fec) { |
| 314 // Set FecPolicy to always protect data on all streams. |
| 315 client_->SetFecPolicy(FEC_PROTECT_ALWAYS); |
| 316 } |
264 static EpollEvent event(EPOLLOUT, false); | 317 static EpollEvent event(EPOLLOUT, false); |
265 client_writer_->Initialize( | 318 client_writer_->Initialize( |
266 reinterpret_cast<QuicEpollConnectionHelper*>( | 319 reinterpret_cast<QuicEpollConnectionHelper*>( |
267 QuicConnectionPeer::GetHelper( | 320 QuicConnectionPeer::GetHelper( |
268 client_->client()->session()->connection())), | 321 client_->client()->session()->connection())), |
269 new ClientDelegate(client_->client())); | 322 new ClientDelegate(client_->client())); |
270 return client_->client()->connected(); | 323 return client_->client()->connected(); |
271 } | 324 } |
272 | 325 |
273 virtual void SetUp() OVERRIDE { | 326 virtual void SetUp() OVERRIDE { |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 // Otherwise it may have queued frames which will trigger a | 714 // Otherwise it may have queued frames which will trigger a |
662 // DFATAL when they are serialized after the downgrade. | 715 // DFATAL when they are serialized after the downgrade. |
663 client_->client()->WaitForCryptoHandshakeConfirmed(); | 716 client_->client()->WaitForCryptoHandshakeConfirmed(); |
664 } | 717 } |
665 ASSERT_TRUE(client_->client()->connected()); | 718 ASSERT_TRUE(client_->client()->connected()); |
666 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); | 719 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); |
667 EXPECT_EQ(2, client_->client()->session()->GetNumSentClientHellos()); | 720 EXPECT_EQ(2, client_->client()->session()->GetNumSentClientHellos()); |
668 VerifyCleanConnection(false); | 721 VerifyCleanConnection(false); |
669 } | 722 } |
670 | 723 |
671 TEST_P(EndToEndTest, LargePostFec) { | 724 TEST_P(EndToEndTest, CorrectlyConfiguredFec) { |
672 ValueRestore<bool> old_flag(&FLAGS_enable_quic_fec, true); | |
673 | |
674 // Connect without packet loss to avoid issues with losing handshake packets, | |
675 // and then up the packet loss rate (b/10126687). | |
676 ASSERT_TRUE(Initialize()); | |
677 | |
678 // Wait for the server SHLO before upping the packet loss. | |
679 client_->client()->WaitForCryptoHandshakeConfirmed(); | |
680 SetPacketLossPercentage(30); | |
681 | |
682 // Verify that FEC is enabled. | |
683 QuicPacketCreator* creator = QuicConnectionPeer::GetPacketCreator( | |
684 client_->client()->session()->connection()); | |
685 EXPECT_TRUE(creator->IsFecEnabled()); | |
686 | |
687 // Set FecPolicy to always protect data on all streams. | |
688 client_->SetFecPolicy(FEC_PROTECT_ALWAYS); | |
689 | |
690 string body; | |
691 GenerateBody(&body, 10240); | |
692 | |
693 HTTPMessage request(HttpConstants::HTTP_1_1, | |
694 HttpConstants::POST, "/foo"); | |
695 request.AddBody(body, true); | |
696 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); | |
697 VerifyCleanConnection(true); | |
698 } | |
699 | |
700 TEST_P(EndToEndTest, ClientSpecifiedFecProtectionForHeaders) { | |
701 ValueRestore<bool> old_flag(&FLAGS_enable_quic_fec, true); | |
702 | |
703 // Set FEC config in client's connection options and in client session. | |
704 QuicTagVector copt; | |
705 copt.push_back(kFHDR); | |
706 client_config_.SetConnectionOptionsToSend(copt); | |
707 | |
708 // Connect without packet loss to avoid issues with losing handshake packets, | |
709 // and then up the packet loss rate (b/10126687). | |
710 ASSERT_TRUE(Initialize()); | 725 ASSERT_TRUE(Initialize()); |
711 client_->client()->WaitForCryptoHandshakeConfirmed(); | 726 client_->client()->WaitForCryptoHandshakeConfirmed(); |
712 server_thread_->WaitForCryptoHandshakeConfirmed(); | 727 server_thread_->WaitForCryptoHandshakeConfirmed(); |
713 | 728 |
714 // Verify that FEC is enabled. | 729 FecPolicy expected_policy = |
715 QuicPacketCreator* creator = QuicConnectionPeer::GetPacketCreator( | 730 GetParam().use_fec ? FEC_PROTECT_ALWAYS : FEC_PROTECT_OPTIONAL; |
716 client_->client()->session()->connection()); | |
717 EXPECT_TRUE(creator->IsFecEnabled()); | |
718 | 731 |
719 // Verify that server headers stream is FEC protected. | 732 // Verify that server's FEC configuration is correct. |
720 server_thread_->Pause(); | 733 server_thread_->Pause(); |
721 QuicDispatcher* dispatcher = | 734 QuicDispatcher* dispatcher = |
722 QuicServerPeer::GetDispatcher(server_thread_->server()); | 735 QuicServerPeer::GetDispatcher(server_thread_->server()); |
723 ASSERT_EQ(1u, dispatcher->session_map().size()); | 736 ASSERT_EQ(1u, dispatcher->session_map().size()); |
724 QuicSession* session = dispatcher->session_map().begin()->second; | 737 QuicSession* session = dispatcher->session_map().begin()->second; |
725 EXPECT_EQ(FEC_PROTECT_ALWAYS, | 738 EXPECT_EQ(expected_policy, |
726 QuicSessionPeer::GetHeadersStream(session)->fec_policy()); | 739 QuicSessionPeer::GetHeadersStream(session)->fec_policy()); |
727 server_thread_->Resume(); | 740 server_thread_->Resume(); |
728 | 741 |
729 // Verify that at the client, headers stream is protected and other data | 742 // Verify that client's FEC configuration is correct. |
730 // streams are optionally protected. | 743 EXPECT_EQ(expected_policy, |
731 EXPECT_EQ(FEC_PROTECT_ALWAYS, QuicSessionPeer::GetHeadersStream( | 744 QuicSessionPeer::GetHeadersStream( |
732 client_->client()->session())->fec_policy()); | 745 client_->client()->session())->fec_policy()); |
733 EXPECT_EQ(FEC_PROTECT_OPTIONAL, client_->GetOrCreateStream()->fec_policy()); | 746 EXPECT_EQ(expected_policy, |
| 747 client_->GetOrCreateStream()->fec_policy()); |
734 } | 748 } |
735 | 749 |
736 // TODO(shess): This is flaky on ChromiumOS bots. | 750 // TODO(shess): This is flaky on ChromiumOS bots. |
737 // http://crbug.com/374871 | 751 // http://crbug.com/374871 |
738 TEST_P(EndToEndTest, DISABLED_LargePostSmallBandwidthLargeBuffer) { | 752 TEST_P(EndToEndTest, DISABLED_LargePostSmallBandwidthLargeBuffer) { |
739 ASSERT_TRUE(Initialize()); | 753 ASSERT_TRUE(Initialize()); |
740 SetPacketSendDelay(QuicTime::Delta::FromMicroseconds(1)); | 754 SetPacketSendDelay(QuicTime::Delta::FromMicroseconds(1)); |
741 // 256KB per second with a 256KB buffer from server to client. Wireless | 755 // 256KB per second with a 256KB buffer from server to client. Wireless |
742 // clients commonly have larger buffers, but our max CWND is 200. | 756 // clients commonly have larger buffers, but our max CWND is 200. |
743 server_writer_->set_max_bandwidth_and_buffer_size( | 757 server_writer_->set_max_bandwidth_and_buffer_size( |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
877 // Open two simultaneous streams. | 891 // Open two simultaneous streams. |
878 client_->SendMessage(request); | 892 client_->SendMessage(request); |
879 client_->SendMessage(request); | 893 client_->SendMessage(request); |
880 client_->WaitForResponse(); | 894 client_->WaitForResponse(); |
881 | 895 |
882 EXPECT_FALSE(client_->connected()); | 896 EXPECT_FALSE(client_->connected()); |
883 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); | 897 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); |
884 EXPECT_EQ(QUIC_TOO_MANY_OPEN_STREAMS, client_->connection_error()); | 898 EXPECT_EQ(QUIC_TOO_MANY_OPEN_STREAMS, client_->connection_error()); |
885 } | 899 } |
886 | 900 |
| 901 TEST_P(EndToEndTest, NegotiateCongestionControl) { |
| 902 ASSERT_TRUE(Initialize()); |
| 903 client_->client()->WaitForCryptoHandshakeConfirmed(); |
| 904 |
| 905 CongestionControlType expected_congestion_control_type; |
| 906 switch (GetParam().congestion_control_tag) { |
| 907 case kRENO: |
| 908 expected_congestion_control_type = kReno; |
| 909 break; |
| 910 case kTBBR: |
| 911 expected_congestion_control_type = kBBR; |
| 912 break; |
| 913 case kQBIC: |
| 914 expected_congestion_control_type = kCubic; |
| 915 break; |
| 916 default: |
| 917 DLOG(FATAL) << "Unexpected congestion control tag"; |
| 918 } |
| 919 |
| 920 EXPECT_EQ(expected_congestion_control_type, |
| 921 QuicSentPacketManagerPeer::GetCongestionControlAlgorithm( |
| 922 *GetSentPacketManagerFromFirstServerSession()) |
| 923 ->GetCongestionControlType()); |
| 924 } |
| 925 |
887 TEST_P(EndToEndTest, LimitMaxOpenStreams) { | 926 TEST_P(EndToEndTest, LimitMaxOpenStreams) { |
888 // Server limits the number of max streams to 2. | 927 // Server limits the number of max streams to 2. |
889 server_config_.set_max_streams_per_connection(2, 2); | 928 server_config_.set_max_streams_per_connection(2, 2); |
890 // Client tries to negotiate for 10. | 929 // Client tries to negotiate for 10. |
891 client_config_.set_max_streams_per_connection(10, 5); | 930 client_config_.set_max_streams_per_connection(10, 5); |
892 | 931 |
893 ASSERT_TRUE(Initialize()); | 932 ASSERT_TRUE(Initialize()); |
894 client_->client()->WaitForCryptoHandshakeConfirmed(); | 933 client_->client()->WaitForCryptoHandshakeConfirmed(); |
895 QuicConfig* client_negotiated_config = client_->client()->session()->config(); | 934 QuicConfig* client_negotiated_config = client_->client()->session()->config(); |
896 EXPECT_EQ(2u, client_negotiated_config->max_streams_per_connection()); | 935 EXPECT_EQ(2u, client_negotiated_config->max_streams_per_connection()); |
897 } | 936 } |
898 | 937 |
899 // TODO(rtenneti): DISABLED_LimitCongestionWindowAndRTT seems to be flaky. | 938 // TODO(rtenneti): DISABLED_LimitCongestionWindowAndRTT seems to be flaky. |
900 // http://crbug.com/321870. | 939 // http://crbug.com/321870. |
901 TEST_P(EndToEndTest, DISABLED_LimitCongestionWindowAndRTT) { | 940 TEST_P(EndToEndTest, DISABLED_LimitCongestionWindowAndRTT) { |
902 // Client tries to request twice the server's max initial window, and the | 941 // Client tries to request twice the server's max initial window, and the |
903 // server limits it to the max. | 942 // server limits it to the max. |
904 client_config_.SetInitialCongestionWindowToSend(2 * kMaxInitialWindow); | 943 client_config_.SetInitialCongestionWindowToSend(2 * kMaxInitialWindow); |
905 client_config_.SetInitialRoundTripTimeUsToSend(1); | 944 client_config_.SetInitialRoundTripTimeUsToSend(1); |
906 | 945 |
907 ASSERT_TRUE(Initialize()); | 946 ASSERT_TRUE(Initialize()); |
908 client_->client()->WaitForCryptoHandshakeConfirmed(); | 947 client_->client()->WaitForCryptoHandshakeConfirmed(); |
909 server_thread_->WaitForCryptoHandshakeConfirmed(); | 948 server_thread_->WaitForCryptoHandshakeConfirmed(); |
910 | 949 |
911 // Pause the server so we can access the server's internals without races. | 950 // Pause the server so we can access the server's internals without races. |
912 server_thread_->Pause(); | 951 server_thread_->Pause(); |
913 QuicDispatcher* dispatcher = | 952 QuicDispatcher* dispatcher = |
914 QuicServerPeer::GetDispatcher(server_thread_->server()); | 953 QuicServerPeer::GetDispatcher(server_thread_->server()); |
915 ASSERT_EQ(1u, dispatcher->session_map().size()); | 954 ASSERT_EQ(1u, dispatcher->session_map().size()); |
916 QuicSession* session = dispatcher->session_map().begin()->second; | |
917 const QuicSentPacketManager& client_sent_packet_manager = | 955 const QuicSentPacketManager& client_sent_packet_manager = |
918 client_->client()->session()->connection()->sent_packet_manager(); | 956 client_->client()->session()->connection()->sent_packet_manager(); |
919 const QuicSentPacketManager& server_sent_packet_manager = | 957 const QuicSentPacketManager& server_sent_packet_manager = |
920 session->connection()->sent_packet_manager(); | 958 *GetSentPacketManagerFromFirstServerSession(); |
921 | 959 |
922 // The client shouldn't set it's initial window based on the negotiated value. | 960 // The client shouldn't set it's initial window based on the negotiated value. |
923 EXPECT_EQ(kDefaultInitialWindow * kDefaultTCPMSS, | 961 EXPECT_EQ(kDefaultInitialWindow * kDefaultTCPMSS, |
924 client_sent_packet_manager.GetCongestionWindow()); | 962 client_sent_packet_manager.GetCongestionWindow()); |
925 EXPECT_EQ(kMaxInitialWindow * kDefaultTCPMSS, | 963 EXPECT_EQ(kMaxInitialWindow * kDefaultTCPMSS, |
926 server_sent_packet_manager.GetCongestionWindow()); | 964 server_sent_packet_manager.GetCongestionWindow()); |
927 | 965 |
928 EXPECT_EQ(FLAGS_enable_quic_pacing, | 966 EXPECT_EQ(FLAGS_enable_quic_pacing, |
929 server_sent_packet_manager.using_pacing()); | 967 server_sent_packet_manager.using_pacing()); |
930 EXPECT_EQ(FLAGS_enable_quic_pacing, | 968 EXPECT_EQ(FLAGS_enable_quic_pacing, |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1103 | 1141 |
1104 TEST_P(EndToEndTest, ConnectionMigrationClientIPChanged) { | 1142 TEST_P(EndToEndTest, ConnectionMigrationClientIPChanged) { |
1105 // Tests that the client's IP can not change during an established QUIC | 1143 // Tests that the client's IP can not change during an established QUIC |
1106 // connection. If it changes, the connection is closed by the server as we do | 1144 // connection. If it changes, the connection is closed by the server as we do |
1107 // not yet support IP migration. | 1145 // not yet support IP migration. |
1108 ASSERT_TRUE(Initialize()); | 1146 ASSERT_TRUE(Initialize()); |
1109 | 1147 |
1110 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); | 1148 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); |
1111 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); | 1149 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); |
1112 | 1150 |
1113 scoped_ptr<WrongAddressWriter> writer(new WrongAddressWriter()); | 1151 WrongAddressWriter* writer = new WrongAddressWriter(); |
1114 | 1152 |
1115 writer->set_writer(new QuicDefaultPacketWriter(client_->client()->fd())); | 1153 writer->set_writer(new QuicDefaultPacketWriter(client_->client()->fd())); |
1116 QuicConnectionPeer::SetWriter(client_->client()->session()->connection(), | 1154 QuicConnectionPeer::SetWriter(client_->client()->session()->connection(), |
1117 writer.get()); | 1155 writer, |
| 1156 true /* owns_writer */); |
1118 | 1157 |
1119 client_->SendSynchronousRequest("/bar"); | 1158 client_->SendSynchronousRequest("/bar"); |
1120 | 1159 |
1121 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); | 1160 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); |
1122 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error()); | 1161 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error()); |
1123 } | 1162 } |
1124 | 1163 |
1125 TEST_P(EndToEndTest, ConnectionMigrationClientPortChanged) { | 1164 TEST_P(EndToEndTest, ConnectionMigrationClientPortChanged) { |
1126 // Tests that the client's port can change during an established QUIC | 1165 // Tests that the client's port can change during an established QUIC |
1127 // connection, and that doing so does not result in the connection being | 1166 // connection, and that doing so does not result in the connection being |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1324 session->flow_controller(); | 1363 session->flow_controller(); |
1325 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::ReceiveWindowSize( | 1364 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::ReceiveWindowSize( |
1326 server_connection_flow_controller)); | 1365 server_connection_flow_controller)); |
1327 server_thread_->Resume(); | 1366 server_thread_->Resume(); |
1328 } | 1367 } |
1329 | 1368 |
1330 } // namespace | 1369 } // namespace |
1331 } // namespace test | 1370 } // namespace test |
1332 } // namespace tools | 1371 } // namespace tools |
1333 } // namespace net | 1372 } // namespace net |
OLD | NEW |