| 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/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| 11 #include "net/quic/congestion_control/loss_detection_interface.h" | 11 #include "net/quic/congestion_control/loss_detection_interface.h" |
| 12 #include "net/quic/congestion_control/receive_algorithm_interface.h" | |
| 13 #include "net/quic/congestion_control/send_algorithm_interface.h" | 12 #include "net/quic/congestion_control/send_algorithm_interface.h" |
| 14 #include "net/quic/crypto/null_encrypter.h" | 13 #include "net/quic/crypto/null_encrypter.h" |
| 15 #include "net/quic/crypto/quic_decrypter.h" | 14 #include "net/quic/crypto/quic_decrypter.h" |
| 16 #include "net/quic/crypto/quic_encrypter.h" | 15 #include "net/quic/crypto/quic_encrypter.h" |
| 17 #include "net/quic/quic_ack_notifier.h" | 16 #include "net/quic/quic_ack_notifier.h" |
| 18 #include "net/quic/quic_flags.h" | 17 #include "net/quic/quic_flags.h" |
| 19 #include "net/quic/quic_protocol.h" | 18 #include "net/quic/quic_protocol.h" |
| 20 #include "net/quic/quic_utils.h" | 19 #include "net/quic/quic_utils.h" |
| 21 #include "net/quic/test_tools/mock_clock.h" | 20 #include "net/quic/test_tools/mock_clock.h" |
| 22 #include "net/quic/test_tools/mock_random.h" | 21 #include "net/quic/test_tools/mock_random.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 const char data1[] = "foo"; | 56 const char data1[] = "foo"; |
| 58 const char data2[] = "bar"; | 57 const char data2[] = "bar"; |
| 59 | 58 |
| 60 const bool kFin = true; | 59 const bool kFin = true; |
| 61 const bool kEntropyFlag = true; | 60 const bool kEntropyFlag = true; |
| 62 | 61 |
| 63 const QuicPacketEntropyHash kTestEntropyHash = 76; | 62 const QuicPacketEntropyHash kTestEntropyHash = 76; |
| 64 | 63 |
| 65 const int kDefaultRetransmissionTimeMs = 500; | 64 const int kDefaultRetransmissionTimeMs = 500; |
| 66 | 65 |
| 67 class TestReceiveAlgorithm : public ReceiveAlgorithmInterface { | |
| 68 public: | |
| 69 TestReceiveAlgorithm() {} | |
| 70 | |
| 71 MOCK_METHOD3(RecordIncomingPacket, | |
| 72 void(QuicByteCount, QuicPacketSequenceNumber, QuicTime)); | |
| 73 | |
| 74 private: | |
| 75 DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm); | |
| 76 }; | |
| 77 | |
| 78 // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message. | 66 // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message. |
| 79 class TaggingEncrypter : public QuicEncrypter { | 67 class TaggingEncrypter : public QuicEncrypter { |
| 80 public: | 68 public: |
| 81 explicit TaggingEncrypter(uint8 tag) | 69 explicit TaggingEncrypter(uint8 tag) |
| 82 : tag_(tag) { | 70 : tag_(tag) { |
| 83 } | 71 } |
| 84 | 72 |
| 85 ~TaggingEncrypter() override {} | 73 ~TaggingEncrypter() override {} |
| 86 | 74 |
| 87 // QuicEncrypter interface. | 75 // QuicEncrypter interface. |
| 88 bool SetKey(StringPiece key) override { return true; } | 76 bool SetKey(StringPiece key) override { return true; } |
| 89 | 77 |
| 90 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 78 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
| 91 | 79 |
| 92 bool Encrypt(StringPiece nonce, | 80 bool Encrypt(StringPiece nonce, |
| 93 StringPiece associated_data, | 81 StringPiece associated_data, |
| 94 StringPiece plaintext, | 82 StringPiece plaintext, |
| 95 unsigned char* output) override { | 83 unsigned char* output) override { |
| 96 memcpy(output, plaintext.data(), plaintext.size()); | 84 memcpy(output, plaintext.data(), plaintext.size()); |
| 97 output += plaintext.size(); | 85 output += plaintext.size(); |
| 98 memset(output, tag_, kTagSize); | 86 memset(output, tag_, kTagSize); |
| 99 return true; | 87 return true; |
| 100 } | 88 } |
| 101 | 89 |
| 102 QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number, | 90 bool EncryptPacket(QuicPacketSequenceNumber sequence_number, |
| 103 StringPiece associated_data, | 91 StringPiece associated_data, |
| 104 StringPiece plaintext) override { | 92 StringPiece plaintext, |
| 93 char* output, |
| 94 size_t* output_length, |
| 95 size_t max_output_length) override { |
| 105 const size_t len = plaintext.size() + kTagSize; | 96 const size_t len = plaintext.size() + kTagSize; |
| 106 uint8* buffer = new uint8[len]; | 97 if (max_output_length < len) { |
| 107 Encrypt(StringPiece(), associated_data, plaintext, buffer); | 98 return false; |
| 108 return new QuicData(reinterpret_cast<char*>(buffer), len, true); | 99 } |
| 100 Encrypt(StringPiece(), associated_data, plaintext, |
| 101 reinterpret_cast<unsigned char*>(output)); |
| 102 *output_length = len; |
| 103 return true; |
| 109 } | 104 } |
| 110 | 105 |
| 111 size_t GetKeySize() const override { return 0; } | 106 size_t GetKeySize() const override { return 0; } |
| 112 size_t GetNoncePrefixSize() const override { return 0; } | 107 size_t GetNoncePrefixSize() const override { return 0; } |
| 113 | 108 |
| 114 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override { | 109 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override { |
| 115 return ciphertext_size - kTagSize; | 110 return ciphertext_size - kTagSize; |
| 116 } | 111 } |
| 117 | 112 |
| 118 size_t GetCiphertextSize(size_t plaintext_size) const override { | 113 size_t GetCiphertextSize(size_t plaintext_size) const override { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 137 // have the same value and then removes them. | 132 // have the same value and then removes them. |
| 138 class TaggingDecrypter : public QuicDecrypter { | 133 class TaggingDecrypter : public QuicDecrypter { |
| 139 public: | 134 public: |
| 140 ~TaggingDecrypter() override {} | 135 ~TaggingDecrypter() override {} |
| 141 | 136 |
| 142 // QuicDecrypter interface | 137 // QuicDecrypter interface |
| 143 bool SetKey(StringPiece key) override { return true; } | 138 bool SetKey(StringPiece key) override { return true; } |
| 144 | 139 |
| 145 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 140 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
| 146 | 141 |
| 147 QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number, | 142 bool DecryptPacket(QuicPacketSequenceNumber sequence_number, |
| 148 StringPiece associated_data, | 143 const StringPiece& associated_data, |
| 149 StringPiece ciphertext) override { | 144 const StringPiece& ciphertext, |
| 145 char* output, |
| 146 size_t* output_length, |
| 147 size_t max_output_length) override { |
| 150 if (ciphertext.size() < kTagSize) { | 148 if (ciphertext.size() < kTagSize) { |
| 151 return nullptr; | 149 return false; |
| 152 } | 150 } |
| 153 if (!CheckTag(ciphertext, GetTag(ciphertext))) { | 151 if (!CheckTag(ciphertext, GetTag(ciphertext))) { |
| 154 return nullptr; | 152 return false; |
| 155 } | 153 } |
| 156 const size_t len = ciphertext.size() - kTagSize; | 154 *output_length = ciphertext.size() - kTagSize; |
| 157 uint8* buf = new uint8[len]; | 155 memcpy(output, ciphertext.data(), *output_length); |
| 158 memcpy(buf, ciphertext.data(), len); | 156 return true; |
| 159 return new QuicData(reinterpret_cast<char*>(buf), len, | |
| 160 true /* owns buffer */); | |
| 161 } | 157 } |
| 162 | 158 |
| 163 StringPiece GetKey() const override { return StringPiece(); } | 159 StringPiece GetKey() const override { return StringPiece(); } |
| 164 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 160 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
| 165 | 161 |
| 166 protected: | 162 protected: |
| 167 virtual uint8 GetTag(StringPiece ciphertext) { | 163 virtual uint8 GetTag(StringPiece ciphertext) { |
| 168 return ciphertext.data()[ciphertext.size()-1]; | 164 return ciphertext.data()[ciphertext.size()-1]; |
| 169 } | 165 } |
| 170 | 166 |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 // Disable tail loss probes for most tests. | 397 // Disable tail loss probes for most tests. |
| 402 QuicSentPacketManagerPeer::SetMaxTailLossProbes( | 398 QuicSentPacketManagerPeer::SetMaxTailLossProbes( |
| 403 QuicConnectionPeer::GetSentPacketManager(this), 0); | 399 QuicConnectionPeer::GetSentPacketManager(this), 0); |
| 404 writer()->set_is_server(is_server); | 400 writer()->set_is_server(is_server); |
| 405 } | 401 } |
| 406 | 402 |
| 407 void SendAck() { | 403 void SendAck() { |
| 408 QuicConnectionPeer::SendAck(this); | 404 QuicConnectionPeer::SendAck(this); |
| 409 } | 405 } |
| 410 | 406 |
| 411 void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) { | |
| 412 QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm); | |
| 413 } | |
| 414 | |
| 415 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { | 407 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { |
| 416 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); | 408 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); |
| 417 } | 409 } |
| 418 | 410 |
| 419 void SetLossAlgorithm(LossDetectionInterface* loss_algorithm) { | 411 void SetLossAlgorithm(LossDetectionInterface* loss_algorithm) { |
| 420 QuicSentPacketManagerPeer::SetLossAlgorithm( | 412 QuicSentPacketManagerPeer::SetLossAlgorithm( |
| 421 QuicConnectionPeer::GetSentPacketManager(this), loss_algorithm); | 413 QuicConnectionPeer::GetSentPacketManager(this), loss_algorithm); |
| 422 } | 414 } |
| 423 | 415 |
| 424 void SendPacket(EncryptionLevel level, | 416 void SendPacket(EncryptionLevel level, |
| 425 QuicPacketSequenceNumber sequence_number, | 417 QuicPacketSequenceNumber sequence_number, |
| 426 QuicPacket* packet, | 418 QuicPacket* packet, |
| 427 QuicPacketEntropyHash entropy_hash, | 419 QuicPacketEntropyHash entropy_hash, |
| 428 HasRetransmittableData retransmittable) { | 420 HasRetransmittableData retransmittable) { |
| 429 RetransmittableFrames* retransmittable_frames = | 421 RetransmittableFrames* retransmittable_frames = |
| 430 retransmittable == HAS_RETRANSMITTABLE_DATA | 422 retransmittable == HAS_RETRANSMITTABLE_DATA |
| 431 ? new RetransmittableFrames() | 423 ? new RetransmittableFrames() |
| 432 : nullptr; | 424 : nullptr; |
| 433 OnSerializedPacket( | 425 QuicEncryptedPacket* encrypted = |
| 434 SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, | 426 QuicConnectionPeer::GetFramer(this) |
| 435 packet, entropy_hash, retransmittable_frames)); | 427 ->EncryptPacket(ENCRYPTION_NONE, sequence_number, *packet); |
| 428 delete packet; |
| 429 OnSerializedPacket(SerializedPacket(sequence_number, |
| 430 PACKET_6BYTE_SEQUENCE_NUMBER, encrypted, |
| 431 entropy_hash, retransmittable_frames)); |
| 436 } | 432 } |
| 437 | 433 |
| 438 QuicConsumedData SendStreamDataWithString( | 434 QuicConsumedData SendStreamDataWithString( |
| 439 QuicStreamId id, | 435 QuicStreamId id, |
| 440 StringPiece data, | 436 StringPiece data, |
| 441 QuicStreamOffset offset, | 437 QuicStreamOffset offset, |
| 442 bool fin, | 438 bool fin, |
| 443 QuicAckNotifier::DelegateInterface* delegate) { | 439 QuicAckNotifier::DelegateInterface* delegate) { |
| 444 return SendStreamDataWithStringHelper(id, data, offset, fin, | 440 return SendStreamDataWithStringHelper(id, data, offset, fin, |
| 445 MAY_FEC_PROTECT, delegate); | 441 MAY_FEC_PROTECT, delegate); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 }; | 592 }; |
| 597 | 593 |
| 598 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { | 594 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
| 599 protected: | 595 protected: |
| 600 QuicConnectionTest() | 596 QuicConnectionTest() |
| 601 : connection_id_(42), | 597 : connection_id_(42), |
| 602 framer_(SupportedVersions(version()), QuicTime::Zero(), false), | 598 framer_(SupportedVersions(version()), QuicTime::Zero(), false), |
| 603 peer_creator_(connection_id_, &framer_, &random_generator_), | 599 peer_creator_(connection_id_, &framer_, &random_generator_), |
| 604 send_algorithm_(new StrictMock<MockSendAlgorithm>), | 600 send_algorithm_(new StrictMock<MockSendAlgorithm>), |
| 605 loss_algorithm_(new MockLossAlgorithm()), | 601 loss_algorithm_(new MockLossAlgorithm()), |
| 606 receive_algorithm_(new TestReceiveAlgorithm), | |
| 607 helper_(new TestConnectionHelper(&clock_, &random_generator_)), | 602 helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
| 608 writer_(new TestPacketWriter(version(), &clock_)), | 603 writer_(new TestPacketWriter(version(), &clock_)), |
| 609 factory_(writer_.get()), | 604 factory_(writer_.get()), |
| 610 connection_(connection_id_, | 605 connection_(connection_id_, |
| 611 IPEndPoint(), | 606 IPEndPoint(), |
| 612 helper_.get(), | 607 helper_.get(), |
| 613 factory_, | 608 factory_, |
| 614 false, | 609 false, |
| 615 version()), | 610 version()), |
| 616 creator_(QuicConnectionPeer::GetPacketCreator(&connection_)), | 611 creator_(QuicConnectionPeer::GetPacketCreator(&connection_)), |
| 617 generator_(QuicConnectionPeer::GetPacketGenerator(&connection_)), | 612 generator_(QuicConnectionPeer::GetPacketGenerator(&connection_)), |
| 618 manager_(QuicConnectionPeer::GetSentPacketManager(&connection_)), | 613 manager_(QuicConnectionPeer::GetSentPacketManager(&connection_)), |
| 619 frame1_(1, false, 0, MakeIOVector(data1)), | 614 frame1_(1, false, 0, MakeIOVector(data1)), |
| 620 frame2_(1, false, 3, MakeIOVector(data2)), | 615 frame2_(1, false, 3, MakeIOVector(data2)), |
| 621 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), | 616 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), |
| 622 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { | 617 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { |
| 623 connection_.set_visitor(&visitor_); | 618 connection_.set_visitor(&visitor_); |
| 624 connection_.SetSendAlgorithm(send_algorithm_); | 619 connection_.SetSendAlgorithm(send_algorithm_); |
| 625 connection_.SetLossAlgorithm(loss_algorithm_); | 620 connection_.SetLossAlgorithm(loss_algorithm_); |
| 626 framer_.set_received_entropy_calculator(&entropy_calculator_); | 621 framer_.set_received_entropy_calculator(&entropy_calculator_); |
| 627 connection_.SetReceiveAlgorithm(receive_algorithm_); | |
| 628 EXPECT_CALL( | 622 EXPECT_CALL( |
| 629 *send_algorithm_, TimeUntilSend(_, _, _)).WillRepeatedly(Return( | 623 *send_algorithm_, TimeUntilSend(_, _, _)).WillRepeatedly(Return( |
| 630 QuicTime::Delta::Zero())); | 624 QuicTime::Delta::Zero())); |
| 631 EXPECT_CALL(*receive_algorithm_, | |
| 632 RecordIncomingPacket(_, _, _)).Times(AnyNumber()); | |
| 633 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 625 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 634 .Times(AnyNumber()); | 626 .Times(AnyNumber()); |
| 635 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( | 627 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( |
| 636 Return(QuicTime::Delta::Zero())); | 628 Return(QuicTime::Delta::Zero())); |
| 637 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( | 629 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( |
| 638 Return(kMaxPacketSize)); | 630 Return(kMaxPacketSize)); |
| 639 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 631 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 640 .WillByDefault(Return(true)); | 632 .WillByDefault(Return(true)); |
| 641 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate()) | 633 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate()) |
| 642 .Times(AnyNumber()); | 634 .Times(AnyNumber()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 655 .WillRepeatedly(Return(QuicTime::Zero())); | 647 .WillRepeatedly(Return(QuicTime::Zero())); |
| 656 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) | 648 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 657 .WillRepeatedly(Return(SequenceNumberSet())); | 649 .WillRepeatedly(Return(SequenceNumberSet())); |
| 658 } | 650 } |
| 659 | 651 |
| 660 QuicVersion version() { | 652 QuicVersion version() { |
| 661 return GetParam(); | 653 return GetParam(); |
| 662 } | 654 } |
| 663 | 655 |
| 664 QuicAckFrame* outgoing_ack() { | 656 QuicAckFrame* outgoing_ack() { |
| 665 outgoing_ack_.reset(QuicConnectionPeer::CreateAckFrame(&connection_)); | 657 QuicConnectionPeer::PopulateAckFrame(&connection_, &ack_); |
| 666 return outgoing_ack_.get(); | 658 return &ack_; |
| 667 } | 659 } |
| 668 | 660 |
| 669 QuicStopWaitingFrame* stop_waiting() { | 661 QuicStopWaitingFrame* stop_waiting() { |
| 670 stop_waiting_.reset( | 662 QuicConnectionPeer::PopulateStopWaitingFrame(&connection_, &stop_waiting_); |
| 671 QuicConnectionPeer::CreateStopWaitingFrame(&connection_)); | 663 return &stop_waiting_; |
| 672 return stop_waiting_.get(); | |
| 673 } | 664 } |
| 674 | 665 |
| 675 QuicPacketSequenceNumber least_unacked() { | 666 QuicPacketSequenceNumber least_unacked() { |
| 676 if (writer_->stop_waiting_frames().empty()) { | 667 if (writer_->stop_waiting_frames().empty()) { |
| 677 return 0; | 668 return 0; |
| 678 } | 669 } |
| 679 return writer_->stop_waiting_frames()[0].least_unacked; | 670 return writer_->stop_waiting_frames()[0].least_unacked; |
| 680 } | 671 } |
| 681 | 672 |
| 682 void use_tagging_decrypter() { | 673 void use_tagging_decrypter() { |
| 683 writer_->use_tagging_decrypter(); | 674 writer_->use_tagging_decrypter(); |
| 684 } | 675 } |
| 685 | 676 |
| 686 void ProcessPacket(QuicPacketSequenceNumber number) { | 677 void ProcessPacket(QuicPacketSequenceNumber number) { |
| 687 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); | 678 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); |
| 688 ProcessDataPacket(number, 0, !kEntropyFlag); | 679 ProcessDataPacket(number, 0, !kEntropyFlag); |
| 689 } | 680 } |
| 690 | 681 |
| 691 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { | 682 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { |
| 692 QuicFrames frames; | 683 QuicFrames frames; |
| 693 frames.push_back(QuicFrame(frame)); | 684 frames.push_back(QuicFrame(frame)); |
| 694 QuicPacketCreatorPeer::SetSendVersionInPacket(&peer_creator_, | 685 QuicPacketCreatorPeer::SetSendVersionInPacket(&peer_creator_, |
| 695 connection_.is_server()); | 686 connection_.is_server()); |
| 696 SerializedPacket serialized_packet = | 687 SerializedPacket serialized_packet = |
| 697 peer_creator_.SerializeAllFrames(frames); | 688 peer_creator_.SerializeAllFrames(frames); |
| 698 scoped_ptr<QuicPacket> packet(serialized_packet.packet); | 689 scoped_ptr<QuicEncryptedPacket> encrypted(serialized_packet.packet); |
| 699 scoped_ptr<QuicEncryptedPacket> encrypted( | |
| 700 framer_.EncryptPacket(ENCRYPTION_NONE, | |
| 701 serialized_packet.sequence_number, *packet)); | |
| 702 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 690 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 703 return serialized_packet.entropy_hash; | 691 return serialized_packet.entropy_hash; |
| 704 } | 692 } |
| 705 | 693 |
| 706 size_t ProcessDataPacket(QuicPacketSequenceNumber number, | 694 size_t ProcessDataPacket(QuicPacketSequenceNumber number, |
| 707 QuicFecGroupNumber fec_group, | 695 QuicFecGroupNumber fec_group, |
| 708 bool entropy_flag) { | 696 bool entropy_flag) { |
| 709 return ProcessDataPacketAtLevel(number, fec_group, entropy_flag, | 697 return ProcessDataPacketAtLevel(number, fec_group, entropy_flag, |
| 710 ENCRYPTION_NONE); | 698 ENCRYPTION_NONE); |
| 711 } | 699 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 789 header_.public_header.connection_id_length, | 777 header_.public_header.connection_id_length, |
| 790 header_.public_header.version_flag, | 778 header_.public_header.version_flag, |
| 791 header_.public_header.sequence_number_length); | 779 header_.public_header.sequence_number_length); |
| 792 i < data_packet->length(); ++i) { | 780 i < data_packet->length(); ++i) { |
| 793 data_packet->mutable_data()[i] ^= data_packet->data()[i]; | 781 data_packet->mutable_data()[i] ^= data_packet->data()[i]; |
| 794 } | 782 } |
| 795 } | 783 } |
| 796 fec_data.redundancy = data_packet->FecProtectedData(); | 784 fec_data.redundancy = data_packet->FecProtectedData(); |
| 797 | 785 |
| 798 scoped_ptr<QuicPacket> fec_packet( | 786 scoped_ptr<QuicPacket> fec_packet( |
| 799 framer_.BuildFecPacket(header_, fec_data).packet); | 787 framer_.BuildFecPacket(header_, fec_data)); |
| 800 scoped_ptr<QuicEncryptedPacket> encrypted( | 788 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 801 framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet)); | 789 framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet)); |
| 802 | 790 |
| 803 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 791 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 804 return encrypted->length(); | 792 return encrypted->length(); |
| 805 } | 793 } |
| 806 | 794 |
| 807 QuicByteCount SendStreamDataToPeer(QuicStreamId id, | 795 QuicByteCount SendStreamDataToPeer(QuicStreamId id, |
| 808 StringPiece data, | 796 StringPiece data, |
| 809 QuicStreamOffset offset, | 797 QuicStreamOffset offset, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 header_.public_header.connection_id_length = connection_id_length_; | 842 header_.public_header.connection_id_length = connection_id_length_; |
| 855 header_.entropy_flag = entropy_flag; | 843 header_.entropy_flag = entropy_flag; |
| 856 header_.fec_flag = false; | 844 header_.fec_flag = false; |
| 857 header_.packet_sequence_number = number; | 845 header_.packet_sequence_number = number; |
| 858 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; | 846 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
| 859 header_.fec_group = fec_group; | 847 header_.fec_group = fec_group; |
| 860 | 848 |
| 861 QuicFrames frames; | 849 QuicFrames frames; |
| 862 QuicFrame frame(&frame1_); | 850 QuicFrame frame(&frame1_); |
| 863 frames.push_back(frame); | 851 frames.push_back(frame); |
| 864 QuicPacket* packet = | 852 QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header_, frames); |
| 865 BuildUnsizedDataPacket(&framer_, header_, frames).packet; | |
| 866 EXPECT_TRUE(packet != nullptr); | 853 EXPECT_TRUE(packet != nullptr); |
| 867 return packet; | 854 return packet; |
| 868 } | 855 } |
| 869 | 856 |
| 870 QuicPacket* ConstructPingPacket(QuicPacketSequenceNumber number) { | 857 QuicPacket* ConstructPingPacket(QuicPacketSequenceNumber number) { |
| 871 header_.public_header.connection_id = connection_id_; | 858 header_.public_header.connection_id = connection_id_; |
| 872 header_.packet_sequence_number = number; | 859 header_.packet_sequence_number = number; |
| 873 header_.public_header.reset_flag = false; | 860 header_.public_header.reset_flag = false; |
| 874 header_.public_header.version_flag = false; | 861 header_.public_header.version_flag = false; |
| 875 header_.entropy_flag = false; | 862 header_.entropy_flag = false; |
| 876 header_.fec_flag = false; | 863 header_.fec_flag = false; |
| 877 header_.is_in_fec_group = NOT_IN_FEC_GROUP; | 864 header_.is_in_fec_group = NOT_IN_FEC_GROUP; |
| 878 header_.fec_group = 0; | 865 header_.fec_group = 0; |
| 879 | 866 |
| 880 QuicPingFrame ping; | 867 QuicPingFrame ping; |
| 881 | 868 |
| 882 QuicFrames frames; | 869 QuicFrames frames; |
| 883 QuicFrame frame(&ping); | 870 QuicFrame frame(&ping); |
| 884 frames.push_back(frame); | 871 frames.push_back(frame); |
| 885 QuicPacket* packet = | 872 QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header_, frames); |
| 886 BuildUnsizedDataPacket(&framer_, header_, frames).packet; | |
| 887 EXPECT_TRUE(packet != nullptr); | 873 EXPECT_TRUE(packet != nullptr); |
| 888 return packet; | 874 return packet; |
| 889 } | 875 } |
| 890 | 876 |
| 891 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, | 877 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, |
| 892 QuicFecGroupNumber fec_group) { | 878 QuicFecGroupNumber fec_group) { |
| 893 header_.public_header.connection_id = connection_id_; | 879 header_.public_header.connection_id = connection_id_; |
| 894 header_.packet_sequence_number = number; | 880 header_.packet_sequence_number = number; |
| 895 header_.public_header.reset_flag = false; | 881 header_.public_header.reset_flag = false; |
| 896 header_.public_header.version_flag = false; | 882 header_.public_header.version_flag = false; |
| 897 header_.entropy_flag = false; | 883 header_.entropy_flag = false; |
| 898 header_.fec_flag = false; | 884 header_.fec_flag = false; |
| 899 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; | 885 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
| 900 header_.fec_group = fec_group; | 886 header_.fec_group = fec_group; |
| 901 | 887 |
| 902 QuicConnectionCloseFrame qccf; | 888 QuicConnectionCloseFrame qccf; |
| 903 qccf.error_code = QUIC_PEER_GOING_AWAY; | 889 qccf.error_code = QUIC_PEER_GOING_AWAY; |
| 904 | 890 |
| 905 QuicFrames frames; | 891 QuicFrames frames; |
| 906 QuicFrame frame(&qccf); | 892 QuicFrame frame(&qccf); |
| 907 frames.push_back(frame); | 893 frames.push_back(frame); |
| 908 QuicPacket* packet = | 894 QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header_, frames); |
| 909 BuildUnsizedDataPacket(&framer_, header_, frames).packet; | |
| 910 EXPECT_TRUE(packet != nullptr); | 895 EXPECT_TRUE(packet != nullptr); |
| 911 return packet; | 896 return packet; |
| 912 } | 897 } |
| 913 | 898 |
| 914 QuicTime::Delta DefaultRetransmissionTime() { | 899 QuicTime::Delta DefaultRetransmissionTime() { |
| 915 return QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs); | 900 return QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs); |
| 916 } | 901 } |
| 917 | 902 |
| 918 QuicTime::Delta DefaultDelayedAckTime() { | 903 QuicTime::Delta DefaultDelayedAckTime() { |
| 919 return QuicTime::Delta::FromMilliseconds(kMaxDelayedAckTimeMs); | 904 return QuicTime::Delta::FromMilliseconds(kMaxDelayedAckTimeMs); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 testing::Return(QuicTime::Delta::Zero())); | 969 testing::Return(QuicTime::Delta::Zero())); |
| 985 } | 970 } |
| 986 | 971 |
| 987 QuicConnectionId connection_id_; | 972 QuicConnectionId connection_id_; |
| 988 QuicFramer framer_; | 973 QuicFramer framer_; |
| 989 QuicPacketCreator peer_creator_; | 974 QuicPacketCreator peer_creator_; |
| 990 MockEntropyCalculator entropy_calculator_; | 975 MockEntropyCalculator entropy_calculator_; |
| 991 | 976 |
| 992 MockSendAlgorithm* send_algorithm_; | 977 MockSendAlgorithm* send_algorithm_; |
| 993 MockLossAlgorithm* loss_algorithm_; | 978 MockLossAlgorithm* loss_algorithm_; |
| 994 TestReceiveAlgorithm* receive_algorithm_; | |
| 995 MockClock clock_; | 979 MockClock clock_; |
| 996 MockRandom random_generator_; | 980 MockRandom random_generator_; |
| 997 scoped_ptr<TestConnectionHelper> helper_; | 981 scoped_ptr<TestConnectionHelper> helper_; |
| 998 scoped_ptr<TestPacketWriter> writer_; | 982 scoped_ptr<TestPacketWriter> writer_; |
| 999 NiceMock<MockPacketWriterFactory> factory_; | 983 NiceMock<MockPacketWriterFactory> factory_; |
| 1000 TestConnection connection_; | 984 TestConnection connection_; |
| 1001 QuicPacketCreator* creator_; | 985 QuicPacketCreator* creator_; |
| 1002 QuicPacketGenerator* generator_; | 986 QuicPacketGenerator* generator_; |
| 1003 QuicSentPacketManager* manager_; | 987 QuicSentPacketManager* manager_; |
| 1004 StrictMock<MockConnectionVisitor> visitor_; | 988 StrictMock<MockConnectionVisitor> visitor_; |
| 1005 | 989 |
| 1006 QuicPacketHeader header_; | 990 QuicPacketHeader header_; |
| 1007 QuicStreamFrame frame1_; | 991 QuicStreamFrame frame1_; |
| 1008 QuicStreamFrame frame2_; | 992 QuicStreamFrame frame2_; |
| 1009 scoped_ptr<QuicAckFrame> outgoing_ack_; | 993 QuicAckFrame ack_; |
| 1010 scoped_ptr<QuicStopWaitingFrame> stop_waiting_; | 994 QuicStopWaitingFrame stop_waiting_; |
| 1011 QuicSequenceNumberLength sequence_number_length_; | 995 QuicSequenceNumberLength sequence_number_length_; |
| 1012 QuicConnectionIdLength connection_id_length_; | 996 QuicConnectionIdLength connection_id_length_; |
| 1013 | 997 |
| 1014 private: | 998 private: |
| 1015 DISALLOW_COPY_AND_ASSIGN(QuicConnectionTest); | 999 DISALLOW_COPY_AND_ASSIGN(QuicConnectionTest); |
| 1016 }; | 1000 }; |
| 1017 | 1001 |
| 1018 // Run all end to end tests with all supported versions. | 1002 // Run all end to end tests with all supported versions. |
| 1019 INSTANTIATE_TEST_CASE_P(SupportedVersion, | 1003 INSTANTIATE_TEST_CASE_P(SupportedVersion, |
| 1020 QuicConnectionTest, | 1004 QuicConnectionTest, |
| 1021 ::testing::ValuesIn(QuicSupportedVersions())); | 1005 ::testing::ValuesIn(QuicSupportedVersions())); |
| 1022 | 1006 |
| 1007 TEST_P(QuicConnectionTest, MaxPacketSize) { |
| 1008 EXPECT_FALSE(connection_.is_server()); |
| 1009 EXPECT_EQ(1350u, connection_.max_packet_length()); |
| 1010 } |
| 1011 |
| 1012 TEST_P(QuicConnectionTest, SmallerServerMaxPacketSize) { |
| 1013 ValueRestore<bool> old_flag(&FLAGS_quic_small_default_packet_size, true); |
| 1014 QuicConnectionId connection_id = 42; |
| 1015 bool kIsServer = true; |
| 1016 TestConnection connection(connection_id, IPEndPoint(), helper_.get(), |
| 1017 factory_, kIsServer, version()); |
| 1018 EXPECT_TRUE(connection.is_server()); |
| 1019 EXPECT_EQ(1000u, connection.max_packet_length()); |
| 1020 } |
| 1021 |
| 1022 TEST_P(QuicConnectionTest, ServerMaxPacketSize) { |
| 1023 ValueRestore<bool> old_flag(&FLAGS_quic_small_default_packet_size, false); |
| 1024 QuicConnectionId connection_id = 42; |
| 1025 bool kIsServer = true; |
| 1026 TestConnection connection(connection_id, IPEndPoint(), helper_.get(), |
| 1027 factory_, kIsServer, version()); |
| 1028 EXPECT_TRUE(connection.is_server()); |
| 1029 EXPECT_EQ(1350u, connection.max_packet_length()); |
| 1030 } |
| 1031 |
| 1032 TEST_P(QuicConnectionTest, IncreaseServerMaxPacketSize) { |
| 1033 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1034 |
| 1035 connection_.set_is_server(true); |
| 1036 connection_.set_max_packet_length(1000); |
| 1037 |
| 1038 QuicPacketHeader header; |
| 1039 header.public_header.connection_id = connection_id_; |
| 1040 header.public_header.reset_flag = false; |
| 1041 header.public_header.version_flag = true; |
| 1042 header.entropy_flag = false; |
| 1043 header.fec_flag = false; |
| 1044 header.packet_sequence_number = 1; |
| 1045 header.fec_group = 0; |
| 1046 |
| 1047 QuicFrames frames; |
| 1048 QuicPaddingFrame padding; |
| 1049 frames.push_back(QuicFrame(&frame1_)); |
| 1050 frames.push_back(QuicFrame(&padding)); |
| 1051 |
| 1052 scoped_ptr<QuicPacket> packet( |
| 1053 BuildUnsizedDataPacket(&framer_, header, frames)); |
| 1054 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 1055 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
| 1056 EXPECT_EQ(kMaxPacketSize, encrypted->length()); |
| 1057 |
| 1058 framer_.set_version(version()); |
| 1059 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); |
| 1060 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 1061 |
| 1062 EXPECT_EQ(kMaxPacketSize, connection_.max_packet_length()); |
| 1063 } |
| 1064 |
| 1023 TEST_P(QuicConnectionTest, PacketsInOrder) { | 1065 TEST_P(QuicConnectionTest, PacketsInOrder) { |
| 1024 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1066 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1025 | 1067 |
| 1026 ProcessPacket(1); | 1068 ProcessPacket(1); |
| 1027 EXPECT_EQ(1u, outgoing_ack()->largest_observed); | 1069 EXPECT_EQ(1u, outgoing_ack()->largest_observed); |
| 1028 EXPECT_EQ(0u, outgoing_ack()->missing_packets.size()); | 1070 EXPECT_EQ(0u, outgoing_ack()->missing_packets.size()); |
| 1029 | 1071 |
| 1030 ProcessPacket(2); | 1072 ProcessPacket(2); |
| 1031 EXPECT_EQ(2u, outgoing_ack()->largest_observed); | 1073 EXPECT_EQ(2u, outgoing_ack()->largest_observed); |
| 1032 EXPECT_EQ(0u, outgoing_ack()->missing_packets.size()); | 1074 EXPECT_EQ(0u, outgoing_ack()->missing_packets.size()); |
| (...skipping 2117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3150 clock_.AdvanceTime(five_ms); | 3192 clock_.AdvanceTime(five_ms); |
| 3151 EXPECT_EQ(default_timeout.Add(five_ms), clock_.ApproximateNow()); | 3193 EXPECT_EQ(default_timeout.Add(five_ms), clock_.ApproximateNow()); |
| 3152 connection_.GetTimeoutAlarm()->Fire(); | 3194 connection_.GetTimeoutAlarm()->Fire(); |
| 3153 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); | 3195 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); |
| 3154 EXPECT_FALSE(connection_.connected()); | 3196 EXPECT_FALSE(connection_.connected()); |
| 3155 } | 3197 } |
| 3156 | 3198 |
| 3157 TEST_P(QuicConnectionTest, TimeoutAfterSendSilentClose) { | 3199 TEST_P(QuicConnectionTest, TimeoutAfterSendSilentClose) { |
| 3158 // Same test as above, but complete a handshake which enables silent close, | 3200 // Same test as above, but complete a handshake which enables silent close, |
| 3159 // causing no connection close packet to be sent. | 3201 // causing no connection close packet to be sent. |
| 3160 ValueRestore<bool> old_flag(&FLAGS_quic_allow_silent_close, true); | |
| 3161 EXPECT_TRUE(connection_.connected()); | 3202 EXPECT_TRUE(connection_.connected()); |
| 3162 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); | 3203 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
| 3163 QuicConfig config; | 3204 QuicConfig config; |
| 3164 | 3205 |
| 3165 // Create a handshake message that also enables silent close. | 3206 // Create a handshake message that also enables silent close. |
| 3166 CryptoHandshakeMessage msg; | 3207 CryptoHandshakeMessage msg; |
| 3167 string error_details; | 3208 string error_details; |
| 3168 QuicConfig client_config; | 3209 QuicConfig client_config; |
| 3169 client_config.SetInitialStreamFlowControlWindowToSend( | 3210 client_config.SetInitialStreamFlowControlWindowToSend( |
| 3170 kInitialStreamFlowControlWindowForTest); | 3211 kInitialStreamFlowControlWindowForTest); |
| (...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3694 header.public_header.version_flag = true; | 3735 header.public_header.version_flag = true; |
| 3695 header.entropy_flag = false; | 3736 header.entropy_flag = false; |
| 3696 header.fec_flag = false; | 3737 header.fec_flag = false; |
| 3697 header.packet_sequence_number = 12; | 3738 header.packet_sequence_number = 12; |
| 3698 header.fec_group = 0; | 3739 header.fec_group = 0; |
| 3699 | 3740 |
| 3700 QuicFrames frames; | 3741 QuicFrames frames; |
| 3701 QuicFrame frame(&frame1_); | 3742 QuicFrame frame(&frame1_); |
| 3702 frames.push_back(frame); | 3743 frames.push_back(frame); |
| 3703 scoped_ptr<QuicPacket> packet( | 3744 scoped_ptr<QuicPacket> packet( |
| 3704 BuildUnsizedDataPacket(&framer_, header, frames).packet); | 3745 BuildUnsizedDataPacket(&framer_, header, frames)); |
| 3705 scoped_ptr<QuicEncryptedPacket> encrypted( | 3746 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 3706 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 3747 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
| 3707 | 3748 |
| 3708 framer_.set_version(version()); | 3749 framer_.set_version(version()); |
| 3709 connection_.set_is_server(true); | 3750 connection_.set_is_server(true); |
| 3710 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3751 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 3711 EXPECT_TRUE(writer_->version_negotiation_packet() != nullptr); | 3752 EXPECT_TRUE(writer_->version_negotiation_packet() != nullptr); |
| 3712 | 3753 |
| 3713 size_t num_versions = arraysize(kSupportedQuicVersions); | 3754 size_t num_versions = arraysize(kSupportedQuicVersions); |
| 3714 ASSERT_EQ(num_versions, | 3755 ASSERT_EQ(num_versions, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3732 header.public_header.version_flag = true; | 3773 header.public_header.version_flag = true; |
| 3733 header.entropy_flag = false; | 3774 header.entropy_flag = false; |
| 3734 header.fec_flag = false; | 3775 header.fec_flag = false; |
| 3735 header.packet_sequence_number = 12; | 3776 header.packet_sequence_number = 12; |
| 3736 header.fec_group = 0; | 3777 header.fec_group = 0; |
| 3737 | 3778 |
| 3738 QuicFrames frames; | 3779 QuicFrames frames; |
| 3739 QuicFrame frame(&frame1_); | 3780 QuicFrame frame(&frame1_); |
| 3740 frames.push_back(frame); | 3781 frames.push_back(frame); |
| 3741 scoped_ptr<QuicPacket> packet( | 3782 scoped_ptr<QuicPacket> packet( |
| 3742 BuildUnsizedDataPacket(&framer_, header, frames).packet); | 3783 BuildUnsizedDataPacket(&framer_, header, frames)); |
| 3743 scoped_ptr<QuicEncryptedPacket> encrypted( | 3784 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 3744 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 3785 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
| 3745 | 3786 |
| 3746 framer_.set_version(version()); | 3787 framer_.set_version(version()); |
| 3747 connection_.set_is_server(true); | 3788 connection_.set_is_server(true); |
| 3748 BlockOnNextWrite(); | 3789 BlockOnNextWrite(); |
| 3749 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3790 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 3750 EXPECT_EQ(0u, writer_->last_packet_size()); | 3791 EXPECT_EQ(0u, writer_->last_packet_size()); |
| 3751 EXPECT_TRUE(connection_.HasQueuedData()); | 3792 EXPECT_TRUE(connection_.HasQueuedData()); |
| 3752 | 3793 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3777 header.public_header.version_flag = true; | 3818 header.public_header.version_flag = true; |
| 3778 header.entropy_flag = false; | 3819 header.entropy_flag = false; |
| 3779 header.fec_flag = false; | 3820 header.fec_flag = false; |
| 3780 header.packet_sequence_number = 12; | 3821 header.packet_sequence_number = 12; |
| 3781 header.fec_group = 0; | 3822 header.fec_group = 0; |
| 3782 | 3823 |
| 3783 QuicFrames frames; | 3824 QuicFrames frames; |
| 3784 QuicFrame frame(&frame1_); | 3825 QuicFrame frame(&frame1_); |
| 3785 frames.push_back(frame); | 3826 frames.push_back(frame); |
| 3786 scoped_ptr<QuicPacket> packet( | 3827 scoped_ptr<QuicPacket> packet( |
| 3787 BuildUnsizedDataPacket(&framer_, header, frames).packet); | 3828 BuildUnsizedDataPacket(&framer_, header, frames)); |
| 3788 scoped_ptr<QuicEncryptedPacket> encrypted( | 3829 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 3789 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 3830 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
| 3790 | 3831 |
| 3791 framer_.set_version(version()); | 3832 framer_.set_version(version()); |
| 3792 connection_.set_is_server(true); | 3833 connection_.set_is_server(true); |
| 3793 BlockOnNextWrite(); | 3834 BlockOnNextWrite(); |
| 3794 writer_->set_is_write_blocked_data_buffered(true); | 3835 writer_->set_is_write_blocked_data_buffered(true); |
| 3795 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3836 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 3796 EXPECT_EQ(0u, writer_->last_packet_size()); | 3837 EXPECT_EQ(0u, writer_->last_packet_size()); |
| 3797 EXPECT_FALSE(connection_.HasQueuedData()); | 3838 EXPECT_FALSE(connection_.HasQueuedData()); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3822 header.public_header, supported_versions)); | 3863 header.public_header, supported_versions)); |
| 3823 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3864 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 3824 | 3865 |
| 3825 // Now force another packet. The connection should transition into | 3866 // Now force another packet. The connection should transition into |
| 3826 // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion. | 3867 // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion. |
| 3827 header.public_header.version_flag = false; | 3868 header.public_header.version_flag = false; |
| 3828 QuicFrames frames; | 3869 QuicFrames frames; |
| 3829 QuicFrame frame(&frame1_); | 3870 QuicFrame frame(&frame1_); |
| 3830 frames.push_back(frame); | 3871 frames.push_back(frame); |
| 3831 scoped_ptr<QuicPacket> packet( | 3872 scoped_ptr<QuicPacket> packet( |
| 3832 BuildUnsizedDataPacket(&framer_, header, frames).packet); | 3873 BuildUnsizedDataPacket(&framer_, header, frames)); |
| 3833 encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 3874 encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
| 3834 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); | 3875 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); |
| 3835 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3876 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3836 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3877 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 3837 | 3878 |
| 3838 ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket(creator_)); | 3879 ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket(creator_)); |
| 3839 } | 3880 } |
| 3840 | 3881 |
| 3841 TEST_P(QuicConnectionTest, BadVersionNegotiation) { | 3882 TEST_P(QuicConnectionTest, BadVersionNegotiation) { |
| 3842 QuicPacketHeader header; | 3883 QuicPacketHeader header; |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3967 | 4008 |
| 3968 QuicConnectionCloseFrame qccf; | 4009 QuicConnectionCloseFrame qccf; |
| 3969 qccf.error_code = QUIC_PEER_GOING_AWAY; | 4010 qccf.error_code = QUIC_PEER_GOING_AWAY; |
| 3970 QuicFrame close_frame(&qccf); | 4011 QuicFrame close_frame(&qccf); |
| 3971 QuicFrame stream_frame(&frame1_); | 4012 QuicFrame stream_frame(&frame1_); |
| 3972 | 4013 |
| 3973 QuicFrames frames; | 4014 QuicFrames frames; |
| 3974 frames.push_back(stream_frame); | 4015 frames.push_back(stream_frame); |
| 3975 frames.push_back(close_frame); | 4016 frames.push_back(close_frame); |
| 3976 scoped_ptr<QuicPacket> packet( | 4017 scoped_ptr<QuicPacket> packet( |
| 3977 BuildUnsizedDataPacket(&framer_, header_, frames).packet); | 4018 BuildUnsizedDataPacket(&framer_, header_, frames)); |
| 3978 EXPECT_TRUE(nullptr != packet.get()); | 4019 EXPECT_TRUE(nullptr != packet.get()); |
| 3979 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( | 4020 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( |
| 3980 ENCRYPTION_NONE, 1, *packet)); | 4021 ENCRYPTION_NONE, 1, *packet)); |
| 3981 | 4022 |
| 3982 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true)); | 4023 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true)); |
| 3983 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); | 4024 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); |
| 3984 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4025 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3985 | 4026 |
| 3986 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 4027 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 3987 } | 4028 } |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4261 QuicPacketHeader ack_header; | 4302 QuicPacketHeader ack_header; |
| 4262 ack_header.public_header.connection_id = connection_id_; | 4303 ack_header.public_header.connection_id = connection_id_; |
| 4263 ack_header.public_header.reset_flag = false; | 4304 ack_header.public_header.reset_flag = false; |
| 4264 ack_header.public_header.version_flag = false; | 4305 ack_header.public_header.version_flag = false; |
| 4265 ack_header.entropy_flag = !kEntropyFlag; | 4306 ack_header.entropy_flag = !kEntropyFlag; |
| 4266 ack_header.fec_flag = true; | 4307 ack_header.fec_flag = true; |
| 4267 ack_header.packet_sequence_number = 1; | 4308 ack_header.packet_sequence_number = 1; |
| 4268 ack_header.is_in_fec_group = IN_FEC_GROUP; | 4309 ack_header.is_in_fec_group = IN_FEC_GROUP; |
| 4269 ack_header.fec_group = 1; | 4310 ack_header.fec_group = 1; |
| 4270 | 4311 |
| 4271 QuicPacket* packet = | 4312 QuicPacket* packet = BuildUnsizedDataPacket(&framer_, ack_header, frames); |
| 4272 BuildUnsizedDataPacket(&framer_, ack_header, frames).packet; | |
| 4273 | 4313 |
| 4274 // Take the packet which contains the ACK frame, and construct and deliver an | 4314 // Take the packet which contains the ACK frame, and construct and deliver an |
| 4275 // FEC packet which allows the ACK packet to be recovered. | 4315 // FEC packet which allows the ACK packet to be recovered. |
| 4276 ProcessFecPacket(2, 1, true, !kEntropyFlag, packet); | 4316 ProcessFecPacket(2, 1, true, !kEntropyFlag, packet); |
| 4277 } | 4317 } |
| 4278 | 4318 |
| 4279 TEST_P(QuicConnectionTest, NetworkChangeVisitorCwndCallbackChangesFecState) { | 4319 TEST_P(QuicConnectionTest, NetworkChangeVisitorCwndCallbackChangesFecState) { |
| 4280 size_t max_packets_per_fec_group = creator_->max_packets_per_fec_group(); | 4320 size_t max_packets_per_fec_group = creator_->max_packets_per_fec_group(); |
| 4281 | 4321 |
| 4282 QuicSentPacketManager::NetworkChangeVisitor* visitor = | 4322 QuicSentPacketManager::NetworkChangeVisitor* visitor = |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4422 // Regression test for b/18594622 | 4462 // Regression test for b/18594622 |
| 4423 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); | 4463 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
| 4424 EXPECT_DFATAL( | 4464 EXPECT_DFATAL( |
| 4425 connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), | 4465 connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), |
| 4426 "Attempt to send empty stream frame"); | 4466 "Attempt to send empty stream frame"); |
| 4427 } | 4467 } |
| 4428 | 4468 |
| 4429 } // namespace | 4469 } // namespace |
| 4430 } // namespace test | 4470 } // namespace test |
| 4431 } // namespace net | 4471 } // namespace net |
| OLD | NEW |