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

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

Issue 200723004: Fix SPDY error-handling if the connection gets closed just after use. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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_pool.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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 SpdySessionTest, 183 SpdySessionTest,
184 testing::Values(kProtoDeprecatedSPDY2, 184 testing::Values(kProtoDeprecatedSPDY2,
185 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2, 185 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2,
186 kProtoHTTP2Draft04)); 186 kProtoHTTP2Draft04));
187 187
188 // Try to create a SPDY session that will fail during 188 // Try to create a SPDY session that will fail during
189 // initialization. Nothing should blow up. 189 // initialization. Nothing should blow up.
190 TEST_P(SpdySessionTest, InitialReadError) { 190 TEST_P(SpdySessionTest, InitialReadError) {
191 CreateDeterministicNetworkSession(); 191 CreateDeterministicNetworkSession();
192 192
193 TryCreateFakeSpdySessionExpectingFailure( 193 base::WeakPtr<SpdySession> session = TryCreateFakeSpdySessionExpectingFailure(
194 spdy_session_pool_, key_, ERR_FAILED); 194 spdy_session_pool_, key_, ERR_FAILED);
195 EXPECT_TRUE(session);
196 // Flush the read.
197 base::RunLoop().RunUntilIdle();
198 EXPECT_FALSE(session);
195 } 199 }
196 200
197 namespace { 201 namespace {
198 202
199 // A helper class that vends a callback that, when fired, destroys a 203 // A helper class that vends a callback that, when fired, destroys a
200 // given SpdyStreamRequest. 204 // given SpdyStreamRequest.
201 class StreamRequestDestroyingCallback : public TestCompletionCallbackBase { 205 class StreamRequestDestroyingCallback : public TestCompletionCallbackBase {
202 public: 206 public:
203 StreamRequestDestroyingCallback() {} 207 StreamRequestDestroyingCallback() {}
204 208
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 test_url_, 274 test_url_,
271 MEDIUM, 275 MEDIUM,
272 BoundNetLog(), 276 BoundNetLog(),
273 callback2.callback())); 277 callback2.callback()));
274 278
275 callback1.SetRequestToDestroy(request2.Pass()); 279 callback1.SetRequestToDestroy(request2.Pass());
276 280
277 session->CloseSessionOnError(ERR_ABORTED, "Aborting session"); 281 session->CloseSessionOnError(ERR_ABORTED, "Aborting session");
278 282
279 EXPECT_EQ(ERR_ABORTED, callback1.WaitForResult()); 283 EXPECT_EQ(ERR_ABORTED, callback1.WaitForResult());
280
281 data.RunFor(1);
282 } 284 }
283 285
284 // A session receiving a GOAWAY frame with no active streams should 286 // A session receiving a GOAWAY frame with no active streams should
285 // immediately close. 287 // immediately close.
286 TEST_P(SpdySessionTest, GoAwayWithNoActiveStreams) { 288 TEST_P(SpdySessionTest, GoAwayWithNoActiveStreams) {
287 session_deps_.host_resolver->set_synchronous_mode(true); 289 session_deps_.host_resolver->set_synchronous_mode(true);
288 290
289 MockConnect connect_data(SYNCHRONOUS, OK); 291 MockConnect connect_data(SYNCHRONOUS, OK);
290 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); 292 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1));
291 MockRead reads[] = { 293 MockRead reads[] = {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 CreateMockRead(*goaway, 0, SYNCHRONOUS), 325 CreateMockRead(*goaway, 0, SYNCHRONOUS),
324 }; 326 };
325 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); 327 DeterministicSocketData data(reads, arraysize(reads), NULL, 0);
326 data.set_connect_data(connect_data); 328 data.set_connect_data(connect_data);
327 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); 329 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
328 330
329 CreateDeterministicNetworkSession(); 331 CreateDeterministicNetworkSession();
330 332
331 data.StopAfter(1); 333 data.StopAfter(1);
332 334
333 TryCreateInsecureSpdySessionExpectingFailure( 335 base::WeakPtr<SpdySession> session =
334 http_session_, key_, ERR_CONNECTION_CLOSED, BoundNetLog()); 336 TryCreateInsecureSpdySessionExpectingFailure(
337 http_session_, key_, ERR_CONNECTION_CLOSED, BoundNetLog());
338 base::RunLoop().RunUntilIdle();
335 339
340 EXPECT_FALSE(session);
336 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); 341 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_));
337 } 342 }
338 343
339 // A session receiving a GOAWAY frame with active streams should close 344 // A session receiving a GOAWAY frame with active streams should close
340 // when the last active stream is closed. 345 // when the last active stream is closed.
341 TEST_P(SpdySessionTest, GoAwayWithActiveStreams) { 346 TEST_P(SpdySessionTest, GoAwayWithActiveStreams) {
342 session_deps_.host_resolver->set_synchronous_mode(true); 347 session_deps_.host_resolver->set_synchronous_mode(true);
343 348
344 MockConnect connect_data(SYNCHRONOUS, OK); 349 MockConnect connect_data(SYNCHRONOUS, OK);
345 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); 350 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1));
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); 1043 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_));
1039 1044
1040 // We set last time we have received any data in 1 sec less than now. 1045 // We set last time we have received any data in 1 sec less than now.
1041 // CheckPingStatus will trigger timeout because hung interval is zero. 1046 // CheckPingStatus will trigger timeout because hung interval is zero.
1042 base::TimeTicks now = base::TimeTicks::Now(); 1047 base::TimeTicks now = base::TimeTicks::Now();
1043 session->last_activity_time_ = now - base::TimeDelta::FromSeconds(1); 1048 session->last_activity_time_ = now - base::TimeDelta::FromSeconds(1);
1044 session->CheckPingStatus(now); 1049 session->CheckPingStatus(now);
1045 1050
1046 EXPECT_TRUE(session == NULL); 1051 EXPECT_TRUE(session == NULL);
1047 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); 1052 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_));
1048
1049 data.RunFor(1);
1050 EXPECT_EQ(NULL, spdy_stream1.get()); 1053 EXPECT_EQ(NULL, spdy_stream1.get());
1051 } 1054 }
1052 1055
1053 // Request kInitialMaxConcurrentStreams + 1 streams. Receive a 1056 // Request kInitialMaxConcurrentStreams + 1 streams. Receive a
1054 // settings frame increasing the max concurrent streams by 1. Make 1057 // settings frame increasing the max concurrent streams by 1. Make
1055 // sure nothing blows up. This is a regression test for 1058 // sure nothing blows up. This is a regression test for
1056 // http://crbug.com/57331 . 1059 // http://crbug.com/57331 .
1057 TEST_P(SpdySessionTest, OnSettings) { 1060 TEST_P(SpdySessionTest, OnSettings) {
1058 session_deps_.host_resolver->set_synchronous_mode(true); 1061 session_deps_.host_resolver->set_synchronous_mode(true);
1059 1062
(...skipping 3076 matching lines...) Expand 10 before | Expand all | Expand 10 after
4136 TEST(MapRstStreamStatusToProtocolError, MapsValues) { 4139 TEST(MapRstStreamStatusToProtocolError, MapsValues) {
4137 CHECK_EQ(STATUS_CODE_PROTOCOL_ERROR, 4140 CHECK_EQ(STATUS_CODE_PROTOCOL_ERROR,
4138 MapRstStreamStatusToProtocolError( 4141 MapRstStreamStatusToProtocolError(
4139 RST_STREAM_PROTOCOL_ERROR)); 4142 RST_STREAM_PROTOCOL_ERROR));
4140 CHECK_EQ(STATUS_CODE_FRAME_TOO_LARGE, 4143 CHECK_EQ(STATUS_CODE_FRAME_TOO_LARGE,
4141 MapRstStreamStatusToProtocolError( 4144 MapRstStreamStatusToProtocolError(
4142 RST_STREAM_FRAME_TOO_LARGE)); 4145 RST_STREAM_FRAME_TOO_LARGE));
4143 } 4146 }
4144 4147
4145 } // namespace net 4148 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_session_pool.cc ('k') | net/spdy/spdy_test_util_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698