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 |