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

Unified Diff: net/spdy/spdy_session_spdy2_unittest.cc

Issue 14232014: Correctly handle SPDY GOAWAY frames. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix comments Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: net/spdy/spdy_session_spdy2_unittest.cc
diff --git a/net/spdy/spdy_session_spdy2_unittest.cc b/net/spdy/spdy_session_spdy2_unittest.cc
index cd676bc7510af92917f1ce23824f0f7d8f445358..0978f0671e55cb346e7ca85504016ef34950ef10 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;

Powered by Google App Engine
This is Rietveld 408576698