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

Side by Side Diff: net/http/http_stream_factory_impl_job_controller_unittest.cc

Issue 2932513004: Throttle HttpStreamFactoryImpl::Job to HTTP/2-supported servers (Closed)
Patch Set: self Created 3 years, 6 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
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/http/http_stream_factory_impl_job_controller.cc ('k') | net/spdy/chromium/spdy_session_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698