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