OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "net/base/auth.h" | 10 #include "net/base/auth.h" |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 if (!session_.get()) | 115 if (!session_.get()) |
116 session_ = SpdySessionDependencies::SpdyCreateSession( | 116 session_ = SpdySessionDependencies::SpdyCreateSession( |
117 session_deps_.get()); | 117 session_deps_.get()); |
118 HttpStreamFactory::set_use_alternate_protocols(false); | 118 HttpStreamFactory::set_use_alternate_protocols(false); |
119 HttpStreamFactory::set_force_spdy_over_ssl(false); | 119 HttpStreamFactory::set_force_spdy_over_ssl(false); |
120 HttpStreamFactory::set_force_spdy_always(false); | 120 HttpStreamFactory::set_force_spdy_always(false); |
121 | 121 |
122 std::vector<std::string> next_protos; | 122 std::vector<std::string> next_protos; |
123 next_protos.push_back("http/1.1"); | 123 next_protos.push_back("http/1.1"); |
124 next_protos.push_back("spdy/2"); | 124 next_protos.push_back("spdy/2"); |
| 125 next_protos.push_back("spdy/2.1"); |
125 | 126 |
126 switch (test_type_) { | 127 switch (test_type_) { |
127 case SPDYNPN: | 128 case SPDYNPN: |
128 session_->http_server_properties()->SetAlternateProtocol( | 129 session_->http_server_properties()->SetAlternateProtocol( |
129 HostPortPair("www.google.com", 80), 443, | 130 HostPortPair("www.google.com", 80), 443, |
130 NPN_SPDY_2); | 131 NPN_SPDY_2); |
131 HttpStreamFactory::set_use_alternate_protocols(true); | 132 HttpStreamFactory::set_use_alternate_protocols(true); |
132 HttpStreamFactory::set_next_protos(next_protos); | 133 HttpStreamFactory::set_next_protos(next_protos); |
133 break; | 134 break; |
134 case SPDYNOSSL: | 135 case SPDYNOSSL: |
(...skipping 1709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1844 // enough number of WINDOW_UPDATEs to finish the first read and cause a | 1845 // enough number of WINDOW_UPDATEs to finish the first read and cause a |
1845 // write, leading to a complete write of request body; after that we send | 1846 // write, leading to a complete write of request body; after that we send |
1846 // a reply with a body, to cause a graceful shutdown. | 1847 // a reply with a body, to cause a graceful shutdown. |
1847 | 1848 |
1848 // TODO(agayev): develop a socket data provider where both, reads and | 1849 // TODO(agayev): develop a socket data provider where both, reads and |
1849 // writes are ordered so that writing tests like these are easy and rewrite | 1850 // writes are ordered so that writing tests like these are easy and rewrite |
1850 // all these tests using it. Right now we are working around the | 1851 // all these tests using it. Right now we are working around the |
1851 // limitations as described above and it's not deterministic, tests may | 1852 // limitations as described above and it's not deterministic, tests may |
1852 // fail under specific circumstances. | 1853 // fail under specific circumstances. |
1853 TEST_P(SpdyNetworkTransactionTest, WindowUpdateReceived) { | 1854 TEST_P(SpdyNetworkTransactionTest, WindowUpdateReceived) { |
1854 SpdySession::set_flow_control(true); | 1855 SpdySession::set_use_flow_control(true); |
1855 | 1856 |
1856 static int kFrameCount = 2; | 1857 static int kFrameCount = 2; |
1857 scoped_ptr<std::string> content( | 1858 scoped_ptr<std::string> content( |
1858 new std::string(kMaxSpdyFrameChunkSize, 'a')); | 1859 new std::string(kMaxSpdyFrameChunkSize, 'a')); |
1859 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost( | 1860 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost( |
1860 kMaxSpdyFrameChunkSize * kFrameCount, NULL, 0)); | 1861 kMaxSpdyFrameChunkSize * kFrameCount, NULL, 0)); |
1861 scoped_ptr<spdy::SpdyFrame> body( | 1862 scoped_ptr<spdy::SpdyFrame> body( |
1862 ConstructSpdyBodyFrame(1, content->c_str(), content->size(), false)); | 1863 ConstructSpdyBodyFrame(1, content->c_str(), content->size(), false)); |
1863 scoped_ptr<spdy::SpdyFrame> body_end( | 1864 scoped_ptr<spdy::SpdyFrame> body_end( |
1864 ConstructSpdyBodyFrame(1, content->c_str(), content->size(), true)); | 1865 ConstructSpdyBodyFrame(1, content->c_str(), content->size(), true)); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1915 EXPECT_EQ(OK, rv); | 1916 EXPECT_EQ(OK, rv); |
1916 | 1917 |
1917 SpdyHttpStream* stream = static_cast<SpdyHttpStream*>(trans->stream_.get()); | 1918 SpdyHttpStream* stream = static_cast<SpdyHttpStream*>(trans->stream_.get()); |
1918 ASSERT_TRUE(stream != NULL); | 1919 ASSERT_TRUE(stream != NULL); |
1919 ASSERT_TRUE(stream->stream() != NULL); | 1920 ASSERT_TRUE(stream->stream() != NULL); |
1920 EXPECT_EQ(static_cast<int>(spdy::kSpdyStreamInitialWindowSize) + | 1921 EXPECT_EQ(static_cast<int>(spdy::kSpdyStreamInitialWindowSize) + |
1921 kDeltaWindowSize * kDeltaCount - | 1922 kDeltaWindowSize * kDeltaCount - |
1922 kMaxSpdyFrameChunkSize * kFrameCount, | 1923 kMaxSpdyFrameChunkSize * kFrameCount, |
1923 stream->stream()->send_window_size()); | 1924 stream->stream()->send_window_size()); |
1924 helper.VerifyDataConsumed(); | 1925 helper.VerifyDataConsumed(); |
1925 SpdySession::set_flow_control(false); | 1926 SpdySession::set_use_flow_control(false); |
1926 } | 1927 } |
1927 | 1928 |
1928 // Test that received data frames and sent WINDOW_UPDATE frames change | 1929 // Test that received data frames and sent WINDOW_UPDATE frames change |
1929 // the recv_window_size_ correctly. | 1930 // the recv_window_size_ correctly. |
1930 TEST_P(SpdyNetworkTransactionTest, WindowUpdateSent) { | 1931 TEST_P(SpdyNetworkTransactionTest, WindowUpdateSent) { |
1931 SpdySession::set_flow_control(true); | 1932 SpdySession::set_use_flow_control(true); |
1932 | 1933 |
1933 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 1934 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1934 scoped_ptr<spdy::SpdyFrame> window_update( | 1935 scoped_ptr<spdy::SpdyFrame> window_update( |
1935 ConstructSpdyWindowUpdate(1, kUploadDataSize)); | 1936 ConstructSpdyWindowUpdate(1, kUploadDataSize)); |
1936 | 1937 |
1937 MockWrite writes[] = { | 1938 MockWrite writes[] = { |
1938 CreateMockWrite(*req), | 1939 CreateMockWrite(*req), |
1939 CreateMockWrite(*window_update), | 1940 CreateMockWrite(*window_update), |
1940 }; | 1941 }; |
1941 | 1942 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1998 data->CompleteRead(); | 1999 data->CompleteRead(); |
1999 | 2000 |
2000 // Force write of WINDOW_UPDATE which was scheduled during the above | 2001 // Force write of WINDOW_UPDATE which was scheduled during the above |
2001 // read. | 2002 // read. |
2002 MessageLoop::current()->RunAllPending(); | 2003 MessageLoop::current()->RunAllPending(); |
2003 | 2004 |
2004 // Read EOF. | 2005 // Read EOF. |
2005 data->CompleteRead(); | 2006 data->CompleteRead(); |
2006 | 2007 |
2007 helper.VerifyDataConsumed(); | 2008 helper.VerifyDataConsumed(); |
2008 SpdySession::set_flow_control(false); | 2009 SpdySession::set_use_flow_control(false); |
2009 } | 2010 } |
2010 | 2011 |
2011 // Test that WINDOW_UPDATE frame causing overflow is handled correctly. We | 2012 // Test that WINDOW_UPDATE frame causing overflow is handled correctly. We |
2012 // use the same trick as in the above test to enforce our scenario. | 2013 // use the same trick as in the above test to enforce our scenario. |
2013 TEST_P(SpdyNetworkTransactionTest, WindowUpdateOverflow) { | 2014 TEST_P(SpdyNetworkTransactionTest, WindowUpdateOverflow) { |
2014 SpdySession::set_flow_control(true); | 2015 SpdySession::set_use_flow_control(true); |
2015 | 2016 |
2016 // number of full frames we hope to write (but will not, used to | 2017 // number of full frames we hope to write (but will not, used to |
2017 // set content-length header correctly) | 2018 // set content-length header correctly) |
2018 static int kFrameCount = 3; | 2019 static int kFrameCount = 3; |
2019 | 2020 |
2020 scoped_ptr<std::string> content( | 2021 scoped_ptr<std::string> content( |
2021 new std::string(kMaxSpdyFrameChunkSize, 'a')); | 2022 new std::string(kMaxSpdyFrameChunkSize, 'a')); |
2022 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost( | 2023 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost( |
2023 kMaxSpdyFrameChunkSize * kFrameCount, NULL, 0)); | 2024 kMaxSpdyFrameChunkSize * kFrameCount, NULL, 0)); |
2024 scoped_ptr<spdy::SpdyFrame> body( | 2025 scoped_ptr<spdy::SpdyFrame> body( |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2077 rv = callback.WaitForResult(); | 2078 rv = callback.WaitForResult(); |
2078 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv); | 2079 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv); |
2079 | 2080 |
2080 data->CompleteRead(); | 2081 data->CompleteRead(); |
2081 | 2082 |
2082 ASSERT_TRUE(helper.session() != NULL); | 2083 ASSERT_TRUE(helper.session() != NULL); |
2083 ASSERT_TRUE(helper.session()->spdy_session_pool() != NULL); | 2084 ASSERT_TRUE(helper.session()->spdy_session_pool() != NULL); |
2084 helper.session()->spdy_session_pool()->CloseAllSessions(); | 2085 helper.session()->spdy_session_pool()->CloseAllSessions(); |
2085 helper.VerifyDataConsumed(); | 2086 helper.VerifyDataConsumed(); |
2086 | 2087 |
2087 SpdySession::set_flow_control(false); | 2088 SpdySession::set_use_flow_control(false); |
2088 } | 2089 } |
2089 | 2090 |
2090 // Test that after hitting a send window size of 0, the write process | 2091 // Test that after hitting a send window size of 0, the write process |
2091 // stalls and upon receiving WINDOW_UPDATE frame write resumes. | 2092 // stalls and upon receiving WINDOW_UPDATE frame write resumes. |
2092 | 2093 |
2093 // This test constructs a POST request followed by enough data frames | 2094 // This test constructs a POST request followed by enough data frames |
2094 // containing 'a' that would make the window size 0, followed by another | 2095 // containing 'a' that would make the window size 0, followed by another |
2095 // data frame containing default content (which is "hello!") and this frame | 2096 // data frame containing default content (which is "hello!") and this frame |
2096 // also contains a FIN flag. DelayedSocketData is used to enforce all | 2097 // also contains a FIN flag. DelayedSocketData is used to enforce all |
2097 // writes go through before a read could happen. However, the last frame | 2098 // writes go through before a read could happen. However, the last frame |
2098 // ("hello!") is not supposed to go through since by the time its turn | 2099 // ("hello!") is not supposed to go through since by the time its turn |
2099 // arrives, window size is 0. At this point MessageLoop::Run() called via | 2100 // arrives, window size is 0. At this point MessageLoop::Run() called via |
2100 // callback would block. Therefore we call MessageLoop::RunAllPending() | 2101 // callback would block. Therefore we call MessageLoop::RunAllPending() |
2101 // which returns after performing all possible writes. We use DCHECKS to | 2102 // which returns after performing all possible writes. We use DCHECKS to |
2102 // ensure that last data frame is still there and stream has stalled. | 2103 // ensure that last data frame is still there and stream has stalled. |
2103 // After that, next read is artifically enforced, which causes a | 2104 // After that, next read is artifically enforced, which causes a |
2104 // WINDOW_UPDATE to be read and I/O process resumes. | 2105 // WINDOW_UPDATE to be read and I/O process resumes. |
2105 TEST_P(SpdyNetworkTransactionTest, FlowControlStallResume) { | 2106 TEST_P(SpdyNetworkTransactionTest, FlowControlStallResume) { |
2106 SpdySession::set_flow_control(true); | 2107 SpdySession::set_use_flow_control(true); |
2107 | 2108 |
2108 // Number of frames we need to send to zero out the window size: data | 2109 // Number of frames we need to send to zero out the window size: data |
2109 // frames plus SYN_STREAM plus the last data frame; also we need another | 2110 // frames plus SYN_STREAM plus the last data frame; also we need another |
2110 // data frame that we will send once the WINDOW_UPDATE is received, | 2111 // data frame that we will send once the WINDOW_UPDATE is received, |
2111 // therefore +3. | 2112 // therefore +3. |
2112 size_t nwrites = | 2113 size_t nwrites = |
2113 spdy::kSpdyStreamInitialWindowSize / kMaxSpdyFrameChunkSize + 3; | 2114 spdy::kSpdyStreamInitialWindowSize / kMaxSpdyFrameChunkSize + 3; |
2114 | 2115 |
2115 // Calculate last frame's size; 0 size data frame is legal. | 2116 // Calculate last frame's size; 0 size data frame is legal. |
2116 size_t last_frame_size = | 2117 size_t last_frame_size = |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2187 SpdyHttpStream* stream = static_cast<SpdyHttpStream*>(trans->stream_.get()); | 2188 SpdyHttpStream* stream = static_cast<SpdyHttpStream*>(trans->stream_.get()); |
2188 ASSERT_TRUE(stream != NULL); | 2189 ASSERT_TRUE(stream != NULL); |
2189 ASSERT_TRUE(stream->stream() != NULL); | 2190 ASSERT_TRUE(stream->stream() != NULL); |
2190 EXPECT_EQ(0, stream->stream()->send_window_size()); | 2191 EXPECT_EQ(0, stream->stream()->send_window_size()); |
2191 EXPECT_FALSE(stream->request_body_stream_->eof()); | 2192 EXPECT_FALSE(stream->request_body_stream_->eof()); |
2192 | 2193 |
2193 data->ForceNextRead(); // Read in WINDOW_UPDATE frame. | 2194 data->ForceNextRead(); // Read in WINDOW_UPDATE frame. |
2194 rv = callback.WaitForResult(); | 2195 rv = callback.WaitForResult(); |
2195 helper.VerifyDataConsumed(); | 2196 helper.VerifyDataConsumed(); |
2196 | 2197 |
2197 SpdySession::set_flow_control(false); | 2198 SpdySession::set_use_flow_control(false); |
2198 } | 2199 } |
2199 | 2200 |
2200 TEST_P(SpdyNetworkTransactionTest, CancelledTransaction) { | 2201 TEST_P(SpdyNetworkTransactionTest, CancelledTransaction) { |
2201 // Construct the request. | 2202 // Construct the request. |
2202 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 2203 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
2203 MockWrite writes[] = { | 2204 MockWrite writes[] = { |
2204 CreateMockWrite(*req), | 2205 CreateMockWrite(*req), |
2205 }; | 2206 }; |
2206 | 2207 |
2207 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | 2208 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
(...skipping 3454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5662 << " Write index: " | 5663 << " Write index: " |
5663 << data->write_index(); | 5664 << data->write_index(); |
5664 | 5665 |
5665 // Verify the SYN_REPLY. | 5666 // Verify the SYN_REPLY. |
5666 HttpResponseInfo response = *trans->GetResponseInfo(); | 5667 HttpResponseInfo response = *trans->GetResponseInfo(); |
5667 EXPECT_TRUE(response.headers != NULL); | 5668 EXPECT_TRUE(response.headers != NULL); |
5668 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); | 5669 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); |
5669 } | 5670 } |
5670 | 5671 |
5671 } // namespace net | 5672 } // namespace net |
OLD | NEW |