| 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/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 SPDYNPN, | 38 SPDYNPN, |
| 39 SPDYNOSSL, | 39 SPDYNOSSL, |
| 40 SPDYSSL, | 40 SPDYSSL, |
| 41 }; | 41 }; |
| 42 | 42 |
| 43 class SpdyNetworkTransactionSpdy2Test | 43 class SpdyNetworkTransactionSpdy2Test |
| 44 : public ::testing::TestWithParam<SpdyNetworkTransactionSpdy2TestTypes> { | 44 : public ::testing::TestWithParam<SpdyNetworkTransactionSpdy2TestTypes> { |
| 45 protected: | 45 protected: |
| 46 | 46 |
| 47 virtual void SetUp() { | 47 virtual void SetUp() { |
| 48 SpdySession::set_default_protocol(kProtoSPDY2); | |
| 49 google_get_request_initialized_ = false; | 48 google_get_request_initialized_ = false; |
| 50 google_post_request_initialized_ = false; | 49 google_post_request_initialized_ = false; |
| 51 google_chunked_post_request_initialized_ = false; | 50 google_chunked_post_request_initialized_ = false; |
| 52 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 51 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 53 } | 52 } |
| 54 | 53 |
| 55 virtual void TearDown() { | 54 virtual void TearDown() { |
| 56 UploadDataStream::ResetMergeChunks(); | 55 UploadDataStream::ResetMergeChunks(); |
| 57 // Empty the current queue. | 56 // Empty the current queue. |
| 58 MessageLoop::current()->RunUntilIdle(); | 57 MessageLoop::current()->RunUntilIdle(); |
| (...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 | 568 |
| 570 private: | 569 private: |
| 571 scoped_ptr<UploadDataStream> upload_data_stream_; | 570 scoped_ptr<UploadDataStream> upload_data_stream_; |
| 572 bool google_get_request_initialized_; | 571 bool google_get_request_initialized_; |
| 573 bool google_post_request_initialized_; | 572 bool google_post_request_initialized_; |
| 574 bool google_chunked_post_request_initialized_; | 573 bool google_chunked_post_request_initialized_; |
| 575 HttpRequestInfo google_get_request_; | 574 HttpRequestInfo google_get_request_; |
| 576 HttpRequestInfo google_post_request_; | 575 HttpRequestInfo google_post_request_; |
| 577 HttpRequestInfo google_chunked_post_request_; | 576 HttpRequestInfo google_chunked_post_request_; |
| 578 HttpRequestInfo google_get_push_request_; | 577 HttpRequestInfo google_get_push_request_; |
| 579 SpdyTestStateHelper spdy_state_; | |
| 580 base::ScopedTempDir temp_dir_; | 578 base::ScopedTempDir temp_dir_; |
| 581 }; | 579 }; |
| 582 | 580 |
| 583 //----------------------------------------------------------------------------- | 581 //----------------------------------------------------------------------------- |
| 584 // All tests are run with three different connection types: SPDY after NPN | 582 // All tests are run with three different connection types: SPDY after NPN |
| 585 // negotiation, SPDY without SSL, and SPDY with SSL. | 583 // negotiation, SPDY without SSL, and SPDY with SSL. |
| 586 INSTANTIATE_TEST_CASE_P(Spdy, | 584 INSTANTIATE_TEST_CASE_P(Spdy, |
| 587 SpdyNetworkTransactionSpdy2Test, | 585 SpdyNetworkTransactionSpdy2Test, |
| 588 ::testing::Values(SPDYNOSSL, SPDYSSL, SPDYNPN)); | 586 ::testing::Values(SPDYNOSSL, SPDYSSL, SPDYNPN)); |
| 589 | 587 |
| (...skipping 2936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3526 helper.RunToCompletion(&data); | 3524 helper.RunToCompletion(&data); |
| 3527 TransactionHelperResult out = helper.output(); | 3525 TransactionHelperResult out = helper.output(); |
| 3528 EXPECT_EQ(OK, out.rv); | 3526 EXPECT_EQ(OK, out.rv); |
| 3529 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 3527 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 3530 EXPECT_EQ("hello!", out.response_data); | 3528 EXPECT_EQ("hello!", out.response_data); |
| 3531 } | 3529 } |
| 3532 | 3530 |
| 3533 // In this test, we enable compression, but get a uncompressed SynReply from | 3531 // In this test, we enable compression, but get a uncompressed SynReply from |
| 3534 // the server. Verify that teardown is all clean. | 3532 // the server. Verify that teardown is all clean. |
| 3535 TEST_P(SpdyNetworkTransactionSpdy2Test, DecompressFailureOnSynReply) { | 3533 TEST_P(SpdyNetworkTransactionSpdy2Test, DecompressFailureOnSynReply) { |
| 3536 // For this test, we turn on the normal compression. | |
| 3537 BufferedSpdyFramer::set_enable_compression_default(true); | |
| 3538 | |
| 3539 scoped_ptr<SpdyFrame> compressed( | 3534 scoped_ptr<SpdyFrame> compressed( |
| 3540 ConstructSpdyGet(NULL, 0, true, 1, LOWEST)); | 3535 ConstructSpdyGet(NULL, 0, true, 1, LOWEST)); |
| 3541 scoped_ptr<SpdyFrame> rst( | 3536 scoped_ptr<SpdyFrame> rst( |
| 3542 ConstructSpdyRstStream(1, PROTOCOL_ERROR)); | 3537 ConstructSpdyRstStream(1, PROTOCOL_ERROR)); |
| 3543 MockWrite writes[] = { | 3538 MockWrite writes[] = { |
| 3544 CreateMockWrite(*compressed), | 3539 CreateMockWrite(*compressed), |
| 3545 }; | 3540 }; |
| 3546 | 3541 |
| 3547 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | 3542 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 3548 scoped_ptr<SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); | 3543 scoped_ptr<SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
| 3549 MockRead reads[] = { | 3544 MockRead reads[] = { |
| 3550 CreateMockRead(*resp), | 3545 CreateMockRead(*resp), |
| 3551 }; | 3546 }; |
| 3552 | 3547 |
| 3553 DelayedSocketData data(1, reads, arraysize(reads), | 3548 DelayedSocketData data(1, reads, arraysize(reads), |
| 3554 writes, arraysize(writes)); | 3549 writes, arraysize(writes)); |
| 3550 SpdySessionDependencies* session_deps = new SpdySessionDependencies(); |
| 3551 session_deps->enable_compression = true; |
| 3555 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 3552 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
| 3556 BoundNetLog(), GetParam(), NULL); | 3553 BoundNetLog(), GetParam(), session_deps); |
| 3557 helper.RunToCompletion(&data); | 3554 helper.RunToCompletion(&data); |
| 3558 TransactionHelperResult out = helper.output(); | 3555 TransactionHelperResult out = helper.output(); |
| 3559 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); | 3556 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); |
| 3560 data.Reset(); | 3557 data.Reset(); |
| 3561 } | 3558 } |
| 3562 | 3559 |
| 3563 // Test that the NetLog contains good data for a simple GET request. | 3560 // Test that the NetLog contains good data for a simple GET request. |
| 3564 TEST_P(SpdyNetworkTransactionSpdy2Test, NetLog) { | 3561 TEST_P(SpdyNetworkTransactionSpdy2Test, NetLog) { |
| 3565 static const char* const kExtraHeaders[] = { | 3562 static const char* const kExtraHeaders[] = { |
| 3566 "user-agent", "Chrome", | 3563 "user-agent", "Chrome", |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3642 EXPECT_NE(header_list->end(), header_list->Find(header)) << | 3639 EXPECT_NE(header_list->end(), header_list->Find(header)) << |
| 3643 "Header not found: " << *it; | 3640 "Header not found: " << *it; |
| 3644 } | 3641 } |
| 3645 } | 3642 } |
| 3646 | 3643 |
| 3647 // Since we buffer the IO from the stream to the renderer, this test verifies | 3644 // Since we buffer the IO from the stream to the renderer, this test verifies |
| 3648 // that when we read out the maximum amount of data (e.g. we received 50 bytes | 3645 // that when we read out the maximum amount of data (e.g. we received 50 bytes |
| 3649 // on the network, but issued a Read for only 5 of those bytes) that the data | 3646 // on the network, but issued a Read for only 5 of those bytes) that the data |
| 3650 // flow still works correctly. | 3647 // flow still works correctly. |
| 3651 TEST_P(SpdyNetworkTransactionSpdy2Test, BufferFull) { | 3648 TEST_P(SpdyNetworkTransactionSpdy2Test, BufferFull) { |
| 3652 BufferedSpdyFramer framer(2); | 3649 BufferedSpdyFramer framer(2, false); |
| 3653 | 3650 |
| 3654 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 3651 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 3655 MockWrite writes[] = { CreateMockWrite(*req) }; | 3652 MockWrite writes[] = { CreateMockWrite(*req) }; |
| 3656 | 3653 |
| 3657 // 2 data frames in a single read. | 3654 // 2 data frames in a single read. |
| 3658 scoped_ptr<SpdyFrame> data_frame_1( | 3655 scoped_ptr<SpdyFrame> data_frame_1( |
| 3659 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE)); | 3656 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE)); |
| 3660 scoped_ptr<SpdyFrame> data_frame_2( | 3657 scoped_ptr<SpdyFrame> data_frame_2( |
| 3661 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE)); | 3658 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE)); |
| 3662 const SpdyFrame* data_frames[2] = { | 3659 const SpdyFrame* data_frames[2] = { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3735 | 3732 |
| 3736 EXPECT_EQ(OK, out.rv); | 3733 EXPECT_EQ(OK, out.rv); |
| 3737 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 3734 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 3738 EXPECT_EQ("goodbye world", out.response_data); | 3735 EXPECT_EQ("goodbye world", out.response_data); |
| 3739 } | 3736 } |
| 3740 | 3737 |
| 3741 // Verify that basic buffering works; when multiple data frames arrive | 3738 // Verify that basic buffering works; when multiple data frames arrive |
| 3742 // at the same time, ensure that we don't notify a read completion for | 3739 // at the same time, ensure that we don't notify a read completion for |
| 3743 // each data frame individually. | 3740 // each data frame individually. |
| 3744 TEST_P(SpdyNetworkTransactionSpdy2Test, Buffering) { | 3741 TEST_P(SpdyNetworkTransactionSpdy2Test, Buffering) { |
| 3745 BufferedSpdyFramer framer(2); | 3742 BufferedSpdyFramer framer(2, false); |
| 3746 | 3743 |
| 3747 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 3744 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 3748 MockWrite writes[] = { CreateMockWrite(*req) }; | 3745 MockWrite writes[] = { CreateMockWrite(*req) }; |
| 3749 | 3746 |
| 3750 // 4 data frames in a single read. | 3747 // 4 data frames in a single read. |
| 3751 scoped_ptr<SpdyFrame> data_frame( | 3748 scoped_ptr<SpdyFrame> data_frame( |
| 3752 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); | 3749 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); |
| 3753 scoped_ptr<SpdyFrame> data_frame_fin( | 3750 scoped_ptr<SpdyFrame> data_frame_fin( |
| 3754 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN)); | 3751 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN)); |
| 3755 const SpdyFrame* data_frames[4] = { | 3752 const SpdyFrame* data_frames[4] = { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3829 // Verify that we consumed all test data. | 3826 // Verify that we consumed all test data. |
| 3830 helper.VerifyDataConsumed(); | 3827 helper.VerifyDataConsumed(); |
| 3831 | 3828 |
| 3832 EXPECT_EQ(OK, out.rv); | 3829 EXPECT_EQ(OK, out.rv); |
| 3833 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 3830 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 3834 EXPECT_EQ("messagemessagemessagemessage", out.response_data); | 3831 EXPECT_EQ("messagemessagemessagemessage", out.response_data); |
| 3835 } | 3832 } |
| 3836 | 3833 |
| 3837 // Verify the case where we buffer data but read it after it has been buffered. | 3834 // Verify the case where we buffer data but read it after it has been buffered. |
| 3838 TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedAll) { | 3835 TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedAll) { |
| 3839 BufferedSpdyFramer framer(2); | 3836 BufferedSpdyFramer framer(2, false); |
| 3840 | 3837 |
| 3841 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 3838 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 3842 MockWrite writes[] = { CreateMockWrite(*req) }; | 3839 MockWrite writes[] = { CreateMockWrite(*req) }; |
| 3843 | 3840 |
| 3844 // 5 data frames in a single read. | 3841 // 5 data frames in a single read. |
| 3845 scoped_ptr<SpdyFrame> syn_reply( | 3842 scoped_ptr<SpdyFrame> syn_reply( |
| 3846 ConstructSpdyGetSynReply(NULL, 0, 1)); | 3843 ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 3847 syn_reply->set_flags(CONTROL_FLAG_NONE); // turn off FIN bit | 3844 syn_reply->set_flags(CONTROL_FLAG_NONE); // turn off FIN bit |
| 3848 scoped_ptr<SpdyFrame> data_frame( | 3845 scoped_ptr<SpdyFrame> data_frame( |
| 3849 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); | 3846 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3920 // Verify that we consumed all test data. | 3917 // Verify that we consumed all test data. |
| 3921 helper.VerifyDataConsumed(); | 3918 helper.VerifyDataConsumed(); |
| 3922 | 3919 |
| 3923 EXPECT_EQ(OK, out.rv); | 3920 EXPECT_EQ(OK, out.rv); |
| 3924 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 3921 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 3925 EXPECT_EQ("messagemessagemessagemessage", out.response_data); | 3922 EXPECT_EQ("messagemessagemessagemessage", out.response_data); |
| 3926 } | 3923 } |
| 3927 | 3924 |
| 3928 // Verify the case where we buffer data and close the connection. | 3925 // Verify the case where we buffer data and close the connection. |
| 3929 TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedClosed) { | 3926 TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedClosed) { |
| 3930 BufferedSpdyFramer framer(2); | 3927 BufferedSpdyFramer framer(2, false); |
| 3931 | 3928 |
| 3932 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 3929 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 3933 MockWrite writes[] = { CreateMockWrite(*req) }; | 3930 MockWrite writes[] = { CreateMockWrite(*req) }; |
| 3934 | 3931 |
| 3935 // All data frames in a single read. | 3932 // All data frames in a single read. |
| 3936 // NOTE: We don't FIN the stream. | 3933 // NOTE: We don't FIN the stream. |
| 3937 scoped_ptr<SpdyFrame> data_frame( | 3934 scoped_ptr<SpdyFrame> data_frame( |
| 3938 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); | 3935 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); |
| 3939 const SpdyFrame* data_frames[4] = { | 3936 const SpdyFrame* data_frames[4] = { |
| 3940 data_frame.get(), | 3937 data_frame.get(), |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4010 // Flush the MessageLoop while the SpdySessionDependencies (in particular, the | 4007 // Flush the MessageLoop while the SpdySessionDependencies (in particular, the |
| 4011 // MockClientSocketFactory) are still alive. | 4008 // MockClientSocketFactory) are still alive. |
| 4012 MessageLoop::current()->RunUntilIdle(); | 4009 MessageLoop::current()->RunUntilIdle(); |
| 4013 | 4010 |
| 4014 // Verify that we consumed all test data. | 4011 // Verify that we consumed all test data. |
| 4015 helper.VerifyDataConsumed(); | 4012 helper.VerifyDataConsumed(); |
| 4016 } | 4013 } |
| 4017 | 4014 |
| 4018 // Verify the case where we buffer data and cancel the transaction. | 4015 // Verify the case where we buffer data and cancel the transaction. |
| 4019 TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedCancelled) { | 4016 TEST_P(SpdyNetworkTransactionSpdy2Test, BufferedCancelled) { |
| 4020 BufferedSpdyFramer framer(2); | 4017 BufferedSpdyFramer framer(2, false); |
| 4021 | 4018 |
| 4022 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 4019 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 4023 MockWrite writes[] = { CreateMockWrite(*req) }; | 4020 MockWrite writes[] = { CreateMockWrite(*req) }; |
| 4024 | 4021 |
| 4025 // NOTE: We don't FIN the stream. | 4022 // NOTE: We don't FIN the stream. |
| 4026 scoped_ptr<SpdyFrame> data_frame( | 4023 scoped_ptr<SpdyFrame> data_frame( |
| 4027 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); | 4024 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); |
| 4028 | 4025 |
| 4029 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | 4026 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 4030 MockRead reads[] = { | 4027 MockRead reads[] = { |
| (...skipping 1738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5769 // And now we can allow everything else to run to completion. | 5766 // And now we can allow everything else to run to completion. |
| 5770 data.SetStop(10); | 5767 data.SetStop(10); |
| 5771 data.Run(); | 5768 data.Run(); |
| 5772 EXPECT_EQ(OK, callback2.WaitForResult()); | 5769 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 5773 EXPECT_EQ(OK, callback3.WaitForResult()); | 5770 EXPECT_EQ(OK, callback3.WaitForResult()); |
| 5774 | 5771 |
| 5775 helper.VerifyDataConsumed(); | 5772 helper.VerifyDataConsumed(); |
| 5776 } | 5773 } |
| 5777 | 5774 |
| 5778 } // namespace net | 5775 } // namespace net |
| OLD | NEW |