OLD | NEW |
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/spdy/spdy_http_stream.h" | 5 #include "net/spdy/spdy_http_stream.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "net/http/http_request_info.h" | 21 #include "net/http/http_request_info.h" |
22 #include "net/http/http_response_headers.h" | 22 #include "net/http/http_response_headers.h" |
23 #include "net/http/http_response_info.h" | 23 #include "net/http/http_response_info.h" |
24 #include "net/log/test_net_log.h" | 24 #include "net/log/test_net_log.h" |
25 #include "net/socket/next_proto.h" | 25 #include "net/socket/next_proto.h" |
26 #include "net/socket/socket_test_util.h" | 26 #include "net/socket/socket_test_util.h" |
27 #include "net/spdy/spdy_http_utils.h" | 27 #include "net/spdy/spdy_http_utils.h" |
28 #include "net/spdy/spdy_session.h" | 28 #include "net/spdy/spdy_session.h" |
29 #include "net/spdy/spdy_test_util_common.h" | 29 #include "net/spdy/spdy_test_util_common.h" |
30 #include "net/ssl/default_channel_id_store.h" | 30 #include "net/ssl/default_channel_id_store.h" |
| 31 #include "net/test/gtest_util.h" |
| 32 #include "testing/gmock/include/gmock/gmock.h" |
31 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
32 | 34 |
| 35 using net::test::IsError; |
| 36 using net::test::IsOk; |
| 37 |
33 namespace net { | 38 namespace net { |
34 | 39 |
35 namespace { | 40 namespace { |
36 | 41 |
37 enum TestCase { | 42 enum TestCase { |
38 // Test using the SPDY/3.1 protocol. | 43 // Test using the SPDY/3.1 protocol. |
39 kTestCaseSPDY31, | 44 kTestCaseSPDY31, |
40 | 45 |
41 // Test using the HTTP/2 protocol, without specifying a stream | 46 // Test using the HTTP/2 protocol, without specifying a stream |
42 // dependency based on the RequestPriority. | 47 // dependency based on the RequestPriority. |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 const int kFirstChunkSize = kUploadDataSize/2; | 384 const int kFirstChunkSize = kUploadDataSize/2; |
380 upload_stream.AppendData(kUploadData, kFirstChunkSize, false); | 385 upload_stream.AppendData(kUploadData, kFirstChunkSize, false); |
381 upload_stream.AppendData(kUploadData + kFirstChunkSize, | 386 upload_stream.AppendData(kUploadData + kFirstChunkSize, |
382 kUploadDataSize - kFirstChunkSize, true); | 387 kUploadDataSize - kFirstChunkSize, true); |
383 | 388 |
384 HttpRequestInfo request; | 389 HttpRequestInfo request; |
385 request.method = "POST"; | 390 request.method = "POST"; |
386 request.url = GURL("http://www.example.org/"); | 391 request.url = GURL("http://www.example.org/"); |
387 request.upload_data_stream = &upload_stream; | 392 request.upload_data_stream = &upload_stream; |
388 | 393 |
389 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); | 394 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback()), IsOk()); |
390 | 395 |
391 TestCompletionCallback callback; | 396 TestCompletionCallback callback; |
392 HttpResponseInfo response; | 397 HttpResponseInfo response; |
393 HttpRequestHeaders headers; | 398 HttpRequestHeaders headers; |
394 BoundNetLog net_log; | 399 BoundNetLog net_log; |
395 SpdyHttpStream http_stream(session_, true); | 400 SpdyHttpStream http_stream(session_, true); |
396 ASSERT_EQ( | 401 ASSERT_EQ( |
397 OK, | 402 OK, |
398 http_stream.InitializeStream(&request, DEFAULT_PRIORITY, | 403 http_stream.InitializeStream(&request, DEFAULT_PRIORITY, |
399 net_log, CompletionCallback())); | 404 net_log, CompletionCallback())); |
400 | 405 |
401 EXPECT_EQ(ERR_IO_PENDING, http_stream.SendRequest( | 406 EXPECT_EQ(ERR_IO_PENDING, http_stream.SendRequest( |
402 headers, &response, callback.callback())); | 407 headers, &response, callback.callback())); |
403 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 408 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
404 | 409 |
405 EXPECT_EQ(OK, callback.WaitForResult()); | 410 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
406 | 411 |
407 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), | 412 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), |
408 http_stream.GetTotalSentBytes()); | 413 http_stream.GetTotalSentBytes()); |
409 EXPECT_EQ(static_cast<int64_t>(resp->size() + body->size()), | 414 EXPECT_EQ(static_cast<int64_t>(resp->size() + body->size()), |
410 http_stream.GetTotalReceivedBytes()); | 415 http_stream.GetTotalReceivedBytes()); |
411 | 416 |
412 // Because the server closed the connection, we there shouldn't be a session | 417 // Because the server closed the connection, we there shouldn't be a session |
413 // in the pool anymore. | 418 // in the pool anymore. |
414 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 419 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
415 } | 420 } |
(...skipping 21 matching lines...) Expand all Loading... |
437 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 442 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); |
438 | 443 |
439 ChunkedUploadDataStream upload_stream(0); | 444 ChunkedUploadDataStream upload_stream(0); |
440 upload_stream.AppendData(nullptr, 0, true); | 445 upload_stream.AppendData(nullptr, 0, true); |
441 | 446 |
442 HttpRequestInfo request; | 447 HttpRequestInfo request; |
443 request.method = "POST"; | 448 request.method = "POST"; |
444 request.url = GURL("http://www.example.org/"); | 449 request.url = GURL("http://www.example.org/"); |
445 request.upload_data_stream = &upload_stream; | 450 request.upload_data_stream = &upload_stream; |
446 | 451 |
447 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); | 452 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback()), IsOk()); |
448 | 453 |
449 TestCompletionCallback callback; | 454 TestCompletionCallback callback; |
450 HttpResponseInfo response; | 455 HttpResponseInfo response; |
451 HttpRequestHeaders headers; | 456 HttpRequestHeaders headers; |
452 BoundNetLog net_log; | 457 BoundNetLog net_log; |
453 SpdyHttpStream http_stream(session_, true); | 458 SpdyHttpStream http_stream(session_, true); |
454 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, | 459 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, |
455 net_log, CompletionCallback())); | 460 net_log, CompletionCallback())); |
456 EXPECT_EQ(ERR_IO_PENDING, | 461 EXPECT_EQ(ERR_IO_PENDING, |
457 http_stream.SendRequest(headers, &response, callback.callback())); | 462 http_stream.SendRequest(headers, &response, callback.callback())); |
458 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 463 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
459 | 464 |
460 EXPECT_EQ(OK, callback.WaitForResult()); | 465 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
461 | 466 |
462 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk->size()), | 467 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk->size()), |
463 http_stream.GetTotalSentBytes()); | 468 http_stream.GetTotalSentBytes()); |
464 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk->size()), | 469 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk->size()), |
465 http_stream.GetTotalReceivedBytes()); | 470 http_stream.GetTotalReceivedBytes()); |
466 | 471 |
467 // Because the server closed the connection, there shouldn't be a session | 472 // Because the server closed the connection, there shouldn't be a session |
468 // in the pool anymore. | 473 // in the pool anymore. |
469 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 474 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
470 } | 475 } |
(...skipping 21 matching lines...) Expand all Loading... |
492 | 497 |
493 ChunkedUploadDataStream upload_stream(0); | 498 ChunkedUploadDataStream upload_stream(0); |
494 // Append first chunk. | 499 // Append first chunk. |
495 upload_stream.AppendData(kUploadData, kUploadDataSize, false); | 500 upload_stream.AppendData(kUploadData, kUploadDataSize, false); |
496 | 501 |
497 HttpRequestInfo request; | 502 HttpRequestInfo request; |
498 request.method = "POST"; | 503 request.method = "POST"; |
499 request.url = GURL("http://www.example.org/"); | 504 request.url = GURL("http://www.example.org/"); |
500 request.upload_data_stream = &upload_stream; | 505 request.upload_data_stream = &upload_stream; |
501 | 506 |
502 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); | 507 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback()), IsOk()); |
503 | 508 |
504 TestCompletionCallback callback; | 509 TestCompletionCallback callback; |
505 HttpResponseInfo response; | 510 HttpResponseInfo response; |
506 HttpRequestHeaders headers; | 511 HttpRequestHeaders headers; |
507 BoundNetLog net_log; | 512 BoundNetLog net_log; |
508 SpdyHttpStream http_stream(session_, true); | 513 SpdyHttpStream http_stream(session_, true); |
509 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, | 514 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, |
510 net_log, CompletionCallback())); | 515 net_log, CompletionCallback())); |
511 | 516 |
512 EXPECT_EQ(ERR_IO_PENDING, | 517 EXPECT_EQ(ERR_IO_PENDING, |
513 http_stream.SendRequest(headers, &response, callback.callback())); | 518 http_stream.SendRequest(headers, &response, callback.callback())); |
514 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 519 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
515 | 520 |
516 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); | 521 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
517 | 522 |
518 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), | 523 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), |
519 http_stream.GetTotalSentBytes()); | 524 http_stream.GetTotalSentBytes()); |
520 EXPECT_EQ(0, http_stream.GetTotalReceivedBytes()); | 525 EXPECT_EQ(0, http_stream.GetTotalReceivedBytes()); |
521 | 526 |
522 // Because the server closed the connection, we there shouldn't be a session | 527 // Because the server closed the connection, we there shouldn't be a session |
523 // in the pool anymore. | 528 // in the pool anymore. |
524 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 529 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
525 | 530 |
526 // Appending a second chunk now should not result in a crash. | 531 // Appending a second chunk now should not result in a crash. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 | 571 |
567 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 572 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
568 | 573 |
569 ChunkedUploadDataStream upload_stream(0); | 574 ChunkedUploadDataStream upload_stream(0); |
570 | 575 |
571 HttpRequestInfo request; | 576 HttpRequestInfo request; |
572 request.method = "POST"; | 577 request.method = "POST"; |
573 request.url = GURL("http://www.example.org/"); | 578 request.url = GURL("http://www.example.org/"); |
574 request.upload_data_stream = &upload_stream; | 579 request.upload_data_stream = &upload_stream; |
575 | 580 |
576 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); | 581 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback()), IsOk()); |
577 upload_stream.AppendData(kUploadData, kUploadDataSize, false); | 582 upload_stream.AppendData(kUploadData, kUploadDataSize, false); |
578 | 583 |
579 BoundNetLog net_log; | 584 BoundNetLog net_log; |
580 std::unique_ptr<SpdyHttpStream> http_stream( | 585 std::unique_ptr<SpdyHttpStream> http_stream( |
581 new SpdyHttpStream(session_, true)); | 586 new SpdyHttpStream(session_, true)); |
582 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, | 587 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, |
583 net_log, CompletionCallback())); | 588 net_log, CompletionCallback())); |
584 | 589 |
585 TestCompletionCallback callback; | 590 TestCompletionCallback callback; |
586 HttpRequestHeaders headers; | 591 HttpRequestHeaders headers; |
587 HttpResponseInfo response; | 592 HttpResponseInfo response; |
588 // This will attempt to Write() the initial request and headers, which will | 593 // This will attempt to Write() the initial request and headers, which will |
589 // complete asynchronously. | 594 // complete asynchronously. |
590 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, | 595 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, |
591 callback.callback())); | 596 callback.callback())); |
592 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 597 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
593 | 598 |
594 // Complete the initial request write and the first chunk. | 599 // Complete the initial request write and the first chunk. |
595 base::RunLoop().RunUntilIdle(); | 600 base::RunLoop().RunUntilIdle(); |
596 ASSERT_FALSE(callback.have_result()); | 601 ASSERT_FALSE(callback.have_result()); |
597 | 602 |
598 // Now append the final two chunks which will enqueue two more writes. | 603 // Now append the final two chunks which will enqueue two more writes. |
599 upload_stream.AppendData(kUploadData1, kUploadData1Size, false); | 604 upload_stream.AppendData(kUploadData1, kUploadData1Size, false); |
600 upload_stream.AppendData(kUploadData, kUploadDataSize, true); | 605 upload_stream.AppendData(kUploadData, kUploadDataSize, true); |
601 | 606 |
602 // Finish writing all the chunks and do all reads. | 607 // Finish writing all the chunks and do all reads. |
603 base::RunLoop().RunUntilIdle(); | 608 base::RunLoop().RunUntilIdle(); |
604 ASSERT_TRUE(callback.have_result()); | 609 ASSERT_TRUE(callback.have_result()); |
605 EXPECT_EQ(OK, callback.WaitForResult()); | 610 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
606 | 611 |
607 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size() + chunk2->size() + | 612 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size() + chunk2->size() + |
608 chunk3->size()), | 613 chunk3->size()), |
609 http_stream->GetTotalSentBytes()); | 614 http_stream->GetTotalSentBytes()); |
610 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk1->size() + | 615 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk1->size() + |
611 chunk2->size() + chunk3->size()), | 616 chunk2->size() + chunk3->size()), |
612 http_stream->GetTotalReceivedBytes()); | 617 http_stream->GetTotalReceivedBytes()); |
613 | 618 |
614 // Check response headers. | 619 // Check response headers. |
615 ASSERT_EQ(OK, http_stream->ReadResponseHeaders(callback.callback())); | 620 ASSERT_THAT(http_stream->ReadResponseHeaders(callback.callback()), IsOk()); |
616 | 621 |
617 // Check |chunk1| response. | 622 // Check |chunk1| response. |
618 scoped_refptr<IOBuffer> buf1(new IOBuffer(kUploadDataSize)); | 623 scoped_refptr<IOBuffer> buf1(new IOBuffer(kUploadDataSize)); |
619 ASSERT_EQ(kUploadDataSize, | 624 ASSERT_EQ(kUploadDataSize, |
620 http_stream->ReadResponseBody( | 625 http_stream->ReadResponseBody( |
621 buf1.get(), kUploadDataSize, callback.callback())); | 626 buf1.get(), kUploadDataSize, callback.callback())); |
622 EXPECT_EQ(kUploadData, std::string(buf1->data(), kUploadDataSize)); | 627 EXPECT_EQ(kUploadData, std::string(buf1->data(), kUploadDataSize)); |
623 | 628 |
624 // Check |chunk2| response. | 629 // Check |chunk2| response. |
625 scoped_refptr<IOBuffer> buf2(new IOBuffer(kUploadData1Size)); | 630 scoped_refptr<IOBuffer> buf2(new IOBuffer(kUploadData1Size)); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 | 669 |
665 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 670 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
666 | 671 |
667 ChunkedUploadDataStream upload_stream(0); | 672 ChunkedUploadDataStream upload_stream(0); |
668 | 673 |
669 HttpRequestInfo request; | 674 HttpRequestInfo request; |
670 request.method = "POST"; | 675 request.method = "POST"; |
671 request.url = GURL("http://www.example.org/"); | 676 request.url = GURL("http://www.example.org/"); |
672 request.upload_data_stream = &upload_stream; | 677 request.upload_data_stream = &upload_stream; |
673 | 678 |
674 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); | 679 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback()), IsOk()); |
675 upload_stream.AppendData(kUploadData, kUploadDataSize, false); | 680 upload_stream.AppendData(kUploadData, kUploadDataSize, false); |
676 | 681 |
677 BoundNetLog net_log; | 682 BoundNetLog net_log; |
678 std::unique_ptr<SpdyHttpStream> http_stream( | 683 std::unique_ptr<SpdyHttpStream> http_stream( |
679 new SpdyHttpStream(session_, true)); | 684 new SpdyHttpStream(session_, true)); |
680 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, | 685 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, |
681 net_log, CompletionCallback())); | 686 net_log, CompletionCallback())); |
682 | 687 |
683 TestCompletionCallback callback; | 688 TestCompletionCallback callback; |
684 HttpRequestHeaders headers; | 689 HttpRequestHeaders headers; |
(...skipping 11 matching lines...) Expand all Loading... |
696 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()), | 701 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()), |
697 http_stream->GetTotalSentBytes()); | 702 http_stream->GetTotalSentBytes()); |
698 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); | 703 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); |
699 | 704 |
700 // Now end the stream with an empty data frame and the FIN set. | 705 // Now end the stream with an empty data frame and the FIN set. |
701 upload_stream.AppendData(nullptr, 0, true); | 706 upload_stream.AppendData(nullptr, 0, true); |
702 | 707 |
703 // Finish writing the final frame, and perform all reads. | 708 // Finish writing the final frame, and perform all reads. |
704 base::RunLoop().RunUntilIdle(); | 709 base::RunLoop().RunUntilIdle(); |
705 ASSERT_TRUE(callback.have_result()); | 710 ASSERT_TRUE(callback.have_result()); |
706 EXPECT_EQ(OK, callback.WaitForResult()); | 711 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
707 | 712 |
708 // Check response headers. | 713 // Check response headers. |
709 ASSERT_EQ(OK, http_stream->ReadResponseHeaders(callback.callback())); | 714 ASSERT_THAT(http_stream->ReadResponseHeaders(callback.callback()), IsOk()); |
710 | 715 |
711 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size() + chunk2->size()), | 716 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size() + chunk2->size()), |
712 http_stream->GetTotalSentBytes()); | 717 http_stream->GetTotalSentBytes()); |
713 EXPECT_EQ( | 718 EXPECT_EQ( |
714 static_cast<int64_t>(resp->size() + chunk1->size() + chunk2->size()), | 719 static_cast<int64_t>(resp->size() + chunk1->size() + chunk2->size()), |
715 http_stream->GetTotalReceivedBytes()); | 720 http_stream->GetTotalReceivedBytes()); |
716 | 721 |
717 // Check |chunk1| response. | 722 // Check |chunk1| response. |
718 scoped_refptr<IOBuffer> buf1(new IOBuffer(kUploadDataSize)); | 723 scoped_refptr<IOBuffer> buf1(new IOBuffer(kUploadDataSize)); |
719 ASSERT_EQ(kUploadDataSize, | 724 ASSERT_EQ(kUploadDataSize, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 | 756 |
752 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 757 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
753 | 758 |
754 ChunkedUploadDataStream upload_stream(0); | 759 ChunkedUploadDataStream upload_stream(0); |
755 | 760 |
756 HttpRequestInfo request; | 761 HttpRequestInfo request; |
757 request.method = "POST"; | 762 request.method = "POST"; |
758 request.url = GURL("http://www.example.org/"); | 763 request.url = GURL("http://www.example.org/"); |
759 request.upload_data_stream = &upload_stream; | 764 request.upload_data_stream = &upload_stream; |
760 | 765 |
761 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); | 766 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback()), IsOk()); |
762 upload_stream.AppendData("", 0, true); | 767 upload_stream.AppendData("", 0, true); |
763 | 768 |
764 BoundNetLog net_log; | 769 BoundNetLog net_log; |
765 std::unique_ptr<SpdyHttpStream> http_stream( | 770 std::unique_ptr<SpdyHttpStream> http_stream( |
766 new SpdyHttpStream(session_, true)); | 771 new SpdyHttpStream(session_, true)); |
767 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, | 772 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, |
768 net_log, CompletionCallback())); | 773 net_log, CompletionCallback())); |
769 | 774 |
770 TestCompletionCallback callback; | 775 TestCompletionCallback callback; |
771 HttpRequestHeaders headers; | 776 HttpRequestHeaders headers; |
772 HttpResponseInfo response; | 777 HttpResponseInfo response; |
773 // This will attempt to Write() the initial request and headers, which will | 778 // This will attempt to Write() the initial request and headers, which will |
774 // complete asynchronously. | 779 // complete asynchronously. |
775 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, | 780 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, |
776 callback.callback())); | 781 callback.callback())); |
777 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 782 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
778 | 783 |
779 // Complete writing request, followed by a FIN. | 784 // Complete writing request, followed by a FIN. |
780 base::RunLoop().RunUntilIdle(); | 785 base::RunLoop().RunUntilIdle(); |
781 ASSERT_TRUE(callback.have_result()); | 786 ASSERT_TRUE(callback.have_result()); |
782 EXPECT_EQ(OK, callback.WaitForResult()); | 787 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
783 | 788 |
784 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk->size()), | 789 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk->size()), |
785 http_stream->GetTotalSentBytes()); | 790 http_stream->GetTotalSentBytes()); |
786 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk->size()), | 791 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk->size()), |
787 http_stream->GetTotalReceivedBytes()); | 792 http_stream->GetTotalReceivedBytes()); |
788 | 793 |
789 // Check response headers. | 794 // Check response headers. |
790 ASSERT_EQ(OK, http_stream->ReadResponseHeaders(callback.callback())); | 795 ASSERT_THAT(http_stream->ReadResponseHeaders(callback.callback()), IsOk()); |
791 | 796 |
792 // Check |chunk| response. | 797 // Check |chunk| response. |
793 scoped_refptr<IOBuffer> buf(new IOBuffer(1)); | 798 scoped_refptr<IOBuffer> buf(new IOBuffer(1)); |
794 ASSERT_EQ(0, | 799 ASSERT_EQ(0, |
795 http_stream->ReadResponseBody( | 800 http_stream->ReadResponseBody( |
796 buf.get(), 1, callback.callback())); | 801 buf.get(), 1, callback.callback())); |
797 | 802 |
798 ASSERT_TRUE(response.headers.get()); | 803 ASSERT_TRUE(response.headers.get()); |
799 ASSERT_EQ(200, response.headers->response_code()); | 804 ASSERT_EQ(200, response.headers->response_code()); |
800 } | 805 } |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
871 | 876 |
872 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 877 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
873 | 878 |
874 ChunkedUploadDataStream upload_stream(0); | 879 ChunkedUploadDataStream upload_stream(0); |
875 | 880 |
876 HttpRequestInfo request; | 881 HttpRequestInfo request; |
877 request.method = "POST"; | 882 request.method = "POST"; |
878 request.url = GURL("http://www.example.org/"); | 883 request.url = GURL("http://www.example.org/"); |
879 request.upload_data_stream = &upload_stream; | 884 request.upload_data_stream = &upload_stream; |
880 | 885 |
881 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); | 886 ASSERT_THAT(upload_stream.Init(TestCompletionCallback().callback()), IsOk()); |
882 | 887 |
883 BoundNetLog net_log; | 888 BoundNetLog net_log; |
884 std::unique_ptr<SpdyHttpStream> http_stream( | 889 std::unique_ptr<SpdyHttpStream> http_stream( |
885 new SpdyHttpStream(session_, true)); | 890 new SpdyHttpStream(session_, true)); |
886 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, | 891 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, |
887 net_log, CompletionCallback())); | 892 net_log, CompletionCallback())); |
888 | 893 |
889 HttpRequestHeaders headers; | 894 HttpRequestHeaders headers; |
890 HttpResponseInfo response; | 895 HttpResponseInfo response; |
891 // This will attempt to Write() the initial request and headers, which will | 896 // This will attempt to Write() the initial request and headers, which will |
892 // complete asynchronously. | 897 // complete asynchronously. |
893 TestCompletionCallback callback; | 898 TestCompletionCallback callback; |
894 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, | 899 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, |
895 callback.callback())); | 900 callback.callback())); |
896 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 901 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
897 | 902 |
898 // Complete the initial request write and first chunk. | 903 // Complete the initial request write and first chunk. |
899 base::RunLoop().RunUntilIdle(); | 904 base::RunLoop().RunUntilIdle(); |
900 ASSERT_FALSE(callback.have_result()); | 905 ASSERT_FALSE(callback.have_result()); |
901 | 906 |
902 EXPECT_EQ(static_cast<int64_t>(req->size()), | 907 EXPECT_EQ(static_cast<int64_t>(req->size()), |
903 http_stream->GetTotalSentBytes()); | 908 http_stream->GetTotalSentBytes()); |
904 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); | 909 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); |
905 | 910 |
906 upload_stream.AppendData(kUploadData, kUploadDataSize, true); | 911 upload_stream.AppendData(kUploadData, kUploadDataSize, true); |
907 | 912 |
908 ASSERT_TRUE(callback.have_result()); | 913 ASSERT_TRUE(callback.have_result()); |
909 EXPECT_EQ(OK, callback.WaitForResult()); | 914 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
910 | 915 |
911 // Verify that the window size has decreased. | 916 // Verify that the window size has decreased. |
912 ASSERT_TRUE(http_stream->stream() != nullptr); | 917 ASSERT_TRUE(http_stream->stream() != nullptr); |
913 EXPECT_NE(static_cast<int>( | 918 EXPECT_NE(static_cast<int>( |
914 SpdySession::GetDefaultInitialWindowSize(session_->protocol())), | 919 SpdySession::GetDefaultInitialWindowSize(session_->protocol())), |
915 http_stream->stream()->send_window_size()); | 920 http_stream->stream()->send_window_size()); |
916 | 921 |
917 // Read window update. | 922 // Read window update. |
918 base::RunLoop().RunUntilIdle(); | 923 base::RunLoop().RunUntilIdle(); |
919 | 924 |
(...skipping 11 matching lines...) Expand all Loading... |
931 // Read rest of data. | 936 // Read rest of data. |
932 sequenced_data_->Resume(); | 937 sequenced_data_->Resume(); |
933 base::RunLoop().RunUntilIdle(); | 938 base::RunLoop().RunUntilIdle(); |
934 | 939 |
935 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()), | 940 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()), |
936 http_stream->GetTotalSentBytes()); | 941 http_stream->GetTotalSentBytes()); |
937 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk1->size()), | 942 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk1->size()), |
938 http_stream->GetTotalReceivedBytes()); | 943 http_stream->GetTotalReceivedBytes()); |
939 | 944 |
940 // Check response headers. | 945 // Check response headers. |
941 ASSERT_EQ(OK, http_stream->ReadResponseHeaders(callback.callback())); | 946 ASSERT_THAT(http_stream->ReadResponseHeaders(callback.callback()), IsOk()); |
942 | 947 |
943 // Check |chunk1| response. | 948 // Check |chunk1| response. |
944 scoped_refptr<IOBuffer> buf1(new IOBuffer(kUploadDataSize)); | 949 scoped_refptr<IOBuffer> buf1(new IOBuffer(kUploadDataSize)); |
945 ASSERT_EQ(kUploadDataSize, | 950 ASSERT_EQ(kUploadDataSize, |
946 http_stream->ReadResponseBody( | 951 http_stream->ReadResponseBody( |
947 buf1.get(), kUploadDataSize, callback.callback())); | 952 buf1.get(), kUploadDataSize, callback.callback())); |
948 EXPECT_EQ(kUploadData, std::string(buf1->data(), kUploadDataSize)); | 953 EXPECT_EQ(kUploadData, std::string(buf1->data(), kUploadDataSize)); |
949 | 954 |
950 ASSERT_TRUE(response.headers.get()); | 955 ASSERT_TRUE(response.headers.get()); |
951 ASSERT_EQ(200, response.headers->response_code()); | 956 ASSERT_EQ(200, response.headers->response_code()); |
(...skipping 19 matching lines...) Expand all Loading... |
971 | 976 |
972 MockRead reads[] = { | 977 MockRead reads[] = { |
973 CreateMockRead(*resp, 2), MockRead(SYNCHRONOUS, 0, 3), | 978 CreateMockRead(*resp, 2), MockRead(SYNCHRONOUS, 0, 3), |
974 }; | 979 }; |
975 | 980 |
976 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 981 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
977 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 982 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); |
978 | 983 |
979 ReadErrorUploadDataStream upload_data_stream( | 984 ReadErrorUploadDataStream upload_data_stream( |
980 ReadErrorUploadDataStream::FailureMode::SYNC); | 985 ReadErrorUploadDataStream::FailureMode::SYNC); |
981 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback())); | 986 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback()), |
| 987 IsOk()); |
982 | 988 |
983 HttpRequestInfo request; | 989 HttpRequestInfo request; |
984 request.method = "POST"; | 990 request.method = "POST"; |
985 request.url = GURL("http://www.example.org/"); | 991 request.url = GURL("http://www.example.org/"); |
986 request.upload_data_stream = &upload_data_stream; | 992 request.upload_data_stream = &upload_data_stream; |
987 | 993 |
988 TestCompletionCallback callback; | 994 TestCompletionCallback callback; |
989 HttpResponseInfo response; | 995 HttpResponseInfo response; |
990 HttpRequestHeaders headers; | 996 HttpRequestHeaders headers; |
991 BoundNetLog net_log; | 997 BoundNetLog net_log; |
992 SpdyHttpStream http_stream(session_, true); | 998 SpdyHttpStream http_stream(session_, true); |
993 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, | 999 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, |
994 net_log, CompletionCallback())); | 1000 net_log, CompletionCallback())); |
995 | 1001 |
996 int result = http_stream.SendRequest(headers, &response, callback.callback()); | 1002 int result = http_stream.SendRequest(headers, &response, callback.callback()); |
997 EXPECT_EQ(ERR_FAILED, callback.GetResult(result)); | 1003 EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED)); |
998 | 1004 |
999 // Because the server has not closed the connection yet, there shouldn't be | 1005 // Because the server has not closed the connection yet, there shouldn't be |
1000 // a stream but a session in the pool | 1006 // a stream but a session in the pool |
1001 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 1007 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
1002 } | 1008 } |
1003 | 1009 |
1004 TEST_P(SpdyHttpStreamTest, DataReadErrorAsynchronous) { | 1010 TEST_P(SpdyHttpStreamTest, DataReadErrorAsynchronous) { |
1005 std::unique_ptr<SpdySerializedFrame> req( | 1011 std::unique_ptr<SpdySerializedFrame> req( |
1006 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0)); | 1012 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0)); |
1007 | 1013 |
(...skipping 13 matching lines...) Expand all Loading... |
1021 | 1027 |
1022 MockRead reads[] = { | 1028 MockRead reads[] = { |
1023 MockRead(ASYNC, 0, 2), | 1029 MockRead(ASYNC, 0, 2), |
1024 }; | 1030 }; |
1025 | 1031 |
1026 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1032 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
1027 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); | 1033 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); |
1028 | 1034 |
1029 ReadErrorUploadDataStream upload_data_stream( | 1035 ReadErrorUploadDataStream upload_data_stream( |
1030 ReadErrorUploadDataStream::FailureMode::ASYNC); | 1036 ReadErrorUploadDataStream::FailureMode::ASYNC); |
1031 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback())); | 1037 ASSERT_THAT(upload_data_stream.Init(TestCompletionCallback().callback()), |
| 1038 IsOk()); |
1032 | 1039 |
1033 HttpRequestInfo request; | 1040 HttpRequestInfo request; |
1034 request.method = "POST"; | 1041 request.method = "POST"; |
1035 request.url = GURL("http://www.example.org/"); | 1042 request.url = GURL("http://www.example.org/"); |
1036 request.upload_data_stream = &upload_data_stream; | 1043 request.upload_data_stream = &upload_data_stream; |
1037 | 1044 |
1038 TestCompletionCallback callback; | 1045 TestCompletionCallback callback; |
1039 HttpResponseInfo response; | 1046 HttpResponseInfo response; |
1040 HttpRequestHeaders headers; | 1047 HttpRequestHeaders headers; |
1041 BoundNetLog net_log; | 1048 BoundNetLog net_log; |
1042 SpdyHttpStream http_stream(session_, true); | 1049 SpdyHttpStream http_stream(session_, true); |
1043 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, | 1050 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, |
1044 net_log, CompletionCallback())); | 1051 net_log, CompletionCallback())); |
1045 | 1052 |
1046 int result = http_stream.SendRequest(headers, &response, callback.callback()); | 1053 int result = http_stream.SendRequest(headers, &response, callback.callback()); |
1047 EXPECT_EQ(ERR_IO_PENDING, result); | 1054 EXPECT_THAT(result, IsError(ERR_IO_PENDING)); |
1048 EXPECT_EQ(ERR_FAILED, callback.GetResult(result)); | 1055 EXPECT_THAT(callback.GetResult(result), IsError(ERR_FAILED)); |
1049 | 1056 |
1050 // Because the server has closed the connection, there shouldn't be a session | 1057 // Because the server has closed the connection, there shouldn't be a session |
1051 // in the pool anymore. | 1058 // in the pool anymore. |
1052 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); | 1059 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_)); |
1053 } | 1060 } |
1054 | 1061 |
1055 // TODO(willchan): Write a longer test for SpdyStream that exercises all | 1062 // TODO(willchan): Write a longer test for SpdyStream that exercises all |
1056 // methods. | 1063 // methods. |
1057 | 1064 |
1058 } // namespace net | 1065 } // namespace net |
OLD | NEW |