OLD | NEW |
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/quic/quic_headers_stream.h" | 5 #include "net/quic/quic_headers_stream.h" |
6 | 6 |
7 #include "net/quic/quic_utils.h" | 7 #include "net/quic/quic_utils.h" |
8 #include "net/quic/spdy_utils.h" | 8 #include "net/quic/spdy_utils.h" |
9 #include "net/quic/test_tools/quic_connection_peer.h" | 9 #include "net/quic/test_tools/quic_connection_peer.h" |
10 #include "net/quic/test_tools/quic_spdy_session_peer.h" | 10 #include "net/quic/test_tools/quic_spdy_session_peer.h" |
11 #include "net/quic/test_tools/quic_test_utils.h" | 11 #include "net/quic/test_tools/quic_test_utils.h" |
12 #include "net/quic/test_tools/reliable_quic_stream_peer.h" | 12 #include "net/quic/test_tools/reliable_quic_stream_peer.h" |
13 #include "net/spdy/spdy_alt_svc_wire_format.h" | 13 #include "net/spdy/spdy_alt_svc_wire_format.h" |
14 #include "net/spdy/spdy_protocol.h" | 14 #include "net/spdy/spdy_protocol.h" |
15 #include "net/spdy/spdy_test_utils.h" | 15 #include "net/spdy/spdy_test_utils.h" |
16 #include "net/test/gtest_util.h" | 16 #include "net/test/gtest_util.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
18 | 18 |
19 using base::StringPiece; | 19 using base::StringPiece; |
20 using std::ostream; | 20 using std::ostream; |
21 using std::string; | 21 using std::string; |
22 using std::vector; | 22 using std::vector; |
23 using testing::ElementsAre; | 23 using testing::ElementsAre; |
24 using testing::InSequence; | 24 using testing::InSequence; |
25 using testing::Invoke; | 25 using testing::Invoke; |
26 using testing::Return; | |
27 using testing::StrictMock; | 26 using testing::StrictMock; |
28 using testing::WithArgs; | 27 using testing::WithArgs; |
29 using testing::_; | 28 using testing::_; |
30 | 29 |
31 namespace net { | 30 namespace net { |
32 namespace test { | 31 namespace test { |
33 namespace { | 32 namespace { |
34 | 33 |
35 // TODO(ckrasic): this workaround is due to absence of std::initializer_list | 34 // TODO(ckrasic): this workaround is due to absence of std::initializer_list |
36 const bool kFins[] = {false, true}; | 35 const bool kFins[] = {false, true}; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 | 155 |
157 bool SaveHeaderData(const char* data, int len) { | 156 bool SaveHeaderData(const char* data, int len) { |
158 saved_header_data_.append(data, len); | 157 saved_header_data_.append(data, len); |
159 return true; | 158 return true; |
160 } | 159 } |
161 | 160 |
162 void SaveHeaderDataStringPiece(StringPiece data) { | 161 void SaveHeaderDataStringPiece(StringPiece data) { |
163 saved_header_data_.append(data.data(), data.length()); | 162 saved_header_data_.append(data.data(), data.length()); |
164 } | 163 } |
165 | 164 |
166 void SavePromiseHeaderList(QuicStreamId /* stream_id */, | |
167 QuicStreamId /* promised_stream_id */, | |
168 size_t size, | |
169 const QuicHeaderList& header_list) { | |
170 SaveToHandler(size, header_list); | |
171 } | |
172 | |
173 void SaveHeaderList(QuicStreamId /* stream_id */, | |
174 bool /* fin */, | |
175 size_t size, | |
176 const QuicHeaderList& header_list) { | |
177 SaveToHandler(size, header_list); | |
178 } | |
179 | |
180 void SaveToHandler(size_t size, const QuicHeaderList& header_list) { | |
181 headers_handler_.reset(new TestHeadersHandler); | |
182 headers_handler_->OnHeaderBlockStart(); | |
183 for (const auto& p : header_list) { | |
184 headers_handler_->OnHeader(p.first, p.second); | |
185 } | |
186 headers_handler_->OnHeaderBlockEnd(size); | |
187 } | |
188 | |
189 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, | 165 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, |
190 bool fin, | 166 bool fin, |
191 SpdyPriority priority) { | 167 SpdyPriority priority) { |
192 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); | 168 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); |
193 } | 169 } |
194 | 170 |
195 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { | 171 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { |
196 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); | 172 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); |
197 } | 173 } |
198 | 174 |
(...skipping 12 matching lines...) Expand all Loading... |
211 OnHeaders(stream_id, kHasPriority, priority, | 187 OnHeaders(stream_id, kHasPriority, priority, |
212 /*parent_stream_id=*/0, | 188 /*parent_stream_id=*/0, |
213 /*exclusive=*/false, fin, kFrameComplete)); | 189 /*exclusive=*/false, fin, kFrameComplete)); |
214 } else { | 190 } else { |
215 EXPECT_CALL(visitor_, | 191 EXPECT_CALL(visitor_, |
216 OnHeaders(stream_id, !kHasPriority, | 192 OnHeaders(stream_id, !kHasPriority, |
217 /*priority=*/0, | 193 /*priority=*/0, |
218 /*parent_stream_id=*/0, | 194 /*parent_stream_id=*/0, |
219 /*exclusive=*/false, fin, kFrameComplete)); | 195 /*exclusive=*/false, fin, kFrameComplete)); |
220 } | 196 } |
221 headers_handler_.reset(new TestHeadersHandler); | 197 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) |
222 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) | 198 .WillRepeatedly(WithArgs<1, 2>( |
223 .WillOnce(Return(headers_handler_.get())); | 199 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); |
224 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); | |
225 if (fin) { | 200 if (fin) { |
226 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); | 201 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); |
227 } | 202 } |
228 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 203 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
229 EXPECT_FALSE(framer_->HasError()) | 204 EXPECT_FALSE(framer_->HasError()) |
230 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 205 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
231 | 206 |
232 CheckHeaders(); | 207 CheckHeaders(); |
233 saved_data_.clear(); | 208 saved_data_.clear(); |
234 } | 209 } |
235 | 210 |
236 void CheckHeaders() { | 211 void CheckHeaders() { |
237 EXPECT_EQ(headers_, headers_handler_->decoded_block()); | 212 SpdyHeaderBlock headers; |
238 headers_handler_.reset(); | 213 EXPECT_TRUE(framer_->ParseHeaderBlockInBuffer( |
| 214 saved_header_data_.data(), saved_header_data_.length(), &headers)); |
| 215 EXPECT_EQ(headers_, headers); |
| 216 saved_header_data_.clear(); |
239 } | 217 } |
240 | 218 |
241 Perspective perspective() { return GetParam().perspective; } | 219 Perspective perspective() { return GetParam().perspective; } |
242 | 220 |
243 QuicVersion version() { return GetParam().version; } | 221 QuicVersion version() { return GetParam().version; } |
244 | 222 |
245 QuicVersionVector GetVersion() { | 223 QuicVersionVector GetVersion() { |
246 QuicVersionVector versions; | 224 QuicVersionVector versions; |
247 versions.push_back(version()); | 225 versions.push_back(version()); |
248 return versions; | 226 return versions; |
249 } | 227 } |
250 | 228 |
251 void TearDownLocalConnectionState() { | 229 void TearDownLocalConnectionState() { |
252 QuicConnectionPeer::TearDownLocalConnectionState(connection_); | 230 QuicConnectionPeer::TearDownLocalConnectionState(connection_); |
253 } | 231 } |
254 | 232 |
255 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } | 233 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } |
256 | 234 |
257 static const bool kFrameComplete = true; | 235 static const bool kFrameComplete = true; |
258 static const bool kHasPriority = true; | 236 static const bool kHasPriority = true; |
259 | 237 |
260 MockQuicConnectionHelper helper_; | 238 MockQuicConnectionHelper helper_; |
261 MockAlarmFactory alarm_factory_; | 239 MockAlarmFactory alarm_factory_; |
262 StrictMock<MockQuicConnection>* connection_; | 240 StrictMock<MockQuicConnection>* connection_; |
263 StrictMock<MockQuicSpdySession> session_; | 241 StrictMock<MockQuicSpdySession> session_; |
264 QuicHeadersStream* headers_stream_; | 242 QuicHeadersStream* headers_stream_; |
265 SpdyHeaderBlock headers_; | 243 SpdyHeaderBlock headers_; |
266 std::unique_ptr<TestHeadersHandler> headers_handler_; | |
267 string body_; | 244 string body_; |
268 string saved_data_; | 245 string saved_data_; |
269 string saved_header_data_; | 246 string saved_header_data_; |
270 std::unique_ptr<SpdyFramer> framer_; | 247 std::unique_ptr<SpdyFramer> framer_; |
271 StrictMock<MockVisitor> visitor_; | 248 StrictMock<MockVisitor> visitor_; |
272 QuicStreamFrame stream_frame_; | 249 QuicStreamFrame stream_frame_; |
273 QuicStreamId next_promised_stream_id_; | 250 QuicStreamId next_promised_stream_id_; |
274 }; | 251 }; |
275 | 252 |
276 INSTANTIATE_TEST_CASE_P(Tests, | 253 INSTANTIATE_TEST_CASE_P(Tests, |
(...skipping 27 matching lines...) Expand all Loading... |
304 if (perspective() == Perspective::IS_SERVER) { | 281 if (perspective() == Perspective::IS_SERVER) { |
305 // Write the headers and capture the outgoing data | 282 // Write the headers and capture the outgoing data |
306 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, nullptr)) | 283 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, nullptr)) |
307 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 284 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
308 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, | 285 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, |
309 nullptr); | 286 nullptr); |
310 | 287 |
311 // Parse the outgoing data and check that it matches was was written. | 288 // Parse the outgoing data and check that it matches was was written. |
312 EXPECT_CALL(visitor_, | 289 EXPECT_CALL(visitor_, |
313 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); | 290 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); |
314 headers_handler_.reset(new TestHeadersHandler); | 291 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) |
315 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) | 292 .WillRepeatedly(WithArgs<1, 2>( |
316 .WillOnce(Return(headers_handler_.get())); | 293 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); |
317 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); | |
318 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 294 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
319 EXPECT_FALSE(framer_->HasError()) | 295 EXPECT_FALSE(framer_->HasError()) |
320 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 296 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
321 CheckHeaders(); | 297 CheckHeaders(); |
322 saved_data_.clear(); | 298 saved_data_.clear(); |
323 } else { | 299 } else { |
324 EXPECT_DFATAL(headers_stream_->WritePushPromise( | 300 EXPECT_DFATAL(headers_stream_->WritePushPromise( |
325 stream_id, promised_stream_id, headers_, nullptr), | 301 stream_id, promised_stream_id, headers_, nullptr), |
326 "Client shouldn't send PUSH_PROMISE"); | 302 "Client shouldn't send PUSH_PROMISE"); |
327 } | 303 } |
(...skipping 13 matching lines...) Expand all Loading... |
341 headers_frame.set_fin(fin); | 317 headers_frame.set_fin(fin); |
342 headers_frame.set_has_priority(true); | 318 headers_frame.set_has_priority(true); |
343 frame = framer_->SerializeFrame(headers_frame); | 319 frame = framer_->SerializeFrame(headers_frame); |
344 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 320 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
345 } else { | 321 } else { |
346 SpdyHeadersIR headers_frame(stream_id); | 322 SpdyHeadersIR headers_frame(stream_id); |
347 headers_frame.set_header_block(headers_); | 323 headers_frame.set_header_block(headers_); |
348 headers_frame.set_fin(fin); | 324 headers_frame.set_fin(fin); |
349 frame = framer_->SerializeFrame(headers_frame); | 325 frame = framer_->SerializeFrame(headers_frame); |
350 } | 326 } |
| 327 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) |
| 328 .WillRepeatedly(WithArgs<1>(Invoke( |
| 329 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
351 EXPECT_CALL(session_, | 330 EXPECT_CALL(session_, |
352 OnStreamHeaderList(stream_id, fin, frame.size(), _)) | 331 OnStreamHeadersComplete(stream_id, fin, frame.size())); |
353 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); | |
354 stream_frame_.data_buffer = frame.data(); | 332 stream_frame_.data_buffer = frame.data(); |
355 stream_frame_.data_length = frame.size(); | 333 stream_frame_.data_length = frame.size(); |
356 headers_stream_->OnStreamFrame(stream_frame_); | 334 headers_stream_->OnStreamFrame(stream_frame_); |
357 stream_frame_.offset += frame.size(); | 335 stream_frame_.offset += frame.size(); |
358 CheckHeaders(); | 336 CheckHeaders(); |
359 } | 337 } |
360 } | 338 } |
361 } | 339 } |
362 } | 340 } |
363 | 341 |
364 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { | 342 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { |
365 if (perspective() == Perspective::IS_SERVER) | 343 if (perspective() == Perspective::IS_SERVER) |
366 return; | 344 return; |
367 for (QuicStreamId stream_id = kClientDataStreamId1; | 345 for (QuicStreamId stream_id = kClientDataStreamId1; |
368 stream_id < kClientDataStreamId3; stream_id += 2) { | 346 stream_id < kClientDataStreamId3; stream_id += 2) { |
369 QuicStreamId promised_stream_id = NextPromisedStreamId(); | 347 QuicStreamId promised_stream_id = NextPromisedStreamId(); |
370 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); | 348 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); |
371 push_promise.set_header_block(headers_); | 349 push_promise.set_header_block(headers_); |
372 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); | 350 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); |
373 if (perspective() == Perspective::IS_SERVER) { | 351 if (perspective() == Perspective::IS_SERVER) { |
374 EXPECT_CALL(*connection_, | 352 EXPECT_CALL(*connection_, |
375 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, | 353 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, |
376 "PUSH_PROMISE not supported.", _)) | 354 "PUSH_PROMISE not supported.", _)) |
377 .WillRepeatedly(InvokeWithoutArgs( | 355 .WillRepeatedly(InvokeWithoutArgs( |
378 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); | 356 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); |
379 } else { | 357 } else { |
380 EXPECT_CALL(session_, OnPromiseHeaderList(stream_id, promised_stream_id, | 358 EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) |
381 frame.size(), _)) | 359 .WillRepeatedly(WithArgs<1>( |
382 .WillOnce( | 360 Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
383 Invoke(this, &QuicHeadersStreamTest::SavePromiseHeaderList)); | 361 EXPECT_CALL(session_, OnPromiseHeadersComplete( |
| 362 stream_id, promised_stream_id, frame.size())); |
384 } | 363 } |
385 stream_frame_.data_buffer = frame.data(); | 364 stream_frame_.data_buffer = frame.data(); |
386 stream_frame_.data_length = frame.size(); | 365 stream_frame_.data_length = frame.size(); |
387 headers_stream_->OnStreamFrame(stream_frame_); | 366 headers_stream_->OnStreamFrame(stream_frame_); |
388 if (perspective() == Perspective::IS_CLIENT) { | 367 if (perspective() == Perspective::IS_CLIENT) { |
389 stream_frame_.offset += frame.size(); | 368 stream_frame_.offset += frame.size(); |
390 CheckHeaders(); | 369 CheckHeaders(); |
391 } | 370 } |
392 } | 371 } |
393 } | 372 } |
(...skipping 15 matching lines...) Expand all Loading... |
409 headers_frame.set_fin(fin); | 388 headers_frame.set_fin(fin); |
410 headers_frame.set_has_priority(true); | 389 headers_frame.set_has_priority(true); |
411 frame = framer_->SerializeFrame(headers_frame); | 390 frame = framer_->SerializeFrame(headers_frame); |
412 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 391 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
413 } else { | 392 } else { |
414 SpdyHeadersIR headers_frame(stream_id); | 393 SpdyHeadersIR headers_frame(stream_id); |
415 headers_frame.set_header_block(headers_); | 394 headers_frame.set_header_block(headers_); |
416 headers_frame.set_fin(fin); | 395 headers_frame.set_fin(fin); |
417 frame = framer_->SerializeFrame(headers_frame); | 396 frame = framer_->SerializeFrame(headers_frame); |
418 } | 397 } |
419 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, frame.size(), _)) | 398 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)); |
420 .Times(1); | 399 EXPECT_CALL(session_, |
| 400 OnStreamHeadersComplete(stream_id, fin, frame.size())); |
421 stream_frame_.data_buffer = frame.data(); | 401 stream_frame_.data_buffer = frame.data(); |
422 stream_frame_.data_length = frame.size(); | 402 stream_frame_.data_length = frame.size(); |
423 headers_stream_->OnStreamFrame(stream_frame_); | 403 headers_stream_->OnStreamFrame(stream_frame_); |
424 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 404 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
425 stream_frame_.offset += frame.size(); | 405 stream_frame_.offset += frame.size(); |
426 } | 406 } |
427 } | 407 } |
428 | 408 |
429 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { | 409 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { |
430 if (!FLAGS_quic_measure_headers_hol_blocking_time) { | 410 if (!FLAGS_quic_measure_headers_hol_blocking_time) { |
(...skipping 21 matching lines...) Expand all Loading... |
452 headers_frame.set_fin(fin); | 432 headers_frame.set_fin(fin); |
453 frames[stream_num] = framer_->SerializeFrame(headers_frame); | 433 frames[stream_num] = framer_->SerializeFrame(headers_frame); |
454 } | 434 } |
455 stream_frames[stream_num].stream_id = stream_frame_.stream_id; | 435 stream_frames[stream_num].stream_id = stream_frame_.stream_id; |
456 stream_frames[stream_num].offset = stream_frame_.offset; | 436 stream_frames[stream_num].offset = stream_frame_.offset; |
457 stream_frames[stream_num].data_buffer = frames[stream_num].data(); | 437 stream_frames[stream_num].data_buffer = frames[stream_num].data(); |
458 stream_frames[stream_num].data_length = frames[stream_num].size(); | 438 stream_frames[stream_num].data_length = frames[stream_num].size(); |
459 DVLOG(1) << "make frame for stream " << stream_num << " offset " | 439 DVLOG(1) << "make frame for stream " << stream_num << " offset " |
460 << stream_frames[stream_num].offset; | 440 << stream_frames[stream_num].offset; |
461 stream_frame_.offset += frames[stream_num].size(); | 441 stream_frame_.offset += frames[stream_num].size(); |
462 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, _, _)).Times(1); | 442 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)).Times(1); |
| 443 EXPECT_CALL(session_, OnStreamHeadersComplete(stream_id, fin, _)) |
| 444 .Times(1); |
463 } | 445 } |
464 } | 446 } |
465 | 447 |
466 // Actually writing the frames in reverse order will cause HOL blocking. | 448 // Actually writing the frames in reverse order will cause HOL blocking. |
467 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); | 449 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); |
468 | 450 |
469 for (int stream_num = 9; stream_num >= 0; --stream_num) { | 451 for (int stream_num = 9; stream_num >= 0; --stream_num) { |
470 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " | 452 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " |
471 << stream_frames[stream_num].offset; | 453 << stream_frames[stream_num].offset; |
472 headers_stream_->OnStreamFrame(stream_frames[stream_num]); | 454 headers_stream_->OnStreamFrame(stream_frames[stream_num]); |
(...skipping 20 matching lines...) Expand all Loading... |
493 headers_frame.set_fin(fin); | 475 headers_frame.set_fin(fin); |
494 headers_frame.set_has_priority(true); | 476 headers_frame.set_has_priority(true); |
495 frame = framer_->SerializeFrame(headers_frame); | 477 frame = framer_->SerializeFrame(headers_frame); |
496 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 478 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
497 } else { | 479 } else { |
498 SpdyHeadersIR headers_frame(stream_id); | 480 SpdyHeadersIR headers_frame(stream_id); |
499 headers_frame.set_header_block(headers_); | 481 headers_frame.set_header_block(headers_); |
500 headers_frame.set_fin(fin); | 482 headers_frame.set_fin(fin); |
501 frame = framer_->SerializeFrame(headers_frame); | 483 frame = framer_->SerializeFrame(headers_frame); |
502 } | 484 } |
| 485 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) |
| 486 .WillRepeatedly(WithArgs<1>(Invoke( |
| 487 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
503 EXPECT_CALL(session_, | 488 EXPECT_CALL(session_, |
504 OnStreamHeaderList(stream_id, fin, frame.size(), _)) | 489 OnStreamHeadersComplete(stream_id, fin, frame.size())); |
505 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); | |
506 stream_frame_.data_buffer = frame.data(); | 490 stream_frame_.data_buffer = frame.data(); |
507 stream_frame_.data_length = frame.size(); | 491 stream_frame_.data_length = frame.size(); |
508 headers_stream_->OnStreamFrame(stream_frame_); | 492 headers_stream_->OnStreamFrame(stream_frame_); |
509 stream_frame_.offset += frame.size(); | 493 stream_frame_.offset += frame.size(); |
510 CheckHeaders(); | 494 CheckHeaders(); |
511 } | 495 } |
512 } | 496 } |
513 } | 497 } |
514 } | 498 } |
515 | 499 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 } | 583 } |
600 | 584 |
601 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { | 585 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { |
602 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( | 586 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( |
603 headers_stream_)); | 587 headers_stream_)); |
604 } | 588 } |
605 | 589 |
606 } // namespace | 590 } // namespace |
607 } // namespace test | 591 } // namespace test |
608 } // namespace net | 592 } // namespace net |
OLD | NEW |