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

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

Issue 127523002: Make TimeWaitListManager use PacketWriter's socket writability state. (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
« no previous file with comments | « net/tools/quic/quic_time_wait_list_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
11 #include "net/quic/crypto/quic_decrypter.h" 11 #include "net/quic/crypto/quic_decrypter.h"
12 #include "net/quic/crypto/quic_encrypter.h" 12 #include "net/quic/crypto/quic_encrypter.h"
13 #include "net/quic/quic_data_reader.h" 13 #include "net/quic/quic_data_reader.h"
14 #include "net/quic/quic_framer.h" 14 #include "net/quic/quic_framer.h"
15 #include "net/quic/quic_packet_writer.h" 15 #include "net/quic/quic_packet_writer.h"
16 #include "net/quic/quic_protocol.h" 16 #include "net/quic/quic_protocol.h"
17 #include "net/quic/test_tools/quic_test_utils.h" 17 #include "net/quic/test_tools/quic_test_utils.h"
18 #include "net/tools/quic/test_tools/mock_epoll_server.h" 18 #include "net/tools/quic/test_tools/mock_epoll_server.h"
19 #include "net/tools/quic/test_tools/quic_test_utils.h" 19 #include "net/tools/quic/test_tools/quic_test_utils.h"
20 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
22 22
23 using net::test::FramerVisitorCapturingPublicReset; 23 using net::test::FramerVisitorCapturingPublicReset;
24 using testing::_; 24 using testing::_;
25 using testing::Args; 25 using testing::Args;
26 using testing::Assign;
27 using testing::DoAll;
26 using testing::Matcher; 28 using testing::Matcher;
27 using testing::MatcherInterface; 29 using testing::MatcherInterface;
28 using testing::NiceMock; 30 using testing::NiceMock;
29 using testing::Return; 31 using testing::Return;
32 using testing::ReturnPointee;
30 using testing::SetArgPointee; 33 using testing::SetArgPointee;
31 using testing::StrictMock; 34 using testing::StrictMock;
32 using testing::Truly; 35 using testing::Truly;
33 36
34 namespace net { 37 namespace net {
35 namespace tools { 38 namespace tools {
36 namespace test { 39 namespace test {
37 40
38 class QuicTimeWaitListManagerPeer { 41 class QuicTimeWaitListManagerPeer {
39 public: 42 public:
40 static bool is_write_blocked(QuicTimeWaitListManager* manager) {
41 return manager->is_write_blocked_;
42 }
43
44 static bool ShouldSendResponse(QuicTimeWaitListManager* manager, 43 static bool ShouldSendResponse(QuicTimeWaitListManager* manager,
45 int received_packet_count) { 44 int received_packet_count) {
46 return manager->ShouldSendResponse(received_packet_count); 45 return manager->ShouldSendResponse(received_packet_count);
47 } 46 }
48 47
49 static QuicTime::Delta time_wait_period(QuicTimeWaitListManager* manager) { 48 static QuicTime::Delta time_wait_period(QuicTimeWaitListManager* manager) {
50 return manager->kTimeWaitPeriod_; 49 return manager->kTimeWaitPeriod_;
51 } 50 }
52 51
53 static QuicVersion GetQuicVersionFromGuid(QuicTimeWaitListManager* manager, 52 static QuicVersion GetQuicVersionFromGuid(QuicTimeWaitListManager* manager,
(...skipping 17 matching lines...) Expand all
71 MOCK_METHOD2(RegisterAlarm, void(int64 timeout_in_us, 70 MOCK_METHOD2(RegisterAlarm, void(int64 timeout_in_us,
72 EpollAlarmCallbackInterface* alarm)); 71 EpollAlarmCallbackInterface* alarm));
73 }; 72 };
74 73
75 class QuicTimeWaitListManagerTest : public testing::Test { 74 class QuicTimeWaitListManagerTest : public testing::Test {
76 protected: 75 protected:
77 QuicTimeWaitListManagerTest() 76 QuicTimeWaitListManagerTest()
78 : time_wait_list_manager_( 77 : time_wait_list_manager_(
79 &writer_, &epoll_server_, QuicSupportedVersions()), 78 &writer_, &epoll_server_, QuicSupportedVersions()),
80 framer_(QuicSupportedVersions(), QuicTime::Zero(), true), 79 framer_(QuicSupportedVersions(), QuicTime::Zero(), true),
81 guid_(45) { 80 guid_(45),
82 } 81 writer_is_blocked_(false) {}
83 82
84 virtual ~QuicTimeWaitListManagerTest() {} 83 virtual ~QuicTimeWaitListManagerTest() {}
85 84
85 virtual void SetUp() {
86 EXPECT_CALL(writer_, IsWriteBlocked())
87 .WillRepeatedly(ReturnPointee(&writer_is_blocked_));
88 EXPECT_CALL(writer_, IsWriteBlockedDataBuffered())
89 .WillRepeatedly(Return(false));
90 }
91
86 void AddGuid(QuicGuid guid) { 92 void AddGuid(QuicGuid guid) {
87 AddGuid(guid, net::test::QuicVersionMax(), NULL); 93 AddGuid(guid, net::test::QuicVersionMax(), NULL);
88 } 94 }
89 95
90 void AddGuid(QuicGuid guid, 96 void AddGuid(QuicGuid guid,
91 QuicVersion version, 97 QuicVersion version,
92 QuicEncryptedPacket* packet) { 98 QuicEncryptedPacket* packet) {
93 time_wait_list_manager_.AddGuidToTimeWait(guid, version, packet); 99 time_wait_list_manager_.AddGuidToTimeWait(guid, version, packet);
94 } 100 }
95 101
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 return encrypted; 140 return encrypted;
135 } 141 }
136 142
137 NiceMock<MockFakeTimeEpollServer> epoll_server_; 143 NiceMock<MockFakeTimeEpollServer> epoll_server_;
138 StrictMock<MockPacketWriter> writer_; 144 StrictMock<MockPacketWriter> writer_;
139 QuicTimeWaitListManager time_wait_list_manager_; 145 QuicTimeWaitListManager time_wait_list_manager_;
140 QuicFramer framer_; 146 QuicFramer framer_;
141 QuicGuid guid_; 147 QuicGuid guid_;
142 IPEndPoint server_address_; 148 IPEndPoint server_address_;
143 IPEndPoint client_address_; 149 IPEndPoint client_address_;
150 bool writer_is_blocked_;
144 }; 151 };
145 152
146 class ValidatePublicResetPacketPredicate 153 class ValidatePublicResetPacketPredicate
147 : public MatcherInterface<const std::tr1::tuple<const char*, int> > { 154 : public MatcherInterface<const std::tr1::tuple<const char*, int> > {
148 public: 155 public:
149 explicit ValidatePublicResetPacketPredicate(QuicGuid guid, 156 explicit ValidatePublicResetPacketPredicate(QuicGuid guid,
150 QuicPacketSequenceNumber number) 157 QuicPacketSequenceNumber number)
151 : guid_(guid), sequence_number_(number) { 158 : guid_(guid), sequence_number_(number) {
152 } 159 }
153 160
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 ConstructEncryptedPacket(ENCRYPTION_NONE, guid, sequence_number)); 289 ConstructEncryptedPacket(ENCRYPTION_NONE, guid, sequence_number));
283 // Let first write through. 290 // Let first write through.
284 EXPECT_CALL(writer_, WritePacket(_, _, 291 EXPECT_CALL(writer_, WritePacket(_, _,
285 server_address_.address(), 292 server_address_.address(),
286 client_address_, 293 client_address_,
287 &time_wait_list_manager_)) 294 &time_wait_list_manager_))
288 .With(Args<0, 1>(PublicResetPacketEq(guid, 295 .With(Args<0, 1>(PublicResetPacketEq(guid,
289 sequence_number))) 296 sequence_number)))
290 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); 297 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length())));
291 ProcessPacket(guid, sequence_number); 298 ProcessPacket(guid, sequence_number);
292 EXPECT_FALSE(
293 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_));
294 299
295 // write block for the next packet. 300 // write block for the next packet.
296 EXPECT_CALL(writer_, WritePacket(_, _, 301 EXPECT_CALL(writer_, WritePacket(_, _,
297 server_address_.address(), 302 server_address_.address(),
298 client_address_, 303 client_address_,
299 &time_wait_list_manager_)) 304 &time_wait_list_manager_))
300 .With(Args<0, 1>(PublicResetPacketEq(guid, 305 .With(Args<0, 1>(PublicResetPacketEq(guid,
301 sequence_number))) 306 sequence_number)))
302 .WillOnce(Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN))); 307 .WillOnce(DoAll(
308 Assign(&writer_is_blocked_, true),
309 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN))));
303 ProcessPacket(guid, sequence_number); 310 ProcessPacket(guid, sequence_number);
304 // 3rd packet. No public reset should be sent; 311 // 3rd packet. No public reset should be sent;
305 ProcessPacket(guid, sequence_number); 312 ProcessPacket(guid, sequence_number);
306 EXPECT_TRUE(
307 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_));
308 313
309 // write packet should not be called since already write blocked but the 314 // write packet should not be called since we are write blocked but the
310 // should be queued. 315 // should be queued.
311 QuicGuid other_guid = 2; 316 QuicGuid other_guid = 2;
312 AddGuid(other_guid); 317 AddGuid(other_guid);
313 QuicPacketSequenceNumber other_sequence_number = 23423; 318 QuicPacketSequenceNumber other_sequence_number = 23423;
314 scoped_ptr<QuicEncryptedPacket> other_packet( 319 scoped_ptr<QuicEncryptedPacket> other_packet(
315 ConstructEncryptedPacket( 320 ConstructEncryptedPacket(
316 ENCRYPTION_NONE, other_guid, other_sequence_number)); 321 ENCRYPTION_NONE, other_guid, other_sequence_number));
317 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) 322 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _))
318 .Times(0); 323 .Times(0);
319 ProcessPacket(other_guid, other_sequence_number); 324 ProcessPacket(other_guid, other_sequence_number);
320 325
321 // Now expect all the write blocked public reset packets to be sent again. 326 // Now expect all the write blocked public reset packets to be sent again.
327 writer_is_blocked_ = false;
322 EXPECT_CALL(writer_, WritePacket(_, _, 328 EXPECT_CALL(writer_, WritePacket(_, _,
323 server_address_.address(), 329 server_address_.address(),
324 client_address_, 330 client_address_,
325 &time_wait_list_manager_)) 331 &time_wait_list_manager_))
326 .With(Args<0, 1>(PublicResetPacketEq(guid, 332 .With(Args<0, 1>(PublicResetPacketEq(guid,
327 sequence_number))) 333 sequence_number)))
328 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); 334 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length())));
329 EXPECT_CALL(writer_, WritePacket(_, _, 335 EXPECT_CALL(writer_, WritePacket(_, _,
330 server_address_.address(), 336 server_address_.address(),
331 client_address_, 337 client_address_,
332 &time_wait_list_manager_)) 338 &time_wait_list_manager_))
333 .With(Args<0, 1>(PublicResetPacketEq(other_guid, 339 .With(Args<0, 1>(PublicResetPacketEq(other_guid,
334 other_sequence_number))) 340 other_sequence_number)))
335 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 341 .WillOnce(Return(WriteResult(WRITE_STATUS_OK,
336 other_packet->length()))); 342 other_packet->length())));
337 time_wait_list_manager_.OnCanWrite(); 343 time_wait_list_manager_.OnCanWrite();
338 EXPECT_FALSE(
339 QuicTimeWaitListManagerPeer::is_write_blocked(&time_wait_list_manager_));
340 } 344 }
341 345
342 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { 346 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) {
343 const int kGuid1 = 123; 347 const int kGuid1 = 123;
344 const int kGuid2 = 456; 348 const int kGuid2 = 456;
345 const int kGuid3 = 789; 349 const int kGuid3 = 789;
346 350
347 AddGuid(kGuid1, net::test::QuicVersionMin(), NULL); 351 AddGuid(kGuid1, net::test::QuicVersionMin(), NULL);
348 AddGuid(kGuid2, net::test::QuicVersionMax(), NULL); 352 AddGuid(kGuid2, net::test::QuicVersionMax(), NULL);
349 AddGuid(kGuid3, net::test::QuicVersionMax(), NULL); 353 AddGuid(kGuid3, net::test::QuicVersionMax(), NULL);
350 354
351 EXPECT_EQ(net::test::QuicVersionMin(), 355 EXPECT_EQ(net::test::QuicVersionMin(),
352 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( 356 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid(
353 &time_wait_list_manager_, kGuid1)); 357 &time_wait_list_manager_, kGuid1));
354 EXPECT_EQ(net::test::QuicVersionMax(), 358 EXPECT_EQ(net::test::QuicVersionMax(),
355 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( 359 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid(
356 &time_wait_list_manager_, kGuid2)); 360 &time_wait_list_manager_, kGuid2));
357 EXPECT_EQ(net::test::QuicVersionMax(), 361 EXPECT_EQ(net::test::QuicVersionMax(),
358 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( 362 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid(
359 &time_wait_list_manager_, kGuid3)); 363 &time_wait_list_manager_, kGuid3));
360 } 364 }
361 365
362 } // namespace 366 } // namespace
363 } // namespace test 367 } // namespace test
364 } // namespace tools 368 } // namespace tools
365 } // namespace net 369 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/quic_time_wait_list_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698