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

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

Issue 331573002: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix compiler error - use push_back to initialize vectors Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_session.cc ('k') | net/quic/quic_stream_sequencer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_session.h" 5 #include "net/quic/quic_session.h"
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 143
144 QuicDataStream* GetIncomingDataStream(QuicStreamId stream_id) { 144 QuicDataStream* GetIncomingDataStream(QuicStreamId stream_id) {
145 return QuicSession::GetIncomingDataStream(stream_id); 145 return QuicSession::GetIncomingDataStream(stream_id);
146 } 146 }
147 147
148 virtual QuicConsumedData WritevData( 148 virtual QuicConsumedData WritevData(
149 QuicStreamId id, 149 QuicStreamId id,
150 const IOVector& data, 150 const IOVector& data,
151 QuicStreamOffset offset, 151 QuicStreamOffset offset,
152 bool fin, 152 bool fin,
153 FecProtection fec_protection,
153 QuicAckNotifier::DelegateInterface* ack_notifier_delegate) OVERRIDE { 154 QuicAckNotifier::DelegateInterface* ack_notifier_delegate) OVERRIDE {
154 // Always consumes everything. 155 // Always consumes everything.
155 if (writev_consumes_all_data_) { 156 if (writev_consumes_all_data_) {
156 return QuicConsumedData(data.TotalBufferSize(), fin); 157 return QuicConsumedData(data.TotalBufferSize(), fin);
157 } else { 158 } else {
158 return QuicSession::WritevData(id, data, offset, fin, 159 return QuicSession::WritevData(id, data, offset, fin, fec_protection,
159 ack_notifier_delegate); 160 ack_notifier_delegate);
160 } 161 }
161 } 162 }
162 163
163 void set_writev_consumes_all_data(bool val) { 164 void set_writev_consumes_all_data(bool val) {
164 writev_consumes_all_data_ = val; 165 writev_consumes_all_data_ = val;
165 } 166 }
166 167
167 QuicConsumedData SendStreamData(QuicStreamId id) { 168 QuicConsumedData SendStreamData(QuicStreamId id) {
168 return WritevData(id, IOVector(), 0, true, NULL); 169 return WritevData(id, IOVector(), 0, true, MAY_FEC_PROTECT, NULL);
169 } 170 }
170 171
171 using QuicSession::PostProcessAfterData; 172 using QuicSession::PostProcessAfterData;
172 173
173 private: 174 private:
174 StrictMock<TestCryptoStream> crypto_stream_; 175 StrictMock<TestCryptoStream> crypto_stream_;
175 176
176 bool writev_consumes_all_data_; 177 bool writev_consumes_all_data_;
177 }; 178 };
178 179
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 TEST_P(QuicSessionTest, IncreasedTimeoutAfterCryptoHandshake) { 569 TEST_P(QuicSessionTest, IncreasedTimeoutAfterCryptoHandshake) {
569 EXPECT_EQ(kDefaultInitialTimeoutSecs, 570 EXPECT_EQ(kDefaultInitialTimeoutSecs,
570 QuicConnectionPeer::GetNetworkTimeout(connection_).ToSeconds()); 571 QuicConnectionPeer::GetNetworkTimeout(connection_).ToSeconds());
571 CryptoHandshakeMessage msg; 572 CryptoHandshakeMessage msg;
572 session_.GetCryptoStream()->OnHandshakeMessage(msg); 573 session_.GetCryptoStream()->OnHandshakeMessage(msg);
573 EXPECT_EQ(kDefaultTimeoutSecs, 574 EXPECT_EQ(kDefaultTimeoutSecs,
574 QuicConnectionPeer::GetNetworkTimeout(connection_).ToSeconds()); 575 QuicConnectionPeer::GetNetworkTimeout(connection_).ToSeconds());
575 } 576 }
576 577
577 TEST_P(QuicSessionTest, RstStreamBeforeHeadersDecompressed) { 578 TEST_P(QuicSessionTest, RstStreamBeforeHeadersDecompressed) {
578 QuicStreamId stream_id1 = kClientDataStreamId1;
579 // Send two bytes of payload. 579 // Send two bytes of payload.
580 QuicStreamFrame data1(stream_id1, false, 0, MakeIOVector("HT")); 580 QuicStreamFrame data1(kClientDataStreamId1, false, 0, MakeIOVector("HT"));
581 vector<QuicStreamFrame> frames; 581 vector<QuicStreamFrame> frames;
582 frames.push_back(data1); 582 frames.push_back(data1);
583 session_.OnStreamFrames(frames); 583 session_.OnStreamFrames(frames);
584 EXPECT_EQ(1u, session_.GetNumOpenStreams()); 584 EXPECT_EQ(1u, session_.GetNumOpenStreams());
585 585
586 QuicRstStreamFrame rst1(stream_id1, QUIC_STREAM_NO_ERROR, 0); 586 QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0);
587 session_.OnRstStream(rst1); 587 session_.OnRstStream(rst1);
588 EXPECT_EQ(0u, session_.GetNumOpenStreams()); 588 EXPECT_EQ(0u, session_.GetNumOpenStreams());
589 // Connection should remain alive. 589 // Connection should remain alive.
590 EXPECT_TRUE(connection_->connected()); 590 EXPECT_TRUE(connection_->connected());
591 } 591 }
592 592
593 TEST_P(QuicSessionTest, MultipleRstStreamsCauseSingleConnectionClose) { 593 TEST_P(QuicSessionTest, MultipleRstStreamsCauseSingleConnectionClose) {
594 // If multiple invalid reset stream frames arrive in a single packet, this 594 // If multiple invalid reset stream frames arrive in a single packet, this
595 // should trigger a connection close. However there is no need to send 595 // should trigger a connection close. However there is no need to send
596 // multiple connection close frames. 596 // multiple connection close frames.
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 session_.config()->ToHandshakeMessage(&msg); 661 session_.config()->ToHandshakeMessage(&msg);
662 const QuicErrorCode error = 662 const QuicErrorCode error =
663 session_.config()->ProcessPeerHello(msg, CLIENT, &error_details); 663 session_.config()->ProcessPeerHello(msg, CLIENT, &error_details);
664 EXPECT_EQ(QUIC_NO_ERROR, error); 664 EXPECT_EQ(QUIC_NO_ERROR, error);
665 665
666 EXPECT_CALL(*connection_, 666 EXPECT_CALL(*connection_,
667 SendConnectionClose(QUIC_FLOW_CONTROL_INVALID_WINDOW)); 667 SendConnectionClose(QUIC_FLOW_CONTROL_INVALID_WINDOW));
668 session_.OnConfigNegotiated(); 668 session_.OnConfigNegotiated();
669 } 669 }
670 670
671
671 TEST_P(QuicSessionTest, InvalidFlowControlWindow) { 672 TEST_P(QuicSessionTest, InvalidFlowControlWindow) {
673 // Test that an attempt to create a QuicSession with an invalid (< default)
674 // flow control window results in a QuicSession using the default.
672 QuicConnection* connection = 675 QuicConnection* connection =
673 new MockConnection(true, SupportedVersions(GetParam())); 676 new MockConnection(true, SupportedVersions(GetParam()));
674 677
675 const uint32 kSmallerFlowControlWindow = kDefaultFlowControlSendWindow - 1; 678 const uint32 kSmallerFlowControlWindow = kDefaultFlowControlSendWindow - 1;
676 TestSession session(connection, kSmallerFlowControlWindow); 679 TestSession session(connection, kSmallerFlowControlWindow);
677 680
678 EXPECT_EQ(kDefaultFlowControlSendWindow, 681 EXPECT_EQ(kDefaultFlowControlSendWindow,
679 session.max_flow_control_receive_window_bytes()); 682 session.max_flow_control_receive_window_bytes());
680 } 683 }
681 684
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
818 QuicRstStreamFrame rst_frame(stream->id(), QUIC_STREAM_CANCELLED, 821 QuicRstStreamFrame rst_frame(stream->id(), QUIC_STREAM_CANCELLED,
819 kByteOffset); 822 kByteOffset);
820 session_.OnRstStream(rst_frame); 823 session_.OnRstStream(rst_frame);
821 824
822 EXPECT_EQ(kInitialConnectionBytesConsumed + kByteOffset, 825 EXPECT_EQ(kInitialConnectionBytesConsumed + kByteOffset,
823 session_.flow_controller()->bytes_consumed()); 826 session_.flow_controller()->bytes_consumed());
824 EXPECT_EQ(kInitialConnectionHighestReceivedOffset + kByteOffset, 827 EXPECT_EQ(kInitialConnectionHighestReceivedOffset + kByteOffset,
825 session_.flow_controller()->highest_received_byte_offset()); 828 session_.flow_controller()->highest_received_byte_offset());
826 } 829 }
827 830
831 TEST_P(QuicSessionTest, FlowControlWithInvalidFinalOffset) {
832 // Test that if we receive a stream RST with a highest byte offset that
833 // violates flow control, that we close the connection.
834 if (version() < QUIC_VERSION_17) {
835 return;
836 }
837 FLAGS_enable_quic_stream_flow_control_2 = true;
838 FLAGS_enable_quic_connection_flow_control = true;
839
840 const uint64 kLargeOffset = kInitialFlowControlWindowForTest + 1;
841 EXPECT_CALL(*connection_,
842 SendConnectionClose(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA))
843 .Times(2);
844
845 // Check that stream frame + FIN results in connection close.
846 TestStream* stream = session_.CreateOutgoingDataStream();
847 stream->Reset(QUIC_STREAM_CANCELLED);
848 QuicStreamFrame frame(stream->id(), true, kLargeOffset, IOVector());
849 vector<QuicStreamFrame> frames;
850 frames.push_back(frame);
851 session_.OnStreamFrames(frames);
852
853 // Check that RST results in connection close.
854 QuicRstStreamFrame rst_frame(stream->id(), QUIC_STREAM_CANCELLED,
855 kLargeOffset);
856 session_.OnRstStream(rst_frame);
857 }
858
828 TEST_P(QuicSessionTest, VersionNegotiationDisablesFlowControl) { 859 TEST_P(QuicSessionTest, VersionNegotiationDisablesFlowControl) {
829 ValueRestore<bool> old_stream_flag( 860 ValueRestore<bool> old_stream_flag(
830 &FLAGS_enable_quic_stream_flow_control_2, true); 861 &FLAGS_enable_quic_stream_flow_control_2, true);
831 ValueRestore<bool> old_connection_flag( 862 ValueRestore<bool> old_connection_flag(
832 &FLAGS_enable_quic_connection_flow_control, true); 863 &FLAGS_enable_quic_connection_flow_control, true);
833 if (version() < QUIC_VERSION_19) { 864 if (version() < QUIC_VERSION_19) {
834 return; 865 return;
835 } 866 }
836 867
837 // Test that after successful version negotiation, flow control is disabled 868 // Test that after successful version negotiation, flow control is disabled
(...skipping 12 matching lines...) Expand all
850 881
851 // Version 16 means all flow control is disabled. 882 // Version 16 means all flow control is disabled.
852 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_16); 883 session_.OnSuccessfulVersionNegotiation(QUIC_VERSION_16);
853 EXPECT_FALSE(session_.flow_controller()->IsEnabled()); 884 EXPECT_FALSE(session_.flow_controller()->IsEnabled());
854 EXPECT_FALSE(stream->flow_controller()->IsEnabled()); 885 EXPECT_FALSE(stream->flow_controller()->IsEnabled());
855 } 886 }
856 887
857 } // namespace 888 } // namespace
858 } // namespace test 889 } // namespace test
859 } // namespace net 890 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_session.cc ('k') | net/quic/quic_stream_sequencer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698