| 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_session.h" | 5 #include "net/spdy/spdy_session.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 const uint32 max_concurrent_streams = kInitialMaxConcurrentStreams + 1; | 1065 const uint32 max_concurrent_streams = kInitialMaxConcurrentStreams + 1; |
| 1066 new_settings[kSpdySettingsIds] = | 1066 new_settings[kSpdySettingsIds] = |
| 1067 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1067 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 1068 scoped_ptr<SpdyFrame> settings_frame( | 1068 scoped_ptr<SpdyFrame> settings_frame( |
| 1069 spdy_util_.ConstructSpdySettings(new_settings)); | 1069 spdy_util_.ConstructSpdySettings(new_settings)); |
| 1070 MockRead reads[] = { | 1070 MockRead reads[] = { |
| 1071 CreateMockRead(*settings_frame, 0), | 1071 CreateMockRead(*settings_frame, 0), |
| 1072 MockRead(ASYNC, 0, 1), | 1072 MockRead(ASYNC, 0, 1), |
| 1073 }; | 1073 }; |
| 1074 | 1074 |
| 1075 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 1075 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 1076 MockWrite writes[] = { |
| 1077 CreateMockWrite(*settings_ack, 2), |
| 1078 }; |
| 1079 |
| 1080 DeterministicSocketData data(reads, arraysize(reads), |
| 1081 writes, arraysize(writes)); |
| 1076 MockConnect connect_data(SYNCHRONOUS, OK); | 1082 MockConnect connect_data(SYNCHRONOUS, OK); |
| 1077 data.set_connect_data(connect_data); | 1083 data.set_connect_data(connect_data); |
| 1078 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1084 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 1079 | 1085 |
| 1080 CreateDeterministicNetworkSession(); | 1086 CreateDeterministicNetworkSession(); |
| 1081 | 1087 |
| 1082 base::WeakPtr<SpdySession> session = | 1088 base::WeakPtr<SpdySession> session = |
| 1083 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1089 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
| 1084 | 1090 |
| 1085 // Create the maximum number of concurrent streams. | 1091 // Create the maximum number of concurrent streams. |
| (...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2059 // TODO(rtenneti): Define a helper class/methods and move the common code in | 2065 // TODO(rtenneti): Define a helper class/methods and move the common code in |
| 2060 // this file. | 2066 // this file. |
| 2061 MockConnect connect_data(SYNCHRONOUS, OK); | 2067 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2062 | 2068 |
| 2063 SettingsMap new_settings; | 2069 SettingsMap new_settings; |
| 2064 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; | 2070 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; |
| 2065 const uint32 max_concurrent_streams = 1; | 2071 const uint32 max_concurrent_streams = 1; |
| 2066 new_settings[kSpdySettingsIds1] = | 2072 new_settings[kSpdySettingsIds1] = |
| 2067 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 2073 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 2068 | 2074 |
| 2075 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 2069 scoped_ptr<SpdyFrame> req1( | 2076 scoped_ptr<SpdyFrame> req1( |
| 2070 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 2077 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 2071 scoped_ptr<SpdyFrame> req2( | 2078 scoped_ptr<SpdyFrame> req2( |
| 2072 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); | 2079 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); |
| 2073 scoped_ptr<SpdyFrame> req3( | 2080 scoped_ptr<SpdyFrame> req3( |
| 2074 spdy_util_.ConstructSpdyGet(NULL, 0, false, 5, LOWEST, true)); | 2081 spdy_util_.ConstructSpdyGet(NULL, 0, false, 5, LOWEST, true)); |
| 2075 MockWrite writes[] = { | 2082 MockWrite writes[] = { |
| 2076 CreateMockWrite(*req1, 1), | 2083 CreateMockWrite(*settings_ack, 1), |
| 2077 CreateMockWrite(*req2, 4), | 2084 CreateMockWrite(*req1, 2), |
| 2078 CreateMockWrite(*req3, 7), | 2085 CreateMockWrite(*req2, 5), |
| 2086 CreateMockWrite(*req3, 8), |
| 2079 }; | 2087 }; |
| 2080 | 2088 |
| 2081 // Set up the socket so we read a SETTINGS frame that sets max concurrent | 2089 // Set up the socket so we read a SETTINGS frame that sets max concurrent |
| 2082 // streams to 1. | 2090 // streams to 1. |
| 2083 scoped_ptr<SpdyFrame> settings_frame( | 2091 scoped_ptr<SpdyFrame> settings_frame( |
| 2084 spdy_util_.ConstructSpdySettings(new_settings)); | 2092 spdy_util_.ConstructSpdySettings(new_settings)); |
| 2085 | 2093 |
| 2086 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2094 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 2087 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 2095 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 2088 | 2096 |
| 2089 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 2097 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 2090 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); | 2098 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); |
| 2091 | 2099 |
| 2092 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); | 2100 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); |
| 2093 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, true)); | 2101 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, true)); |
| 2094 | 2102 |
| 2095 MockRead reads[] = { | 2103 MockRead reads[] = { |
| 2096 CreateMockRead(*settings_frame), | 2104 CreateMockRead(*settings_frame), |
| 2097 CreateMockRead(*resp1, 2), | 2105 CreateMockRead(*resp1, 3), |
| 2098 CreateMockRead(*body1, 3), | 2106 CreateMockRead(*body1, 4), |
| 2099 CreateMockRead(*resp2, 5), | 2107 CreateMockRead(*resp2, 6), |
| 2100 CreateMockRead(*body2, 6), | 2108 CreateMockRead(*body2, 7), |
| 2101 CreateMockRead(*resp3, 8), | 2109 CreateMockRead(*resp3, 9), |
| 2102 CreateMockRead(*body3, 9), | 2110 CreateMockRead(*body3, 10), |
| 2103 MockRead(ASYNC, 0, 10) // EOF | 2111 MockRead(ASYNC, 0, 11) // EOF |
| 2104 }; | 2112 }; |
| 2105 | 2113 |
| 2106 DeterministicSocketData data(reads, arraysize(reads), | 2114 DeterministicSocketData data(reads, arraysize(reads), |
| 2107 writes, arraysize(writes)); | 2115 writes, arraysize(writes)); |
| 2108 data.set_connect_data(connect_data); | 2116 data.set_connect_data(connect_data); |
| 2109 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2117 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 2110 | 2118 |
| 2111 CreateDeterministicNetworkSession(); | 2119 CreateDeterministicNetworkSession(); |
| 2112 | 2120 |
| 2113 base::WeakPtr<SpdySession> session = | 2121 base::WeakPtr<SpdySession> session = |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2145 EXPECT_EQ(1u, session->num_created_streams()); | 2153 EXPECT_EQ(1u, session->num_created_streams()); |
| 2146 EXPECT_EQ(2u, session->pending_create_stream_queue_size(LOWEST)); | 2154 EXPECT_EQ(2u, session->pending_create_stream_queue_size(LOWEST)); |
| 2147 | 2155 |
| 2148 scoped_ptr<SpdyHeaderBlock> headers( | 2156 scoped_ptr<SpdyHeaderBlock> headers( |
| 2149 spdy_util_.ConstructGetHeaderBlock(url1.spec())); | 2157 spdy_util_.ConstructGetHeaderBlock(url1.spec())); |
| 2150 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 2158 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
| 2151 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 2159 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
| 2152 | 2160 |
| 2153 // Run until 1st stream is activated and then closed. | 2161 // Run until 1st stream is activated and then closed. |
| 2154 EXPECT_EQ(0u, delegate1.stream_id()); | 2162 EXPECT_EQ(0u, delegate1.stream_id()); |
| 2155 data.RunFor(3); | 2163 data.RunFor(4); |
| 2156 EXPECT_EQ(NULL, spdy_stream1.get()); | 2164 EXPECT_EQ(NULL, spdy_stream1.get()); |
| 2157 EXPECT_EQ(1u, delegate1.stream_id()); | 2165 EXPECT_EQ(1u, delegate1.stream_id()); |
| 2158 | 2166 |
| 2159 EXPECT_EQ(0u, session->num_active_streams()); | 2167 EXPECT_EQ(0u, session->num_active_streams()); |
| 2160 EXPECT_EQ(0u, session->num_created_streams()); | 2168 EXPECT_EQ(0u, session->num_created_streams()); |
| 2161 EXPECT_EQ(1u, session->pending_create_stream_queue_size(LOWEST)); | 2169 EXPECT_EQ(1u, session->pending_create_stream_queue_size(LOWEST)); |
| 2162 | 2170 |
| 2163 // Pump loop for SpdySession::ProcessPendingStreamRequests() to | 2171 // Pump loop for SpdySession::ProcessPendingStreamRequests() to |
| 2164 // create the 2nd stream. | 2172 // create the 2nd stream. |
| 2165 base::MessageLoop::current()->RunUntilIdle(); | 2173 base::MessageLoop::current()->RunUntilIdle(); |
| (...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3055 // Set up the socket so we read a SETTINGS frame that sets | 3063 // Set up the socket so we read a SETTINGS frame that sets |
| 3056 // INITIAL_WINDOW_SIZE. | 3064 // INITIAL_WINDOW_SIZE. |
| 3057 MockConnect connect_data(SYNCHRONOUS, OK); | 3065 MockConnect connect_data(SYNCHRONOUS, OK); |
| 3058 scoped_ptr<SpdyFrame> settings_frame( | 3066 scoped_ptr<SpdyFrame> settings_frame( |
| 3059 spdy_util_.ConstructSpdySettings(new_settings)); | 3067 spdy_util_.ConstructSpdySettings(new_settings)); |
| 3060 MockRead reads[] = { | 3068 MockRead reads[] = { |
| 3061 CreateMockRead(*settings_frame, 0), | 3069 CreateMockRead(*settings_frame, 0), |
| 3062 MockRead(ASYNC, 0, 1) // EOF | 3070 MockRead(ASYNC, 0, 1) // EOF |
| 3063 }; | 3071 }; |
| 3064 | 3072 |
| 3073 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 3074 MockWrite writes[] = { |
| 3075 CreateMockWrite(*settings_ack, 2), |
| 3076 }; |
| 3077 |
| 3065 session_deps_.host_resolver->set_synchronous_mode(true); | 3078 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3066 | 3079 |
| 3067 scoped_ptr<DeterministicSocketData> data( | 3080 DeterministicSocketData data(reads, arraysize(reads), |
| 3068 new DeterministicSocketData(reads, arraysize(reads), NULL, 0)); | 3081 writes, arraysize(writes)); |
| 3069 data->set_connect_data(connect_data); | 3082 data.set_connect_data(connect_data); |
| 3070 session_deps_.deterministic_socket_factory->AddSocketDataProvider(data.get()); | 3083 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 3071 | 3084 |
| 3072 CreateDeterministicNetworkSession(); | 3085 CreateDeterministicNetworkSession(); |
| 3073 | 3086 |
| 3074 base::WeakPtr<SpdySession> session = | 3087 base::WeakPtr<SpdySession> session = |
| 3075 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3088 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
| 3076 base::WeakPtr<SpdyStream> spdy_stream1 = | 3089 base::WeakPtr<SpdyStream> spdy_stream1 = |
| 3077 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 3090 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, |
| 3078 session, test_url_, MEDIUM, BoundNetLog()); | 3091 session, test_url_, MEDIUM, BoundNetLog()); |
| 3079 ASSERT_TRUE(spdy_stream1.get() != NULL); | 3092 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 3080 TestCompletionCallback callback1; | 3093 TestCompletionCallback callback1; |
| 3081 EXPECT_NE(spdy_stream1->send_window_size(), window_size); | 3094 EXPECT_NE(spdy_stream1->send_window_size(), window_size); |
| 3082 | 3095 |
| 3083 data->RunFor(1); // Process the SETTINGS frame, but not the EOF | 3096 data.RunFor(1); // Process the SETTINGS frame, but not the EOF |
| 3084 base::MessageLoop::current()->RunUntilIdle(); | 3097 base::MessageLoop::current()->RunUntilIdle(); |
| 3085 EXPECT_EQ(session->stream_initial_send_window_size(), window_size); | 3098 EXPECT_EQ(session->stream_initial_send_window_size(), window_size); |
| 3086 EXPECT_EQ(spdy_stream1->send_window_size(), window_size); | 3099 EXPECT_EQ(spdy_stream1->send_window_size(), window_size); |
| 3087 | 3100 |
| 3088 // Release the first one, this will allow the second to be created. | 3101 // Release the first one, this will allow the second to be created. |
| 3089 spdy_stream1->Cancel(); | 3102 spdy_stream1->Cancel(); |
| 3090 EXPECT_EQ(NULL, spdy_stream1.get()); | 3103 EXPECT_EQ(NULL, spdy_stream1.get()); |
| 3091 | 3104 |
| 3092 base::WeakPtr<SpdyStream> spdy_stream2 = | 3105 base::WeakPtr<SpdyStream> spdy_stream2 = |
| 3093 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 3106 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, |
| (...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4137 RST_STREAM_PROTOCOL_ERROR)); | 4150 RST_STREAM_PROTOCOL_ERROR)); |
| 4138 CHECK_EQ(STATUS_CODE_FRAME_SIZE_ERROR, | 4151 CHECK_EQ(STATUS_CODE_FRAME_SIZE_ERROR, |
| 4139 MapRstStreamStatusToProtocolError( | 4152 MapRstStreamStatusToProtocolError( |
| 4140 RST_STREAM_FRAME_SIZE_ERROR)); | 4153 RST_STREAM_FRAME_SIZE_ERROR)); |
| 4141 CHECK_EQ(STATUS_CODE_ENHANCE_YOUR_CALM, | 4154 CHECK_EQ(STATUS_CODE_ENHANCE_YOUR_CALM, |
| 4142 MapRstStreamStatusToProtocolError( | 4155 MapRstStreamStatusToProtocolError( |
| 4143 RST_STREAM_ENHANCE_YOUR_CALM)); | 4156 RST_STREAM_ENHANCE_YOUR_CALM)); |
| 4144 } | 4157 } |
| 4145 | 4158 |
| 4146 } // namespace net | 4159 } // namespace net |
| OLD | NEW |