Chromium Code Reviews| Index: net/http/http_stream_factory_impl_unittest.cc |
| diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc |
| index e9a20f6f07bdcaccbd2f7cad56d52d6999e02786..19a9ba7cac3ef7f43ec358e1440c1fede6a95b4c 100644 |
| --- a/net/http/http_stream_factory_impl_unittest.cc |
| +++ b/net/http/http_stream_factory_impl_unittest.cc |
| @@ -2101,6 +2101,66 @@ TEST_F(HttpStreamFactoryTest, NewSpdySessionCloseIdleH2Sockets) { |
| EXPECT_EQ(1, GetSpdySessionCount(session.get())); |
| } |
| +// Regression test for https://crbug.com/706974. |
| +TEST_F(HttpStreamFactoryTest, TwoSpdyConnects) { |
| + SpdySessionDependencies session_deps(ProxyService::CreateDirect()); |
| + |
| + SSLSocketDataProvider ssl_socket_data0(ASYNC, OK); |
| + ssl_socket_data0.next_proto = kProtoHTTP2; |
| + session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data0); |
| + |
| + MockRead reads0[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; |
| + SequencedSocketData data0(reads0, arraysize(reads0), nullptr, 0); |
| + data0.set_connect_data(MockConnect(ASYNC, OK)); |
| + session_deps.socket_factory->AddSocketDataProvider(&data0); |
| + |
| + SSLSocketDataProvider ssl_socket_data1(ASYNC, OK); |
| + ssl_socket_data1.next_proto = kProtoHTTP2; |
| + session_deps.socket_factory->AddSSLSocketDataProvider(&ssl_socket_data1); |
| + |
| + MockRead reads1[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; |
| + SequencedSocketData data1(reads1, arraysize(reads1), nullptr, 0); |
| + data1.set_connect_data(MockConnect(ASYNC, OK)); |
| + session_deps.socket_factory->AddSocketDataProvider(&data1); |
| + |
| + std::unique_ptr<HttpNetworkSession> session = |
| + SpdySessionDependencies::SpdyCreateSession(&session_deps); |
| + HttpRequestInfo request_info; |
| + request_info.method = "GET"; |
| + request_info.url = GURL("https://www.google.com"); |
| + request_info.load_flags = 0; |
| + SSLConfig ssl_config; |
| + |
| + // Request two streams at once and make sure they use the same connection. |
| + StreamRequestWaiter waiter1; |
| + std::unique_ptr<HttpStreamRequest> request1 = |
| + session->http_stream_factory()->RequestStream( |
| + request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter1, |
| + /* enable_ip_based_pooling = */ true, |
| + /* enable_alternative_services = */ true, NetLogWithSource()); |
| + |
| + StreamRequestWaiter waiter2; |
| + std::unique_ptr<HttpStreamRequest> request2 = |
| + session->http_stream_factory()->RequestStream( |
| + request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter2, |
| + /* enable_ip_based_pooling = */ true, |
| + /* enable_alternative_services = */ true, NetLogWithSource()); |
| + |
| + waiter1.WaitForStream(); |
| + waiter2.WaitForStream(); |
| + |
| + EXPECT_TRUE(waiter1.stream_done()); |
| + EXPECT_TRUE(waiter2.stream_done()); |
| + ASSERT_NE(nullptr, waiter1.stream()); |
| + ASSERT_NE(nullptr, waiter2.stream()); |
| + ASSERT_NE(waiter1.stream(), waiter2.stream()); |
| + |
| + // Establishing the SpdySession will close the extra H2 socket. |
| + EXPECT_EQ(0, session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL) |
| + ->IdleSocketCount()); |
| + EXPECT_EQ(1, GetSpdySessionCount(session.get())); |
|
xunjieli
2017/06/12 17:09:07
Could you add the following to make sure the read
Bence
2017/06/12 18:56:35
It seems like data1 is needed (otherwise the DCHEC
|
| +} |
| + |
| TEST_F(HttpStreamFactoryTest, RequestBidirectionalStreamImpl) { |
| SpdySessionDependencies session_deps(ProxyService::CreateDirect()); |