Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Side by Side Diff: net/spdy/spdy_session_unittest.cc

Issue 289823002: SPDY4: SpdySession should send SETTINGS acknowledgements. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_session.cc ('k') | net/spdy/spdy_test_util_common.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_session.cc ('k') | net/spdy/spdy_test_util_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698