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

Side by Side Diff: net/tools/quic/quic_simple_server_session_test.cc

Issue 2607873002: QUIC - refactor in preparation for two streams per HTTP transaction. (Closed)
Patch Set: Fixed namespaces and formatting. Created 3 years, 11 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/tools/quic/quic_simple_server_session.h" 5 #include "net/tools/quic/quic_simple_server_session.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <memory> 8 #include <memory>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 17 matching lines...) Expand all
28 #include "net/quic/test_tools/quic_test_utils.h" 28 #include "net/quic/test_tools/quic_test_utils.h"
29 #include "net/test/gtest_util.h" 29 #include "net/test/gtest_util.h"
30 #include "net/tools/quic/quic_simple_server_stream.h" 30 #include "net/tools/quic/quic_simple_server_stream.h"
31 #include "net/tools/quic/test_tools/mock_quic_server_session_visitor.h" 31 #include "net/tools/quic/test_tools/mock_quic_server_session_visitor.h"
32 #include "testing/gmock/include/gmock/gmock.h" 32 #include "testing/gmock/include/gmock/gmock.h"
33 #include "testing/gtest/include/gtest/gtest.h" 33 #include "testing/gtest/include/gtest/gtest.h"
34 34
35 using std::string; 35 using std::string;
36 using testing::StrictMock; 36 using testing::StrictMock;
37 using testing::_; 37 using testing::_;
38 using testing::AtLeast;
38 using testing::InSequence; 39 using testing::InSequence;
39 using testing::Return; 40 using testing::Return;
40 using testing::AtLeast; 41 using testing::StrictMock;
41 42
42 namespace net { 43 namespace net {
43 namespace test { 44 namespace test {
44 namespace { 45 namespace {
45 typedef QuicSimpleServerSession::PromisedStreamInfo PromisedStreamInfo; 46 typedef QuicSimpleServerSession::PromisedStreamInfo PromisedStreamInfo;
46 } // namespace 47 } // namespace
47 48
48 class MockQuicHeadersStream : public QuicHeadersStream { 49 class QuicSimpleServerSessionPeer {
49 public: 50 public:
50 explicit MockQuicHeadersStream(QuicSpdySession* session) 51 static void SetCryptoStream(QuicSimpleServerSession* s,
51 : QuicHeadersStream(session) {} 52 QuicCryptoServerStream* crypto_stream) {
53 s->crypto_stream_.reset(crypto_stream);
54 s->static_streams()[kCryptoStreamId] = crypto_stream;
55 }
52 56
53 // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be 57 static QuicSpdyStream* CreateIncomingDynamicStream(QuicSimpleServerSession* s,
54 // mocked directly. 58 QuicStreamId id) {
55 size_t WritePushPromise(QuicStreamId original_stream_id, 59 return s->CreateIncomingDynamicStream(id);
56 QuicStreamId promised_stream_id,
57 SpdyHeaderBlock headers) override {
58 return WritePushPromiseMock(original_stream_id, promised_stream_id,
59 headers);
60 } 60 }
61 MOCK_METHOD3(WritePushPromiseMock,
62 size_t(QuicStreamId original_stream_id,
63 QuicStreamId promised_stream_id,
64 const SpdyHeaderBlock& headers));
65 61
66 size_t WriteHeaders(QuicStreamId stream_id, 62 static QuicSimpleServerStream* CreateOutgoingDynamicStream(
67 SpdyHeaderBlock headers, 63 QuicSimpleServerSession* s,
68 bool fin, 64 SpdyPriority priority) {
69 SpdyPriority priority, 65 return s->CreateOutgoingDynamicStream(priority);
70 QuicReferenceCountedPointer<QuicAckListenerInterface>
71 ack_listener) override {
72 return WriteHeadersMock(stream_id, headers, fin, priority, ack_listener);
73 } 66 }
74 MOCK_METHOD5( 67
75 WriteHeadersMock, 68 static std::deque<PromisedStreamInfo>* promised_streams(
76 size_t(QuicStreamId stream_id, 69 QuicSimpleServerSession* s) {
77 const SpdyHeaderBlock& headers, 70 return &(s->promised_streams_);
78 bool fin, 71 }
79 SpdyPriority priority, 72
80 const QuicReferenceCountedPointer<QuicAckListenerInterface>& 73 static QuicStreamId hightest_promised_stream_id(QuicSimpleServerSession* s) {
81 ack_listener)); 74 return s->highest_promised_stream_id_;
75 }
82 }; 76 };
83 77
78 namespace {
79
80 const size_t kMaxStreamsForTest = 10;
81
84 class MockQuicCryptoServerStream : public QuicCryptoServerStream { 82 class MockQuicCryptoServerStream : public QuicCryptoServerStream {
85 public: 83 public:
86 explicit MockQuicCryptoServerStream( 84 explicit MockQuicCryptoServerStream(
87 const QuicCryptoServerConfig* crypto_config, 85 const QuicCryptoServerConfig* crypto_config,
88 QuicCompressedCertsCache* compressed_certs_cache, 86 QuicCompressedCertsCache* compressed_certs_cache,
89 QuicServerSessionBase* session, 87 QuicServerSessionBase* session,
90 QuicCryptoServerStream::Helper* helper) 88 QuicCryptoServerStream::Helper* helper)
91 : QuicCryptoServerStream( 89 : QuicCryptoServerStream(
92 crypto_config, 90 crypto_config,
93 compressed_certs_cache, 91 compressed_certs_cache,
(...skipping 28 matching lines...) Expand all
122 MOCK_METHOD5( 120 MOCK_METHOD5(
123 SendStreamData, 121 SendStreamData,
124 QuicConsumedData( 122 QuicConsumedData(
125 QuicStreamId id, 123 QuicStreamId id,
126 QuicIOVector iov, 124 QuicIOVector iov,
127 QuicStreamOffset offset, 125 QuicStreamOffset offset,
128 bool fin, 126 bool fin,
129 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener)); 127 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener));
130 }; 128 };
131 129
132 class QuicSimpleServerSessionPeer { 130 class MockQuicSimpleServerSession : public QuicSimpleServerSession {
133 public: 131 public:
134 static void SetCryptoStream(QuicSimpleServerSession* s, 132 MockQuicSimpleServerSession(const QuicConfig& config,
135 QuicCryptoServerStream* crypto_stream) { 133 QuicConnection* connection,
136 s->crypto_stream_.reset(crypto_stream); 134 QuicSession::Visitor* visitor,
137 s->static_streams()[kCryptoStreamId] = crypto_stream; 135 QuicCryptoServerStream::Helper* helper,
136 const QuicCryptoServerConfig* crypto_config,
137 QuicCompressedCertsCache* compressed_certs_cache,
138 QuicHttpResponseCache* response_cache)
139 : QuicSimpleServerSession(config,
140 connection,
141 visitor,
142 helper,
143 crypto_config,
144 compressed_certs_cache,
145 response_cache) {}
146 // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be
147 // mocked directly.
148 size_t WritePushPromise(QuicStreamId original_stream_id,
149 QuicStreamId promised_stream_id,
150 SpdyHeaderBlock headers) override {
151 return WritePushPromiseMock(original_stream_id, promised_stream_id,
152 headers);
138 } 153 }
154 MOCK_METHOD3(WritePushPromiseMock,
155 size_t(QuicStreamId original_stream_id,
156 QuicStreamId promised_stream_id,
157 const SpdyHeaderBlock& headers));
139 158
140 static QuicSpdyStream* CreateIncomingDynamicStream(QuicSimpleServerSession* s, 159 size_t WriteHeaders(QuicStreamId stream_id,
141 QuicStreamId id) { 160 SpdyHeaderBlock headers,
142 return s->CreateIncomingDynamicStream(id); 161 bool fin,
162 SpdyPriority priority,
163 QuicReferenceCountedPointer<QuicAckListenerInterface>
164 ack_listener) override {
165 return WriteHeadersMock(stream_id, headers, fin, priority, ack_listener);
143 } 166 }
144 167 MOCK_METHOD5(
145 static QuicSimpleServerStream* CreateOutgoingDynamicStream( 168 WriteHeadersMock,
146 QuicSimpleServerSession* s, 169 size_t(QuicStreamId stream_id,
147 SpdyPriority priority) { 170 const SpdyHeaderBlock& headers,
148 return s->CreateOutgoingDynamicStream(priority); 171 bool fin,
149 } 172 SpdyPriority priority,
150 173 const QuicReferenceCountedPointer<QuicAckListenerInterface>&
151 static std::deque<PromisedStreamInfo>* promised_streams( 174 ack_listener));
152 QuicSimpleServerSession* s) {
153 return &(s->promised_streams_);
154 }
155
156 static QuicStreamId hightest_promised_stream_id(QuicSimpleServerSession* s) {
157 return s->highest_promised_stream_id_;
158 }
159 }; 175 };
160 176
161 namespace {
162
163 const size_t kMaxStreamsForTest = 10;
164
165 class QuicSimpleServerSessionTest 177 class QuicSimpleServerSessionTest
166 : public ::testing::TestWithParam<QuicVersion> { 178 : public ::testing::TestWithParam<QuicVersion> {
167 protected: 179 protected:
168 QuicSimpleServerSessionTest() 180 QuicSimpleServerSessionTest()
169 : crypto_config_(QuicCryptoServerConfig::TESTING, 181 : crypto_config_(QuicCryptoServerConfig::TESTING,
170 QuicRandom::GetInstance(), 182 QuicRandom::GetInstance(),
171 CryptoTestUtils::ProofSourceForTesting()), 183 CryptoTestUtils::ProofSourceForTesting()),
172 compressed_certs_cache_( 184 compressed_certs_cache_(
173 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize) { 185 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize) {
174 config_.SetMaxStreamsPerConnection(kMaxStreamsForTest, kMaxStreamsForTest); 186 config_.SetMaxStreamsPerConnection(kMaxStreamsForTest, kMaxStreamsForTest);
175 config_.SetMaxIncomingDynamicStreamsToSend(kMaxStreamsForTest); 187 config_.SetMaxIncomingDynamicStreamsToSend(kMaxStreamsForTest);
176 QuicConfigPeer::SetReceivedMaxIncomingDynamicStreams(&config_, 188 QuicConfigPeer::SetReceivedMaxIncomingDynamicStreams(&config_,
177 kMaxStreamsForTest); 189 kMaxStreamsForTest);
178 config_.SetInitialStreamFlowControlWindowToSend( 190 config_.SetInitialStreamFlowControlWindowToSend(
179 kInitialStreamFlowControlWindowForTest); 191 kInitialStreamFlowControlWindowForTest);
180 config_.SetInitialSessionFlowControlWindowToSend( 192 config_.SetInitialSessionFlowControlWindowToSend(
181 kInitialSessionFlowControlWindowForTest); 193 kInitialSessionFlowControlWindowForTest);
182 194
183 connection_ = new StrictMock<MockQuicConnectionWithSendStreamData>( 195 connection_ = new StrictMock<MockQuicConnectionWithSendStreamData>(
184 &helper_, &alarm_factory_, Perspective::IS_SERVER, 196 &helper_, &alarm_factory_, Perspective::IS_SERVER,
185 SupportedVersions(GetParam())); 197 SupportedVersions(GetParam()));
186 session_.reset(new QuicSimpleServerSession( 198 session_.reset(new MockQuicSimpleServerSession(
187 config_, connection_, &owner_, &stream_helper_, &crypto_config_, 199 config_, connection_, &owner_, &stream_helper_, &crypto_config_,
188 &compressed_certs_cache_, &response_cache_)); 200 &compressed_certs_cache_, &response_cache_));
189 MockClock clock; 201 MockClock clock;
190 handshake_message_.reset(crypto_config_.AddDefaultConfig( 202 handshake_message_.reset(crypto_config_.AddDefaultConfig(
191 QuicRandom::GetInstance(), &clock, 203 QuicRandom::GetInstance(), &clock,
192 QuicCryptoServerConfig::ConfigOptions())); 204 QuicCryptoServerConfig::ConfigOptions()));
193 session_->Initialize(); 205 session_->Initialize();
194 visitor_ = QuicConnectionPeer::GetVisitor(connection_); 206 visitor_ = QuicConnectionPeer::GetVisitor(connection_);
195 headers_stream_ = new MockQuicHeadersStream(session_.get());
196 QuicSpdySessionPeer::SetHeadersStream(session_.get(), headers_stream_);
197 207
198 session_->OnConfigNegotiated(); 208 session_->OnConfigNegotiated();
199 } 209 }
200 210
201 StrictMock<MockQuicSessionVisitor> owner_; 211 StrictMock<MockQuicSessionVisitor> owner_;
202 StrictMock<MockQuicCryptoServerStreamHelper> stream_helper_; 212 StrictMock<MockQuicCryptoServerStreamHelper> stream_helper_;
203 MockQuicConnectionHelper helper_; 213 MockQuicConnectionHelper helper_;
204 MockAlarmFactory alarm_factory_; 214 MockAlarmFactory alarm_factory_;
205 StrictMock<MockQuicConnectionWithSendStreamData>* connection_; 215 StrictMock<MockQuicConnectionWithSendStreamData>* connection_;
206 QuicConfig config_; 216 QuicConfig config_;
207 QuicCryptoServerConfig crypto_config_; 217 QuicCryptoServerConfig crypto_config_;
208 QuicCompressedCertsCache compressed_certs_cache_; 218 QuicCompressedCertsCache compressed_certs_cache_;
209 QuicHttpResponseCache response_cache_; 219 QuicHttpResponseCache response_cache_;
210 std::unique_ptr<QuicSimpleServerSession> session_; 220 std::unique_ptr<MockQuicSimpleServerSession> session_;
211 std::unique_ptr<CryptoHandshakeMessage> handshake_message_; 221 std::unique_ptr<CryptoHandshakeMessage> handshake_message_;
212 QuicConnectionVisitorInterface* visitor_; 222 QuicConnectionVisitorInterface* visitor_;
213 MockQuicHeadersStream* headers_stream_;
214 }; 223 };
215 224
216 INSTANTIATE_TEST_CASE_P(Tests, 225 INSTANTIATE_TEST_CASE_P(Tests,
217 QuicSimpleServerSessionTest, 226 QuicSimpleServerSessionTest,
218 ::testing::ValuesIn(AllSupportedVersions())); 227 ::testing::ValuesIn(AllSupportedVersions()));
219 228
220 TEST_P(QuicSimpleServerSessionTest, CloseStreamDueToReset) { 229 TEST_P(QuicSimpleServerSessionTest, CloseStreamDueToReset) {
221 // Open a stream, then reset it. 230 // Open a stream, then reset it.
222 // Send two bytes of payload to open it. 231 // Send two bytes of payload to open it.
223 QuicStreamFrame data1(kClientDataStreamId1, false, 0, StringPiece("HT")); 232 QuicStreamFrame data1(kClientDataStreamId1, false, 0, StringPiece("HT"));
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 QuicConfigPeer::SetReceivedInitialSessionFlowControlWindow( 425 QuicConfigPeer::SetReceivedInitialSessionFlowControlWindow(
417 &config_, kInitialSessionFlowControlWindowForTest); 426 &config_, kInitialSessionFlowControlWindowForTest);
418 // Enable server push. 427 // Enable server push.
419 QuicTagVector copt; 428 QuicTagVector copt;
420 copt.push_back(kSPSH); 429 copt.push_back(kSPSH);
421 QuicConfigPeer::SetReceivedConnectionOptions(&config_, copt); 430 QuicConfigPeer::SetReceivedConnectionOptions(&config_, copt);
422 431
423 connection_ = new StrictMock<MockQuicConnectionWithSendStreamData>( 432 connection_ = new StrictMock<MockQuicConnectionWithSendStreamData>(
424 &helper_, &alarm_factory_, Perspective::IS_SERVER, 433 &helper_, &alarm_factory_, Perspective::IS_SERVER,
425 SupportedVersions(GetParam())); 434 SupportedVersions(GetParam()));
426 session_.reset(new QuicSimpleServerSession( 435 session_.reset(new MockQuicSimpleServerSession(
427 config_, connection_, &owner_, &stream_helper_, &crypto_config_, 436 config_, connection_, &owner_, &stream_helper_, &crypto_config_,
428 &compressed_certs_cache_, &response_cache_)); 437 &compressed_certs_cache_, &response_cache_));
429 session_->Initialize(); 438 session_->Initialize();
430 // Needed to make new session flow control window and server push work. 439 // Needed to make new session flow control window and server push work.
431 session_->OnConfigNegotiated(); 440 session_->OnConfigNegotiated();
432 441
433 visitor_ = QuicConnectionPeer::GetVisitor(connection_); 442 visitor_ = QuicConnectionPeer::GetVisitor(connection_);
434 headers_stream_ = new MockQuicHeadersStream(session_.get());
435 QuicSpdySessionPeer::SetHeadersStream(session_.get(), headers_stream_);
436 443
437 // Assume encryption already established. 444 // Assume encryption already established.
438 MockQuicCryptoServerStream* crypto_stream = new MockQuicCryptoServerStream( 445 MockQuicCryptoServerStream* crypto_stream = new MockQuicCryptoServerStream(
439 &crypto_config_, &compressed_certs_cache_, session_.get(), 446 &crypto_config_, &compressed_certs_cache_, session_.get(),
440 &stream_helper_); 447 &stream_helper_);
441 448
442 crypto_stream->set_encryption_established(true); 449 crypto_stream->set_encryption_established(true);
443 QuicSimpleServerSessionPeer::SetCryptoStream(session_.get(), crypto_stream); 450 QuicSimpleServerSessionPeer::SetCryptoStream(session_.get(), crypto_stream);
444 } 451 }
445 452
(...skipping 17 matching lines...) Expand all
463 for (unsigned int i = 1; i <= num_resources; ++i) { 470 for (unsigned int i = 1; i <= num_resources; ++i) {
464 QuicStreamId stream_id = i * 2; 471 QuicStreamId stream_id = i * 2;
465 string path = partial_push_resource_path + base::UintToString(i); 472 string path = partial_push_resource_path + base::UintToString(i);
466 string url = scheme + "://" + resource_host + path; 473 string url = scheme + "://" + resource_host + path;
467 GURL resource_url = GURL(url); 474 GURL resource_url = GURL(url);
468 string body(body_size, 'a'); 475 string body(body_size, 'a');
469 response_cache_.AddSimpleResponse(resource_host, path, 200, body); 476 response_cache_.AddSimpleResponse(resource_host, path, 200, body);
470 push_resources.push_back(QuicHttpResponseCache::ServerPushInfo( 477 push_resources.push_back(QuicHttpResponseCache::ServerPushInfo(
471 resource_url, SpdyHeaderBlock(), kDefaultPriority, body)); 478 resource_url, SpdyHeaderBlock(), kDefaultPriority, body));
472 // PUSH_PROMISED are sent for all the resources. 479 // PUSH_PROMISED are sent for all the resources.
473 EXPECT_CALL(*headers_stream_, 480 EXPECT_CALL(*session_,
474 WritePushPromiseMock(kClientDataStreamId1, stream_id, _)); 481 WritePushPromiseMock(kClientDataStreamId1, stream_id, _));
475 if (i <= kMaxStreamsForTest) { 482 if (i <= kMaxStreamsForTest) {
476 // |kMaxStreamsForTest| promised responses should be sent. 483 // |kMaxStreamsForTest| promised responses should be sent.
477 EXPECT_CALL(*headers_stream_, 484 EXPECT_CALL(*session_,
478 WriteHeadersMock(stream_id, _, false, kDefaultPriority, _)); 485 WriteHeadersMock(stream_id, _, false, kDefaultPriority, _));
479 // Since flow control window is smaller than response body, not the 486 // Since flow control window is smaller than response body, not the
480 // whole body will be sent. 487 // whole body will be sent.
481 if (!session_->force_hol_blocking()) { 488 if (!session_->force_hol_blocking()) {
482 EXPECT_CALL(*connection_, SendStreamData(stream_id, _, 0, false, _)) 489 EXPECT_CALL(*connection_, SendStreamData(stream_id, _, 0, false, _))
483 .WillOnce(Return( 490 .WillOnce(Return(
484 QuicConsumedData(kStreamFlowControlWindowSize, false))); 491 QuicConsumedData(kStreamFlowControlWindowSize, false)));
485 EXPECT_CALL(*connection_, SendBlocked(stream_id)); 492 EXPECT_CALL(*connection_, SendBlocked(stream_id));
486 } else { 493 } else {
487 // The forced HOL blocking encapsulates the stream data into 494 // The forced HOL blocking encapsulates the stream data into
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 } 534 }
528 535
529 // Tests that after promised stream queued up, when an opened stream is marked 536 // Tests that after promised stream queued up, when an opened stream is marked
530 // draining, a queued promised stream will become open and send push response. 537 // draining, a queued promised stream will become open and send push response.
531 size_t num_resources = kMaxStreamsForTest + 1; 538 size_t num_resources = kMaxStreamsForTest + 1;
532 PromisePushResources(num_resources); 539 PromisePushResources(num_resources);
533 QuicStreamId next_out_going_stream_id = num_resources * 2; 540 QuicStreamId next_out_going_stream_id = num_resources * 2;
534 541
535 // After an open stream is marked draining, a new stream is expected to be 542 // After an open stream is marked draining, a new stream is expected to be
536 // created and a response sent on the stream. 543 // created and a response sent on the stream.
537 EXPECT_CALL(*headers_stream_, WriteHeadersMock(next_out_going_stream_id, _, 544 EXPECT_CALL(*session_, WriteHeadersMock(next_out_going_stream_id, _, false,
538 false, kDefaultPriority, _)); 545 kDefaultPriority, _));
539 EXPECT_CALL(*connection_, 546 EXPECT_CALL(*connection_,
540 SendStreamData(next_out_going_stream_id, _, 0, false, _)) 547 SendStreamData(next_out_going_stream_id, _, 0, false, _))
541 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); 548 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false)));
542 EXPECT_CALL(*connection_, SendBlocked(next_out_going_stream_id)); 549 EXPECT_CALL(*connection_, SendBlocked(next_out_going_stream_id));
543 session_->StreamDraining(2); 550 session_->StreamDraining(2);
544 // Number of open outgoing streams should still be the same, because a new 551 // Number of open outgoing streams should still be the same, because a new
545 // stream is opened. And the queue should be empty. 552 // stream is opened. And the queue should be empty.
546 EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams()); 553 EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams());
547 } 554 }
548 555
(...skipping 15 matching lines...) Expand all
564 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0); 571 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0);
565 EXPECT_CALL(*connection_, 572 EXPECT_CALL(*connection_,
566 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, 0)); 573 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, 0));
567 visitor_->OnRstStream(rst); 574 visitor_->OnRstStream(rst);
568 575
569 // When the first 2 streams becomes draining, the two queued up stream could 576 // When the first 2 streams becomes draining, the two queued up stream could
570 // be created. But since one of them was marked cancelled due to RST frame, 577 // be created. But since one of them was marked cancelled due to RST frame,
571 // only one queued resource will be sent out. 578 // only one queued resource will be sent out.
572 QuicStreamId stream_not_reset = (kMaxStreamsForTest + 1) * 2; 579 QuicStreamId stream_not_reset = (kMaxStreamsForTest + 1) * 2;
573 InSequence s; 580 InSequence s;
574 EXPECT_CALL(*headers_stream_, WriteHeadersMock(stream_not_reset, _, false, 581 EXPECT_CALL(*session_, WriteHeadersMock(stream_not_reset, _, false,
575 kDefaultPriority, _)); 582 kDefaultPriority, _));
576 EXPECT_CALL(*connection_, SendStreamData(stream_not_reset, _, 0, false, _)) 583 EXPECT_CALL(*connection_, SendStreamData(stream_not_reset, _, 0, false, _))
577 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); 584 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false)));
578 EXPECT_CALL(*connection_, SendBlocked(stream_not_reset)); 585 EXPECT_CALL(*connection_, SendBlocked(stream_not_reset));
579 EXPECT_CALL(*headers_stream_, 586 EXPECT_CALL(*session_,
580 WriteHeadersMock(stream_got_reset, _, false, kDefaultPriority, _)) 587 WriteHeadersMock(stream_got_reset, _, false, kDefaultPriority, _))
581 .Times(0); 588 .Times(0);
582 589
583 session_->StreamDraining(2); 590 session_->StreamDraining(2);
584 session_->StreamDraining(4); 591 session_->StreamDraining(4);
585 } 592 }
586 593
587 TEST_P(QuicSimpleServerSessionServerPushTest, 594 TEST_P(QuicSimpleServerSessionServerPushTest,
588 CloseStreamToHandleMorePromisedStream) { 595 CloseStreamToHandleMorePromisedStream) {
589 if (session_->force_hol_blocking()) { 596 if (session_->force_hol_blocking()) {
590 return; 597 return;
591 } 598 }
592 // Tests that closing a open outgoing stream can trigger a promised resource 599 // Tests that closing a open outgoing stream can trigger a promised resource
593 // in the queue to be send out. 600 // in the queue to be send out.
594 size_t num_resources = kMaxStreamsForTest + 1; 601 size_t num_resources = kMaxStreamsForTest + 1;
595 PromisePushResources(num_resources); 602 PromisePushResources(num_resources);
596 QuicStreamId stream_to_open = num_resources * 2; 603 QuicStreamId stream_to_open = num_resources * 2;
597 604
598 // Resetting 1st open stream will close the stream and give space for extra 605 // Resetting 1st open stream will close the stream and give space for extra
599 // stream to be opened. 606 // stream to be opened.
600 QuicStreamId stream_got_reset = 2; 607 QuicStreamId stream_got_reset = 2;
601 EXPECT_CALL(*connection_, 608 EXPECT_CALL(*connection_,
602 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, _)); 609 SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, _));
603 EXPECT_CALL(*headers_stream_, 610 EXPECT_CALL(*session_,
604 WriteHeadersMock(stream_to_open, _, false, kDefaultPriority, _)); 611 WriteHeadersMock(stream_to_open, _, false, kDefaultPriority, _));
605 EXPECT_CALL(*connection_, SendStreamData(stream_to_open, _, 0, false, _)) 612 EXPECT_CALL(*connection_, SendStreamData(stream_to_open, _, 0, false, _))
606 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false))); 613 .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false)));
607 614
608 EXPECT_CALL(*connection_, SendBlocked(stream_to_open)); 615 EXPECT_CALL(*connection_, SendBlocked(stream_to_open));
609 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0); 616 QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0);
610 visitor_->OnRstStream(rst); 617 visitor_->OnRstStream(rst);
611 } 618 }
612 619
613 } // namespace 620 } // namespace
614 } // namespace test 621 } // namespace test
615 } // namespace net 622 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/quic_simple_server_session.cc ('k') | net/tools/quic/quic_simple_server_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698