OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |