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; |
26 using testing::StrictMock; | 27 using testing::StrictMock; |
27 using testing::WithArgs; | 28 using testing::WithArgs; |
28 using testing::_; | 29 using testing::_; |
29 | 30 |
30 namespace net { | 31 namespace net { |
31 namespace test { | 32 namespace test { |
32 | 33 |
33 class MockHpackDebugVisitor : public QuicHeadersStream::HpackDebugVisitor { | 34 class MockHpackDebugVisitor : public QuicHeadersStream::HpackDebugVisitor { |
34 public: | 35 public: |
35 explicit MockHpackDebugVisitor() : HpackDebugVisitor() {} | 36 explicit MockHpackDebugVisitor() : HpackDebugVisitor() {} |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 | 169 |
169 bool SaveHeaderData(const char* data, int len) { | 170 bool SaveHeaderData(const char* data, int len) { |
170 saved_header_data_.append(data, len); | 171 saved_header_data_.append(data, len); |
171 return true; | 172 return true; |
172 } | 173 } |
173 | 174 |
174 void SaveHeaderDataStringPiece(StringPiece data) { | 175 void SaveHeaderDataStringPiece(StringPiece data) { |
175 saved_header_data_.append(data.data(), data.length()); | 176 saved_header_data_.append(data.data(), data.length()); |
176 } | 177 } |
177 | 178 |
| 179 void SavePromiseHeaderList(QuicStreamId /* stream_id */, |
| 180 QuicStreamId /* promised_stream_id */, |
| 181 size_t size, |
| 182 const QuicHeaderList& header_list) { |
| 183 SaveToHandler(size, header_list); |
| 184 } |
| 185 |
| 186 void SaveHeaderList(QuicStreamId /* stream_id */, |
| 187 bool /* fin */, |
| 188 size_t size, |
| 189 const QuicHeaderList& header_list) { |
| 190 SaveToHandler(size, header_list); |
| 191 } |
| 192 |
| 193 void SaveToHandler(size_t size, const QuicHeaderList& header_list) { |
| 194 headers_handler_.reset(new TestHeadersHandler); |
| 195 headers_handler_->OnHeaderBlockStart(); |
| 196 for (const auto& p : header_list) { |
| 197 headers_handler_->OnHeader(p.first, p.second); |
| 198 } |
| 199 headers_handler_->OnHeaderBlockEnd(size); |
| 200 } |
| 201 |
178 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, | 202 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, |
179 bool fin, | 203 bool fin, |
180 SpdyPriority priority) { | 204 SpdyPriority priority) { |
181 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); | 205 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); |
182 } | 206 } |
183 | 207 |
184 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { | 208 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { |
185 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); | 209 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); |
186 } | 210 } |
187 | 211 |
(...skipping 13 matching lines...) Expand all Loading... |
201 OnHeaders(stream_id, kHasPriority, priority, | 225 OnHeaders(stream_id, kHasPriority, priority, |
202 /*parent_stream_id=*/0, | 226 /*parent_stream_id=*/0, |
203 /*exclusive=*/false, fin, kFrameComplete)); | 227 /*exclusive=*/false, fin, kFrameComplete)); |
204 } else { | 228 } else { |
205 EXPECT_CALL(visitor_, | 229 EXPECT_CALL(visitor_, |
206 OnHeaders(stream_id, !kHasPriority, | 230 OnHeaders(stream_id, !kHasPriority, |
207 /*priority=*/0, | 231 /*priority=*/0, |
208 /*parent_stream_id=*/0, | 232 /*parent_stream_id=*/0, |
209 /*exclusive=*/false, fin, kFrameComplete)); | 233 /*exclusive=*/false, fin, kFrameComplete)); |
210 } | 234 } |
211 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 235 headers_handler_.reset(new TestHeadersHandler); |
212 .WillRepeatedly(WithArgs<1, 2>( | 236 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) |
213 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 237 .WillOnce(Return(headers_handler_.get())); |
| 238 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); |
214 if (fin) { | 239 if (fin) { |
215 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); | 240 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); |
216 } | 241 } |
217 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 242 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
218 EXPECT_FALSE(framer_->HasError()) | 243 EXPECT_FALSE(framer_->HasError()) |
219 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 244 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
220 | 245 |
221 CheckHeaders(); | 246 CheckHeaders(); |
222 saved_data_.clear(); | 247 saved_data_.clear(); |
223 } | 248 } |
224 | 249 |
225 void CheckHeaders() { | 250 void CheckHeaders() { |
226 SpdyHeaderBlock headers; | 251 EXPECT_EQ(headers_, headers_handler_->decoded_block()); |
227 EXPECT_TRUE(framer_->ParseHeaderBlockInBuffer( | 252 headers_handler_.reset(); |
228 saved_header_data_.data(), saved_header_data_.length(), &headers)); | |
229 EXPECT_EQ(headers_, headers); | |
230 saved_header_data_.clear(); | |
231 } | 253 } |
232 | 254 |
233 Perspective perspective() { return GetParam().perspective; } | 255 Perspective perspective() { return GetParam().perspective; } |
234 | 256 |
235 QuicVersion version() { return GetParam().version; } | 257 QuicVersion version() { return GetParam().version; } |
236 | 258 |
237 QuicVersionVector GetVersion() { | 259 QuicVersionVector GetVersion() { |
238 QuicVersionVector versions; | 260 QuicVersionVector versions; |
239 versions.push_back(version()); | 261 versions.push_back(version()); |
240 return versions; | 262 return versions; |
241 } | 263 } |
242 | 264 |
243 void TearDownLocalConnectionState() { | 265 void TearDownLocalConnectionState() { |
244 QuicConnectionPeer::TearDownLocalConnectionState(connection_); | 266 QuicConnectionPeer::TearDownLocalConnectionState(connection_); |
245 } | 267 } |
246 | 268 |
247 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } | 269 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } |
248 | 270 |
249 static const bool kFrameComplete = true; | 271 static const bool kFrameComplete = true; |
250 static const bool kHasPriority = true; | 272 static const bool kHasPriority = true; |
251 | 273 |
252 MockQuicConnectionHelper helper_; | 274 MockQuicConnectionHelper helper_; |
253 MockAlarmFactory alarm_factory_; | 275 MockAlarmFactory alarm_factory_; |
254 StrictMock<MockQuicConnection>* connection_; | 276 StrictMock<MockQuicConnection>* connection_; |
255 StrictMock<MockQuicSpdySession> session_; | 277 StrictMock<MockQuicSpdySession> session_; |
256 QuicHeadersStream* headers_stream_; | 278 QuicHeadersStream* headers_stream_; |
257 SpdyHeaderBlock headers_; | 279 SpdyHeaderBlock headers_; |
| 280 std::unique_ptr<TestHeadersHandler> headers_handler_; |
258 string body_; | 281 string body_; |
259 string saved_data_; | 282 string saved_data_; |
260 string saved_header_data_; | 283 string saved_header_data_; |
261 std::unique_ptr<SpdyFramer> framer_; | 284 std::unique_ptr<SpdyFramer> framer_; |
262 StrictMock<MockVisitor> visitor_; | 285 StrictMock<MockVisitor> visitor_; |
263 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_encoder_visitor_; | 286 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_encoder_visitor_; |
264 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_decoder_visitor_; | 287 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_decoder_visitor_; |
265 QuicStreamFrame stream_frame_; | 288 QuicStreamFrame stream_frame_; |
266 QuicStreamId next_promised_stream_id_; | 289 QuicStreamId next_promised_stream_id_; |
267 }; | 290 }; |
(...skipping 30 matching lines...) Expand all Loading... |
298 // Write the headers and capture the outgoing data | 321 // Write the headers and capture the outgoing data |
299 EXPECT_CALL(session_, WritevData(headers_stream_, kHeadersStreamId, _, _, | 322 EXPECT_CALL(session_, WritevData(headers_stream_, kHeadersStreamId, _, _, |
300 false, nullptr)) | 323 false, nullptr)) |
301 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 324 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
302 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, | 325 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, |
303 nullptr); | 326 nullptr); |
304 | 327 |
305 // Parse the outgoing data and check that it matches was was written. | 328 // Parse the outgoing data and check that it matches was was written. |
306 EXPECT_CALL(visitor_, | 329 EXPECT_CALL(visitor_, |
307 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); | 330 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); |
308 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 331 headers_handler_.reset(new TestHeadersHandler); |
309 .WillRepeatedly(WithArgs<1, 2>( | 332 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) |
310 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 333 .WillOnce(Return(headers_handler_.get())); |
| 334 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); |
311 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 335 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
312 EXPECT_FALSE(framer_->HasError()) | 336 EXPECT_FALSE(framer_->HasError()) |
313 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 337 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
314 CheckHeaders(); | 338 CheckHeaders(); |
315 saved_data_.clear(); | 339 saved_data_.clear(); |
316 } else { | 340 } else { |
317 EXPECT_DFATAL(headers_stream_->WritePushPromise( | 341 EXPECT_DFATAL(headers_stream_->WritePushPromise( |
318 stream_id, promised_stream_id, headers_, nullptr), | 342 stream_id, promised_stream_id, headers_, nullptr), |
319 "Client shouldn't send PUSH_PROMISE"); | 343 "Client shouldn't send PUSH_PROMISE"); |
320 } | 344 } |
(...skipping 13 matching lines...) Expand all Loading... |
334 headers_frame.set_fin(fin); | 358 headers_frame.set_fin(fin); |
335 headers_frame.set_has_priority(true); | 359 headers_frame.set_has_priority(true); |
336 frame = framer_->SerializeFrame(headers_frame); | 360 frame = framer_->SerializeFrame(headers_frame); |
337 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 361 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
338 } else { | 362 } else { |
339 SpdyHeadersIR headers_frame(stream_id); | 363 SpdyHeadersIR headers_frame(stream_id); |
340 headers_frame.set_header_block(headers_); | 364 headers_frame.set_header_block(headers_); |
341 headers_frame.set_fin(fin); | 365 headers_frame.set_fin(fin); |
342 frame = framer_->SerializeFrame(headers_frame); | 366 frame = framer_->SerializeFrame(headers_frame); |
343 } | 367 } |
344 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
345 .WillRepeatedly(WithArgs<1>(Invoke( | |
346 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
347 EXPECT_CALL(session_, | 368 EXPECT_CALL(session_, |
348 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 369 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 370 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
349 stream_frame_.data_buffer = frame.data(); | 371 stream_frame_.data_buffer = frame.data(); |
350 stream_frame_.data_length = frame.size(); | 372 stream_frame_.data_length = frame.size(); |
351 headers_stream_->OnStreamFrame(stream_frame_); | 373 headers_stream_->OnStreamFrame(stream_frame_); |
352 stream_frame_.offset += frame.size(); | 374 stream_frame_.offset += frame.size(); |
353 CheckHeaders(); | 375 CheckHeaders(); |
354 } | 376 } |
355 } | 377 } |
356 } | 378 } |
357 } | 379 } |
358 | 380 |
359 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { | 381 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { |
360 if (perspective() == Perspective::IS_SERVER) | 382 if (perspective() == Perspective::IS_SERVER) |
361 return; | 383 return; |
362 for (QuicStreamId stream_id = kClientDataStreamId1; | 384 for (QuicStreamId stream_id = kClientDataStreamId1; |
363 stream_id < kClientDataStreamId3; stream_id += 2) { | 385 stream_id < kClientDataStreamId3; stream_id += 2) { |
364 QuicStreamId promised_stream_id = NextPromisedStreamId(); | 386 QuicStreamId promised_stream_id = NextPromisedStreamId(); |
365 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); | 387 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); |
366 push_promise.set_header_block(headers_); | 388 push_promise.set_header_block(headers_); |
367 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); | 389 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); |
368 if (perspective() == Perspective::IS_SERVER) { | 390 if (perspective() == Perspective::IS_SERVER) { |
369 EXPECT_CALL(*connection_, | 391 EXPECT_CALL(*connection_, |
370 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, | 392 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, |
371 "PUSH_PROMISE not supported.", _)) | 393 "PUSH_PROMISE not supported.", _)) |
372 .WillRepeatedly(InvokeWithoutArgs( | 394 .WillRepeatedly(InvokeWithoutArgs( |
373 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); | 395 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); |
374 } else { | 396 } else { |
375 EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) | 397 EXPECT_CALL(session_, OnPromiseHeaderList(stream_id, promised_stream_id, |
376 .WillRepeatedly(WithArgs<1>( | 398 frame.size(), _)) |
377 Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | 399 .WillOnce( |
378 EXPECT_CALL(session_, OnPromiseHeadersComplete( | 400 Invoke(this, &QuicHeadersStreamTest::SavePromiseHeaderList)); |
379 stream_id, promised_stream_id, frame.size())); | |
380 } | 401 } |
381 stream_frame_.data_buffer = frame.data(); | 402 stream_frame_.data_buffer = frame.data(); |
382 stream_frame_.data_length = frame.size(); | 403 stream_frame_.data_length = frame.size(); |
383 headers_stream_->OnStreamFrame(stream_frame_); | 404 headers_stream_->OnStreamFrame(stream_frame_); |
384 if (perspective() == Perspective::IS_CLIENT) { | 405 if (perspective() == Perspective::IS_CLIENT) { |
385 stream_frame_.offset += frame.size(); | 406 stream_frame_.offset += frame.size(); |
386 CheckHeaders(); | 407 CheckHeaders(); |
387 } | 408 } |
388 } | 409 } |
389 } | 410 } |
(...skipping 15 matching lines...) Expand all Loading... |
405 headers_frame.set_fin(fin); | 426 headers_frame.set_fin(fin); |
406 headers_frame.set_has_priority(true); | 427 headers_frame.set_has_priority(true); |
407 frame = framer_->SerializeFrame(headers_frame); | 428 frame = framer_->SerializeFrame(headers_frame); |
408 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 429 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
409 } else { | 430 } else { |
410 SpdyHeadersIR headers_frame(stream_id); | 431 SpdyHeadersIR headers_frame(stream_id); |
411 headers_frame.set_header_block(headers_); | 432 headers_frame.set_header_block(headers_); |
412 headers_frame.set_fin(fin); | 433 headers_frame.set_fin(fin); |
413 frame = framer_->SerializeFrame(headers_frame); | 434 frame = framer_->SerializeFrame(headers_frame); |
414 } | 435 } |
415 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)); | 436 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
416 EXPECT_CALL(session_, | 437 .Times(1); |
417 OnStreamHeadersComplete(stream_id, fin, frame.size())); | |
418 stream_frame_.data_buffer = frame.data(); | 438 stream_frame_.data_buffer = frame.data(); |
419 stream_frame_.data_length = frame.size(); | 439 stream_frame_.data_length = frame.size(); |
420 headers_stream_->OnStreamFrame(stream_frame_); | 440 headers_stream_->OnStreamFrame(stream_frame_); |
421 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 441 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
422 stream_frame_.offset += frame.size(); | 442 stream_frame_.offset += frame.size(); |
423 } | 443 } |
424 } | 444 } |
425 | 445 |
426 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { | 446 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { |
427 if (!FLAGS_quic_measure_headers_hol_blocking_time) { | 447 if (!FLAGS_quic_measure_headers_hol_blocking_time) { |
(...skipping 21 matching lines...) Expand all Loading... |
449 headers_frame.set_fin(fin); | 469 headers_frame.set_fin(fin); |
450 frames[stream_num] = framer_->SerializeFrame(headers_frame); | 470 frames[stream_num] = framer_->SerializeFrame(headers_frame); |
451 } | 471 } |
452 stream_frames[stream_num].stream_id = stream_frame_.stream_id; | 472 stream_frames[stream_num].stream_id = stream_frame_.stream_id; |
453 stream_frames[stream_num].offset = stream_frame_.offset; | 473 stream_frames[stream_num].offset = stream_frame_.offset; |
454 stream_frames[stream_num].data_buffer = frames[stream_num].data(); | 474 stream_frames[stream_num].data_buffer = frames[stream_num].data(); |
455 stream_frames[stream_num].data_length = frames[stream_num].size(); | 475 stream_frames[stream_num].data_length = frames[stream_num].size(); |
456 DVLOG(1) << "make frame for stream " << stream_num << " offset " | 476 DVLOG(1) << "make frame for stream " << stream_num << " offset " |
457 << stream_frames[stream_num].offset; | 477 << stream_frames[stream_num].offset; |
458 stream_frame_.offset += frames[stream_num].size(); | 478 stream_frame_.offset += frames[stream_num].size(); |
459 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)).Times(1); | 479 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, _, _)).Times(1); |
460 EXPECT_CALL(session_, OnStreamHeadersComplete(stream_id, fin, _)) | |
461 .Times(1); | |
462 } | 480 } |
463 } | 481 } |
464 | 482 |
465 // Actually writing the frames in reverse order will cause HOL blocking. | 483 // Actually writing the frames in reverse order will cause HOL blocking. |
466 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); | 484 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); |
467 | 485 |
468 for (int stream_num = 9; stream_num >= 0; --stream_num) { | 486 for (int stream_num = 9; stream_num >= 0; --stream_num) { |
469 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " | 487 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " |
470 << stream_frames[stream_num].offset; | 488 << stream_frames[stream_num].offset; |
471 headers_stream_->OnStreamFrame(stream_frames[stream_num]); | 489 headers_stream_->OnStreamFrame(stream_frames[stream_num]); |
(...skipping 20 matching lines...) Expand all Loading... |
492 headers_frame.set_fin(fin); | 510 headers_frame.set_fin(fin); |
493 headers_frame.set_has_priority(true); | 511 headers_frame.set_has_priority(true); |
494 frame = framer_->SerializeFrame(headers_frame); | 512 frame = framer_->SerializeFrame(headers_frame); |
495 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 513 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
496 } else { | 514 } else { |
497 SpdyHeadersIR headers_frame(stream_id); | 515 SpdyHeadersIR headers_frame(stream_id); |
498 headers_frame.set_header_block(headers_); | 516 headers_frame.set_header_block(headers_); |
499 headers_frame.set_fin(fin); | 517 headers_frame.set_fin(fin); |
500 frame = framer_->SerializeFrame(headers_frame); | 518 frame = framer_->SerializeFrame(headers_frame); |
501 } | 519 } |
502 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
503 .WillRepeatedly(WithArgs<1>(Invoke( | |
504 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
505 EXPECT_CALL(session_, | 520 EXPECT_CALL(session_, |
506 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 521 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 522 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
507 stream_frame_.data_buffer = frame.data(); | 523 stream_frame_.data_buffer = frame.data(); |
508 stream_frame_.data_length = frame.size(); | 524 stream_frame_.data_length = frame.size(); |
509 headers_stream_->OnStreamFrame(stream_frame_); | 525 headers_stream_->OnStreamFrame(stream_frame_); |
510 stream_frame_.offset += frame.size(); | 526 stream_frame_.offset += frame.size(); |
511 CheckHeaders(); | 527 CheckHeaders(); |
512 } | 528 } |
513 } | 529 } |
514 } | 530 } |
515 } | 531 } |
516 | 532 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 headers_frame.set_fin(fin); | 652 headers_frame.set_fin(fin); |
637 headers_frame.set_has_priority(true); | 653 headers_frame.set_has_priority(true); |
638 frame = framer_->SerializeFrame(headers_frame); | 654 frame = framer_->SerializeFrame(headers_frame); |
639 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 655 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
640 } else { | 656 } else { |
641 SpdyHeadersIR headers_frame(stream_id); | 657 SpdyHeadersIR headers_frame(stream_id); |
642 headers_frame.set_header_block(headers_); | 658 headers_frame.set_header_block(headers_); |
643 headers_frame.set_fin(fin); | 659 headers_frame.set_fin(fin); |
644 frame = framer_->SerializeFrame(headers_frame); | 660 frame = framer_->SerializeFrame(headers_frame); |
645 } | 661 } |
646 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
647 .WillRepeatedly(WithArgs<1>(Invoke( | |
648 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
649 EXPECT_CALL(session_, | 662 EXPECT_CALL(session_, |
650 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 663 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 664 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
651 stream_frame_.data_buffer = frame.data(); | 665 stream_frame_.data_buffer = frame.data(); |
652 stream_frame_.data_length = frame.size(); | 666 stream_frame_.data_length = frame.size(); |
653 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 667 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
654 headers_stream_->OnStreamFrame(stream_frame_); | 668 headers_stream_->OnStreamFrame(stream_frame_); |
655 stream_frame_.offset += frame.size(); | 669 stream_frame_.offset += frame.size(); |
656 CheckHeaders(); | 670 CheckHeaders(); |
657 } | 671 } |
658 } | 672 } |
659 } | 673 } |
660 } | 674 } |
(...skipping 30 matching lines...) Expand all Loading... |
691 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 705 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
692 } | 706 } |
693 } | 707 } |
694 } | 708 } |
695 } | 709 } |
696 } | 710 } |
697 | 711 |
698 } // namespace | 712 } // namespace |
699 } // namespace test | 713 } // namespace test |
700 } // namespace net | 714 } // namespace net |
OLD | NEW |