| OLD | NEW |
| 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/bind.h" | 7 #include "base/bind.h" |
| 8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
| 9 #include "net/quic/congestion_control/receive_algorithm_interface.h" | 9 #include "net/quic/congestion_control/receive_algorithm_interface.h" |
| 10 #include "net/quic/congestion_control/send_algorithm_interface.h" | 10 #include "net/quic/congestion_control/send_algorithm_interface.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 | 65 |
| 66 MOCK_METHOD4(RecordIncomingPacket, | 66 MOCK_METHOD4(RecordIncomingPacket, |
| 67 void(QuicByteCount, QuicPacketSequenceNumber, QuicTime, bool)); | 67 void(QuicByteCount, QuicPacketSequenceNumber, QuicTime, bool)); |
| 68 | 68 |
| 69 private: | 69 private: |
| 70 QuicCongestionFeedbackFrame* feedback_; | 70 QuicCongestionFeedbackFrame* feedback_; |
| 71 | 71 |
| 72 DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm); | 72 DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm); |
| 73 }; | 73 }; |
| 74 | 74 |
| 75 // TaggingEncrypter appends 16 bytes of |tag| to the end of each message. |
| 76 class TaggingEncrypter : public QuicEncrypter { |
| 77 public: |
| 78 explicit TaggingEncrypter(uint8_t tag) |
| 79 : tag_(tag) { |
| 80 } |
| 81 |
| 82 virtual ~TaggingEncrypter() {} |
| 83 |
| 84 // QuicEncrypter interface. |
| 85 virtual bool SetKey(StringPiece key) { return true; } |
| 86 virtual bool SetNoncePrefix(StringPiece nonce_prefix) { return true; } |
| 87 |
| 88 virtual bool Encrypt(StringPiece nonce, |
| 89 StringPiece associated_data, |
| 90 StringPiece plaintext, |
| 91 unsigned char* output) { |
| 92 memcpy(output, plaintext.data(), plaintext.size()); |
| 93 output += plaintext.size(); |
| 94 memset(output, tag_, kTagSize); |
| 95 return true; |
| 96 } |
| 97 |
| 98 virtual QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number, |
| 99 StringPiece associated_data, |
| 100 StringPiece plaintext) { |
| 101 const size_t len = plaintext.size() + kTagSize; |
| 102 uint8* buffer = new uint8[len]; |
| 103 Encrypt(StringPiece(), associated_data, plaintext, buffer); |
| 104 return new QuicData(reinterpret_cast<char*>(buffer), len, true); |
| 105 } |
| 106 |
| 107 virtual size_t GetKeySize() const { return 0; } |
| 108 virtual size_t GetNoncePrefixSize() const { return 0; } |
| 109 |
| 110 virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const { |
| 111 return ciphertext_size - kTagSize; |
| 112 } |
| 113 |
| 114 virtual size_t GetCiphertextSize(size_t plaintext_size) const { |
| 115 return plaintext_size + kTagSize; |
| 116 } |
| 117 |
| 118 virtual StringPiece GetKey() const { |
| 119 return StringPiece(); |
| 120 } |
| 121 |
| 122 virtual StringPiece GetNoncePrefix() const { |
| 123 return StringPiece(); |
| 124 } |
| 125 |
| 126 private: |
| 127 enum { |
| 128 kTagSize = 16, |
| 129 }; |
| 130 |
| 131 const uint8_t tag_; |
| 132 }; |
| 133 |
| 134 // TaggingDecrypter ensures that the final 16 bytes of the message all have the |
| 135 // same value and then removes them. |
| 136 class TaggingDecrypter : public QuicDecrypter { |
| 137 public: |
| 138 virtual ~TaggingDecrypter() {} |
| 139 |
| 140 // QuicDecrypter interface |
| 141 virtual bool SetKey(StringPiece key) { return true; } |
| 142 virtual bool SetNoncePrefix(StringPiece nonce_prefix) { return true; } |
| 143 |
| 144 virtual bool Decrypt(StringPiece nonce, |
| 145 StringPiece associated_data, |
| 146 StringPiece ciphertext, |
| 147 unsigned char* output, |
| 148 size_t* output_length) { |
| 149 if (ciphertext.size() < kTagSize) { |
| 150 return false; |
| 151 } |
| 152 if (!CheckTag(ciphertext)) { |
| 153 return false; |
| 154 } |
| 155 *output_length = ciphertext.size() - kTagSize; |
| 156 memcpy(output, ciphertext.data(), *output_length); |
| 157 return true; |
| 158 } |
| 159 |
| 160 virtual QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number, |
| 161 StringPiece associated_data, |
| 162 StringPiece ciphertext) { |
| 163 if (ciphertext.size() < kTagSize) { |
| 164 return NULL; |
| 165 } |
| 166 if (!CheckTag(ciphertext)) { |
| 167 return NULL; |
| 168 } |
| 169 const size_t len = ciphertext.size() - kTagSize; |
| 170 uint8* buf = new uint8[len]; |
| 171 memcpy(buf, ciphertext.data(), len); |
| 172 return new QuicData(reinterpret_cast<char*>(buf), len, |
| 173 true /* owns buffer */); |
| 174 } |
| 175 |
| 176 virtual StringPiece GetKey() const { return StringPiece(); } |
| 177 virtual StringPiece GetNoncePrefix() const { return StringPiece(); } |
| 178 |
| 179 private: |
| 180 enum { |
| 181 kTagSize = 16, |
| 182 }; |
| 183 |
| 184 bool CheckTag(StringPiece ciphertext) { |
| 185 uint8 tag = ciphertext.data()[ciphertext.size()-1]; |
| 186 for (size_t i = ciphertext.size() - kTagSize; i < ciphertext.size(); i++) { |
| 187 if (ciphertext.data()[i] != tag) { |
| 188 return false; |
| 189 } |
| 190 } |
| 191 |
| 192 return true; |
| 193 } |
| 194 }; |
| 195 |
| 75 class TestConnectionHelper : public QuicConnectionHelperInterface { | 196 class TestConnectionHelper : public QuicConnectionHelperInterface { |
| 76 public: | 197 public: |
| 77 TestConnectionHelper(MockClock* clock, MockRandom* random_generator) | 198 TestConnectionHelper(MockClock* clock, MockRandom* random_generator) |
| 78 : clock_(clock), | 199 : clock_(clock), |
| 79 random_generator_(random_generator), | 200 random_generator_(random_generator), |
| 80 retransmission_alarm_(QuicTime::Zero()), | 201 retransmission_alarm_(QuicTime::Zero()), |
| 81 send_alarm_(QuicTime::Zero().Subtract( | 202 send_alarm_(QuicTime::Zero().Subtract( |
| 82 QuicTime::Delta::FromMilliseconds(1))), | 203 QuicTime::Delta::FromMilliseconds(1))), |
| 83 timeout_alarm_(QuicTime::Zero()), | 204 timeout_alarm_(QuicTime::Zero()), |
| 84 blocked_(false), | 205 blocked_(false), |
| 85 is_server_(true) { | 206 is_server_(true), |
| 207 use_tagging_decrypter_(false) { |
| 86 } | 208 } |
| 87 | 209 |
| 88 // QuicConnectionHelperInterface | 210 // QuicConnectionHelperInterface |
| 89 virtual void SetConnection(QuicConnection* connection) OVERRIDE {} | 211 virtual void SetConnection(QuicConnection* connection) OVERRIDE {} |
| 90 | 212 |
| 91 virtual const QuicClock* GetClock() const OVERRIDE { | 213 virtual const QuicClock* GetClock() const OVERRIDE { |
| 92 return clock_; | 214 return clock_; |
| 93 } | 215 } |
| 94 | 216 |
| 95 virtual QuicRandom* GetRandomGenerator() OVERRIDE { | 217 virtual QuicRandom* GetRandomGenerator() OVERRIDE { |
| 96 return random_generator_; | 218 return random_generator_; |
| 97 } | 219 } |
| 98 | 220 |
| 99 virtual int WritePacketToWire(const QuicEncryptedPacket& packet, | 221 virtual int WritePacketToWire(const QuicEncryptedPacket& packet, |
| 100 int* error) OVERRIDE { | 222 int* error) OVERRIDE { |
| 101 QuicFramer framer(kQuicVersion1, | 223 if (packet.length() >= sizeof(final_bytes_of_last_packet_)) { |
| 102 QuicDecrypter::Create(kNULL), | 224 memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4, |
| 103 QuicEncrypter::Create(kNULL), | 225 sizeof(final_bytes_of_last_packet_)); |
| 104 QuicTime::Zero(), | 226 } |
| 105 is_server_); | 227 |
| 228 QuicFramer framer(kQuicVersion1, QuicTime::Zero(), is_server_); |
| 229 if (use_tagging_decrypter_) { |
| 230 framer.SetDecrypter(new TaggingDecrypter); |
| 231 } |
| 106 FramerVisitorCapturingFrames visitor; | 232 FramerVisitorCapturingFrames visitor; |
| 107 framer.set_visitor(&visitor); | 233 framer.set_visitor(&visitor); |
| 108 EXPECT_TRUE(framer.ProcessPacket(packet)); | 234 EXPECT_TRUE(framer.ProcessPacket(packet)); |
| 109 header_ = *visitor.header(); | 235 header_ = *visitor.header(); |
| 110 frame_count_ = visitor.frame_count(); | 236 frame_count_ = visitor.frame_count(); |
| 111 if (visitor.ack()) { | 237 if (visitor.ack()) { |
| 112 ack_.reset(new QuicAckFrame(*visitor.ack())); | 238 ack_.reset(new QuicAckFrame(*visitor.ack())); |
| 113 } | 239 } |
| 114 if (visitor.feedback()) { | 240 if (visitor.feedback()) { |
| 115 feedback_.reset(new QuicCongestionFeedbackFrame(*visitor.feedback())); | 241 feedback_.reset(new QuicCongestionFeedbackFrame(*visitor.feedback())); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 } | 311 } |
| 186 | 312 |
| 187 QuicVersionNegotiationPacket* version_negotiation_packet() { | 313 QuicVersionNegotiationPacket* version_negotiation_packet() { |
| 188 return version_negotiation_packet_.get(); | 314 return version_negotiation_packet_.get(); |
| 189 } | 315 } |
| 190 | 316 |
| 191 void set_blocked(bool blocked) { blocked_ = blocked; } | 317 void set_blocked(bool blocked) { blocked_ = blocked; } |
| 192 | 318 |
| 193 void set_is_server(bool is_server) { is_server_ = is_server; } | 319 void set_is_server(bool is_server) { is_server_ = is_server; } |
| 194 | 320 |
| 321 // final_bytes_of_last_packet_ returns the last four bytes of the previous |
| 322 // packet as a little-endian, uint32. This is intended to be used with a |
| 323 // TaggingEncrypter so that tests can determine which encrypter was used for |
| 324 // a given packet. |
| 325 uint32 final_bytes_of_last_packet() { return final_bytes_of_last_packet_; } |
| 326 |
| 327 void use_tagging_decrypter() { |
| 328 use_tagging_decrypter_ = true; |
| 329 } |
| 330 |
| 195 private: | 331 private: |
| 196 MockClock* clock_; | 332 MockClock* clock_; |
| 197 MockRandom* random_generator_; | 333 MockRandom* random_generator_; |
| 198 QuicTime retransmission_alarm_; | 334 QuicTime retransmission_alarm_; |
| 199 QuicTime send_alarm_; | 335 QuicTime send_alarm_; |
| 200 QuicTime timeout_alarm_; | 336 QuicTime timeout_alarm_; |
| 201 QuicPacketHeader header_; | 337 QuicPacketHeader header_; |
| 202 size_t frame_count_; | 338 size_t frame_count_; |
| 203 scoped_ptr<QuicAckFrame> ack_; | 339 scoped_ptr<QuicAckFrame> ack_; |
| 204 scoped_ptr<QuicCongestionFeedbackFrame> feedback_; | 340 scoped_ptr<QuicCongestionFeedbackFrame> feedback_; |
| 205 vector<QuicStreamFrame> stream_frames_; | 341 vector<QuicStreamFrame> stream_frames_; |
| 206 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; | 342 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; |
| 207 size_t last_packet_size_; | 343 size_t last_packet_size_; |
| 208 bool blocked_; | 344 bool blocked_; |
| 209 bool is_server_; | 345 bool is_server_; |
| 346 uint32 final_bytes_of_last_packet_; |
| 347 bool use_tagging_decrypter_; |
| 210 | 348 |
| 211 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper); | 349 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper); |
| 212 }; | 350 }; |
| 213 | 351 |
| 214 class TestConnection : public QuicConnection { | 352 class TestConnection : public QuicConnection { |
| 215 public: | 353 public: |
| 216 TestConnection(QuicGuid guid, | 354 TestConnection(QuicGuid guid, |
| 217 IPEndPoint address, | 355 IPEndPoint address, |
| 218 TestConnectionHelper* helper, | 356 TestConnectionHelper* helper, |
| 219 bool is_server) | 357 bool is_server) |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 private: | 397 private: |
| 260 TestConnectionHelper* helper_; | 398 TestConnectionHelper* helper_; |
| 261 | 399 |
| 262 DISALLOW_COPY_AND_ASSIGN(TestConnection); | 400 DISALLOW_COPY_AND_ASSIGN(TestConnection); |
| 263 }; | 401 }; |
| 264 | 402 |
| 265 class QuicConnectionTest : public ::testing::Test { | 403 class QuicConnectionTest : public ::testing::Test { |
| 266 protected: | 404 protected: |
| 267 QuicConnectionTest() | 405 QuicConnectionTest() |
| 268 : guid_(42), | 406 : guid_(42), |
| 269 framer_(kQuicVersion1, | 407 framer_(kQuicVersion1, QuicTime::Zero(), false), |
| 270 QuicDecrypter::Create(kNULL), | |
| 271 QuicEncrypter::Create(kNULL), | |
| 272 QuicTime::Zero(), | |
| 273 false), | |
| 274 creator_(guid_, &framer_, QuicRandom::GetInstance(), false), | 408 creator_(guid_, &framer_, QuicRandom::GetInstance(), false), |
| 275 send_algorithm_(new StrictMock<MockSendAlgorithm>), | 409 send_algorithm_(new StrictMock<MockSendAlgorithm>), |
| 276 helper_(new TestConnectionHelper(&clock_, &random_generator_)), | 410 helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
| 277 connection_(guid_, IPEndPoint(), helper_, false), | 411 connection_(guid_, IPEndPoint(), helper_, false), |
| 278 frame1_(1, false, 0, data1), | 412 frame1_(1, false, 0, data1), |
| 279 frame2_(1, false, 3, data2), | 413 frame2_(1, false, 3, data2), |
| 280 accept_packet_(true) { | 414 accept_packet_(true) { |
| 281 connection_.set_visitor(&visitor_); | 415 connection_.set_visitor(&visitor_); |
| 282 connection_.SetSendAlgorithm(send_algorithm_); | 416 connection_.SetSendAlgorithm(send_algorithm_); |
| 283 // Simplify tests by not sending feedback unless specifically configured. | 417 // Simplify tests by not sending feedback unless specifically configured. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 302 } | 436 } |
| 303 | 437 |
| 304 QuicPacketHeader* last_header() { | 438 QuicPacketHeader* last_header() { |
| 305 return helper_->header(); | 439 return helper_->header(); |
| 306 } | 440 } |
| 307 | 441 |
| 308 size_t last_sent_packet_size() { | 442 size_t last_sent_packet_size() { |
| 309 return helper_->last_packet_size(); | 443 return helper_->last_packet_size(); |
| 310 } | 444 } |
| 311 | 445 |
| 446 uint32_t final_bytes_of_last_packet() { |
| 447 return helper_->final_bytes_of_last_packet(); |
| 448 } |
| 449 |
| 450 void use_tagging_decrypter() { |
| 451 helper_->use_tagging_decrypter(); |
| 452 } |
| 453 |
| 312 void ProcessPacket(QuicPacketSequenceNumber number) { | 454 void ProcessPacket(QuicPacketSequenceNumber number) { |
| 313 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)) | 455 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)) |
| 314 .WillOnce(Return(accept_packet_)); | 456 .WillOnce(Return(accept_packet_)); |
| 315 ProcessDataPacket(number, 0, !kEntropyFlag); | 457 ProcessDataPacket(number, 0, !kEntropyFlag); |
| 316 } | 458 } |
| 317 | 459 |
| 318 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { | 460 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { |
| 319 QuicFrames frames; | 461 QuicFrames frames; |
| 320 frames.push_back(QuicFrame(frame)); | 462 frames.push_back(QuicFrame(frame)); |
| 321 QuicPacketCreatorPeer::SetSendVersionInPacket(&creator_, | 463 QuicPacketCreatorPeer::SetSendVersionInPacket(&creator_, |
| 322 connection_.is_server()); | 464 connection_.is_server()); |
| 323 SerializedPacket serialized_packet = creator_.SerializeAllFrames(frames); | 465 SerializedPacket serialized_packet = creator_.SerializeAllFrames(frames); |
| 324 scoped_ptr<QuicPacket> packet(serialized_packet.packet); | 466 scoped_ptr<QuicPacket> packet(serialized_packet.packet); |
| 325 scoped_ptr<QuicEncryptedPacket> encrypted( | 467 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 326 framer_.EncryptPacket(serialized_packet.sequence_number, *packet)); | 468 framer_.EncryptPacket(ENCRYPTION_NONE, |
| 469 serialized_packet.sequence_number, *packet)); |
| 327 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 470 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 328 return serialized_packet.entropy_hash; | 471 return serialized_packet.entropy_hash; |
| 329 } | 472 } |
| 330 | 473 |
| 331 size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number, | 474 size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number, |
| 332 bool expect_revival) { | 475 bool expect_revival) { |
| 333 if (expect_revival) { | 476 if (expect_revival) { |
| 334 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(2).WillRepeatedly( | 477 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(2).WillRepeatedly( |
| 335 Return(accept_packet_)); | 478 Return(accept_packet_)); |
| 336 } else { | 479 } else { |
| 337 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce( | 480 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce( |
| 338 Return(accept_packet_)); | 481 Return(accept_packet_)); |
| 339 } | 482 } |
| 340 return ProcessDataPacket(number, 1, !kEntropyFlag); | 483 return ProcessDataPacket(number, 1, !kEntropyFlag); |
| 341 } | 484 } |
| 342 | 485 |
| 343 size_t ProcessDataPacket(QuicPacketSequenceNumber number, | 486 size_t ProcessDataPacket(QuicPacketSequenceNumber number, |
| 344 QuicFecGroupNumber fec_group, | 487 QuicFecGroupNumber fec_group, |
| 345 bool entropy_flag) { | 488 bool entropy_flag) { |
| 346 scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group, | 489 scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group, |
| 347 entropy_flag)); | 490 entropy_flag)); |
| 348 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(number, | 491 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( |
| 349 *packet)); | 492 ENCRYPTION_NONE, number, *packet)); |
| 350 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 493 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 351 return encrypted->length(); | 494 return encrypted->length(); |
| 352 } | 495 } |
| 353 | 496 |
| 354 void ProcessClosePacket(QuicPacketSequenceNumber number, | 497 void ProcessClosePacket(QuicPacketSequenceNumber number, |
| 355 QuicFecGroupNumber fec_group) { | 498 QuicFecGroupNumber fec_group) { |
| 356 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group)); | 499 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group)); |
| 357 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(number, | 500 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( |
| 358 *packet)); | 501 ENCRYPTION_NONE, number, *packet)); |
| 359 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 502 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 360 } | 503 } |
| 361 | 504 |
| 362 size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number, | 505 size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number, |
| 363 bool expect_revival, bool entropy_flag) { | 506 bool expect_revival, bool entropy_flag) { |
| 364 if (expect_revival) { | 507 if (expect_revival) { |
| 365 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll( | 508 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll( |
| 366 SaveArg<2>(&revived_header_), Return(accept_packet_))); | 509 SaveArg<2>(&revived_header_), Return(accept_packet_))); |
| 367 } | 510 } |
| 368 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(Return(accept_packet_)) | 511 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(Return(accept_packet_)) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 for (size_t i = GetStartOfFecProtectedData( | 545 for (size_t i = GetStartOfFecProtectedData( |
| 403 header_.public_header.version_flag); | 546 header_.public_header.version_flag); |
| 404 i < data_packet->length(); ++i) { | 547 i < data_packet->length(); ++i) { |
| 405 data_packet->mutable_data()[i] ^= data_packet->data()[i]; | 548 data_packet->mutable_data()[i] ^= data_packet->data()[i]; |
| 406 } | 549 } |
| 407 } | 550 } |
| 408 fec_data.redundancy = data_packet->FecProtectedData(); | 551 fec_data.redundancy = data_packet->FecProtectedData(); |
| 409 scoped_ptr<QuicPacket> fec_packet( | 552 scoped_ptr<QuicPacket> fec_packet( |
| 410 framer_.ConstructFecPacket(header_, fec_data).packet); | 553 framer_.ConstructFecPacket(header_, fec_data).packet); |
| 411 scoped_ptr<QuicEncryptedPacket> encrypted( | 554 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 412 framer_.EncryptPacket(number, *fec_packet)); | 555 framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet)); |
| 413 | 556 |
| 414 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 557 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 415 return encrypted->length(); | 558 return encrypted->length(); |
| 416 } | 559 } |
| 417 | 560 |
| 418 QuicByteCount SendStreamDataToPeer(QuicStreamId id, StringPiece data, | 561 QuicByteCount SendStreamDataToPeer(QuicStreamId id, StringPiece data, |
| 419 QuicStreamOffset offset, bool fin, | 562 QuicStreamOffset offset, bool fin, |
| 420 QuicPacketSequenceNumber* last_packet) { | 563 QuicPacketSequenceNumber* last_packet) { |
| 421 QuicByteCount packet_size; | 564 QuicByteCount packet_size; |
| 422 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( | 565 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( |
| (...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 EXPECT_EQ(default_retransmission_time, helper_->retransmission_alarm()); | 1286 EXPECT_EQ(default_retransmission_time, helper_->retransmission_alarm()); |
| 1144 // Simulate the retransimission alarm firing | 1287 // Simulate the retransimission alarm firing |
| 1145 clock_.AdvanceTime(kDefaultRetransmissionTime); | 1288 clock_.AdvanceTime(kDefaultRetransmissionTime); |
| 1146 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); | 1289 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
| 1147 EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1); | 1290 EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1); |
| 1148 connection_.RetransmitPacket(1); | 1291 connection_.RetransmitPacket(1); |
| 1149 EXPECT_EQ(2u, last_header()->packet_sequence_number); | 1292 EXPECT_EQ(2u, last_header()->packet_sequence_number); |
| 1150 EXPECT_EQ(2u, outgoing_ack()->sent_info.least_unacked); | 1293 EXPECT_EQ(2u, outgoing_ack()->sent_info.least_unacked); |
| 1151 } | 1294 } |
| 1152 | 1295 |
| 1296 TEST_F(QuicConnectionTest, RetransmitWithSameEncryptionLevel) { |
| 1297 const QuicTime::Delta kDefaultRetransmissionTime = |
| 1298 QuicTime::Delta::FromMilliseconds(500); |
| 1299 |
| 1300 QuicTime default_retransmission_time = clock_.ApproximateNow().Add( |
| 1301 kDefaultRetransmissionTime); |
| 1302 use_tagging_decrypter(); |
| 1303 |
| 1304 // A TaggingEncrypter puts 16 copies of the given byte (0x01 here) at the end |
| 1305 // of the packet. We can test this to check which encrypter was used. |
| 1306 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); |
| 1307 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL); |
| 1308 EXPECT_EQ(0x01010101u, final_bytes_of_last_packet()); |
| 1309 |
| 1310 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); |
| 1311 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); |
| 1312 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL); |
| 1313 EXPECT_EQ(0x02020202u, final_bytes_of_last_packet()); |
| 1314 |
| 1315 EXPECT_EQ(default_retransmission_time, helper_->retransmission_alarm()); |
| 1316 // Simulate the retransimission alarm firing |
| 1317 clock_.AdvanceTime(kDefaultRetransmissionTime); |
| 1318 EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2); |
| 1319 |
| 1320 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
| 1321 connection_.RetransmitPacket(1); |
| 1322 // Packet should have been sent with ENCRYPTION_NONE. |
| 1323 EXPECT_EQ(0x01010101u, final_bytes_of_last_packet()); |
| 1324 |
| 1325 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
| 1326 connection_.RetransmitPacket(2); |
| 1327 // Packet should have been sent with ENCRYPTION_INITIAL. |
| 1328 EXPECT_EQ(0x02020202u, final_bytes_of_last_packet()); |
| 1329 } |
| 1330 |
| 1153 TEST_F(QuicConnectionTest, TestRetransmitOrder) { | 1331 TEST_F(QuicConnectionTest, TestRetransmitOrder) { |
| 1154 QuicByteCount first_packet_size; | 1332 QuicByteCount first_packet_size; |
| 1155 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( | 1333 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( |
| 1156 SaveArg<2>(&first_packet_size)); | 1334 SaveArg<2>(&first_packet_size)); |
| 1157 EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2); | 1335 EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2); |
| 1158 | 1336 |
| 1159 connection_.SendStreamData(1, "first_packet", 0, !kFin); | 1337 connection_.SendStreamData(1, "first_packet", 0, !kFin); |
| 1160 QuicByteCount second_packet_size; | 1338 QuicByteCount second_packet_size; |
| 1161 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( | 1339 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( |
| 1162 SaveArg<2>(&second_packet_size)); | 1340 SaveArg<2>(&second_packet_size)); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1348 | 1526 |
| 1349 // TODO(ianswett): Add scheduler tests when should_retransmit is false. | 1527 // TODO(ianswett): Add scheduler tests when should_retransmit is false. |
| 1350 TEST_F(QuicConnectionTest, SendScheduler) { | 1528 TEST_F(QuicConnectionTest, SendScheduler) { |
| 1351 // Test that if we send a packet without delay, it is not queued. | 1529 // Test that if we send a packet without delay, it is not queued. |
| 1352 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1530 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1353 EXPECT_CALL(*send_algorithm_, | 1531 EXPECT_CALL(*send_algorithm_, |
| 1354 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1532 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1355 testing::Return(QuicTime::Delta::Zero())); | 1533 testing::Return(QuicTime::Delta::Zero())); |
| 1356 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); | 1534 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
| 1357 connection_.SendOrQueuePacket( | 1535 connection_.SendOrQueuePacket( |
| 1358 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1536 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1359 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1537 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1360 } | 1538 } |
| 1361 | 1539 |
| 1362 TEST_F(QuicConnectionTest, SendSchedulerDelay) { | 1540 TEST_F(QuicConnectionTest, SendSchedulerDelay) { |
| 1363 // Test that if we send a packet with a delay, it ends up queued. | 1541 // Test that if we send a packet with a delay, it ends up queued. |
| 1364 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1542 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1365 EXPECT_CALL(*send_algorithm_, | 1543 EXPECT_CALL(*send_algorithm_, |
| 1366 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1544 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1367 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | 1545 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
| 1368 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); | 1546 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); |
| 1369 connection_.SendOrQueuePacket( | 1547 connection_.SendOrQueuePacket( |
| 1370 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1548 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1371 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1549 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1372 } | 1550 } |
| 1373 | 1551 |
| 1374 TEST_F(QuicConnectionTest, SendSchedulerForce) { | 1552 TEST_F(QuicConnectionTest, SendSchedulerForce) { |
| 1375 // Test that if we force send a packet, it is not queued. | 1553 // Test that if we force send a packet, it is not queued. |
| 1376 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1554 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1377 EXPECT_CALL(*send_algorithm_, | 1555 EXPECT_CALL(*send_algorithm_, |
| 1378 TimeUntilSend(_, IS_RETRANSMISSION, _)).Times(0); | 1556 TimeUntilSend(_, IS_RETRANSMISSION, _)).Times(0); |
| 1379 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); | 1557 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
| 1380 connection_.SendOrQueuePacket( | 1558 connection_.SendOrQueuePacket( |
| 1381 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1559 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1382 // XXX: fixme. was: connection_.SendOrQueuePacket(1, packet, kForce); | 1560 // XXX: fixme. was: connection_.SendOrQueuePacket(1, packet, kForce); |
| 1383 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1561 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1384 } | 1562 } |
| 1385 | 1563 |
| 1386 TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) { | 1564 TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) { |
| 1387 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1565 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1388 helper_->set_blocked(true); | 1566 helper_->set_blocked(true); |
| 1389 EXPECT_CALL(*send_algorithm_, | 1567 EXPECT_CALL(*send_algorithm_, |
| 1390 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1568 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1391 testing::Return(QuicTime::Delta::Zero())); | 1569 testing::Return(QuicTime::Delta::Zero())); |
| 1392 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); | 1570 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); |
| 1393 connection_.SendOrQueuePacket( | 1571 connection_.SendOrQueuePacket( |
| 1394 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1572 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1395 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1573 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1396 } | 1574 } |
| 1397 | 1575 |
| 1398 TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) { | 1576 TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) { |
| 1399 // Test that if we send a packet with a delay, it ends up queued. | 1577 // Test that if we send a packet with a delay, it ends up queued. |
| 1400 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1578 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1401 EXPECT_CALL(*send_algorithm_, | 1579 EXPECT_CALL(*send_algorithm_, |
| 1402 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1580 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1403 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | 1581 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
| 1404 connection_.SendOrQueuePacket( | 1582 connection_.SendOrQueuePacket( |
| 1405 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1583 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1406 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1584 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1407 | 1585 |
| 1408 // Advance the clock to fire the alarm, and configure the scheduler | 1586 // Advance the clock to fire the alarm, and configure the scheduler |
| 1409 // to permit the packet to be sent. | 1587 // to permit the packet to be sent. |
| 1410 EXPECT_CALL(*send_algorithm_, | 1588 EXPECT_CALL(*send_algorithm_, |
| 1411 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillRepeatedly( | 1589 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillRepeatedly( |
| 1412 testing::Return(QuicTime::Delta::Zero())); | 1590 testing::Return(QuicTime::Delta::Zero())); |
| 1413 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); | 1591 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); |
| 1414 helper_->UnregisterSendAlarmIfRegistered(); | 1592 helper_->UnregisterSendAlarmIfRegistered(); |
| 1415 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); | 1593 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1450 connection_.OnCanWrite(); | 1628 connection_.OnCanWrite(); |
| 1451 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1629 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1452 } | 1630 } |
| 1453 | 1631 |
| 1454 TEST_F(QuicConnectionTest, SendSchedulerDelayAndQueue) { | 1632 TEST_F(QuicConnectionTest, SendSchedulerDelayAndQueue) { |
| 1455 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1633 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1456 EXPECT_CALL(*send_algorithm_, | 1634 EXPECT_CALL(*send_algorithm_, |
| 1457 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1635 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1458 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | 1636 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
| 1459 connection_.SendOrQueuePacket( | 1637 connection_.SendOrQueuePacket( |
| 1460 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1638 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1461 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1639 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1462 | 1640 |
| 1463 // Attempt to send another packet and make sure that it gets queued. | 1641 // Attempt to send another packet and make sure that it gets queued. |
| 1464 packet = ConstructDataPacket(2, 0, !kEntropyFlag); | 1642 packet = ConstructDataPacket(2, 0, !kEntropyFlag); |
| 1465 connection_.SendOrQueuePacket( | 1643 connection_.SendOrQueuePacket( |
| 1466 2, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1644 ENCRYPTION_NONE, 2, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1467 EXPECT_EQ(2u, connection_.NumQueuedPackets()); | 1645 EXPECT_EQ(2u, connection_.NumQueuedPackets()); |
| 1468 } | 1646 } |
| 1469 | 1647 |
| 1470 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) { | 1648 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) { |
| 1471 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1649 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1472 EXPECT_CALL(*send_algorithm_, | 1650 EXPECT_CALL(*send_algorithm_, |
| 1473 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1651 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1474 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | 1652 testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
| 1475 connection_.SendOrQueuePacket( | 1653 connection_.SendOrQueuePacket( |
| 1476 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1654 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1477 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1655 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1478 | 1656 |
| 1479 // Now send non-retransmitting information, that we're not going to | 1657 // Now send non-retransmitting information, that we're not going to |
| 1480 // retransmit 3. The far end should stop waiting for it. | 1658 // retransmit 3. The far end should stop waiting for it. |
| 1481 QuicAckFrame frame(0, QuicTime::Zero(), 1); | 1659 QuicAckFrame frame(0, QuicTime::Zero(), 1); |
| 1482 EXPECT_CALL(*send_algorithm_, | 1660 EXPECT_CALL(*send_algorithm_, |
| 1483 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillRepeatedly( | 1661 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillRepeatedly( |
| 1484 testing::Return(QuicTime::Delta::Zero())); | 1662 testing::Return(QuicTime::Delta::Zero())); |
| 1485 EXPECT_CALL(*send_algorithm_, | 1663 EXPECT_CALL(*send_algorithm_, |
| 1486 SentPacket(_, _, _, _)); | 1664 SentPacket(_, _, _, _)); |
| 1487 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); | 1665 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); |
| 1488 ProcessAckPacket(&frame); | 1666 ProcessAckPacket(&frame); |
| 1489 | 1667 |
| 1490 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1668 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1491 // Ensure alarm is not set | 1669 // Ensure alarm is not set |
| 1492 EXPECT_FALSE(helper_->IsSendAlarmSet()); | 1670 EXPECT_FALSE(helper_->IsSendAlarmSet()); |
| 1493 } | 1671 } |
| 1494 | 1672 |
| 1495 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) { | 1673 TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) { |
| 1496 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1674 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1497 EXPECT_CALL(*send_algorithm_, | 1675 EXPECT_CALL(*send_algorithm_, |
| 1498 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1676 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1499 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | 1677 testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
| 1500 connection_.SendOrQueuePacket( | 1678 connection_.SendOrQueuePacket( |
| 1501 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1679 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1502 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1680 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1503 | 1681 |
| 1504 // Now send non-retransmitting information, that we're not going to | 1682 // Now send non-retransmitting information, that we're not going to |
| 1505 // retransmit 3. The far end should stop waiting for it. | 1683 // retransmit 3. The far end should stop waiting for it. |
| 1506 QuicAckFrame frame(0, QuicTime::Zero(), 1); | 1684 QuicAckFrame frame(0, QuicTime::Zero(), 1); |
| 1507 EXPECT_CALL(*send_algorithm_, | 1685 EXPECT_CALL(*send_algorithm_, |
| 1508 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1686 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1509 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | 1687 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
| 1510 ProcessAckPacket(&frame); | 1688 ProcessAckPacket(&frame); |
| 1511 | 1689 |
| 1512 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1690 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1513 } | 1691 } |
| 1514 | 1692 |
| 1515 TEST_F(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { | 1693 TEST_F(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { |
| 1516 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1694 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1517 EXPECT_CALL(*send_algorithm_, | 1695 EXPECT_CALL(*send_algorithm_, |
| 1518 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1696 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1519 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | 1697 testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
| 1520 connection_.SendOrQueuePacket( | 1698 connection_.SendOrQueuePacket( |
| 1521 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1699 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1522 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1700 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1523 | 1701 |
| 1524 // OnCanWrite should not send the packet (because of the delay) | 1702 // OnCanWrite should not send the packet (because of the delay) |
| 1525 // but should still return true. | 1703 // but should still return true. |
| 1526 EXPECT_TRUE(connection_.OnCanWrite()); | 1704 EXPECT_TRUE(connection_.OnCanWrite()); |
| 1527 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1705 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1528 } | 1706 } |
| 1529 | 1707 |
| 1530 TEST_F(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { | 1708 TEST_F(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
| 1531 // Limit to one byte per packet. | 1709 // Limit to one byte per packet. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1563 } | 1741 } |
| 1564 | 1742 |
| 1565 TEST_F(QuicConnectionTest, SendWhenDisconnected) { | 1743 TEST_F(QuicConnectionTest, SendWhenDisconnected) { |
| 1566 EXPECT_TRUE(connection_.connected()); | 1744 EXPECT_TRUE(connection_.connected()); |
| 1567 EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, false)); | 1745 EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, false)); |
| 1568 connection_.CloseConnection(QUIC_PEER_GOING_AWAY, false); | 1746 connection_.CloseConnection(QUIC_PEER_GOING_AWAY, false); |
| 1569 EXPECT_FALSE(connection_.connected()); | 1747 EXPECT_FALSE(connection_.connected()); |
| 1570 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 1748 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
| 1571 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); | 1749 EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); |
| 1572 connection_.SendOrQueuePacket( | 1750 connection_.SendOrQueuePacket( |
| 1573 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 1751 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
| 1574 } | 1752 } |
| 1575 | 1753 |
| 1576 TEST_F(QuicConnectionTest, PublicReset) { | 1754 TEST_F(QuicConnectionTest, PublicReset) { |
| 1577 QuicPublicResetPacket header; | 1755 QuicPublicResetPacket header; |
| 1578 header.public_header.guid = guid_; | 1756 header.public_header.guid = guid_; |
| 1579 header.public_header.reset_flag = true; | 1757 header.public_header.reset_flag = true; |
| 1580 header.public_header.version_flag = false; | 1758 header.public_header.version_flag = false; |
| 1581 header.rejected_sequence_number = 10101; | 1759 header.rejected_sequence_number = 10101; |
| 1582 scoped_ptr<QuicEncryptedPacket> packet( | 1760 scoped_ptr<QuicEncryptedPacket> packet( |
| 1583 framer_.ConstructPublicResetPacket(header)); | 1761 framer_.ConstructPublicResetPacket(header)); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1682 QuicPacketSequenceNumber max_sequence_number = 51; | 1860 QuicPacketSequenceNumber max_sequence_number = 51; |
| 1683 for (QuicPacketSequenceNumber i = 1; i <= max_sequence_number; ++i) { | 1861 for (QuicPacketSequenceNumber i = 1; i <= max_sequence_number; ++i) { |
| 1684 bool is_missing = i % 10 != 0; | 1862 bool is_missing = i % 10 != 0; |
| 1685 bool entropy_flag = (i & (i - 1)) != 0; | 1863 bool entropy_flag = (i & (i - 1)) != 0; |
| 1686 QuicPacketEntropyHash packet_entropy_hash = 0; | 1864 QuicPacketEntropyHash packet_entropy_hash = 0; |
| 1687 if (entropy_flag) { | 1865 if (entropy_flag) { |
| 1688 packet_entropy_hash = 1 << (i % 8); | 1866 packet_entropy_hash = 1 << (i % 8); |
| 1689 } | 1867 } |
| 1690 QuicPacket* packet = ConstructDataPacket(i, 0, entropy_flag); | 1868 QuicPacket* packet = ConstructDataPacket(i, 0, entropy_flag); |
| 1691 connection_.SendOrQueuePacket( | 1869 connection_.SendOrQueuePacket( |
| 1692 i, packet, packet_entropy_hash, HAS_RETRANSMITTABLE_DATA); | 1870 ENCRYPTION_NONE, i, packet, packet_entropy_hash, |
| 1871 HAS_RETRANSMITTABLE_DATA); |
| 1693 | 1872 |
| 1694 if (is_missing) { | 1873 if (is_missing) { |
| 1695 missing_packets.insert(i); | 1874 missing_packets.insert(i); |
| 1696 continue; | 1875 continue; |
| 1697 } | 1876 } |
| 1698 | 1877 |
| 1699 entropy_hash ^= packet_entropy_hash; | 1878 entropy_hash ^= packet_entropy_hash; |
| 1700 } | 1879 } |
| 1701 EXPECT_TRUE(QuicConnectionPeer::IsValidEntropy( | 1880 EXPECT_TRUE(QuicConnectionPeer::IsValidEntropy( |
| 1702 &connection_, max_sequence_number, missing_packets, entropy_hash)) | 1881 &connection_, max_sequence_number, missing_packets, entropy_hash)) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1716 header.fec_flag = false; | 1895 header.fec_flag = false; |
| 1717 header.fec_entropy_flag = false; | 1896 header.fec_entropy_flag = false; |
| 1718 header.packet_sequence_number = 12; | 1897 header.packet_sequence_number = 12; |
| 1719 header.fec_group = 0; | 1898 header.fec_group = 0; |
| 1720 | 1899 |
| 1721 QuicFrames frames; | 1900 QuicFrames frames; |
| 1722 QuicFrame frame(&frame1_); | 1901 QuicFrame frame(&frame1_); |
| 1723 frames.push_back(frame); | 1902 frames.push_back(frame); |
| 1724 scoped_ptr<QuicPacket> packet( | 1903 scoped_ptr<QuicPacket> packet( |
| 1725 framer_.ConstructFrameDataPacket(header, frames).packet); | 1904 framer_.ConstructFrameDataPacket(header, frames).packet); |
| 1726 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(12, *packet)); | 1905 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 1906 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
| 1727 | 1907 |
| 1728 QuicFramerPeer::SetVersion(&framer_, kQuicVersion1); | 1908 QuicFramerPeer::SetVersion(&framer_, kQuicVersion1); |
| 1729 connection_.set_is_server(true); | 1909 connection_.set_is_server(true); |
| 1730 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 1910 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 1731 EXPECT_TRUE(helper_->version_negotiation_packet() != NULL); | 1911 EXPECT_TRUE(helper_->version_negotiation_packet() != NULL); |
| 1732 EXPECT_EQ(1u, | 1912 EXPECT_EQ(1u, |
| 1733 helper_->version_negotiation_packet()->versions.size()); | 1913 helper_->version_negotiation_packet()->versions.size()); |
| 1734 EXPECT_EQ(kQuicVersion1, | 1914 EXPECT_EQ(kQuicVersion1, |
| 1735 helper_->version_negotiation_packet()->versions[0]); | 1915 helper_->version_negotiation_packet()->versions[0]); |
| 1736 } | 1916 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1804 EXPECT_EQ(received_bytes, stats.bytes_received); | 1984 EXPECT_EQ(received_bytes, stats.bytes_received); |
| 1805 EXPECT_EQ(4u, stats.packets_received); | 1985 EXPECT_EQ(4u, stats.packets_received); |
| 1806 | 1986 |
| 1807 EXPECT_EQ(1u, stats.packets_revived); | 1987 EXPECT_EQ(1u, stats.packets_revived); |
| 1808 EXPECT_EQ(1u, stats.packets_dropped); | 1988 EXPECT_EQ(1u, stats.packets_dropped); |
| 1809 } | 1989 } |
| 1810 | 1990 |
| 1811 } // namespace | 1991 } // namespace |
| 1812 } // namespace test | 1992 } // namespace test |
| 1813 } // namespace net | 1993 } // namespace net |
| OLD | NEW |