summaryrefslogtreecommitdiffstats
path: root/net/spdy/spdy_session_spdy2_unittest.cc
diff options
context:
space:
mode:
authorrch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-19 00:50:04 +0000
committerrch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-19 00:50:04 +0000
commit38dfd13a2886bd4f002d79d807883c9762f06f44 (patch)
treeb784bd7aa409350de95207c4f256a3a2a8905713 /net/spdy/spdy_session_spdy2_unittest.cc
parenta71d32455848293246db0766650151a2db3c13d4 (diff)
downloadchromium_src-38dfd13a2886bd4f002d79d807883c9762f06f44.zip
chromium_src-38dfd13a2886bd4f002d79d807883c9762f06f44.tar.gz
chromium_src-38dfd13a2886bd4f002d79d807883c9762f06f44.tar.bz2
Correctly handle SPDY GOAWAY frames.
Review URL: https://chromiumcodereview.appspot.com/14232014 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195032 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/spdy/spdy_session_spdy2_unittest.cc')
-rw-r--r--net/spdy/spdy_session_spdy2_unittest.cc64
1 files changed, 54 insertions, 10 deletions
diff --git a/net/spdy/spdy_session_spdy2_unittest.cc b/net/spdy/spdy_session_spdy2_unittest.cc
index cd676bc..0978f06 100644
--- a/net/spdy/spdy_session_spdy2_unittest.cc
+++ b/net/spdy/spdy_session_spdy2_unittest.cc
@@ -110,32 +110,76 @@ TEST_F(SpdySessionSpdy2Test, GoAway) {
session_deps_.host_resolver->set_synchronous_mode(true);
MockConnect connect_data(SYNCHRONOUS, OK);
- scoped_ptr<SpdyFrame> goaway(ConstructSpdyGoAway());
+ scoped_ptr<SpdyFrame> goaway(ConstructSpdyGoAway(1));
MockRead reads[] = {
- CreateMockRead(*goaway),
- MockRead(SYNCHRONOUS, 0, 0) // EOF
+ CreateMockRead(*goaway, 2),
+ MockRead(ASYNC, 0, 3) // EOF
};
- StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0);
+ scoped_ptr<SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, MEDIUM));
+ scoped_ptr<SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, MEDIUM));
+ MockWrite writes[] = {
+ CreateMockWrite(*req1, 0),
+ CreateMockWrite(*req2, 1),
+ };
+ DeterministicSocketData data(reads, arraysize(reads),
+ writes, arraysize(writes));
data.set_connect_data(connect_data);
- session_deps_.socket_factory->AddSocketDataProvider(&data);
+ session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
- ssl.SetNextProto(kProtoSPDY2);
- session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
+ session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl);
- CreateNetworkSession();
+ CreateDeterministicNetworkSession();
scoped_refptr<SpdySession> session = CreateInitializedSession();
EXPECT_EQ(2, session->GetProtocolVersion());
- // Flush the SpdySession::OnReadComplete() task.
- MessageLoop::current()->RunUntilIdle();
+ GURL url("http://www.google.com");
+ scoped_refptr<SpdyStream> spdy_stream1 =
+ CreateStreamSynchronously(session, url, MEDIUM, BoundNetLog());
+
+ scoped_refptr<SpdyStream> spdy_stream2 =
+ CreateStreamSynchronously(session, url, MEDIUM, BoundNetLog());
+
+ scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock);
+ (*headers)["method"] = "GET";
+ (*headers)["scheme"] = url.scheme();
+ (*headers)["host"] = url.host();
+ (*headers)["url"] = url.path();
+ (*headers)["version"] = "HTTP/1.1";
+ scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock);
+ *headers2 = *headers;
+
+ spdy_stream1->set_spdy_headers(headers.Pass());
+ EXPECT_TRUE(spdy_stream1->HasUrl());
+
+ spdy_stream2->set_spdy_headers(headers2.Pass());
+ EXPECT_TRUE(spdy_stream2->HasUrl());
+
+ spdy_stream1->SendRequest(false);
+ spdy_stream2->SendRequest(false);
+ data.RunFor(2);
+
+ EXPECT_EQ(1u, spdy_stream1->stream_id());
+ EXPECT_EQ(3u, spdy_stream2->stream_id());
+
+ EXPECT_TRUE(spdy_session_pool_->HasSession(pair_));
+
+ // Read and process the GOAWAY frame.
+ data.RunFor(1);
EXPECT_FALSE(spdy_session_pool_->HasSession(pair_));
+ EXPECT_TRUE(session->IsStreamActive(1));
+ EXPECT_FALSE(session->IsStreamActive(3));
+
scoped_refptr<SpdySession> session2 = GetSession(pair_);
+ spdy_stream1->Close();
+ spdy_stream1 = NULL;
+ spdy_stream2 = NULL;
+
// Delete the first session.
session = NULL;