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

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

Issue 1360063002: Include HTTP header bytes in GetTotalSent/ReceivedBytes for QUIC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed nits Created 5 years, 2 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
« no previous file with comments | « net/quic/quic_http_stream.cc ('k') | net/quic/quic_reliable_client_stream.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_http_stream.h" 5 #include "net/quic/quic_http_stream.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 }; 79 };
80 80
81 // Subclass of QuicHttpStream that closes itself when the first piece of data 81 // Subclass of QuicHttpStream that closes itself when the first piece of data
82 // is received. 82 // is received.
83 class AutoClosingStream : public QuicHttpStream { 83 class AutoClosingStream : public QuicHttpStream {
84 public: 84 public:
85 explicit AutoClosingStream( 85 explicit AutoClosingStream(
86 const base::WeakPtr<QuicChromiumClientSession>& session) 86 const base::WeakPtr<QuicChromiumClientSession>& session)
87 : QuicHttpStream(session) {} 87 : QuicHttpStream(session) {}
88 88
89 void OnHeadersAvailable(const SpdyHeaderBlock& headers) override { 89 void OnHeadersAvailable(const SpdyHeaderBlock& headers,
90 size_t frame_len) override {
90 Close(false); 91 Close(false);
91 } 92 }
92 93
93 void OnDataAvailable() override { Close(false); } 94 void OnDataAvailable() override { Close(false); }
94 }; 95 };
95 96
96 class TestPacketWriterFactory : public QuicConnection::PacketWriterFactory { 97 class TestPacketWriterFactory : public QuicConnection::PacketWriterFactory {
97 public: 98 public:
98 explicit TestPacketWriterFactory(DatagramClientSocket* socket) 99 explicit TestPacketWriterFactory(DatagramClientSocket* socket)
99 : socket_(socket) {} 100 : socket_(socket) {}
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 bool fin, 251 bool fin,
251 QuicStreamOffset offset, 252 QuicStreamOffset offset,
252 base::StringPiece data) { 253 base::StringPiece data) {
253 return maker_.MakeDataPacket(packet_number, stream_id_, 254 return maker_.MakeDataPacket(packet_number, stream_id_,
254 should_include_version, fin, offset, data); 255 should_include_version, fin, offset, data);
255 } 256 }
256 257
257 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( 258 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
258 QuicPacketNumber packet_number, 259 QuicPacketNumber packet_number,
259 bool fin, 260 bool fin,
260 RequestPriority request_priority) { 261 RequestPriority request_priority,
262 size_t* spdy_headers_frame_length) {
261 QuicPriority priority = 263 QuicPriority priority =
262 ConvertRequestPriorityToQuicPriority(request_priority); 264 ConvertRequestPriorityToQuicPriority(request_priority);
263 return maker_.MakeRequestHeadersPacket(packet_number, stream_id_, 265 return maker_.MakeRequestHeadersPacket(
264 kIncludeVersion, fin, priority, 266 packet_number, stream_id_, kIncludeVersion, fin, priority,
265 request_headers_); 267 request_headers_, spdy_headers_frame_length);
266 } 268 }
267 269
268 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( 270 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
269 QuicPacketNumber packet_number, 271 QuicPacketNumber packet_number,
270 bool fin) { 272 bool fin,
273 size_t* spdy_headers_frame_length) {
271 return maker_.MakeResponseHeadersPacket( 274 return maker_.MakeResponseHeadersPacket(
272 packet_number, stream_id_, !kIncludeVersion, fin, response_headers_); 275 packet_number, stream_id_, !kIncludeVersion, fin, response_headers_,
276 spdy_headers_frame_length);
273 } 277 }
274 278
275 scoped_ptr<QuicEncryptedPacket> ConstructRstStreamPacket( 279 scoped_ptr<QuicEncryptedPacket> ConstructRstStreamPacket(
276 QuicPacketNumber packet_number) { 280 QuicPacketNumber packet_number) {
277 return maker_.MakeRstPacket( 281 return maker_.MakeRstPacket(
278 packet_number, true, stream_id_, 282 packet_number, true, stream_id_,
279 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam())); 283 AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam()));
280 } 284 }
281 285
282 scoped_ptr<QuicEncryptedPacket> ConstructRstStreamCancelledPacket( 286 scoped_ptr<QuicEncryptedPacket> ConstructRstStreamCancelledPacket(
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 EXPECT_EQ(nullptr, stream_->RenewStreamForAuth()); 347 EXPECT_EQ(nullptr, stream_->RenewStreamForAuth());
344 } 348 }
345 349
346 TEST_P(QuicHttpStreamTest, CanReuseConnection) { 350 TEST_P(QuicHttpStreamTest, CanReuseConnection) {
347 Initialize(); 351 Initialize();
348 EXPECT_FALSE(stream_->CanReuseConnection()); 352 EXPECT_FALSE(stream_->CanReuseConnection());
349 } 353 }
350 354
351 TEST_P(QuicHttpStreamTest, GetRequest) { 355 TEST_P(QuicHttpStreamTest, GetRequest) {
352 SetRequest("GET", "/", DEFAULT_PRIORITY); 356 SetRequest("GET", "/", DEFAULT_PRIORITY);
353 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY)); 357 size_t spdy_request_header_frame_length;
358 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
359 &spdy_request_header_frame_length));
354 Initialize(); 360 Initialize();
355 361
356 request_.method = "GET"; 362 request_.method = "GET";
357 request_.url = GURL("http://www.google.com/"); 363 request_.url = GURL("http://www.google.com/");
358 364
359 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 365 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
360 net_log_, callback_.callback())); 366 net_log_, callback_.callback()));
361 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, 367 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_,
362 callback_.callback())); 368 callback_.callback()));
363 369
364 // Ack the request. 370 // Ack the request.
365 ProcessPacket(ConstructAckPacket(1, 0, 0)); 371 ProcessPacket(ConstructAckPacket(1, 0, 0));
366 372
367 EXPECT_EQ(ERR_IO_PENDING, 373 EXPECT_EQ(ERR_IO_PENDING,
368 stream_->ReadResponseHeaders(callback_.callback())); 374 stream_->ReadResponseHeaders(callback_.callback()));
369 375
370 SetResponse("404 Not Found", std::string()); 376 SetResponse("404 Not Found", std::string());
371 ProcessPacket(ConstructResponseHeadersPacket(2, kFin)); 377 size_t spdy_response_header_frame_length;
378 ProcessPacket(ConstructResponseHeadersPacket(
379 2, kFin, &spdy_response_header_frame_length));
372 380
373 // Now that the headers have been processed, the callback will return. 381 // Now that the headers have been processed, the callback will return.
374 EXPECT_EQ(OK, callback_.WaitForResult()); 382 EXPECT_EQ(OK, callback_.WaitForResult());
375 ASSERT_TRUE(response_.headers.get()); 383 ASSERT_TRUE(response_.headers.get());
376 EXPECT_EQ(404, response_.headers->response_code()); 384 EXPECT_EQ(404, response_.headers->response_code());
377 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); 385 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain"));
378 EXPECT_FALSE(response_.response_time.is_null()); 386 EXPECT_FALSE(response_.response_time.is_null());
379 EXPECT_FALSE(response_.request_time.is_null()); 387 EXPECT_FALSE(response_.request_time.is_null());
380 388
381 // There is no body, so this should return immediately. 389 // There is no body, so this should return immediately.
382 EXPECT_EQ(0, stream_->ReadResponseBody(read_buffer_.get(), 390 EXPECT_EQ(0, stream_->ReadResponseBody(read_buffer_.get(),
383 read_buffer_->size(), 391 read_buffer_->size(),
384 callback_.callback())); 392 callback_.callback()));
385 EXPECT_TRUE(stream_->IsResponseBodyComplete()); 393 EXPECT_TRUE(stream_->IsResponseBodyComplete());
386 EXPECT_TRUE(AtEof()); 394 EXPECT_TRUE(AtEof());
387 395
388 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 396 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
389 // payload. 397 // headers and payload.
390 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 398 EXPECT_EQ(static_cast<int64_t>(spdy_request_header_frame_length),
391 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); 399 stream_->GetTotalSentBytes());
400 EXPECT_EQ(static_cast<int64_t>(spdy_response_header_frame_length),
401 stream_->GetTotalReceivedBytes());
392 } 402 }
393 403
394 // Regression test for http://crbug.com/288128 404 // Regression test for http://crbug.com/288128
395 TEST_P(QuicHttpStreamTest, GetRequestLargeResponse) { 405 TEST_P(QuicHttpStreamTest, GetRequestLargeResponse) {
396 SetRequest("GET", "/", DEFAULT_PRIORITY); 406 SetRequest("GET", "/", DEFAULT_PRIORITY);
397 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY)); 407 size_t spdy_request_headers_frame_length;
408 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
409 &spdy_request_headers_frame_length));
398 Initialize(); 410 Initialize();
399 411
400 request_.method = "GET"; 412 request_.method = "GET";
401 request_.url = GURL("http://www.google.com/"); 413 request_.url = GURL("http://www.google.com/");
402 414
403 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 415 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
404 net_log_, callback_.callback())); 416 net_log_, callback_.callback()));
405 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, 417 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_,
406 callback_.callback())); 418 callback_.callback()));
407 419
408 // Ack the request. 420 // Ack the request.
409 ProcessPacket(ConstructAckPacket(1, 0, 0)); 421 ProcessPacket(ConstructAckPacket(1, 0, 0));
410 422
411 EXPECT_EQ(ERR_IO_PENDING, 423 EXPECT_EQ(ERR_IO_PENDING,
412 stream_->ReadResponseHeaders(callback_.callback())); 424 stream_->ReadResponseHeaders(callback_.callback()));
413 425
414 SpdyHeaderBlock headers; 426 SpdyHeaderBlock headers;
415 headers[":status"] = "200 OK"; 427 headers[":status"] = "200 OK";
416 headers[":version"] = "HTTP/1.1"; 428 headers[":version"] = "HTTP/1.1";
417 headers["content-type"] = "text/plain"; 429 headers["content-type"] = "text/plain";
418 headers["big6"] = std::string(1000, 'x'); // Lots of x's. 430 headers["big6"] = std::string(1000, 'x'); // Lots of x's.
419 431
420 response_headers_ = headers; 432 response_headers_ = headers;
421 ProcessPacket(ConstructResponseHeadersPacket(2, kFin)); 433 size_t spdy_response_headers_frame_length;
434 ProcessPacket(ConstructResponseHeadersPacket(
435 2, kFin, &spdy_response_headers_frame_length));
422 436
423 // Now that the headers have been processed, the callback will return. 437 // Now that the headers have been processed, the callback will return.
424 EXPECT_EQ(OK, callback_.WaitForResult()); 438 EXPECT_EQ(OK, callback_.WaitForResult());
425 ASSERT_TRUE(response_.headers.get()); 439 ASSERT_TRUE(response_.headers.get());
426 EXPECT_EQ(200, response_.headers->response_code()); 440 EXPECT_EQ(200, response_.headers->response_code());
427 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); 441 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain"));
428 442
429 // There is no body, so this should return immediately. 443 // There is no body, so this should return immediately.
430 EXPECT_EQ(0, stream_->ReadResponseBody(read_buffer_.get(), 444 EXPECT_EQ(0, stream_->ReadResponseBody(read_buffer_.get(),
431 read_buffer_->size(), 445 read_buffer_->size(),
432 callback_.callback())); 446 callback_.callback()));
433 EXPECT_TRUE(stream_->IsResponseBodyComplete()); 447 EXPECT_TRUE(stream_->IsResponseBodyComplete());
434 EXPECT_TRUE(AtEof()); 448 EXPECT_TRUE(AtEof());
435 449
436 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 450 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
437 // payload. 451 // headers and payload.
438 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 452 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
439 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); 453 stream_->GetTotalSentBytes());
454 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length),
455 stream_->GetTotalReceivedBytes());
440 } 456 }
441 457
442 // Regression test for http://crbug.com/409101 458 // Regression test for http://crbug.com/409101
443 TEST_P(QuicHttpStreamTest, SessionClosedBeforeSendRequest) { 459 TEST_P(QuicHttpStreamTest, SessionClosedBeforeSendRequest) {
444 SetRequest("GET", "/", DEFAULT_PRIORITY); 460 SetRequest("GET", "/", DEFAULT_PRIORITY);
445 Initialize(); 461 Initialize();
446 462
447 request_.method = "GET"; 463 request_.method = "GET";
448 request_.url = GURL("http://www.google.com/"); 464 request_.url = GURL("http://www.google.com/");
449 465
450 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 466 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
451 net_log_, callback_.callback())); 467 net_log_, callback_.callback()));
452 468
453 session_->connection()->CloseConnection(QUIC_NO_ERROR, true); 469 session_->connection()->CloseConnection(QUIC_NO_ERROR, true);
454 470
455 EXPECT_EQ(ERR_CONNECTION_CLOSED, 471 EXPECT_EQ(ERR_CONNECTION_CLOSED,
456 stream_->SendRequest(headers_, &response_, 472 stream_->SendRequest(headers_, &response_,
457 callback_.callback())); 473 callback_.callback()));
458 474
459 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 475 EXPECT_EQ(0, stream_->GetTotalSentBytes());
460 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); 476 EXPECT_EQ(0, stream_->GetTotalReceivedBytes());
461 } 477 }
462 478
463 // Regression test for http://crbug.com/409871 479 // Regression test for http://crbug.com/409871
464 TEST_P(QuicHttpStreamTest, SessionClosedBeforeReadResponseHeaders) { 480 TEST_P(QuicHttpStreamTest, SessionClosedBeforeReadResponseHeaders) {
465 SetRequest("GET", "/", DEFAULT_PRIORITY); 481 SetRequest("GET", "/", DEFAULT_PRIORITY);
466 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY)); 482 size_t spdy_request_headers_frame_length;
483 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
484 &spdy_request_headers_frame_length));
467 Initialize(); 485 Initialize();
468 486
469 request_.method = "GET"; 487 request_.method = "GET";
470 request_.url = GURL("http://www.google.com/"); 488 request_.url = GURL("http://www.google.com/");
471 489
472 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 490 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
473 net_log_, callback_.callback())); 491 net_log_, callback_.callback()));
474 492
475 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, 493 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_,
476 callback_.callback())); 494 callback_.callback()));
477 495
478 session_->connection()->CloseConnection(QUIC_NO_ERROR, true); 496 session_->connection()->CloseConnection(QUIC_NO_ERROR, true);
479 497
480 EXPECT_NE(OK, stream_->ReadResponseHeaders(callback_.callback())); 498 EXPECT_NE(OK, stream_->ReadResponseHeaders(callback_.callback()));
481 499
482 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 500 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
483 // payload. 501 // headers and payload.
484 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 502 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
503 stream_->GetTotalSentBytes());
485 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); 504 EXPECT_EQ(0, stream_->GetTotalReceivedBytes());
486 } 505 }
487 506
488 TEST_P(QuicHttpStreamTest, SendPostRequest) { 507 TEST_P(QuicHttpStreamTest, SendPostRequest) {
489 SetRequest("POST", "/", DEFAULT_PRIORITY); 508 SetRequest("POST", "/", DEFAULT_PRIORITY);
490 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY)); 509 size_t spdy_request_headers_frame_length;
510 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
511 &spdy_request_headers_frame_length));
491 AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, kUploadData)); 512 AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, kUploadData));
492 AddWrite(ConstructAckPacket(3, 3, 1)); 513 AddWrite(ConstructAckPacket(3, 3, 1));
493 514
494 Initialize(); 515 Initialize();
495 516
496 ScopedVector<UploadElementReader> element_readers; 517 ScopedVector<UploadElementReader> element_readers;
497 element_readers.push_back( 518 element_readers.push_back(
498 new UploadBytesElementReader(kUploadData, strlen(kUploadData))); 519 new UploadBytesElementReader(kUploadData, strlen(kUploadData)));
499 ElementsUploadDataStream upload_data_stream(element_readers.Pass(), 0); 520 ElementsUploadDataStream upload_data_stream(element_readers.Pass(), 0);
500 request_.method = "POST"; 521 request_.method = "POST";
501 request_.url = GURL("http://www.google.com/"); 522 request_.url = GURL("http://www.google.com/");
502 request_.upload_data_stream = &upload_data_stream; 523 request_.upload_data_stream = &upload_data_stream;
503 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); 524 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback()));
504 525
505 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 526 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
506 net_log_, callback_.callback())); 527 net_log_, callback_.callback()));
507 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, 528 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_,
508 callback_.callback())); 529 callback_.callback()));
509 530
510 // Ack both packets in the request. 531 // Ack both packets in the request.
511 ProcessPacket(ConstructAckPacket(1, 0, 0)); 532 ProcessPacket(ConstructAckPacket(1, 0, 0));
512 533
513 // Send the response headers (but not the body). 534 // Send the response headers (but not the body).
514 SetResponse("200 OK", std::string()); 535 SetResponse("200 OK", std::string());
515 ProcessPacket(ConstructResponseHeadersPacket(2, !kFin)); 536 size_t spdy_response_headers_frame_length;
537 ProcessPacket(ConstructResponseHeadersPacket(
538 2, !kFin, &spdy_response_headers_frame_length));
516 539
517 // The headers have arrived, but they are delivered asynchronously. 540 // The headers have arrived, but they are delivered asynchronously.
518 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); 541 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
519 EXPECT_EQ(OK, callback_.WaitForResult()); 542 EXPECT_EQ(OK, callback_.WaitForResult());
520 ASSERT_TRUE(response_.headers.get()); 543 ASSERT_TRUE(response_.headers.get());
521 EXPECT_EQ(200, response_.headers->response_code()); 544 EXPECT_EQ(200, response_.headers->response_code());
522 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); 545 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain"));
523 546
524 // Send the response body. 547 // Send the response body.
525 const char kResponseBody[] = "Hello world!"; 548 const char kResponseBody[] = "Hello world!";
526 ProcessPacket(ConstructDataPacket(3, false, kFin, 0, kResponseBody)); 549 ProcessPacket(ConstructDataPacket(3, false, kFin, 0, kResponseBody));
527 // Since the body has already arrived, this should return immediately. 550 // Since the body has already arrived, this should return immediately.
528 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), 551 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)),
529 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), 552 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
530 callback_.callback())); 553 callback_.callback()));
531 554
532 EXPECT_TRUE(stream_->IsResponseBodyComplete()); 555 EXPECT_TRUE(stream_->IsResponseBodyComplete());
533 EXPECT_TRUE(AtEof()); 556 EXPECT_TRUE(AtEof());
534 557
535 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 558 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
536 // payload. 559 // headers and payload.
537 EXPECT_EQ(static_cast<int64_t>(strlen(kUploadData)), 560 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
561 strlen(kUploadData)),
538 stream_->GetTotalSentBytes()); 562 stream_->GetTotalSentBytes());
539 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), 563 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
564 strlen(kResponseBody)),
540 stream_->GetTotalReceivedBytes()); 565 stream_->GetTotalReceivedBytes());
541 } 566 }
542 567
543 TEST_P(QuicHttpStreamTest, SendChunkedPostRequest) { 568 TEST_P(QuicHttpStreamTest, SendChunkedPostRequest) {
544 SetRequest("POST", "/", DEFAULT_PRIORITY); 569 SetRequest("POST", "/", DEFAULT_PRIORITY);
545 size_t chunk_size = strlen(kUploadData); 570 size_t chunk_size = strlen(kUploadData);
546 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY)); 571 size_t spdy_request_headers_frame_length;
572 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
573 &spdy_request_headers_frame_length));
547 AddWrite(ConstructDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData)); 574 AddWrite(ConstructDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData));
548 AddWrite(ConstructDataPacket(3, kIncludeVersion, kFin, chunk_size, 575 AddWrite(ConstructDataPacket(3, kIncludeVersion, kFin, chunk_size,
549 kUploadData)); 576 kUploadData));
550 AddWrite(ConstructAckPacket(4, 3, 1)); 577 AddWrite(ConstructAckPacket(4, 3, 1));
551 Initialize(); 578 Initialize();
552 579
553 ChunkedUploadDataStream upload_data_stream(0); 580 ChunkedUploadDataStream upload_data_stream(0);
554 upload_data_stream.AppendData(kUploadData, chunk_size, false); 581 upload_data_stream.AppendData(kUploadData, chunk_size, false);
555 582
556 request_.method = "POST"; 583 request_.method = "POST";
557 request_.url = GURL("http://www.google.com/"); 584 request_.url = GURL("http://www.google.com/");
558 request_.upload_data_stream = &upload_data_stream; 585 request_.upload_data_stream = &upload_data_stream;
559 ASSERT_EQ(OK, request_.upload_data_stream->Init( 586 ASSERT_EQ(OK, request_.upload_data_stream->Init(
560 TestCompletionCallback().callback())); 587 TestCompletionCallback().callback()));
561 588
562 ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 589 ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
563 net_log_, callback_.callback())); 590 net_log_, callback_.callback()));
564 ASSERT_EQ(ERR_IO_PENDING, stream_->SendRequest(headers_, &response_, 591 ASSERT_EQ(ERR_IO_PENDING, stream_->SendRequest(headers_, &response_,
565 callback_.callback())); 592 callback_.callback()));
566 593
567 upload_data_stream.AppendData(kUploadData, chunk_size, true); 594 upload_data_stream.AppendData(kUploadData, chunk_size, true);
568 EXPECT_EQ(OK, callback_.WaitForResult()); 595 EXPECT_EQ(OK, callback_.WaitForResult());
569 596
570 // Ack both packets in the request. 597 // Ack both packets in the request.
571 ProcessPacket(ConstructAckPacket(1, 0, 0)); 598 ProcessPacket(ConstructAckPacket(1, 0, 0));
572 599
573 // Send the response headers (but not the body). 600 // Send the response headers (but not the body).
574 SetResponse("200 OK", std::string()); 601 SetResponse("200 OK", std::string());
575 ProcessPacket(ConstructResponseHeadersPacket(2, !kFin)); 602 size_t spdy_response_headers_frame_length;
603 ProcessPacket(ConstructResponseHeadersPacket(
604 2, !kFin, &spdy_response_headers_frame_length));
576 605
577 // The headers have arrived, but they are delivered asynchronously 606 // The headers have arrived, but they are delivered asynchronously
578 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); 607 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
579 EXPECT_EQ(OK, callback_.WaitForResult()); 608 EXPECT_EQ(OK, callback_.WaitForResult());
580 ASSERT_TRUE(response_.headers.get()); 609 ASSERT_TRUE(response_.headers.get());
581 EXPECT_EQ(200, response_.headers->response_code()); 610 EXPECT_EQ(200, response_.headers->response_code());
582 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); 611 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain"));
583 612
584 // Send the response body. 613 // Send the response body.
585 const char kResponseBody[] = "Hello world!"; 614 const char kResponseBody[] = "Hello world!";
586 ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(), 615 ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(),
587 kResponseBody)); 616 kResponseBody));
588 617
589 // Since the body has already arrived, this should return immediately. 618 // Since the body has already arrived, this should return immediately.
590 ASSERT_EQ(static_cast<int>(strlen(kResponseBody)), 619 ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
591 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), 620 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
592 callback_.callback())); 621 callback_.callback()));
593 622
594 EXPECT_TRUE(stream_->IsResponseBodyComplete()); 623 EXPECT_TRUE(stream_->IsResponseBodyComplete());
595 EXPECT_TRUE(AtEof()); 624 EXPECT_TRUE(AtEof());
596 625
597 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 626 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
598 // payload. 627 // headers and payload.
599 EXPECT_EQ(static_cast<int64_t>(strlen(kUploadData) * 2), 628 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
629 strlen(kUploadData) * 2),
600 stream_->GetTotalSentBytes()); 630 stream_->GetTotalSentBytes());
601 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), 631 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
632 strlen(kResponseBody)),
602 stream_->GetTotalReceivedBytes()); 633 stream_->GetTotalReceivedBytes());
603 } 634 }
604 635
605 TEST_P(QuicHttpStreamTest, SendChunkedPostRequestWithFinalEmptyDataPacket) { 636 TEST_P(QuicHttpStreamTest, SendChunkedPostRequestWithFinalEmptyDataPacket) {
606 SetRequest("POST", "/", DEFAULT_PRIORITY); 637 SetRequest("POST", "/", DEFAULT_PRIORITY);
607 size_t chunk_size = strlen(kUploadData); 638 size_t chunk_size = strlen(kUploadData);
608 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY)); 639 size_t spdy_request_headers_frame_length;
640 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
641 &spdy_request_headers_frame_length));
609 AddWrite(ConstructDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData)); 642 AddWrite(ConstructDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData));
610 AddWrite(ConstructDataPacket(3, kIncludeVersion, kFin, chunk_size, "")); 643 AddWrite(ConstructDataPacket(3, kIncludeVersion, kFin, chunk_size, ""));
611 AddWrite(ConstructAckPacket(4, 3, 1)); 644 AddWrite(ConstructAckPacket(4, 3, 1));
612 Initialize(); 645 Initialize();
613 646
614 ChunkedUploadDataStream upload_data_stream(0); 647 ChunkedUploadDataStream upload_data_stream(0);
615 upload_data_stream.AppendData(kUploadData, chunk_size, false); 648 upload_data_stream.AppendData(kUploadData, chunk_size, false);
616 649
617 request_.method = "POST"; 650 request_.method = "POST";
618 request_.url = GURL("http://www.google.com/"); 651 request_.url = GURL("http://www.google.com/");
619 request_.upload_data_stream = &upload_data_stream; 652 request_.upload_data_stream = &upload_data_stream;
620 ASSERT_EQ(OK, request_.upload_data_stream->Init( 653 ASSERT_EQ(OK, request_.upload_data_stream->Init(
621 TestCompletionCallback().callback())); 654 TestCompletionCallback().callback()));
622 655
623 ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 656 ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
624 net_log_, callback_.callback())); 657 net_log_, callback_.callback()));
625 ASSERT_EQ(ERR_IO_PENDING, stream_->SendRequest(headers_, &response_, 658 ASSERT_EQ(ERR_IO_PENDING, stream_->SendRequest(headers_, &response_,
626 callback_.callback())); 659 callback_.callback()));
627 660
628 upload_data_stream.AppendData(nullptr, 0, true); 661 upload_data_stream.AppendData(nullptr, 0, true);
629 EXPECT_EQ(OK, callback_.WaitForResult()); 662 EXPECT_EQ(OK, callback_.WaitForResult());
630 663
631 ProcessPacket(ConstructAckPacket(1, 0, 0)); 664 ProcessPacket(ConstructAckPacket(1, 0, 0));
632 665
633 // Send the response headers (but not the body). 666 // Send the response headers (but not the body).
634 SetResponse("200 OK", std::string()); 667 SetResponse("200 OK", std::string());
635 ProcessPacket(ConstructResponseHeadersPacket(2, !kFin)); 668 size_t spdy_response_headers_frame_length;
669 ProcessPacket(ConstructResponseHeadersPacket(
670 2, !kFin, &spdy_response_headers_frame_length));
636 671
637 // The headers have arrived, but they are delivered asynchronously 672 // The headers have arrived, but they are delivered asynchronously
638 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); 673 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
639 EXPECT_EQ(OK, callback_.WaitForResult()); 674 EXPECT_EQ(OK, callback_.WaitForResult());
640 ASSERT_TRUE(response_.headers.get()); 675 ASSERT_TRUE(response_.headers.get());
641 EXPECT_EQ(200, response_.headers->response_code()); 676 EXPECT_EQ(200, response_.headers->response_code());
642 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); 677 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain"));
643 678
644 // Send the response body. 679 // Send the response body.
645 const char kResponseBody[] = "Hello world!"; 680 const char kResponseBody[] = "Hello world!";
646 ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(), 681 ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(),
647 kResponseBody)); 682 kResponseBody));
648 683
649 // The body has arrived, but it is delivered asynchronously 684 // The body has arrived, but it is delivered asynchronously
650 ASSERT_EQ(static_cast<int>(strlen(kResponseBody)), 685 ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
651 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), 686 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
652 callback_.callback())); 687 callback_.callback()));
653 EXPECT_TRUE(stream_->IsResponseBodyComplete()); 688 EXPECT_TRUE(stream_->IsResponseBodyComplete());
654 EXPECT_TRUE(AtEof()); 689 EXPECT_TRUE(AtEof());
655 690
656 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 691 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
657 // payload. 692 // headers and payload.
658 EXPECT_EQ(static_cast<int64_t>(strlen(kUploadData)), 693 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
694 strlen(kUploadData)),
659 stream_->GetTotalSentBytes()); 695 stream_->GetTotalSentBytes());
660 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), 696 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
697 strlen(kResponseBody)),
661 stream_->GetTotalReceivedBytes()); 698 stream_->GetTotalReceivedBytes());
662 } 699 }
663 700
664 TEST_P(QuicHttpStreamTest, SendChunkedPostRequestWithOneEmptyDataPacket) { 701 TEST_P(QuicHttpStreamTest, SendChunkedPostRequestWithOneEmptyDataPacket) {
665 SetRequest("POST", "/", DEFAULT_PRIORITY); 702 SetRequest("POST", "/", DEFAULT_PRIORITY);
666 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY)); 703 size_t spdy_request_headers_frame_length;
704 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
705 &spdy_request_headers_frame_length));
667 AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, "")); 706 AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, ""));
668 AddWrite(ConstructAckPacket(3, 3, 1)); 707 AddWrite(ConstructAckPacket(3, 3, 1));
669 Initialize(); 708 Initialize();
670 709
671 ChunkedUploadDataStream upload_data_stream(0); 710 ChunkedUploadDataStream upload_data_stream(0);
672 711
673 request_.method = "POST"; 712 request_.method = "POST";
674 request_.url = GURL("http://www.google.com/"); 713 request_.url = GURL("http://www.google.com/");
675 request_.upload_data_stream = &upload_data_stream; 714 request_.upload_data_stream = &upload_data_stream;
676 ASSERT_EQ(OK, request_.upload_data_stream->Init( 715 ASSERT_EQ(OK, request_.upload_data_stream->Init(
677 TestCompletionCallback().callback())); 716 TestCompletionCallback().callback()));
678 717
679 ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 718 ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
680 net_log_, callback_.callback())); 719 net_log_, callback_.callback()));
681 ASSERT_EQ(ERR_IO_PENDING, stream_->SendRequest(headers_, &response_, 720 ASSERT_EQ(ERR_IO_PENDING, stream_->SendRequest(headers_, &response_,
682 callback_.callback())); 721 callback_.callback()));
683 722
684 upload_data_stream.AppendData(nullptr, 0, true); 723 upload_data_stream.AppendData(nullptr, 0, true);
685 EXPECT_EQ(OK, callback_.WaitForResult()); 724 EXPECT_EQ(OK, callback_.WaitForResult());
686 725
687 ProcessPacket(ConstructAckPacket(1, 0, 0)); 726 ProcessPacket(ConstructAckPacket(1, 0, 0));
688 727
689 // Send the response headers (but not the body). 728 // Send the response headers (but not the body).
690 SetResponse("200 OK", std::string()); 729 SetResponse("200 OK", std::string());
691 ProcessPacket(ConstructResponseHeadersPacket(2, !kFin)); 730 size_t spdy_response_headers_frame_length;
731 ProcessPacket(ConstructResponseHeadersPacket(
732 2, !kFin, &spdy_response_headers_frame_length));
692 733
693 // The headers have arrived, but they are delivered asynchronously 734 // The headers have arrived, but they are delivered asynchronously
694 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback())); 735 EXPECT_EQ(ERR_IO_PENDING, stream_->ReadResponseHeaders(callback_.callback()));
695 EXPECT_EQ(OK, callback_.WaitForResult()); 736 EXPECT_EQ(OK, callback_.WaitForResult());
696 ASSERT_TRUE(response_.headers.get()); 737 ASSERT_TRUE(response_.headers.get());
697 EXPECT_EQ(200, response_.headers->response_code()); 738 EXPECT_EQ(200, response_.headers->response_code());
698 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain")); 739 EXPECT_TRUE(response_.headers->HasHeaderValue("Content-Type", "text/plain"));
699 740
700 // Send the response body. 741 // Send the response body.
701 const char kResponseBody[] = "Hello world!"; 742 const char kResponseBody[] = "Hello world!";
702 ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(), 743 ProcessPacket(ConstructDataPacket(3, false, kFin, response_data_.length(),
703 kResponseBody)); 744 kResponseBody));
704 745
705 // The body has arrived, but it is delivered asynchronously 746 // The body has arrived, but it is delivered asynchronously
706 ASSERT_EQ(static_cast<int>(strlen(kResponseBody)), 747 ASSERT_EQ(static_cast<int>(strlen(kResponseBody)),
707 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), 748 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(),
708 callback_.callback())); 749 callback_.callback()));
709 750
710 EXPECT_TRUE(stream_->IsResponseBodyComplete()); 751 EXPECT_TRUE(stream_->IsResponseBodyComplete());
711 EXPECT_TRUE(AtEof()); 752 EXPECT_TRUE(AtEof());
712 753
713 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 754 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
714 // payload. 755 // headers and payload.
715 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 756 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
716 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), 757 stream_->GetTotalSentBytes());
758 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
759 strlen(kResponseBody)),
717 stream_->GetTotalReceivedBytes()); 760 stream_->GetTotalReceivedBytes());
718 } 761 }
719 762
720 TEST_P(QuicHttpStreamTest, DestroyedEarly) { 763 TEST_P(QuicHttpStreamTest, DestroyedEarly) {
721 SetRequest("GET", "/", DEFAULT_PRIORITY); 764 SetRequest("GET", "/", DEFAULT_PRIORITY);
722 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY)); 765 size_t spdy_request_headers_frame_length;
766 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
767 &spdy_request_headers_frame_length));
723 AddWrite(ConstructAckAndRstStreamPacket(2)); 768 AddWrite(ConstructAckAndRstStreamPacket(2));
724 use_closing_stream_ = true; 769 use_closing_stream_ = true;
725 Initialize(); 770 Initialize();
726 771
727 request_.method = "GET"; 772 request_.method = "GET";
728 request_.url = GURL("http://www.google.com/"); 773 request_.url = GURL("http://www.google.com/");
729 774
730 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, 775 EXPECT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
731 net_log_, callback_.callback())); 776 net_log_, callback_.callback()));
732 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, 777 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_,
733 callback_.callback())); 778 callback_.callback()));
734 779
735 // Ack the request. 780 // Ack the request.
736 ProcessPacket(ConstructAckPacket(1, 0, 0)); 781 ProcessPacket(ConstructAckPacket(1, 0, 0));
737 EXPECT_EQ(ERR_IO_PENDING, 782 EXPECT_EQ(ERR_IO_PENDING,
738 stream_->ReadResponseHeaders(callback_.callback())); 783 stream_->ReadResponseHeaders(callback_.callback()));
739 784
740 // Send the response with a body. 785 // Send the response with a body.
741 SetResponse("404 OK", "hello world!"); 786 SetResponse("404 OK", "hello world!");
742 // In the course of processing this packet, the QuicHttpStream close itself. 787 // In the course of processing this packet, the QuicHttpStream close itself.
743 ProcessPacket(ConstructResponseHeadersPacket(2, kFin)); 788 ProcessPacket(ConstructResponseHeadersPacket(2, kFin, nullptr));
744 789
745 base::MessageLoop::current()->RunUntilIdle(); 790 base::MessageLoop::current()->RunUntilIdle();
746 791
747 EXPECT_TRUE(AtEof()); 792 EXPECT_TRUE(AtEof());
748 793
749 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 794 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
750 // payload. 795 // headers and payload.
751 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 796 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
797 stream_->GetTotalSentBytes());
798 // Zero since the stream is closed before processing the headers.
752 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); 799 EXPECT_EQ(0, stream_->GetTotalReceivedBytes());
753 } 800 }
754 801
755 TEST_P(QuicHttpStreamTest, Priority) { 802 TEST_P(QuicHttpStreamTest, Priority) {
756 SetRequest("GET", "/", MEDIUM); 803 SetRequest("GET", "/", MEDIUM);
757 AddWrite(ConstructRequestHeadersPacket(1, kFin, MEDIUM)); 804 size_t spdy_request_headers_frame_length;
805 AddWrite(ConstructRequestHeadersPacket(1, kFin, MEDIUM,
806 &spdy_request_headers_frame_length));
758 AddWrite(ConstructAckAndRstStreamPacket(2)); 807 AddWrite(ConstructAckAndRstStreamPacket(2));
759 use_closing_stream_ = true; 808 use_closing_stream_ = true;
760 Initialize(); 809 Initialize();
761 810
762 request_.method = "GET"; 811 request_.method = "GET";
763 request_.url = GURL("http://www.google.com/"); 812 request_.url = GURL("http://www.google.com/");
764 813
765 EXPECT_EQ(OK, stream_->InitializeStream(&request_, MEDIUM, 814 EXPECT_EQ(OK, stream_->InitializeStream(&request_, MEDIUM,
766 net_log_, callback_.callback())); 815 net_log_, callback_.callback()));
767 816
(...skipping 12 matching lines...) Expand all
780 reliable_stream->EffectivePriority())); 829 reliable_stream->EffectivePriority()));
781 830
782 // Ack the request. 831 // Ack the request.
783 ProcessPacket(ConstructAckPacket(1, 0, 0)); 832 ProcessPacket(ConstructAckPacket(1, 0, 0));
784 EXPECT_EQ(ERR_IO_PENDING, 833 EXPECT_EQ(ERR_IO_PENDING,
785 stream_->ReadResponseHeaders(callback_.callback())); 834 stream_->ReadResponseHeaders(callback_.callback()));
786 835
787 // Send the response with a body. 836 // Send the response with a body.
788 SetResponse("404 OK", "hello world!"); 837 SetResponse("404 OK", "hello world!");
789 // In the course of processing this packet, the QuicHttpStream close itself. 838 // In the course of processing this packet, the QuicHttpStream close itself.
790 ProcessPacket(ConstructResponseHeadersPacket(2, kFin)); 839 ProcessPacket(ConstructResponseHeadersPacket(2, kFin, nullptr));
791 840
792 base::MessageLoop::current()->RunUntilIdle(); 841 base::MessageLoop::current()->RunUntilIdle();
793 842
794 EXPECT_TRUE(AtEof()); 843 EXPECT_TRUE(AtEof());
795 844
796 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the 845 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
797 // payload. 846 // headers and payload.
798 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 847 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
848 stream_->GetTotalSentBytes());
849 // Zero since the stream is closed before processing the headers.
799 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); 850 EXPECT_EQ(0, stream_->GetTotalReceivedBytes());
800 } 851 }
801 852
802 // Regression test for http://crbug.com/294870 853 // Regression test for http://crbug.com/294870
803 TEST_P(QuicHttpStreamTest, CheckPriorityWithNoDelegate) { 854 TEST_P(QuicHttpStreamTest, CheckPriorityWithNoDelegate) {
804 SetRequest("GET", "/", MEDIUM); 855 SetRequest("GET", "/", MEDIUM);
805 use_closing_stream_ = true; 856 use_closing_stream_ = true;
806 857
807 AddWrite(ConstructRstStreamPacket(1)); 858 AddWrite(ConstructRstStreamPacket(1));
808 859
(...skipping 14 matching lines...) Expand all
823 DCHECK_EQ(QuicWriteBlockedList::kHighestPriority, 874 DCHECK_EQ(QuicWriteBlockedList::kHighestPriority,
824 reliable_stream->EffectivePriority()); 875 reliable_stream->EffectivePriority());
825 876
826 // Set Delegate to nullptr and make sure EffectivePriority returns highest 877 // Set Delegate to nullptr and make sure EffectivePriority returns highest
827 // priority. 878 // priority.
828 reliable_stream->SetDelegate(nullptr); 879 reliable_stream->SetDelegate(nullptr);
829 DCHECK_EQ(QuicWriteBlockedList::kHighestPriority, 880 DCHECK_EQ(QuicWriteBlockedList::kHighestPriority,
830 reliable_stream->EffectivePriority()); 881 reliable_stream->EffectivePriority());
831 reliable_stream->SetDelegate(delegate); 882 reliable_stream->SetDelegate(delegate);
832 883
833 // QuicHttpStream::GetTotalSent/ReceivedBytes currently only includes the
834 // payload.
835 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 884 EXPECT_EQ(0, stream_->GetTotalSentBytes());
836 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); 885 EXPECT_EQ(0, stream_->GetTotalReceivedBytes());
837 } 886 }
838 887
839 } // namespace test 888 } // namespace test
840 } // namespace net 889 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_http_stream.cc ('k') | net/quic/quic_reliable_client_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698