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

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

Issue 123303003: Move all the packet parsing logic into QuicDispatcher from the (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/tools/quic/quic_time_wait_list_manager.h" 5 #include "net/tools/quic/quic_time_wait_list_manager.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 8
9 #include "net/quic/crypto/crypto_protocol.h" 9 #include "net/quic/crypto/crypto_protocol.h"
10 #include "net/quic/crypto/null_encrypter.h" 10 #include "net/quic/crypto/null_encrypter.h"
(...skipping 17 matching lines...) Expand all
28 using testing::Return; 28 using testing::Return;
29 using testing::SetArgPointee; 29 using testing::SetArgPointee;
30 using testing::Truly; 30 using testing::Truly;
31 31
32 namespace net { 32 namespace net {
33 namespace tools { 33 namespace tools {
34 namespace test { 34 namespace test {
35 35
36 class QuicTimeWaitListManagerPeer { 36 class QuicTimeWaitListManagerPeer {
37 public: 37 public:
38 static QuicVersion version(QuicTimeWaitListManager* manager) {
39 return manager->framer_.version();
40 }
41
42 static bool is_write_blocked(QuicTimeWaitListManager* manager) { 38 static bool is_write_blocked(QuicTimeWaitListManager* manager) {
43 return manager->is_write_blocked_; 39 return manager->is_write_blocked_;
44 } 40 }
45 41
46 static bool ShouldSendResponse(QuicTimeWaitListManager* manager, 42 static bool ShouldSendResponse(QuicTimeWaitListManager* manager,
47 int received_packet_count) { 43 int received_packet_count) {
48 return manager->ShouldSendResponse(received_packet_count); 44 return manager->ShouldSendResponse(received_packet_count);
49 } 45 }
50 46
51 static QuicTime::Delta time_wait_period(QuicTimeWaitListManager* manager) { 47 static QuicTime::Delta time_wait_period(QuicTimeWaitListManager* manager) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 void AddGuid(QuicGuid guid, 88 void AddGuid(QuicGuid guid,
93 QuicVersion version, 89 QuicVersion version,
94 QuicEncryptedPacket* packet) { 90 QuicEncryptedPacket* packet) {
95 time_wait_list_manager_.AddGuidToTimeWait(guid, version, packet); 91 time_wait_list_manager_.AddGuidToTimeWait(guid, version, packet);
96 } 92 }
97 93
98 bool IsGuidInTimeWait(QuicGuid guid) { 94 bool IsGuidInTimeWait(QuicGuid guid) {
99 return time_wait_list_manager_.IsGuidInTimeWait(guid); 95 return time_wait_list_manager_.IsGuidInTimeWait(guid);
100 } 96 }
101 97
102 void ProcessPacket(QuicGuid guid, const QuicEncryptedPacket& packet) { 98 void ProcessPacket(QuicGuid guid, QuicPacketSequenceNumber sequence_number) {
103 time_wait_list_manager_.ProcessPacket(server_address_, 99 time_wait_list_manager_.ProcessPacket(server_address_,
104 client_address_, 100 client_address_,
105 guid, 101 guid,
106 packet); 102 sequence_number);
107 } 103 }
108 104
109 QuicEncryptedPacket* ConstructEncryptedPacket( 105 QuicEncryptedPacket* ConstructEncryptedPacket(
110 EncryptionLevel level, 106 EncryptionLevel level,
111 QuicGuid guid, 107 QuicGuid guid,
112 QuicPacketSequenceNumber sequence_number) { 108 QuicPacketSequenceNumber sequence_number) {
113 QuicPacketHeader header; 109 QuicPacketHeader header;
114 header.public_header.guid = guid; 110 header.public_header.guid = guid;
115 header.public_header.guid_length = PACKET_8BYTE_GUID; 111 header.public_header.guid_length = PACKET_8BYTE_GUID;
116 header.public_header.version_flag = false; 112 header.public_header.version_flag = false;
(...skipping 13 matching lines...) Expand all
130 framer_.BuildUnsizedDataPacket(header, frames).packet); 126 framer_.BuildUnsizedDataPacket(header, frames).packet);
131 EXPECT_TRUE(packet != NULL); 127 EXPECT_TRUE(packet != NULL);
132 QuicEncryptedPacket* encrypted = framer_.EncryptPacket(ENCRYPTION_NONE, 128 QuicEncryptedPacket* encrypted = framer_.EncryptPacket(ENCRYPTION_NONE,
133 sequence_number, 129 sequence_number,
134 *packet); 130 *packet);
135 EXPECT_TRUE(encrypted != NULL); 131 EXPECT_TRUE(encrypted != NULL);
136 return encrypted; 132 return encrypted;
137 } 133 }
138 134
139 MockFakeTimeEpollServer epoll_server_; 135 MockFakeTimeEpollServer epoll_server_;
140 MockPacketWriter writer_; 136 testing::StrictMock<MockPacketWriter> writer_;
141 QuicTimeWaitListManager time_wait_list_manager_; 137 QuicTimeWaitListManager time_wait_list_manager_;
142 QuicFramer framer_; 138 QuicFramer framer_;
143 QuicGuid guid_; 139 QuicGuid guid_;
144 IPEndPoint server_address_; 140 IPEndPoint server_address_;
145 IPEndPoint client_address_; 141 IPEndPoint client_address_;
146 }; 142 };
147 143
148 class ValidatePublicResetPacketPredicate 144 class ValidatePublicResetPacketPredicate
149 : public MatcherInterface<const std::tr1::tuple<const char*, int> > { 145 : public MatcherInterface<const std::tr1::tuple<const char*, int> > {
150 public: 146 public:
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 EXPECT_TRUE(IsGuidInTimeWait(guid_)); 189 EXPECT_TRUE(IsGuidInTimeWait(guid_));
194 } 190 }
195 191
196 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { 192 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) {
197 size_t kConnectionCloseLength = 100; 193 size_t kConnectionCloseLength = 100;
198 AddGuid(guid_, 194 AddGuid(guid_,
199 net::test::QuicVersionMax(), 195 net::test::QuicVersionMax(),
200 new QuicEncryptedPacket( 196 new QuicEncryptedPacket(
201 new char[kConnectionCloseLength], kConnectionCloseLength, true)); 197 new char[kConnectionCloseLength], kConnectionCloseLength, true));
202 const int kRandomSequenceNumber = 1; 198 const int kRandomSequenceNumber = 1;
203 scoped_ptr<QuicEncryptedPacket> packet(
204 ConstructEncryptedPacket(ENCRYPTION_NONE, guid_, kRandomSequenceNumber));
205 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, 199 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength,
206 server_address_.address(), 200 server_address_.address(),
207 client_address_, 201 client_address_,
208 &time_wait_list_manager_)) 202 &time_wait_list_manager_))
209 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); 203 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1)));
210 204
211 ProcessPacket(guid_, *packet); 205 ProcessPacket(guid_, kRandomSequenceNumber);
212 } 206 }
213 207
214 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { 208 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) {
215 AddGuid(guid_); 209 AddGuid(guid_);
216 const int kRandomSequenceNumber = 1; 210 const int kRandomSequenceNumber = 1;
217 scoped_ptr<QuicEncryptedPacket> packet(
218 ConstructEncryptedPacket(ENCRYPTION_NONE, guid_, kRandomSequenceNumber));
219 EXPECT_CALL(writer_, WritePacket(_, _, 211 EXPECT_CALL(writer_, WritePacket(_, _,
220 server_address_.address(), 212 server_address_.address(),
221 client_address_, 213 client_address_,
222 &time_wait_list_manager_)) 214 &time_wait_list_manager_))
223 .With(Args<0, 1>(PublicResetPacketEq(guid_, 215 .With(Args<0, 1>(PublicResetPacketEq(guid_,
224 kRandomSequenceNumber))) 216 kRandomSequenceNumber)))
225 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); 217 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0)));
226 218
227 ProcessPacket(guid_, *packet); 219 ProcessPacket(guid_, kRandomSequenceNumber);
228 }
229
230 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetUndecryptable) {
231 AddGuid(guid_);
232 const int kRandomSequenceNumber = 1;
233 scoped_ptr<QuicEncryptedPacket> packet(
234 ConstructEncryptedPacket(
235 ENCRYPTION_INITIAL, guid_, kRandomSequenceNumber));
236 EXPECT_CALL(writer_, WritePacket(_, _,
237 server_address_.address(),
238 client_address_,
239 &time_wait_list_manager_))
240 .With(Args<0, 1>(PublicResetPacketEq(guid_,
241 kRandomSequenceNumber)))
242 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length())));
243
244 ProcessPacket(guid_, *packet);
245 }
246
247 TEST_F(QuicTimeWaitListManagerTest, DropInvalidPacket) {
248 AddGuid(guid_);
249 const char buffer[] = "invalid";
250 QuicEncryptedPacket packet(buffer, arraysize(buffer));
251 // Will get called for a valid packet since received packet count = 1 (2 ^ 0).
252 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)).Times(0);
253 ProcessPacket(guid_, packet);
254 }
255
256 TEST_F(QuicTimeWaitListManagerTest, DropPublicResetPacket) {
257 AddGuid(guid_);
258 QuicPublicResetPacket packet;
259 packet.public_header.guid = guid_;
260 packet.public_header.version_flag = false;
261 packet.public_header.reset_flag = true;
262 packet.rejected_sequence_number = 239191;
263 packet.nonce_proof = 1010101;
264 scoped_ptr<QuicEncryptedPacket> public_reset_packet(
265 QuicFramer::BuildPublicResetPacket(packet));
266 // Will get called for a data packet since received packet count = 1 (2 ^ 0).
267 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)).Times(0);
268 ProcessPacket(guid_, *public_reset_packet);
269 } 220 }
270 221
271 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { 222 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) {
272 AddGuid(guid_); 223 AddGuid(guid_);
273 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { 224 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) {
274 scoped_ptr<QuicEncryptedPacket> packet(
275 ConstructEncryptedPacket(ENCRYPTION_NONE, guid_, sequence_number));
276 if ((sequence_number & (sequence_number - 1)) == 0) { 225 if ((sequence_number & (sequence_number - 1)) == 0) {
277 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) 226 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _))
278 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); 227 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1)));
279 } 228 }
280 ProcessPacket(guid_, *packet); 229 ProcessPacket(guid_, sequence_number);
281 // Send public reset with exponential back off. 230 // Send public reset with exponential back off.
282 if ((sequence_number & (sequence_number - 1)) == 0) { 231 if ((sequence_number & (sequence_number - 1)) == 0) {
283 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( 232 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse(
284 &time_wait_list_manager_, sequence_number)); 233 &time_wait_list_manager_, sequence_number));
285 } else { 234 } else {
286 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( 235 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse(
287 &time_wait_list_manager_, sequence_number)); 236 &time_wait_list_manager_, sequence_number));
288 } 237 }
289 } 238 }
290 } 239 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 scoped_ptr<QuicEncryptedPacket> packet( 279 scoped_ptr<QuicEncryptedPacket> packet(
331 ConstructEncryptedPacket(ENCRYPTION_NONE, guid, sequence_number)); 280 ConstructEncryptedPacket(ENCRYPTION_NONE, guid, sequence_number));
332 // Let first write through. 281 // Let first write through.
333 EXPECT_CALL(writer_, WritePacket(_, _, 282 EXPECT_CALL(writer_, WritePacket(_, _,
334 server_address_.address(), 283 server_address_.address(),
335 client_address_, 284 client_address_,
336 &time_wait_list_manager_)) 285 &time_wait_list_manager_))
337 .With(Args<0, 1>(PublicResetPacketEq(guid, 286 .With(Args<0, 1>(PublicResetPacketEq(guid,
338 sequence_number))) 287 sequence_number)))
339 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); 288 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length())));
340 ProcessPacket(guid, *packet); 289 ProcessPacket(guid, sequence_number);
341 EXPECT_FALSE( 290 EXPECT_FALSE(
342 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_)); 291 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_));
343 292
344 // write block for the next packet. 293 // write block for the next packet.
345 EXPECT_CALL(writer_, WritePacket(_, _, 294 EXPECT_CALL(writer_, WritePacket(_, _,
346 server_address_.address(), 295 server_address_.address(),
347 client_address_, 296 client_address_,
348 &time_wait_list_manager_)) 297 &time_wait_list_manager_))
349 .With(Args<0, 1>(PublicResetPacketEq(guid, 298 .With(Args<0, 1>(PublicResetPacketEq(guid,
350 sequence_number))) 299 sequence_number)))
351 .WillOnce(Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN))); 300 .WillOnce(Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)));
352 ProcessPacket(guid, *packet); 301 ProcessPacket(guid, sequence_number);
353 // 3rd packet. No public reset should be sent; 302 // 3rd packet. No public reset should be sent;
354 ProcessPacket(guid, *packet); 303 ProcessPacket(guid, sequence_number);
355 EXPECT_TRUE( 304 EXPECT_TRUE(
356 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_)); 305 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_));
357 306
358 // write packet should not be called since already write blocked but the 307 // write packet should not be called since already write blocked but the
359 // should be queued. 308 // should be queued.
360 QuicGuid other_guid = 2; 309 QuicGuid other_guid = 2;
361 AddGuid(other_guid); 310 AddGuid(other_guid);
362 QuicPacketSequenceNumber other_sequence_number = 23423; 311 QuicPacketSequenceNumber other_sequence_number = 23423;
363 scoped_ptr<QuicEncryptedPacket> other_packet( 312 scoped_ptr<QuicEncryptedPacket> other_packet(
364 ConstructEncryptedPacket( 313 ConstructEncryptedPacket(
365 ENCRYPTION_NONE, other_guid, other_sequence_number)); 314 ENCRYPTION_NONE, other_guid, other_sequence_number));
366 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) 315 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _))
367 .Times(0); 316 .Times(0);
368 ProcessPacket(other_guid, *other_packet); 317 ProcessPacket(other_guid, other_sequence_number);
369 318
370 // Now expect all the write blocked public reset packets to be sent again. 319 // Now expect all the write blocked public reset packets to be sent again.
371 EXPECT_CALL(writer_, WritePacket(_, _, 320 EXPECT_CALL(writer_, WritePacket(_, _,
372 server_address_.address(), 321 server_address_.address(),
373 client_address_, 322 client_address_,
374 &time_wait_list_manager_)) 323 &time_wait_list_manager_))
375 .With(Args<0, 1>(PublicResetPacketEq(guid, 324 .With(Args<0, 1>(PublicResetPacketEq(guid,
376 sequence_number))) 325 sequence_number)))
377 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); 326 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length())));
378 EXPECT_CALL(writer_, WritePacket(_, _, 327 EXPECT_CALL(writer_, WritePacket(_, _,
379 server_address_.address(), 328 server_address_.address(),
380 client_address_, 329 client_address_,
381 &time_wait_list_manager_)) 330 &time_wait_list_manager_))
382 .With(Args<0, 1>(PublicResetPacketEq(other_guid, 331 .With(Args<0, 1>(PublicResetPacketEq(other_guid,
383 other_sequence_number))) 332 other_sequence_number)))
384 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 333 .WillOnce(Return(WriteResult(WRITE_STATUS_OK,
385 other_packet->length()))); 334 other_packet->length())));
386 time_wait_list_manager_.OnCanWrite(); 335 time_wait_list_manager_.OnCanWrite();
387 EXPECT_FALSE( 336 EXPECT_FALSE(
388 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_)); 337 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_));
389 } 338 }
390 339
391 TEST_F(QuicTimeWaitListManagerTest, MakeSureFramerUsesCorrectVersion) {
392 const int kRandomSequenceNumber = 1;
393 scoped_ptr<QuicEncryptedPacket> packet;
394
395 AddGuid(guid_, net::test::QuicVersionMin(), NULL);
396 framer_.set_version(net::test::QuicVersionMin());
397 packet.reset(
398 ConstructEncryptedPacket(ENCRYPTION_NONE, guid_, kRandomSequenceNumber));
399
400 // Reset packet should be written, using the minimum quic version.
401 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)).Times(1)
402 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0)));
403 ProcessPacket(guid_, *packet);
404 EXPECT_EQ(QuicTimeWaitListManagerPeer::version(&time_wait_list_manager_),
405 net::test::QuicVersionMin());
406
407 // New guid
408 ++guid_;
409
410 AddGuid(guid_, net::test::QuicVersionMax(), NULL);
411 framer_.set_version(net::test::QuicVersionMax());
412 packet.reset(
413 ConstructEncryptedPacket(ENCRYPTION_NONE, guid_, kRandomSequenceNumber));
414
415 // Reset packet should be written, using the maximum quic version.
416 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)).Times(1)
417 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0)));
418 ProcessPacket(guid_, *packet);
419 EXPECT_EQ(QuicTimeWaitListManagerPeer::version(&time_wait_list_manager_),
420 net::test::QuicVersionMax());
421 }
422
423 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { 340 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) {
424 const int kGuid1 = 123; 341 const int kGuid1 = 123;
425 const int kGuid2 = 456; 342 const int kGuid2 = 456;
426 const int kGuid3 = 789; 343 const int kGuid3 = 789;
427 344
428 AddGuid(kGuid1, net::test::QuicVersionMin(), NULL); 345 AddGuid(kGuid1, net::test::QuicVersionMin(), NULL);
429 AddGuid(kGuid2, net::test::QuicVersionMax(), NULL); 346 AddGuid(kGuid2, net::test::QuicVersionMax(), NULL);
430 AddGuid(kGuid3, net::test::QuicVersionMax(), NULL); 347 AddGuid(kGuid3, net::test::QuicVersionMax(), NULL);
431 348
432 EXPECT_EQ(net::test::QuicVersionMin(), 349 EXPECT_EQ(net::test::QuicVersionMin(),
433 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( 350 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid(
434 &time_wait_list_manager_, kGuid1)); 351 &time_wait_list_manager_, kGuid1));
435 EXPECT_EQ(net::test::QuicVersionMax(), 352 EXPECT_EQ(net::test::QuicVersionMax(),
436 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( 353 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid(
437 &time_wait_list_manager_, kGuid2)); 354 &time_wait_list_manager_, kGuid2));
438 EXPECT_EQ(net::test::QuicVersionMax(), 355 EXPECT_EQ(net::test::QuicVersionMax(),
439 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( 356 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid(
440 &time_wait_list_manager_, kGuid3)); 357 &time_wait_list_manager_, kGuid3));
441 } 358 }
442 359
443 } // namespace 360 } // namespace
444 } // namespace test 361 } // namespace test
445 } // namespace tools 362 } // namespace tools
446 } // namespace net 363 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/quic_time_wait_list_manager.cc ('k') | net/tools/quic/test_tools/mock_quic_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698