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

Side by Side Diff: net/quic/quic_connection_test.cc

Issue 754433003: Update from https://crrev.com/305340 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 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
« no previous file with comments | « net/quic/quic_connection.cc ('k') | net/quic/quic_crypto_client_stream_test.cc » ('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 "net/quic/quic_connection.h" 5 #include "net/quic/quic_connection.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 60
61 const int kDefaultRetransmissionTimeMs = 500; 61 const int kDefaultRetransmissionTimeMs = 500;
62 62
63 class TestReceiveAlgorithm : public ReceiveAlgorithmInterface { 63 class TestReceiveAlgorithm : public ReceiveAlgorithmInterface {
64 public: 64 public:
65 explicit TestReceiveAlgorithm(QuicCongestionFeedbackFrame* feedback) 65 explicit TestReceiveAlgorithm(QuicCongestionFeedbackFrame* feedback)
66 : feedback_(feedback) { 66 : feedback_(feedback) {
67 } 67 }
68 68
69 bool GenerateCongestionFeedback( 69 bool GenerateCongestionFeedback(
70 QuicCongestionFeedbackFrame* congestion_feedback) { 70 QuicCongestionFeedbackFrame* congestion_feedback) override {
71 if (feedback_ == nullptr) { 71 if (feedback_ == nullptr) {
72 return false; 72 return false;
73 } 73 }
74 *congestion_feedback = *feedback_; 74 *congestion_feedback = *feedback_;
75 return true; 75 return true;
76 } 76 }
77 77
78 MOCK_METHOD3(RecordIncomingPacket, 78 MOCK_METHOD3(RecordIncomingPacket,
79 void(QuicByteCount, QuicPacketSequenceNumber, QuicTime)); 79 void(QuicByteCount, QuicPacketSequenceNumber, QuicTime));
80 80
81 private: 81 private:
82 QuicCongestionFeedbackFrame* feedback_; 82 QuicCongestionFeedbackFrame* feedback_;
83 83
84 DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm); 84 DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm);
85 }; 85 };
86 86
87 // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message. 87 // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message.
88 class TaggingEncrypter : public QuicEncrypter { 88 class TaggingEncrypter : public QuicEncrypter {
89 public: 89 public:
90 explicit TaggingEncrypter(uint8 tag) 90 explicit TaggingEncrypter(uint8 tag)
91 : tag_(tag) { 91 : tag_(tag) {
92 } 92 }
93 93
94 ~TaggingEncrypter() override {} 94 ~TaggingEncrypter() override {}
95 95
96 // QuicEncrypter interface. 96 // QuicEncrypter interface.
97 bool SetKey(StringPiece key) override { return true; } 97 bool SetKey(StringPiece key) override { return true; }
98
98 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } 99 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; }
99 100
100 bool Encrypt(StringPiece nonce, 101 bool Encrypt(StringPiece nonce,
101 StringPiece associated_data, 102 StringPiece associated_data,
102 StringPiece plaintext, 103 StringPiece plaintext,
103 unsigned char* output) override { 104 unsigned char* output) override {
104 memcpy(output, plaintext.data(), plaintext.size()); 105 memcpy(output, plaintext.data(), plaintext.size());
105 output += plaintext.size(); 106 output += plaintext.size();
106 memset(output, tag_, kTagSize); 107 memset(output, tag_, kTagSize);
107 return true; 108 return true;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 }; 143 };
143 144
144 // TaggingDecrypter ensures that the final kTagSize bytes of the message all 145 // TaggingDecrypter ensures that the final kTagSize bytes of the message all
145 // have the same value and then removes them. 146 // have the same value and then removes them.
146 class TaggingDecrypter : public QuicDecrypter { 147 class TaggingDecrypter : public QuicDecrypter {
147 public: 148 public:
148 ~TaggingDecrypter() override {} 149 ~TaggingDecrypter() override {}
149 150
150 // QuicDecrypter interface 151 // QuicDecrypter interface
151 bool SetKey(StringPiece key) override { return true; } 152 bool SetKey(StringPiece key) override { return true; }
153
152 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } 154 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; }
153 155
154 bool Decrypt(StringPiece nonce, 156 bool Decrypt(StringPiece nonce,
155 StringPiece associated_data, 157 StringPiece associated_data,
156 StringPiece ciphertext, 158 StringPiece ciphertext,
157 unsigned char* output, 159 unsigned char* output,
158 size_t* output_length) override { 160 size_t* output_length) override {
159 if (ciphertext.size() < kTagSize) { 161 if (ciphertext.size() < kTagSize) {
160 return false; 162 return false;
161 } 163 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 253
252 private: 254 private:
253 MockClock* clock_; 255 MockClock* clock_;
254 MockRandom* random_generator_; 256 MockRandom* random_generator_;
255 257
256 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper); 258 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper);
257 }; 259 };
258 260
259 class TestPacketWriter : public QuicPacketWriter { 261 class TestPacketWriter : public QuicPacketWriter {
260 public: 262 public:
261 explicit TestPacketWriter(QuicVersion version) 263 TestPacketWriter(QuicVersion version, MockClock *clock)
262 : version_(version), 264 : version_(version),
263 framer_(SupportedVersions(version_)), 265 framer_(SupportedVersions(version_)),
264 last_packet_size_(0), 266 last_packet_size_(0),
265 write_blocked_(false), 267 write_blocked_(false),
266 block_on_next_write_(false), 268 block_on_next_write_(false),
267 is_write_blocked_data_buffered_(false), 269 is_write_blocked_data_buffered_(false),
268 final_bytes_of_last_packet_(0), 270 final_bytes_of_last_packet_(0),
269 final_bytes_of_previous_packet_(0), 271 final_bytes_of_previous_packet_(0),
270 use_tagging_decrypter_(false), 272 use_tagging_decrypter_(false),
271 packets_write_attempts_(0) { 273 packets_write_attempts_(0),
274 clock_(clock),
275 write_pause_time_delta_(QuicTime::Delta::Zero()) {
272 } 276 }
273 277
274 // QuicPacketWriter interface 278 // QuicPacketWriter interface
275 WriteResult WritePacket(const char* buffer, 279 WriteResult WritePacket(const char* buffer,
276 size_t buf_len, 280 size_t buf_len,
277 const IPAddressNumber& self_address, 281 const IPAddressNumber& self_address,
278 const IPEndPoint& peer_address) override { 282 const IPEndPoint& peer_address) override {
279 QuicEncryptedPacket packet(buffer, buf_len); 283 QuicEncryptedPacket packet(buffer, buf_len);
280 ++packets_write_attempts_; 284 ++packets_write_attempts_;
281 285
282 if (packet.length() >= sizeof(final_bytes_of_last_packet_)) { 286 if (packet.length() >= sizeof(final_bytes_of_last_packet_)) {
283 final_bytes_of_previous_packet_ = final_bytes_of_last_packet_; 287 final_bytes_of_previous_packet_ = final_bytes_of_last_packet_;
284 memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4, 288 memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4,
285 sizeof(final_bytes_of_last_packet_)); 289 sizeof(final_bytes_of_last_packet_));
286 } 290 }
287 291
288 if (use_tagging_decrypter_) { 292 if (use_tagging_decrypter_) {
289 framer_.framer()->SetDecrypter(new TaggingDecrypter, ENCRYPTION_NONE); 293 framer_.framer()->SetDecrypter(new TaggingDecrypter, ENCRYPTION_NONE);
290 } 294 }
291 EXPECT_TRUE(framer_.ProcessPacket(packet)); 295 EXPECT_TRUE(framer_.ProcessPacket(packet));
292 if (block_on_next_write_) { 296 if (block_on_next_write_) {
293 write_blocked_ = true; 297 write_blocked_ = true;
294 block_on_next_write_ = false; 298 block_on_next_write_ = false;
295 } 299 }
296 if (IsWriteBlocked()) { 300 if (IsWriteBlocked()) {
297 return WriteResult(WRITE_STATUS_BLOCKED, -1); 301 return WriteResult(WRITE_STATUS_BLOCKED, -1);
298 } 302 }
299 last_packet_size_ = packet.length(); 303 last_packet_size_ = packet.length();
304
305 if (!write_pause_time_delta_.IsZero()) {
306 clock_->AdvanceTime(write_pause_time_delta_);
307 }
300 return WriteResult(WRITE_STATUS_OK, last_packet_size_); 308 return WriteResult(WRITE_STATUS_OK, last_packet_size_);
301 } 309 }
302 310
303 bool IsWriteBlockedDataBuffered() const override { 311 bool IsWriteBlockedDataBuffered() const override {
304 return is_write_blocked_data_buffered_; 312 return is_write_blocked_data_buffered_;
305 } 313 }
306 314
307 bool IsWriteBlocked() const override { return write_blocked_; } 315 bool IsWriteBlocked() const override { return write_blocked_; }
308 316
309 void SetWritable() override { write_blocked_ = false; } 317 void SetWritable() override { write_blocked_ = false; }
310 318
311 void BlockOnNextWrite() { block_on_next_write_ = true; } 319 void BlockOnNextWrite() { block_on_next_write_ = true; }
312 320
321 // Sets the amount of time that the writer should before the actual write.
322 void SetWritePauseTimeDelta(QuicTime::Delta delta) {
323 write_pause_time_delta_ = delta;
324 }
325
313 const QuicPacketHeader& header() { return framer_.header(); } 326 const QuicPacketHeader& header() { return framer_.header(); }
314 327
315 size_t frame_count() const { return framer_.num_frames(); } 328 size_t frame_count() const { return framer_.num_frames(); }
316 329
317 const vector<QuicAckFrame>& ack_frames() const { 330 const vector<QuicAckFrame>& ack_frames() const {
318 return framer_.ack_frames(); 331 return framer_.ack_frames();
319 } 332 }
320 333
321 const vector<QuicCongestionFeedbackFrame>& feedback_frames() const { 334 const vector<QuicCongestionFeedbackFrame>& feedback_frames() const {
322 return framer_.feedback_frames(); 335 return framer_.feedback_frames();
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 QuicVersion version_; 396 QuicVersion version_;
384 SimpleQuicFramer framer_; 397 SimpleQuicFramer framer_;
385 size_t last_packet_size_; 398 size_t last_packet_size_;
386 bool write_blocked_; 399 bool write_blocked_;
387 bool block_on_next_write_; 400 bool block_on_next_write_;
388 bool is_write_blocked_data_buffered_; 401 bool is_write_blocked_data_buffered_;
389 uint32 final_bytes_of_last_packet_; 402 uint32 final_bytes_of_last_packet_;
390 uint32 final_bytes_of_previous_packet_; 403 uint32 final_bytes_of_previous_packet_;
391 bool use_tagging_decrypter_; 404 bool use_tagging_decrypter_;
392 uint32 packets_write_attempts_; 405 uint32 packets_write_attempts_;
406 MockClock *clock_;
407 // If non-zero, the clock will pause during WritePacket for this amount of
408 // time.
409 QuicTime::Delta write_pause_time_delta_;
393 410
394 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter); 411 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter);
395 }; 412 };
396 413
397 class TestConnection : public QuicConnection { 414 class TestConnection : public QuicConnection {
398 public: 415 public:
399 TestConnection(QuicConnectionId connection_id, 416 TestConnection(QuicConnectionId connection_id,
400 IPEndPoint address, 417 IPEndPoint address,
401 TestConnectionHelper* helper, 418 TestConnectionHelper* helper,
402 const PacketWriterFactory& factory, 419 const PacketWriterFactory& factory,
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 607
591 private: 608 private:
592 QuicPacketHeader revived_header_; 609 QuicPacketHeader revived_header_;
593 }; 610 };
594 611
595 class MockPacketWriterFactory : public QuicConnection::PacketWriterFactory { 612 class MockPacketWriterFactory : public QuicConnection::PacketWriterFactory {
596 public: 613 public:
597 MockPacketWriterFactory(QuicPacketWriter* writer) { 614 MockPacketWriterFactory(QuicPacketWriter* writer) {
598 ON_CALL(*this, Create(_)).WillByDefault(Return(writer)); 615 ON_CALL(*this, Create(_)).WillByDefault(Return(writer));
599 } 616 }
600 virtual ~MockPacketWriterFactory() {} 617 ~MockPacketWriterFactory() override {}
601 618
602 MOCK_CONST_METHOD1(Create, QuicPacketWriter*(QuicConnection* connection)); 619 MOCK_CONST_METHOD1(Create, QuicPacketWriter*(QuicConnection* connection));
603 }; 620 };
604 621
605 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { 622 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
606 protected: 623 protected:
607 QuicConnectionTest() 624 QuicConnectionTest()
608 : connection_id_(42), 625 : connection_id_(42),
609 framer_(SupportedVersions(version()), QuicTime::Zero(), false), 626 framer_(SupportedVersions(version()), QuicTime::Zero(), false),
610 peer_creator_(connection_id_, &framer_, &random_generator_), 627 peer_creator_(connection_id_, &framer_, &random_generator_),
611 send_algorithm_(new StrictMock<MockSendAlgorithm>), 628 send_algorithm_(new StrictMock<MockSendAlgorithm>),
612 loss_algorithm_(new MockLossAlgorithm()), 629 loss_algorithm_(new MockLossAlgorithm()),
613 helper_(new TestConnectionHelper(&clock_, &random_generator_)), 630 helper_(new TestConnectionHelper(&clock_, &random_generator_)),
614 writer_(new TestPacketWriter(version())), 631 writer_(new TestPacketWriter(version(), &clock_)),
615 factory_(writer_.get()), 632 factory_(writer_.get()),
616 connection_(connection_id_, IPEndPoint(), helper_.get(), 633 connection_(connection_id_, IPEndPoint(), helper_.get(),
617 factory_, false, version()), 634 factory_, false, version()),
618 frame1_(1, false, 0, MakeIOVector(data1)), 635 frame1_(1, false, 0, MakeIOVector(data1)),
619 frame2_(1, false, 3, MakeIOVector(data2)), 636 frame2_(1, false, 3, MakeIOVector(data2)),
620 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), 637 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER),
621 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { 638 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) {
622 connection_.set_visitor(&visitor_); 639 connection_.set_visitor(&visitor_);
623 connection_.SetSendAlgorithm(send_algorithm_); 640 connection_.SetSendAlgorithm(send_algorithm_);
624 connection_.SetLossAlgorithm(loss_algorithm_); 641 connection_.SetLossAlgorithm(loss_algorithm_);
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 ProcessDataPacket(6000, 0, !kEntropyFlag); 984 ProcessDataPacket(6000, 0, !kEntropyFlag);
968 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == 985 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) ==
969 nullptr); 986 nullptr);
970 } 987 }
971 988
972 void BlockOnNextWrite() { 989 void BlockOnNextWrite() {
973 writer_->BlockOnNextWrite(); 990 writer_->BlockOnNextWrite();
974 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); 991 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1));
975 } 992 }
976 993
994 void SetWritePauseTimeDelta(QuicTime::Delta delta) {
995 writer_->SetWritePauseTimeDelta(delta);
996 }
997
977 void CongestionBlockWrites() { 998 void CongestionBlockWrites() {
978 EXPECT_CALL(*send_algorithm_, 999 EXPECT_CALL(*send_algorithm_,
979 TimeUntilSend(_, _, _)).WillRepeatedly( 1000 TimeUntilSend(_, _, _)).WillRepeatedly(
980 testing::Return(QuicTime::Delta::FromSeconds(1))); 1001 testing::Return(QuicTime::Delta::FromSeconds(1)));
981 } 1002 }
982 1003
983 void CongestionUnblockWrites() { 1004 void CongestionUnblockWrites() {
984 EXPECT_CALL(*send_algorithm_, 1005 EXPECT_CALL(*send_algorithm_,
985 TimeUntilSend(_, _, _)).WillRepeatedly( 1006 TimeUntilSend(_, _, _)).WillRepeatedly(
986 testing::Return(QuicTime::Delta::Zero())); 1007 testing::Return(QuicTime::Delta::Zero()));
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
1541 SendAckPacketToPeer(); // Packet 7 1562 SendAckPacketToPeer(); // Packet 7
1542 EXPECT_EQ(7u, least_unacked()); 1563 EXPECT_EQ(7u, least_unacked());
1543 1564
1544 // But if we send more data it should. 1565 // But if we send more data it should.
1545 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 8 1566 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 8
1546 EXPECT_EQ(8u, last_packet); 1567 EXPECT_EQ(8u, last_packet);
1547 SendAckPacketToPeer(); // Packet 9 1568 SendAckPacketToPeer(); // Packet 9
1548 EXPECT_EQ(7u, least_unacked()); 1569 EXPECT_EQ(7u, least_unacked());
1549 } 1570 }
1550 1571
1572 // If FLAGS_quic_record_send_time_before_write is disabled, QuicConnection
1573 // should record the packet sen-tdime after the packet is sent.
1574 TEST_P(QuicConnectionTest, RecordSentTimeAfterPacketSent) {
1575 ValueRestore<bool> old_flag(&FLAGS_quic_record_send_time_before_write, false);
1576 // We're using a MockClock for the tests, so we have complete control over the
1577 // time.
1578 // Our recorded timestamp for the last packet sent time will be passed in to
1579 // the send_algorithm. Make sure that it is set to the correct value.
1580 QuicTime actual_recorded_send_time = QuicTime::Zero();
1581 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
1582 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true)));
1583
1584 // First send without any pause and check the result.
1585 QuicTime expected_recorded_send_time = clock_.Now();
1586 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr);
1587 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time)
1588 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue()
1589 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue();
1590
1591 // Now pause during the write, and check the results.
1592 actual_recorded_send_time = QuicTime::Zero();
1593 const QuicTime::Delta kWritePauseTimeDelta =
1594 QuicTime::Delta::FromMilliseconds(5000);
1595 SetWritePauseTimeDelta(kWritePauseTimeDelta);
1596 expected_recorded_send_time = clock_.Now().Add(kWritePauseTimeDelta);
1597
1598 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
1599 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true)));
1600 connection_.SendStreamDataWithString(2, "baz", 0, !kFin, nullptr);
1601 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time)
1602 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue()
1603 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue();
1604 }
1605
1606 // If FLAGS_quic_record_send_time_before_write is enabled, QuicConnection should
1607 // record the the packet sent-time prior to sending the packet.
1608 TEST_P(QuicConnectionTest, RecordSentTimeBeforePacketSent) {
1609 ValueRestore<bool> old_flag(&FLAGS_quic_record_send_time_before_write, true);
1610 // We're using a MockClock for the tests, so we have complete control over the
1611 // time.
1612 // Our recorded timestamp for the last packet sent time will be passed in to
1613 // the send_algorithm. Make sure that it is set to the correct value.
1614 QuicTime actual_recorded_send_time = QuicTime::Zero();
1615 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
1616 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true)));
1617
1618 // First send without any pause and check the result.
1619 QuicTime expected_recorded_send_time = clock_.Now();
1620 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr);
1621 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time)
1622 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue()
1623 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue();
1624
1625 // Now pause during the write, and check the results.
1626 actual_recorded_send_time = QuicTime::Zero();
1627 const QuicTime::Delta kWritePauseTimeDelta =
1628 QuicTime::Delta::FromMilliseconds(5000);
1629 SetWritePauseTimeDelta(kWritePauseTimeDelta);
1630 expected_recorded_send_time = clock_.Now();
1631
1632 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
1633 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true)));
1634 connection_.SendStreamDataWithString(2, "baz", 0, !kFin, nullptr);
1635 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time)
1636 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue()
1637 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue();
1638 }
1639
1551 TEST_P(QuicConnectionTest, FECSending) { 1640 TEST_P(QuicConnectionTest, FECSending) {
1552 // All packets carry version info till version is negotiated. 1641 // All packets carry version info till version is negotiated.
1553 QuicPacketCreator* creator = 1642 QuicPacketCreator* creator =
1554 QuicConnectionPeer::GetPacketCreator(&connection_); 1643 QuicConnectionPeer::GetPacketCreator(&connection_);
1555 size_t payload_length; 1644 size_t payload_length;
1556 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining 1645 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining
1557 // packet length. The size of the offset field in a stream frame is 0 for 1646 // packet length. The size of the offset field in a stream frame is 0 for
1558 // offset 0, and 2 for non-zero offsets up through 64K. Increase 1647 // offset 0, and 2 for non-zero offsets up through 64K. Increase
1559 // max_packet_length by 2 so that subsequent packets containing subsequent 1648 // max_packet_length by 2 so that subsequent packets containing subsequent
1560 // stream frames with non-zero offets will fit within the packet length. 1649 // stream frames with non-zero offets will fit within the packet length.
1561 size_t length = 2 + GetPacketLengthForOneStream( 1650 size_t length = 2 + GetPacketLengthForOneStream(
1562 connection_.version(), kIncludeVersion, 1651 connection_.version(), kIncludeVersion,
1563 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER, 1652 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER,
1564 IN_FEC_GROUP, &payload_length); 1653 IN_FEC_GROUP, &payload_length);
1565 creator->set_max_packet_length(length); 1654 creator->set_max_packet_length(length);
1566 1655
1567 // Send 4 protected data packets, which should also trigger 1 FEC packet. 1656 // Send 4 protected data packets, which should also trigger 1 FEC packet.
1568 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(5); 1657 EXPECT_CALL(*send_algorithm_,
1658 OnPacketSent(_, _, _, _, HAS_RETRANSMITTABLE_DATA)).Times(5);
1569 // The first stream frame will have 2 fewer overhead bytes than the other 3. 1659 // The first stream frame will have 2 fewer overhead bytes than the other 3.
1570 const string payload(payload_length * 4 + 2, 'a'); 1660 const string payload(payload_length * 4 + 2, 'a');
1571 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, nullptr); 1661 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, nullptr);
1572 // Expect the FEC group to be closed after SendStreamDataWithString. 1662 // Expect the FEC group to be closed after SendStreamDataWithString.
1573 EXPECT_FALSE(creator->IsFecGroupOpen()); 1663 EXPECT_FALSE(creator->IsFecGroupOpen());
1574 EXPECT_FALSE(creator->IsFecProtected()); 1664 EXPECT_FALSE(creator->IsFecProtected());
1575 } 1665 }
1576 1666
1577 TEST_P(QuicConnectionTest, FECQueueing) { 1667 TEST_P(QuicConnectionTest, FECQueueing) {
1578 // All packets carry version info till version is negotiated. 1668 // All packets carry version info till version is negotiated.
(...skipping 15 matching lines...) Expand all
1594 EXPECT_FALSE(creator->IsFecProtected()); 1684 EXPECT_FALSE(creator->IsFecProtected());
1595 // Expect the first data packet and the fec packet to be queued. 1685 // Expect the first data packet and the fec packet to be queued.
1596 EXPECT_EQ(2u, connection_.NumQueuedPackets()); 1686 EXPECT_EQ(2u, connection_.NumQueuedPackets());
1597 } 1687 }
1598 1688
1599 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) { 1689 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) {
1600 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator( 1690 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator(
1601 &connection_)->IsFecEnabled()); 1691 &connection_)->IsFecEnabled());
1602 1692
1603 // 1 Data and 1 FEC packet. 1693 // 1 Data and 1 FEC packet.
1604 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); 1694 EXPECT_CALL(*send_algorithm_,
1695 OnPacketSent(_, _, _, _, HAS_RETRANSMITTABLE_DATA)).Times(2);
1605 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, nullptr); 1696 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, nullptr);
1606 1697
1607 const QuicTime::Delta retransmission_time = 1698 const QuicTime::Delta retransmission_time =
1608 QuicTime::Delta::FromMilliseconds(5000); 1699 QuicTime::Delta::FromMilliseconds(5000);
1609 clock_.AdvanceTime(retransmission_time); 1700 clock_.AdvanceTime(retransmission_time);
1610 1701
1611 // Abandon FEC packet and data packet. 1702 // Abandon FEC packet and data packet.
1612 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); 1703 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1613 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); 1704 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1614 EXPECT_CALL(visitor_, OnCanWrite()); 1705 EXPECT_CALL(visitor_, OnCanWrite());
1615 connection_.OnRetransmissionTimeout(); 1706 connection_.OnRetransmissionTimeout();
1616 } 1707 }
1617 1708
1618 TEST_P(QuicConnectionTest, DontAbandonAckedFEC) { 1709 TEST_P(QuicConnectionTest, DontAbandonAckedFEC) {
1619 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1710 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1620 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator( 1711 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator(
1621 &connection_)->IsFecEnabled()); 1712 &connection_)->IsFecEnabled());
1622 1713
1623 // 1 Data and 1 FEC packet. 1714 // 3 Data and 3 FEC packets.
1624 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); 1715 EXPECT_CALL(*send_algorithm_,
1716 OnPacketSent(_, _, _, _, HAS_RETRANSMITTABLE_DATA)).Times(6);
1625 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, nullptr); 1717 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, nullptr);
1626 // Send some more data afterwards to ensure early retransmit doesn't trigger. 1718 // Send some more data afterwards to ensure early retransmit doesn't trigger.
1627 connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, nullptr); 1719 connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, nullptr);
1628 connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, nullptr); 1720 connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, nullptr);
1629 1721
1630 QuicAckFrame ack_fec = InitAckFrame(2); 1722 QuicAckFrame ack_fec = InitAckFrame(2);
1631 // Data packet missing. 1723 // Data packet missing.
1632 // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was 1724 // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was
1633 // received, it would cause the covered packet to be acked as well. 1725 // received, it would cause the covered packet to be acked as well.
1634 NackPacket(1, &ack_fec); 1726 NackPacket(1, &ack_fec);
1635 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); 1727 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1636 ProcessAckPacket(&ack_fec); 1728 ProcessAckPacket(&ack_fec);
1637 clock_.AdvanceTime(DefaultRetransmissionTime()); 1729 clock_.AdvanceTime(DefaultRetransmissionTime());
1638 1730
1639 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent 1731 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent
1640 // FEC packets. 1732 // FEC packets.
1641 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); 1733 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1642 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); 1734 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
1643 connection_.GetRetransmissionAlarm()->Fire(); 1735 connection_.GetRetransmissionAlarm()->Fire();
1644 } 1736 }
1645 1737
1646 TEST_P(QuicConnectionTest, AbandonAllFEC) { 1738 TEST_P(QuicConnectionTest, AbandonAllFEC) {
1647 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1739 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1648 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator( 1740 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator(
1649 &connection_)->IsFecEnabled()); 1741 &connection_)->IsFecEnabled());
1650 1742
1651 // 1 Data and 1 FEC packet. 1743 // 3 Data and 3 FEC packet.
1652 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); 1744 EXPECT_CALL(*send_algorithm_,
1745 OnPacketSent(_, _, _, _, HAS_RETRANSMITTABLE_DATA)).Times(6);
1653 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, nullptr); 1746 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, nullptr);
1654 // Send some more data afterwards to ensure early retransmit doesn't trigger. 1747 // Send some more data afterwards to ensure early retransmit doesn't trigger.
1655 connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, nullptr); 1748 connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, nullptr);
1656 // Advance the time so not all the FEC packets are abandoned. 1749 // Advance the time so not all the FEC packets are abandoned.
1657 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); 1750 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
1658 connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, nullptr); 1751 connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, nullptr);
1659 1752
1660 QuicAckFrame ack_fec = InitAckFrame(5); 1753 QuicAckFrame ack_fec = InitAckFrame(5);
1661 // Ack all data packets, but no fec packets. 1754 // Ack all data packets, but no fec packets.
1662 NackPacket(2, &ack_fec); 1755 NackPacket(2, &ack_fec);
(...skipping 1400 matching lines...) Expand 10 before | Expand all | Expand 10 after
3063 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); 3156 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
3064 // Simulate delayed ack alarm firing. 3157 // Simulate delayed ack alarm firing.
3065 connection_.GetAckAlarm()->Fire(); 3158 connection_.GetAckAlarm()->Fire();
3066 // Check that ack is sent and that delayed ack alarm is reset. 3159 // Check that ack is sent and that delayed ack alarm is reset.
3067 EXPECT_EQ(2u, writer_->frame_count()); 3160 EXPECT_EQ(2u, writer_->frame_count());
3068 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); 3161 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
3069 EXPECT_FALSE(writer_->ack_frames().empty()); 3162 EXPECT_FALSE(writer_->ack_frames().empty());
3070 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); 3163 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
3071 } 3164 }
3072 3165
3073 TEST_P(QuicConnectionTest, SendEarlyDelayedAckForCrypto) { 3166 TEST_P(QuicConnectionTest, SendDelayedAckOnHandshakeConfirmed) {
3074 QuicTime ack_time = clock_.ApproximateNow();
3075 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3167 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3076 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
3077 // Process a packet from the crypto stream, which is frame1_'s default.
3078 ProcessPacket(1); 3168 ProcessPacket(1);
3079 // Check if delayed ack timer is running for the expected interval. 3169 // Check that ack is sent and that delayed ack alarm is set.
3170 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
3171 QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime());
3172 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
3173
3174 // Completing the handshake as the server does nothing.
3175 QuicConnectionPeer::SetIsServer(&connection_, true);
3176 connection_.OnHandshakeComplete();
3080 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); 3177 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
3081 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); 3178 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
3082 // Simulate delayed ack alarm firing. 3179
3083 connection_.GetAckAlarm()->Fire(); 3180 // Complete the handshake as the client decreases the delayed ack time to 0ms.
3084 // Check that ack is sent and that delayed ack alarm is reset. 3181 QuicConnectionPeer::SetIsServer(&connection_, false);
3085 EXPECT_EQ(2u, writer_->frame_count()); 3182 connection_.OnHandshakeComplete();
3086 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); 3183 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
3087 EXPECT_FALSE(writer_->ack_frames().empty()); 3184 EXPECT_EQ(clock_.ApproximateNow(), connection_.GetAckAlarm()->deadline());
3088 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
3089 } 3185 }
3090 3186
3091 TEST_P(QuicConnectionTest, SendDelayedAckOnSecondPacket) { 3187 TEST_P(QuicConnectionTest, SendDelayedAckOnSecondPacket) {
3092 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3188 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3093 ProcessPacket(1); 3189 ProcessPacket(1);
3094 ProcessPacket(2); 3190 ProcessPacket(2);
3095 // Check that ack is sent and that delayed ack alarm is reset. 3191 // Check that ack is sent and that delayed ack alarm is reset.
3096 EXPECT_EQ(2u, writer_->frame_count()); 3192 EXPECT_EQ(2u, writer_->frame_count());
3097 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); 3193 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
3098 EXPECT_FALSE(writer_->ack_frames().empty()); 3194 EXPECT_FALSE(writer_->ack_frames().empty());
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after
4096 QuicBlockedFrame blocked; 4192 QuicBlockedFrame blocked;
4097 blocked.stream_id = 3; 4193 blocked.stream_id = 3;
4098 EXPECT_CALL(visitor_, OnBlockedFrames(_)); 4194 EXPECT_CALL(visitor_, OnBlockedFrames(_));
4099 ProcessFramePacket(QuicFrame(&blocked)); 4195 ProcessFramePacket(QuicFrame(&blocked));
4100 EXPECT_TRUE(ack_alarm->IsSet()); 4196 EXPECT_TRUE(ack_alarm->IsSet());
4101 } 4197 }
4102 4198
4103 } // namespace 4199 } // namespace
4104 } // namespace test 4200 } // namespace test
4105 } // namespace net 4201 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.cc ('k') | net/quic/quic_crypto_client_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698