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

Side by Side Diff: net/tools/quic/end_to_end_test.cc

Issue 47283002: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix compilation error Created 7 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « net/quic/test_tools/simple_quic_framer.cc ('k') | net/tools/quic/quic_client.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 <stddef.h> 5 #include <stddef.h>
6 #include <string> 6 #include <string>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/memory/singleton.h" 10 #include "base/memory/singleton.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 body->clear(); 63 body->clear();
64 body->reserve(length); 64 body->reserve(length);
65 for (int i = 0; i < length; ++i) { 65 for (int i = 0; i < length; ++i) {
66 body->append(1, static_cast<char>(32 + i % (126 - 32))); 66 body->append(1, static_cast<char>(32 + i % (126 - 32)));
67 } 67 }
68 } 68 }
69 69
70 // Run all tests with the cross products of all versions 70 // Run all tests with the cross products of all versions
71 // and all values of FLAGS_pad_quic_handshake_packets. 71 // and all values of FLAGS_pad_quic_handshake_packets.
72 struct TestParams { 72 struct TestParams {
73 TestParams(QuicVersion version, 73 TestParams(const QuicVersionVector& client_supported_versions,
74 const QuicVersionVector& server_supported_versions,
75 QuicVersion negotiated_version,
74 bool use_padding) 76 bool use_padding)
75 : version(version), 77 : client_supported_versions(client_supported_versions),
78 server_supported_versions(server_supported_versions),
79 negotiated_version(negotiated_version),
76 use_padding(use_padding) { 80 use_padding(use_padding) {
77 } 81 }
78 82
79 QuicVersion version; 83 QuicVersionVector client_supported_versions;
84 QuicVersionVector server_supported_versions;
85 QuicVersion negotiated_version;
80 bool use_padding; 86 bool use_padding;
81 }; 87 };
82 88
83 // Constructs all the various test permutations. 89 // Constructs various test permutations.
84 vector<TestParams> GetTestParams() { 90 vector<TestParams> GetTestParams() {
85 vector<TestParams> params; 91 vector<TestParams> params;
86 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { 92 QuicVersionVector all_supported_versions = QuicSupportedVersions();
87 params.push_back(TestParams(kSupportedQuicVersions[i], true)); 93
88 params.push_back(TestParams(kSupportedQuicVersions[i], false)); 94 // Add an entry for server and client supporting all versions.
95 params.push_back(TestParams(all_supported_versions, all_supported_versions,
96 all_supported_versions[0], true));
97 params.push_back(TestParams(all_supported_versions, all_supported_versions,
98 all_supported_versions[0], false));
99
100 // Test client supporting 1 version and server supporting all versions.
101 // Simulate an old client and exercise version downgrade in the server.
102 // No protocol negotiation should occur. Skip the i = 0 case because it
103 // is essentially the same as the default case.
104 for (size_t i = 1; i < all_supported_versions.size(); ++i) {
105 QuicVersionVector client_supported_versions;
106 client_supported_versions.push_back(all_supported_versions[i]);
107 params.push_back(TestParams(client_supported_versions,
108 all_supported_versions,
109 client_supported_versions[0],
110 true));
111 params.push_back(TestParams(client_supported_versions,
112 all_supported_versions,
113 client_supported_versions[0],
114 false));
115 }
116
117 // Test client supporting all versions and server supporting 1 version.
118 // Simulate an old server and exercise version downgrade in the client.
119 // Protocol negotiation should occur. Skip the i = 0 case because it is
120 // essentially the same as the default case.
121 for (size_t i = 1; i < all_supported_versions.size(); ++i) {
122 QuicVersionVector server_supported_versions;
123 server_supported_versions.push_back(all_supported_versions[i]);
124 params.push_back(TestParams(all_supported_versions,
125 server_supported_versions,
126 server_supported_versions[0],
127 true));
128 params.push_back(TestParams(all_supported_versions,
129 server_supported_versions,
130 server_supported_versions[0],
131 false));
89 } 132 }
90 return params; 133 return params;
91 } 134 }
92 135
93 class EndToEndTest : public ::testing::TestWithParam<TestParams> { 136 class EndToEndTest : public ::testing::TestWithParam<TestParams> {
94 protected: 137 protected:
95 EndToEndTest() 138 EndToEndTest()
96 : server_hostname_("example.com"), 139 : server_hostname_("example.com"),
97 server_started_(false), 140 server_started_(false),
98 strike_register_no_startup_period_(false) { 141 strike_register_no_startup_period_(false) {
99 net::IPAddressNumber ip; 142 net::IPAddressNumber ip;
100 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); 143 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip));
101 server_address_ = IPEndPoint(ip, 0); 144 server_address_ = IPEndPoint(ip, 0);
102 FLAGS_track_retransmission_history = true; 145 FLAGS_track_retransmission_history = true;
103 client_config_.SetDefaults(); 146 client_config_.SetDefaults();
104 server_config_.SetDefaults(); 147 server_config_.SetDefaults();
105 148
106 QuicInMemoryCachePeer::ResetForTests(); 149 QuicInMemoryCachePeer::ResetForTests();
107 AddToCache("GET", kLargeRequest, "HTTP/1.1", "200", "OK", kFooResponseBody); 150 AddToCache("GET", kLargeRequest, "HTTP/1.1", "200", "OK", kFooResponseBody);
108 AddToCache("GET", "https://www.google.com/foo", 151 AddToCache("GET", "https://www.google.com/foo",
109 "HTTP/1.1", "200", "OK", kFooResponseBody); 152 "HTTP/1.1", "200", "OK", kFooResponseBody);
110 AddToCache("GET", "https://www.google.com/bar", 153 AddToCache("GET", "https://www.google.com/bar",
111 "HTTP/1.1", "200", "OK", kBarResponseBody); 154 "HTTP/1.1", "200", "OK", kBarResponseBody);
112 version_ = GetParam().version; 155
113 FLAGS_pad_quic_handshake_packets = 156 client_supported_versions_ = GetParam().client_supported_versions;
114 GetParam().use_padding; 157 server_supported_versions_ = GetParam().server_supported_versions;
158 negotiated_version_ = GetParam().negotiated_version;
159 FLAGS_pad_quic_handshake_packets = GetParam().use_padding;
160 LOG(INFO) << "server running " << QuicVersionVectorToString(
161 server_supported_versions_);
162 LOG(INFO) << "client running " << QuicVersionVectorToString(
163 client_supported_versions_);
164 LOG(INFO) << "negotiated_version_ " << QuicVersionToString(
165 negotiated_version_);
166 LOG(INFO) << "use_padding " << GetParam().use_padding;
115 } 167 }
116 168
117 virtual ~EndToEndTest() { 169 virtual ~EndToEndTest() {
170 // TODO(rtenneti): port RecycleUnusedPort if needed.
171 // RecycleUnusedPort(server_address_.port());
118 QuicInMemoryCachePeer::ResetForTests(); 172 QuicInMemoryCachePeer::ResetForTests();
119 } 173 }
120 174
121 virtual QuicTestClient* CreateQuicClient(QuicTestWriter* writer) { 175 virtual QuicTestClient* CreateQuicClient(QuicTestWriter* writer) {
122 QuicTestClient* client = new QuicTestClient(server_address_, 176 QuicTestClient* client = new QuicTestClient(server_address_,
123 server_hostname_, 177 server_hostname_,
124 false, // not secure 178 false, // not secure
125 client_config_, 179 client_config_,
126 version_); 180 client_supported_versions_);
127 client->UseWriter(writer); 181 client->UseWriter(writer);
128 client->Connect(); 182 client->Connect();
129 return client; 183 return client;
130 } 184 }
131 185
132 virtual bool Initialize() { 186 virtual bool Initialize() {
133 // Start the server first, because CreateQuicClient() attempts 187 // Start the server first, because CreateQuicClient() attempts
134 // to connect to the server. 188 // to connect to the server.
135 StartServer(); 189 StartServer();
136 client_.reset(CreateQuicClient(client_writer_)); 190 client_.reset(CreateQuicClient(client_writer_));
(...skipping 11 matching lines...) Expand all
148 client_writer_ = new PacketDroppingTestWriter(); 202 client_writer_ = new PacketDroppingTestWriter();
149 server_writer_ = new PacketDroppingTestWriter(); 203 server_writer_ = new PacketDroppingTestWriter();
150 } 204 }
151 205
152 virtual void TearDown() { 206 virtual void TearDown() {
153 StopServer(); 207 StopServer();
154 } 208 }
155 209
156 void StartServer() { 210 void StartServer() {
157 server_thread_.reset(new ServerThread(server_address_, server_config_, 211 server_thread_.reset(new ServerThread(server_address_, server_config_,
212 server_supported_versions_,
158 strike_register_no_startup_period_)); 213 strike_register_no_startup_period_));
159 server_thread_->Start(); 214 server_thread_->Start();
160 server_thread_->listening()->Wait(); 215 server_thread_->listening()->Wait();
161 server_address_ = IPEndPoint(server_address_.address(), 216 server_address_ = IPEndPoint(server_address_.address(),
162 server_thread_->GetPort()); 217 server_thread_->GetPort());
163 QuicDispatcher* dispatcher = 218 QuicDispatcher* dispatcher =
164 QuicServerPeer::GetDispatcher(server_thread_->server()); 219 QuicServerPeer::GetDispatcher(server_thread_->server());
165 server_writer_->SetConnectionHelper( 220 server_writer_->SetConnectionHelper(
166 QuicDispatcherPeer::GetHelper(dispatcher)); 221 QuicDispatcherPeer::GetHelper(dispatcher));
167 QuicDispatcherPeer::UseWriter(dispatcher, server_writer_); 222 QuicDispatcherPeer::UseWriter(dispatcher, server_writer_);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 265
211 IPEndPoint server_address_; 266 IPEndPoint server_address_;
212 string server_hostname_; 267 string server_hostname_;
213 scoped_ptr<ServerThread> server_thread_; 268 scoped_ptr<ServerThread> server_thread_;
214 scoped_ptr<QuicTestClient> client_; 269 scoped_ptr<QuicTestClient> client_;
215 PacketDroppingTestWriter* client_writer_; 270 PacketDroppingTestWriter* client_writer_;
216 PacketDroppingTestWriter* server_writer_; 271 PacketDroppingTestWriter* server_writer_;
217 bool server_started_; 272 bool server_started_;
218 QuicConfig client_config_; 273 QuicConfig client_config_;
219 QuicConfig server_config_; 274 QuicConfig server_config_;
220 QuicVersion version_; 275 QuicVersionVector client_supported_versions_;
276 QuicVersionVector server_supported_versions_;
277 QuicVersion negotiated_version_;
221 bool strike_register_no_startup_period_; 278 bool strike_register_no_startup_period_;
222 }; 279 };
223 280
224 // Run all end to end tests with all supported versions. 281 // Run all end to end tests with all supported versions.
225 INSTANTIATE_TEST_CASE_P(EndToEndTests, 282 INSTANTIATE_TEST_CASE_P(EndToEndTests,
226 EndToEndTest, 283 EndToEndTest,
227 ::testing::ValuesIn(GetTestParams())); 284 ::testing::ValuesIn(GetTestParams()));
228 285
229 TEST_P(EndToEndTest, SimpleRequestResponse) { 286 TEST_P(EndToEndTest, SimpleRequestResponse) {
230 ASSERT_TRUE(Initialize()); 287 ASSERT_TRUE(Initialize());
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 ASSERT_TRUE(Initialize()); 362 ASSERT_TRUE(Initialize());
306 // Set things up so we have a small payload, to guarantee fragmentation. 363 // Set things up so we have a small payload, to guarantee fragmentation.
307 // A congestion feedback frame can't be split into multiple packets, make sure 364 // A congestion feedback frame can't be split into multiple packets, make sure
308 // that our packet have room for at least this amount after the normal headers 365 // that our packet have room for at least this amount after the normal headers
309 // are added. 366 // are added.
310 367
311 // TODO(rch) handle this better when we have different encryption options. 368 // TODO(rch) handle this better when we have different encryption options.
312 const size_t kStreamDataLength = 3; 369 const size_t kStreamDataLength = 3;
313 const QuicStreamId kStreamId = 1u; 370 const QuicStreamId kStreamId = 1u;
314 const QuicStreamOffset kStreamOffset = 0u; 371 const QuicStreamOffset kStreamOffset = 0u;
315 size_t stream_payload_size = 372 size_t stream_payload_size = QuicFramer::GetMinStreamFrameSize(
316 QuicFramer::GetMinStreamFrameSize( 373 negotiated_version_, kStreamId, kStreamOffset, true) + kStreamDataLength;
317 version_, kStreamId, kStreamOffset, true) + kStreamDataLength;
318 size_t min_payload_size = 374 size_t min_payload_size =
319 std::max(kCongestionFeedbackFrameSize, stream_payload_size); 375 std::max(kCongestionFeedbackFrameSize, stream_payload_size);
320 bool use_short_hash = version_ >= QUIC_VERSION_11;
321 size_t ciphertext_size = 376 size_t ciphertext_size =
322 NullEncrypter(use_short_hash).GetCiphertextSize(min_payload_size); 377 NullEncrypter(false).GetCiphertextSize(min_payload_size);
323 // TODO(satyashekhar): Fix this when versioning is implemented. 378 // TODO(satyashekhar): Fix this when versioning is implemented.
324 client_->options()->max_packet_length = 379 client_->options()->max_packet_length =
325 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 380 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
326 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 381 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) +
327 ciphertext_size; 382 ciphertext_size;
328 383
329 // Make sure our request is too large to fit in one packet. 384 // Make sure our request is too large to fit in one packet.
330 EXPECT_GT(strlen(kLargeRequest), min_payload_size); 385 EXPECT_GT(strlen(kLargeRequest), min_payload_size);
331 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest(kLargeRequest)); 386 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest(kLargeRequest));
332 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 387 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code());
333 } 388 }
334 389
335 TEST_P(EndToEndTest, MultipleFramesRandomOrder) { 390 TEST_P(EndToEndTest, MultipleFramesRandomOrder) {
336 ASSERT_TRUE(Initialize()); 391 ASSERT_TRUE(Initialize());
337 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); 392 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2));
338 SetReorderPercentage(50); 393 SetReorderPercentage(50);
339 // Set things up so we have a small payload, to guarantee fragmentation. 394 // Set things up so we have a small payload, to guarantee fragmentation.
340 // A congestion feedback frame can't be split into multiple packets, make sure 395 // A congestion feedback frame can't be split into multiple packets, make sure
341 // that our packet have room for at least this amount after the normal headers 396 // that our packet have room for at least this amount after the normal headers
342 // are added. 397 // are added.
343 398
344 // TODO(rch) handle this better when we have different encryption options. 399 // TODO(rch) handle this better when we have different encryption options.
345 const size_t kStreamDataLength = 3; 400 const size_t kStreamDataLength = 3;
346 const QuicStreamId kStreamId = 1u; 401 const QuicStreamId kStreamId = 1u;
347 const QuicStreamOffset kStreamOffset = 0u; 402 const QuicStreamOffset kStreamOffset = 0u;
348 size_t stream_payload_size = 403 size_t stream_payload_size = QuicFramer::GetMinStreamFrameSize(
349 QuicFramer::GetMinStreamFrameSize( 404 negotiated_version_, kStreamId, kStreamOffset, true) + kStreamDataLength;
350 version_, kStreamId, kStreamOffset, true) + kStreamDataLength;
351 size_t min_payload_size = 405 size_t min_payload_size =
352 std::max(kCongestionFeedbackFrameSize, stream_payload_size); 406 std::max(kCongestionFeedbackFrameSize, stream_payload_size);
353 bool use_short_hash = version_ >= QUIC_VERSION_11;
354 size_t ciphertext_size = 407 size_t ciphertext_size =
355 NullEncrypter(use_short_hash).GetCiphertextSize(min_payload_size); 408 NullEncrypter(false).GetCiphertextSize(min_payload_size);
356 // TODO(satyashekhar): Fix this when versioning is implemented. 409 // TODO(satyashekhar): Fix this when versioning is implemented.
357 client_->options()->max_packet_length = 410 client_->options()->max_packet_length =
358 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 411 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
359 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 412 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) +
360 ciphertext_size; 413 ciphertext_size;
361 414
362 // Make sure our request is too large to fit in one packet. 415 // Make sure our request is too large to fit in one packet.
363 EXPECT_GT(strlen(kLargeRequest), min_payload_size); 416 EXPECT_GT(strlen(kLargeRequest), min_payload_size);
364 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest(kLargeRequest)); 417 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest(kLargeRequest));
365 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 418 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code());
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 client_->SendSynchronousRequest("/bar"); 750 client_->SendSynchronousRequest("/bar");
698 751
699 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); 752 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error());
700 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error()); 753 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error());
701 } 754 }
702 755
703 } // namespace 756 } // namespace
704 } // namespace test 757 } // namespace test
705 } // namespace tools 758 } // namespace tools
706 } // namespace net 759 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/test_tools/simple_quic_framer.cc ('k') | net/tools/quic/quic_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698