OLD | NEW |
---|---|
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 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/http/http_stream_factory_impl_job_controller.h" | 5 #include "net/http/http_stream_factory_impl_job_controller.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
153 return job_controller->main_job_is_blocked_; | 153 return job_controller->main_job_is_blocked_; |
154 } | 154 } |
155 static bool main_job_is_resumed( | 155 static bool main_job_is_resumed( |
156 HttpStreamFactoryImpl::JobController* job_controller) { | 156 HttpStreamFactoryImpl::JobController* job_controller) { |
157 return job_controller->main_job_is_resumed_; | 157 return job_controller->main_job_is_resumed_; |
158 } | 158 } |
159 }; | 159 }; |
160 | 160 |
161 class HttpStreamFactoryImplJobControllerTest : public ::testing::Test { | 161 class HttpStreamFactoryImplJobControllerTest : public ::testing::Test { |
162 public: | 162 public: |
163 HttpStreamFactoryImplJobControllerTest() | 163 HttpStreamFactoryImplJobControllerTest() { session_deps_.enable_quic = true; } |
164 : session_deps_(ProxyService::CreateDirect()), | |
165 random_generator_(0), | |
166 client_maker_(HttpNetworkSession::Params().quic_supported_versions[0], | |
167 0, | |
168 &clock_, | |
169 kServerHostname, | |
170 Perspective::IS_CLIENT), | |
171 use_alternative_proxy_(false), | |
172 is_preconnect_(false), | |
173 enable_ip_based_pooling_(true), | |
174 enable_alternative_services_(true), | |
175 test_proxy_delegate_(nullptr) { | |
176 session_deps_.enable_quic = true; | |
177 } | |
178 | 164 |
179 void UseAlternativeProxy() { | 165 void UseAlternativeProxy() { |
180 ASSERT_FALSE(test_proxy_delegate_); | 166 ASSERT_FALSE(test_proxy_delegate_); |
181 use_alternative_proxy_ = true; | 167 use_alternative_proxy_ = true; |
182 } | 168 } |
183 | 169 |
184 void SetPreconnect() { | 170 void SetPreconnect() { |
185 ASSERT_FALSE(test_proxy_delegate_); | 171 ASSERT_FALSE(test_proxy_delegate_); |
186 is_preconnect_ = true; | 172 is_preconnect_ = true; |
187 } | 173 } |
188 | 174 |
189 void DisableIPBasedPooling() { | 175 void DisableIPBasedPooling() { |
190 ASSERT_FALSE(test_proxy_delegate_); | 176 ASSERT_FALSE(test_proxy_delegate_); |
191 enable_ip_based_pooling_ = false; | 177 enable_ip_based_pooling_ = false; |
192 } | 178 } |
193 | 179 |
194 void DisableAlternativeServices() { | 180 void DisableAlternativeServices() { |
195 ASSERT_FALSE(test_proxy_delegate_); | 181 ASSERT_FALSE(test_proxy_delegate_); |
196 enable_alternative_services_ = false; | 182 enable_alternative_services_ = false; |
197 } | 183 } |
198 | 184 |
185 void SkipCreatingJobController() { | |
186 ASSERT_FALSE(job_controller_); | |
187 create_job_controller_ = false; | |
188 } | |
189 | |
199 void Initialize(const HttpRequestInfo& request_info) { | 190 void Initialize(const HttpRequestInfo& request_info) { |
200 ASSERT_FALSE(test_proxy_delegate_); | 191 ASSERT_FALSE(test_proxy_delegate_); |
201 auto test_proxy_delegate = base::MakeUnique<TestProxyDelegate>(); | 192 auto test_proxy_delegate = base::MakeUnique<TestProxyDelegate>(); |
202 test_proxy_delegate_ = test_proxy_delegate.get(); | 193 test_proxy_delegate_ = test_proxy_delegate.get(); |
203 | 194 |
204 test_proxy_delegate->set_alternative_proxy_server( | 195 test_proxy_delegate->set_alternative_proxy_server( |
205 ProxyServer::FromPacString("QUIC myproxy.org:443")); | 196 ProxyServer::FromPacString("QUIC myproxy.org:443")); |
206 EXPECT_TRUE(test_proxy_delegate->alternative_proxy_server().is_quic()); | 197 EXPECT_TRUE(test_proxy_delegate->alternative_proxy_server().is_quic()); |
207 session_deps_.proxy_delegate = std::move(test_proxy_delegate); | 198 session_deps_.proxy_delegate = std::move(test_proxy_delegate); |
208 | 199 |
(...skipping 11 matching lines...) Expand all Loading... | |
220 SpdySessionDependencies::CreateSessionParams(&session_deps_); | 211 SpdySessionDependencies::CreateSessionParams(&session_deps_); |
221 HttpNetworkSession::Context session_context = | 212 HttpNetworkSession::Context session_context = |
222 SpdySessionDependencies::CreateSessionContext(&session_deps_); | 213 SpdySessionDependencies::CreateSessionContext(&session_deps_); |
223 | 214 |
224 session_context.quic_crypto_client_stream_factory = | 215 session_context.quic_crypto_client_stream_factory = |
225 &crypto_client_stream_factory_; | 216 &crypto_client_stream_factory_; |
226 session_context.quic_random = &random_generator_; | 217 session_context.quic_random = &random_generator_; |
227 session_ = base::MakeUnique<HttpNetworkSession>(params, session_context); | 218 session_ = base::MakeUnique<HttpNetworkSession>(params, session_context); |
228 factory_ = | 219 factory_ = |
229 static_cast<HttpStreamFactoryImpl*>(session_->http_stream_factory()); | 220 static_cast<HttpStreamFactoryImpl*>(session_->http_stream_factory()); |
230 job_controller_ = new HttpStreamFactoryImpl::JobController( | 221 if (create_job_controller_) { |
231 factory_, &request_delegate_, session_.get(), &job_factory_, | 222 job_controller_ = new HttpStreamFactoryImpl::JobController( |
232 request_info, is_preconnect_, enable_ip_based_pooling_, | 223 factory_, &request_delegate_, session_.get(), &job_factory_, |
233 enable_alternative_services_, SSLConfig(), SSLConfig()); | 224 request_info, is_preconnect_, enable_ip_based_pooling_, |
234 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller_); | 225 enable_alternative_services_, SSLConfig(), SSLConfig()); |
226 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller_); | |
227 } | |
235 } | 228 } |
236 | 229 |
237 TestProxyDelegate* test_proxy_delegate() const { | 230 TestProxyDelegate* test_proxy_delegate() const { |
238 return test_proxy_delegate_; | 231 return test_proxy_delegate_; |
239 } | 232 } |
240 | 233 |
241 ~HttpStreamFactoryImplJobControllerTest() override { | 234 ~HttpStreamFactoryImplJobControllerTest() override { |
242 if (quic_data_) { | 235 if (quic_data_) { |
243 EXPECT_TRUE(quic_data_->AllReadDataConsumed()); | 236 EXPECT_TRUE(quic_data_->AllReadDataConsumed()); |
244 EXPECT_TRUE(quic_data_->AllWriteDataConsumed()); | 237 EXPECT_TRUE(quic_data_->AllWriteDataConsumed()); |
(...skipping 19 matching lines...) Expand all Loading... | |
264 const AlternativeServiceInfoVector alternative_service_info_vector = | 257 const AlternativeServiceInfoVector alternative_service_info_vector = |
265 session_->http_server_properties()->GetAlternativeServiceInfos(server); | 258 session_->http_server_properties()->GetAlternativeServiceInfos(server); |
266 EXPECT_EQ(1u, alternative_service_info_vector.size()); | 259 EXPECT_EQ(1u, alternative_service_info_vector.size()); |
267 EXPECT_EQ(should_mark_broken, | 260 EXPECT_EQ(should_mark_broken, |
268 session_->http_server_properties()->IsAlternativeServiceBroken( | 261 session_->http_server_properties()->IsAlternativeServiceBroken( |
269 alternative_service_info_vector[0].alternative_service())); | 262 alternative_service_info_vector[0].alternative_service())); |
270 } | 263 } |
271 | 264 |
272 TestJobFactory job_factory_; | 265 TestJobFactory job_factory_; |
273 MockHttpStreamRequestDelegate request_delegate_; | 266 MockHttpStreamRequestDelegate request_delegate_; |
274 SpdySessionDependencies session_deps_; | 267 SpdySessionDependencies session_deps_{ProxyService::CreateDirect()}; |
275 std::unique_ptr<HttpNetworkSession> session_; | 268 std::unique_ptr<HttpNetworkSession> session_; |
276 HttpStreamFactoryImpl* factory_; | 269 HttpStreamFactoryImpl* factory_ = nullptr; |
277 HttpStreamFactoryImpl::JobController* job_controller_; | 270 HttpStreamFactoryImpl::JobController* job_controller_ = nullptr; |
278 std::unique_ptr<HttpStreamFactoryImpl::Request> request_; | 271 std::unique_ptr<HttpStreamFactoryImpl::Request> request_; |
279 std::unique_ptr<SequencedSocketData> tcp_data_; | 272 std::unique_ptr<SequencedSocketData> tcp_data_; |
280 std::unique_ptr<test::MockQuicData> quic_data_; | 273 std::unique_ptr<test::MockQuicData> quic_data_; |
281 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 274 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
282 MockClock clock_; | 275 MockClock clock_; |
283 test::MockRandom random_generator_; | 276 test::MockRandom random_generator_{0}; |
284 test::QuicTestPacketMaker client_maker_; | 277 test::QuicTestPacketMaker client_maker_{ |
278 HttpNetworkSession::Params().quic_supported_versions[0], 0, &clock_, | |
279 kServerHostname, Perspective::IS_CLIENT}; | |
285 | 280 |
286 protected: | 281 protected: |
287 bool use_alternative_proxy_; | 282 bool use_alternative_proxy_ = false; |
288 bool is_preconnect_; | 283 bool is_preconnect_ = false; |
289 bool enable_ip_based_pooling_; | 284 bool enable_ip_based_pooling_ = true; |
290 bool enable_alternative_services_; | 285 bool enable_alternative_services_ = true; |
291 | 286 |
292 private: | 287 private: |
293 // Not owned by |this|. | 288 // Not owned by |this|. |
294 TestProxyDelegate* test_proxy_delegate_; | 289 TestProxyDelegate* test_proxy_delegate_ = nullptr; |
290 bool create_job_controller_ = true; | |
295 | 291 |
296 DISALLOW_COPY_AND_ASSIGN(HttpStreamFactoryImplJobControllerTest); | 292 DISALLOW_COPY_AND_ASSIGN(HttpStreamFactoryImplJobControllerTest); |
297 }; | 293 }; |
298 | 294 |
299 TEST_F(HttpStreamFactoryImplJobControllerTest, ProxyResolutionFailsSync) { | 295 TEST_F(HttpStreamFactoryImplJobControllerTest, ProxyResolutionFailsSync) { |
300 ProxyConfig proxy_config; | 296 ProxyConfig proxy_config; |
301 proxy_config.set_pac_url(GURL("http://fooproxyurl")); | 297 proxy_config.set_pac_url(GURL("http://fooproxyurl")); |
302 proxy_config.set_pac_mandatory(true); | 298 proxy_config.set_pac_mandatory(true); |
303 session_deps_.proxy_service.reset(new ProxyService( | 299 session_deps_.proxy_service.reset(new ProxyService( |
304 base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), | 300 base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), |
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1556 PreconnectMultipleStreamsToH2Server) { | 1552 PreconnectMultipleStreamsToH2Server) { |
1557 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | 1553 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); |
1558 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); | 1554 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); |
1559 SetPreconnect(); | 1555 SetPreconnect(); |
1560 | 1556 |
1561 HttpRequestInfo request_info; | 1557 HttpRequestInfo request_info; |
1562 request_info.method = "GET"; | 1558 request_info.method = "GET"; |
1563 request_info.url = GURL("http://www.example.com"); | 1559 request_info.url = GURL("http://www.example.com"); |
1564 Initialize(request_info); | 1560 Initialize(request_info); |
1565 | 1561 |
1562 // Sets server support Http/2. | |
1566 url::SchemeHostPort server(request_info.url); | 1563 url::SchemeHostPort server(request_info.url); |
1567 | |
1568 // Sets server support Http/2. | |
1569 session_->http_server_properties()->SetSupportsSpdy(server, true); | 1564 session_->http_server_properties()->SetSupportsSpdy(server, true); |
1570 | 1565 |
1571 job_controller_->Preconnect(/*num_streams=*/5); | 1566 job_controller_->Preconnect(/*num_streams=*/5); |
1572 // Only one job is started. | 1567 // Only one job is started. |
1573 EXPECT_TRUE(job_controller_->main_job()); | 1568 EXPECT_TRUE(job_controller_->main_job()); |
1574 EXPECT_FALSE(job_controller_->alternative_job()); | 1569 EXPECT_FALSE(job_controller_->alternative_job()); |
1575 EXPECT_EQ(HttpStreamFactoryImpl::PRECONNECT, | 1570 EXPECT_EQ(HttpStreamFactoryImpl::PRECONNECT, |
1576 job_controller_->main_job()->job_type()); | 1571 job_controller_->main_job()->job_type()); |
1577 // There is only 1 connect even though multiple streams were requested. | 1572 // There is only 1 connect even though multiple streams were requested. |
1578 EXPECT_EQ(1, HttpStreamFactoryImplJobPeer::GetNumStreams( | 1573 EXPECT_EQ(1, HttpStreamFactoryImplJobPeer::GetNumStreams( |
1579 job_controller_->main_job())); | 1574 job_controller_->main_job())); |
1580 | 1575 |
1581 base::RunLoop().RunUntilIdle(); | 1576 base::RunLoop().RunUntilIdle(); |
1582 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 1577 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
1583 } | 1578 } |
1584 | 1579 |
1580 class JobControllerLimitMultipleH2Requests | |
1581 : public HttpStreamFactoryImplJobControllerTest { | |
1582 protected: | |
1583 const int kNumRequests = 5; | |
1584 void SetUp() override { SkipCreatingJobController(); } | |
1585 }; | |
1586 | |
1587 TEST_F(JobControllerLimitMultipleH2Requests, MultipleRequests) { | |
1588 // Make sure there is only one socket connect. | |
1589 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; | |
1590 tcp_data_ = base::MakeUnique<SequencedSocketData>(reads, arraysize(reads), | |
1591 nullptr, 0); | |
1592 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); | |
1593 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK); | |
1594 ssl_data->next_proto = kProtoHTTP2; | |
1595 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get()); | |
1596 HttpRequestInfo request_info; | |
1597 request_info.method = "GET"; | |
1598 request_info.url = GURL("https://www.example.com"); | |
1599 Initialize(request_info); | |
1600 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); | |
1601 pool_peer.SetEnableSendingInitialData(false); | |
1602 | |
1603 // Sets server support Http/2. | |
1604 url::SchemeHostPort server(request_info.url); | |
1605 session_->http_server_properties()->SetSupportsSpdy(server, true); | |
1606 | |
1607 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates; | |
1608 std::vector<std::unique_ptr<HttpStreamRequest>> requests; | |
1609 for (int i = 0; i < kNumRequests; ++i) { | |
1610 request_delegates.emplace_back( | |
1611 base::MakeUnique<MockHttpStreamRequestDelegate>()); | |
1612 HttpStreamFactoryImpl::JobController* job_controller = | |
1613 new HttpStreamFactoryImpl::JobController( | |
1614 factory_, request_delegates[i].get(), session_.get(), &job_factory_, | |
1615 request_info, is_preconnect_, enable_ip_based_pooling_, | |
1616 enable_alternative_services_, SSLConfig(), SSLConfig()); | |
1617 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller); | |
1618 auto request = job_controller->Start( | |
1619 request_delegates[i].get(), nullptr, NetLogWithSource(), | |
1620 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | |
1621 EXPECT_TRUE(job_controller->main_job()); | |
1622 EXPECT_FALSE(job_controller->alternative_job()); | |
1623 requests.push_back(std::move(request)); | |
1624 } | |
1625 | |
1626 for (int i = 0; i < kNumRequests; ++i) { | |
1627 EXPECT_CALL(*request_delegates[i].get(), OnStreamReadyImpl(_, _, _)); | |
1628 } | |
1629 | |
1630 base::RunLoop().RunUntilIdle(); | |
1631 requests.clear(); | |
1632 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | |
1633 } | |
1634 | |
1635 TEST_F(JobControllerLimitMultipleH2Requests, MultipleRequestsFirstRequestHang) { | |
1636 base::ScopedMockTimeMessageLoopTaskRunner test_task_runner; | |
1637 // First socket connect hang. | |
1638 auto hangdata = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | |
1639 hangdata->set_connect_data(MockConnect(SYNCHRONOUS, ERR_IO_PENDING)); | |
1640 session_deps_.socket_factory->AddSocketDataProvider(hangdata.get()); | |
1641 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; | |
1642 std::vector<std::unique_ptr<SequencedSocketData>> socket_data; | |
1643 std::vector<std::unique_ptr<SSLSocketDataProvider>> ssl_socket_data; | |
1644 // kNumRequests - 1 will resume themselves after a delay. There will be | |
1645 // kNumRequests - 1 sockets opened. | |
1646 for (int i = 0; i < kNumRequests - 1; i++) { | |
1647 // Only the first one needs a MockRead because subsequent sockets are | |
1648 // not used to establish a SpdySession. | |
1649 auto tcp_data = | |
1650 i == 0 ? base::MakeUnique<SequencedSocketData>(reads, arraysize(reads), | |
1651 nullptr, 0) | |
1652 : base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | |
1653 tcp_data->set_connect_data(MockConnect(ASYNC, OK)); | |
1654 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK); | |
1655 ssl_data->next_proto = kProtoHTTP2; | |
1656 session_deps_.socket_factory->AddSocketDataProvider(tcp_data.get()); | |
1657 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get()); | |
1658 socket_data.push_back(std::move(tcp_data)); | |
1659 ssl_socket_data.push_back(std::move(ssl_data)); | |
1660 } | |
1661 HttpRequestInfo request_info; | |
1662 request_info.method = "GET"; | |
1663 request_info.url = GURL("https://www.example.com"); | |
1664 Initialize(request_info); | |
1665 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); | |
1666 pool_peer.SetEnableSendingInitialData(false); | |
1667 | |
1668 // Sets server support Http/2. | |
1669 url::SchemeHostPort server(request_info.url); | |
1670 session_->http_server_properties()->SetSupportsSpdy(server, true); | |
1671 | |
1672 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates; | |
1673 std::vector<std::unique_ptr<HttpStreamRequest>> requests; | |
1674 for (int i = 0; i < kNumRequests; ++i) { | |
1675 request_delegates.push_back( | |
1676 base::MakeUnique<MockHttpStreamRequestDelegate>()); | |
1677 HttpStreamFactoryImpl::JobController* job_controller = | |
1678 new HttpStreamFactoryImpl::JobController( | |
1679 factory_, request_delegates[i].get(), session_.get(), &job_factory_, | |
1680 request_info, is_preconnect_, enable_ip_based_pooling_, | |
1681 enable_alternative_services_, SSLConfig(), SSLConfig()); | |
1682 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller); | |
1683 auto request = job_controller->Start( | |
1684 request_delegates[i].get(), nullptr, NetLogWithSource(), | |
1685 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | |
1686 EXPECT_TRUE(job_controller->main_job()); | |
1687 EXPECT_FALSE(job_controller->alternative_job()); | |
1688 requests.push_back(std::move(request)); | |
1689 } | |
1690 | |
1691 for (int i = 0; i < kNumRequests; ++i) { | |
1692 // When a request is completed, delete it. This is needed because | |
1693 // otherwise request will be completed twice. See crbug.com/706974. | |
1694 EXPECT_CALL(*request_delegates[i].get(), OnStreamReadyImpl(_, _, _)) | |
1695 .WillOnce(testing::InvokeWithoutArgs( | |
1696 [this, &requests, i]() { requests[i].reset(); })); | |
1697 } | |
1698 | |
1699 EXPECT_TRUE(test_task_runner->HasPendingTask()); | |
1700 test_task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds( | |
1701 HttpStreamFactoryImpl::Job::kHTTP2ThrottleMs)); | |
1702 base::RunLoop().RunUntilIdle(); | |
1703 | |
1704 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | |
1705 for (const auto& data : socket_data) { | |
1706 EXPECT_TRUE(data->AllReadDataConsumed()); | |
1707 EXPECT_TRUE(data->AllWriteDataConsumed()); | |
1708 } | |
1709 } | |
1710 | |
1711 TEST_F(JobControllerLimitMultipleH2Requests, | |
1712 MultipleRequestsFirstRequestCanceled) { | |
1713 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; | |
1714 auto first_socket = base::MakeUnique<SequencedSocketData>( | |
1715 reads, arraysize(reads), nullptr, 0); | |
1716 first_socket->set_connect_data(MockConnect(ASYNC, OK)); | |
1717 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK); | |
1718 ssl_data->next_proto = kProtoHTTP2; | |
1719 session_deps_.socket_factory->AddSocketDataProvider(first_socket.get()); | |
1720 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get()); | |
1721 auto second_socket = | |
1722 base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | |
1723 second_socket->set_connect_data(MockConnect(ASYNC, OK)); | |
1724 session_deps_.socket_factory->AddSocketDataProvider(second_socket.get()); | |
1725 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get()); | |
1726 | |
1727 HttpRequestInfo request_info; | |
1728 request_info.method = "GET"; | |
1729 request_info.url = GURL("https://www.example.com"); | |
1730 Initialize(request_info); | |
1731 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); | |
1732 pool_peer.SetEnableSendingInitialData(false); | |
1733 | |
1734 // Sets server support Http/2. | |
1735 url::SchemeHostPort server(request_info.url); | |
1736 session_->http_server_properties()->SetSupportsSpdy(server, true); | |
1737 | |
1738 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates; | |
1739 std::vector<std::unique_ptr<HttpStreamRequest>> requests; | |
1740 for (int i = 0; i < kNumRequests; ++i) { | |
1741 request_delegates.emplace_back( | |
1742 base::MakeUnique<MockHttpStreamRequestDelegate>()); | |
1743 HttpStreamFactoryImpl::JobController* job_controller = | |
1744 new HttpStreamFactoryImpl::JobController( | |
1745 factory_, request_delegates[i].get(), session_.get(), &job_factory_, | |
1746 request_info, is_preconnect_, enable_ip_based_pooling_, | |
1747 enable_alternative_services_, SSLConfig(), SSLConfig()); | |
1748 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller); | |
1749 auto request = job_controller->Start( | |
1750 request_delegates[i].get(), nullptr, NetLogWithSource(), | |
1751 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | |
1752 EXPECT_TRUE(job_controller->main_job()); | |
1753 EXPECT_FALSE(job_controller->alternative_job()); | |
1754 requests.push_back(std::move(request)); | |
1755 } | |
1756 // Cancel the first one. | |
1757 requests[0].reset(); | |
1758 | |
1759 for (int i = 1; i < kNumRequests; ++i) { | |
1760 EXPECT_CALL(*request_delegates[i].get(), OnStreamReadyImpl(_, _, _)); | |
1761 } | |
1762 base::RunLoop().RunUntilIdle(); | |
1763 requests.clear(); | |
1764 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | |
1765 EXPECT_TRUE(first_socket->AllReadDataConsumed()); | |
1766 EXPECT_TRUE(second_socket->AllReadDataConsumed()); | |
1767 } | |
1768 | |
1769 TEST_F(JobControllerLimitMultipleH2Requests, MultiplePreconnects) { | |
1770 // Make sure there is only one socket connect. | |
1771 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | |
1772 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); | |
1773 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK); | |
1774 ssl_data->next_proto = kProtoHTTP2; | |
1775 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get()); | |
1776 HttpRequestInfo request_info; | |
1777 request_info.method = "GET"; | |
1778 request_info.url = GURL("https://www.example.com"); | |
1779 SetPreconnect(); | |
1780 Initialize(request_info); | |
1781 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); | |
Bence
2017/06/13 16:04:51
|pool_peer| is unused.
xunjieli
2017/06/15 13:19:26
Done.
| |
1782 | |
1783 // Sets server support Http/2. | |
1784 url::SchemeHostPort server(request_info.url); | |
1785 session_->http_server_properties()->SetSupportsSpdy(server, true); | |
1786 | |
1787 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates; | |
1788 for (int i = 0; i < kNumRequests; ++i) { | |
1789 request_delegates.emplace_back( | |
1790 base::MakeUnique<MockHttpStreamRequestDelegate>()); | |
1791 HttpStreamFactoryImpl::JobController* job_controller = | |
1792 new HttpStreamFactoryImpl::JobController( | |
1793 factory_, request_delegates[i].get(), session_.get(), &job_factory_, | |
1794 request_info, is_preconnect_, enable_ip_based_pooling_, | |
1795 enable_alternative_services_, SSLConfig(), SSLConfig()); | |
1796 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller); | |
1797 job_controller->Preconnect(1); | |
1798 EXPECT_TRUE(job_controller->main_job()); | |
1799 EXPECT_FALSE(job_controller->alternative_job()); | |
1800 } | |
1801 base::RunLoop().RunUntilIdle(); | |
1802 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | |
1803 } | |
1804 | |
1805 TEST_F(JobControllerLimitMultipleH2Requests, H1NegotiatedForFirstRequest) { | |
1806 // First socket is an HTTP/1.1 socket. | |
1807 auto first_socket = | |
1808 base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); | |
1809 first_socket->set_connect_data(MockConnect(ASYNC, OK)); | |
1810 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK); | |
1811 session_deps_.socket_factory->AddSocketDataProvider(first_socket.get()); | |
1812 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get()); | |
1813 // Second socket is an HTTP/2 socket. | |
1814 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; | |
1815 auto second_socket = base::MakeUnique<SequencedSocketData>( | |
1816 reads, arraysize(reads), nullptr, 0); | |
1817 second_socket->set_connect_data(MockConnect(ASYNC, OK)); | |
1818 auto second_ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK); | |
1819 second_ssl_data->next_proto = kProtoHTTP2; | |
1820 session_deps_.socket_factory->AddSocketDataProvider(second_socket.get()); | |
1821 session_deps_.socket_factory->AddSSLSocketDataProvider(second_ssl_data.get()); | |
1822 | |
1823 HttpRequestInfo request_info; | |
1824 request_info.method = "GET"; | |
1825 request_info.url = GURL("https://www.example.com"); | |
1826 Initialize(request_info); | |
1827 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool()); | |
1828 pool_peer.SetEnableSendingInitialData(false); | |
1829 | |
1830 // Sets server support Http/2. | |
1831 url::SchemeHostPort server(request_info.url); | |
1832 session_->http_server_properties()->SetSupportsSpdy(server, true); | |
1833 | |
1834 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates; | |
1835 std::vector<std::unique_ptr<HttpStreamRequest>> requests; | |
1836 for (int i = 0; i < 2; ++i) { | |
1837 request_delegates.emplace_back( | |
1838 base::MakeUnique<MockHttpStreamRequestDelegate>()); | |
1839 HttpStreamFactoryImpl::JobController* job_controller = | |
1840 new HttpStreamFactoryImpl::JobController( | |
1841 factory_, request_delegates[i].get(), session_.get(), &job_factory_, | |
1842 request_info, is_preconnect_, enable_ip_based_pooling_, | |
1843 enable_alternative_services_, SSLConfig(), SSLConfig()); | |
1844 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller); | |
1845 auto request = job_controller->Start( | |
1846 request_delegates[i].get(), nullptr, NetLogWithSource(), | |
1847 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY); | |
1848 EXPECT_TRUE(job_controller->main_job()); | |
1849 EXPECT_FALSE(job_controller->alternative_job()); | |
1850 requests.push_back(std::move(request)); | |
1851 } | |
1852 | |
1853 for (int i = 0; i < 2; ++i) { | |
1854 // When a request is completed, delete it. This is needed because | |
1855 // otherwise request will be completed twice. See crbug.com/706974. | |
1856 EXPECT_CALL(*request_delegates[i].get(), OnStreamReadyImpl(_, _, _)) | |
1857 .WillOnce(testing::InvokeWithoutArgs( | |
1858 [this, &requests, i]() { requests[i].reset(); })); | |
1859 } | |
1860 base::RunLoop().RunUntilIdle(); | |
1861 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | |
1862 EXPECT_TRUE(first_socket->AllReadDataConsumed()); | |
1863 EXPECT_FALSE(second_socket->AllReadDataConsumed()); | |
1864 } | |
1865 | |
1585 class HttpStreamFactoryImplJobControllerMisdirectedRequestRetry | 1866 class HttpStreamFactoryImplJobControllerMisdirectedRequestRetry |
1586 : public HttpStreamFactoryImplJobControllerTest, | 1867 : public HttpStreamFactoryImplJobControllerTest, |
1587 public ::testing::WithParamInterface<::testing::tuple<bool, bool>> {}; | 1868 public ::testing::WithParamInterface<::testing::tuple<bool, bool>> {}; |
1588 | 1869 |
1589 INSTANTIATE_TEST_CASE_P( | 1870 INSTANTIATE_TEST_CASE_P( |
1590 /* no prefix */, | 1871 /* no prefix */, |
1591 HttpStreamFactoryImplJobControllerMisdirectedRequestRetry, | 1872 HttpStreamFactoryImplJobControllerMisdirectedRequestRetry, |
1592 ::testing::Combine(::testing::Bool(), ::testing::Bool())); | 1873 ::testing::Combine(::testing::Bool(), ::testing::Bool())); |
1593 | 1874 |
1594 TEST_P(HttpStreamFactoryImplJobControllerMisdirectedRequestRetry, | 1875 TEST_P(HttpStreamFactoryImplJobControllerMisdirectedRequestRetry, |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1702 Preconnect(kNumPreconects); | 1983 Preconnect(kNumPreconects); |
1703 // If experiment is enabled, only 1 stream is requested. | 1984 // If experiment is enabled, only 1 stream is requested. |
1704 EXPECT_EQ( | 1985 EXPECT_EQ( |
1705 (int)actual_num_connects, | 1986 (int)actual_num_connects, |
1706 HttpStreamFactoryImplJobPeer::GetNumStreams(job_controller_->main_job())); | 1987 HttpStreamFactoryImplJobPeer::GetNumStreams(job_controller_->main_job())); |
1707 base::RunLoop().RunUntilIdle(); | 1988 base::RunLoop().RunUntilIdle(); |
1708 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); | 1989 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); |
1709 } | 1990 } |
1710 | 1991 |
1711 } // namespace net | 1992 } // namespace net |
OLD | NEW |