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

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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
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()
164 : session_deps_(ProxyService::CreateDirect()), 164 : session_deps_(ProxyService::CreateDirect()),
165 random_generator_(0), 165 random_generator_(0),
Bence 2017/06/09 19:17:39 Please assign default value at member declaration
xunjieli 2017/06/13 15:23:11 Done.
166 client_maker_(HttpNetworkSession::Params().quic_supported_versions[0], 166 client_maker_(HttpNetworkSession::Params().quic_supported_versions[0],
167 0, 167 0,
168 &clock_, 168 &clock_,
169 kServerHostname, 169 kServerHostname,
170 Perspective::IS_CLIENT), 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; 171 session_deps_.enable_quic = true;
177 } 172 }
178 173
179 void UseAlternativeProxy() { 174 void UseAlternativeProxy() {
180 ASSERT_FALSE(test_proxy_delegate_); 175 ASSERT_FALSE(test_proxy_delegate_);
181 use_alternative_proxy_ = true; 176 use_alternative_proxy_ = true;
182 } 177 }
183 178
184 void SetPreconnect() { 179 void SetPreconnect() {
185 ASSERT_FALSE(test_proxy_delegate_); 180 ASSERT_FALSE(test_proxy_delegate_);
186 is_preconnect_ = true; 181 is_preconnect_ = true;
187 } 182 }
188 183
189 void DisableIPBasedPooling() { 184 void DisableIPBasedPooling() {
190 ASSERT_FALSE(test_proxy_delegate_); 185 ASSERT_FALSE(test_proxy_delegate_);
191 enable_ip_based_pooling_ = false; 186 enable_ip_based_pooling_ = false;
192 } 187 }
193 188
194 void DisableAlternativeServices() { 189 void DisableAlternativeServices() {
195 ASSERT_FALSE(test_proxy_delegate_); 190 ASSERT_FALSE(test_proxy_delegate_);
196 enable_alternative_services_ = false; 191 enable_alternative_services_ = false;
197 } 192 }
198 193
194 void SetSkipCreateJobController() {
195 ASSERT_FALSE(job_controller_);
196 skip_create_job_controller_ = true;
197 }
198
199 void Initialize(const HttpRequestInfo& request_info) { 199 void Initialize(const HttpRequestInfo& request_info) {
200 ASSERT_FALSE(test_proxy_delegate_); 200 ASSERT_FALSE(test_proxy_delegate_);
201 auto test_proxy_delegate = base::MakeUnique<TestProxyDelegate>(); 201 auto test_proxy_delegate = base::MakeUnique<TestProxyDelegate>();
202 test_proxy_delegate_ = test_proxy_delegate.get(); 202 test_proxy_delegate_ = test_proxy_delegate.get();
203 203
204 test_proxy_delegate->set_alternative_proxy_server( 204 test_proxy_delegate->set_alternative_proxy_server(
205 ProxyServer::FromPacString("QUIC myproxy.org:443")); 205 ProxyServer::FromPacString("QUIC myproxy.org:443"));
206 EXPECT_TRUE(test_proxy_delegate->alternative_proxy_server().is_quic()); 206 EXPECT_TRUE(test_proxy_delegate->alternative_proxy_server().is_quic());
207 session_deps_.proxy_delegate = std::move(test_proxy_delegate); 207 session_deps_.proxy_delegate = std::move(test_proxy_delegate);
208 208
(...skipping 11 matching lines...) Expand all
220 SpdySessionDependencies::CreateSessionParams(&session_deps_); 220 SpdySessionDependencies::CreateSessionParams(&session_deps_);
221 HttpNetworkSession::Context session_context = 221 HttpNetworkSession::Context session_context =
222 SpdySessionDependencies::CreateSessionContext(&session_deps_); 222 SpdySessionDependencies::CreateSessionContext(&session_deps_);
223 223
224 session_context.quic_crypto_client_stream_factory = 224 session_context.quic_crypto_client_stream_factory =
225 &crypto_client_stream_factory_; 225 &crypto_client_stream_factory_;
226 session_context.quic_random = &random_generator_; 226 session_context.quic_random = &random_generator_;
227 session_ = base::MakeUnique<HttpNetworkSession>(params, session_context); 227 session_ = base::MakeUnique<HttpNetworkSession>(params, session_context);
228 factory_ = 228 factory_ =
229 static_cast<HttpStreamFactoryImpl*>(session_->http_stream_factory()); 229 static_cast<HttpStreamFactoryImpl*>(session_->http_stream_factory());
230 job_controller_ = new HttpStreamFactoryImpl::JobController( 230 if (!skip_create_job_controller_) {
Bence 2017/06/09 19:17:39 This feels like a double negation. It might be le
xunjieli 2017/06/13 15:23:11 Done. Good idea.
231 factory_, &request_delegate_, session_.get(), &job_factory_, 231 job_controller_ = new HttpStreamFactoryImpl::JobController(
232 request_info, is_preconnect_, enable_ip_based_pooling_, 232 factory_, &request_delegate_, session_.get(), &job_factory_,
233 enable_alternative_services_, SSLConfig(), SSLConfig()); 233 request_info, is_preconnect_, enable_ip_based_pooling_,
234 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller_); 234 enable_alternative_services_, SSLConfig(), SSLConfig());
235 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller_);
236 }
235 } 237 }
236 238
237 TestProxyDelegate* test_proxy_delegate() const { 239 TestProxyDelegate* test_proxy_delegate() const {
238 return test_proxy_delegate_; 240 return test_proxy_delegate_;
239 } 241 }
240 242
241 ~HttpStreamFactoryImplJobControllerTest() override { 243 ~HttpStreamFactoryImplJobControllerTest() override {
242 if (quic_data_) { 244 if (quic_data_) {
243 EXPECT_TRUE(quic_data_->AllReadDataConsumed()); 245 EXPECT_TRUE(quic_data_->AllReadDataConsumed());
244 EXPECT_TRUE(quic_data_->AllWriteDataConsumed()); 246 EXPECT_TRUE(quic_data_->AllWriteDataConsumed());
(...skipping 21 matching lines...) Expand all
266 EXPECT_EQ(1u, alternative_service_info_vector.size()); 268 EXPECT_EQ(1u, alternative_service_info_vector.size());
267 EXPECT_EQ(should_mark_broken, 269 EXPECT_EQ(should_mark_broken,
268 session_->http_server_properties()->IsAlternativeServiceBroken( 270 session_->http_server_properties()->IsAlternativeServiceBroken(
269 alternative_service_info_vector[0].alternative_service)); 271 alternative_service_info_vector[0].alternative_service));
270 } 272 }
271 273
272 TestJobFactory job_factory_; 274 TestJobFactory job_factory_;
273 MockHttpStreamRequestDelegate request_delegate_; 275 MockHttpStreamRequestDelegate request_delegate_;
274 SpdySessionDependencies session_deps_; 276 SpdySessionDependencies session_deps_;
275 std::unique_ptr<HttpNetworkSession> session_; 277 std::unique_ptr<HttpNetworkSession> session_;
276 HttpStreamFactoryImpl* factory_; 278 HttpStreamFactoryImpl* factory_ = nullptr;
277 HttpStreamFactoryImpl::JobController* job_controller_; 279 HttpStreamFactoryImpl::JobController* job_controller_ = nullptr;
278 std::unique_ptr<HttpStreamFactoryImpl::Request> request_; 280 std::unique_ptr<HttpStreamFactoryImpl::Request> request_;
279 std::unique_ptr<SequencedSocketData> tcp_data_; 281 std::unique_ptr<SequencedSocketData> tcp_data_;
280 std::unique_ptr<test::MockQuicData> quic_data_; 282 std::unique_ptr<test::MockQuicData> quic_data_;
281 MockCryptoClientStreamFactory crypto_client_stream_factory_; 283 MockCryptoClientStreamFactory crypto_client_stream_factory_;
282 MockClock clock_; 284 MockClock clock_;
283 test::MockRandom random_generator_; 285 test::MockRandom random_generator_;
284 test::QuicTestPacketMaker client_maker_; 286 test::QuicTestPacketMaker client_maker_;
285 287
286 protected: 288 protected:
287 bool use_alternative_proxy_; 289 bool use_alternative_proxy_ = false;
288 bool is_preconnect_; 290 bool is_preconnect_ = false;
289 bool enable_ip_based_pooling_; 291 bool enable_ip_based_pooling_ = true;
290 bool enable_alternative_services_; 292 bool enable_alternative_services_ = true;
293 bool skip_create_job_controller_ = false;
291 294
292 private: 295 private:
293 // Not owned by |this|. 296 // Not owned by |this|.
294 TestProxyDelegate* test_proxy_delegate_; 297 TestProxyDelegate* test_proxy_delegate_ = nullptr;
295 298
296 DISALLOW_COPY_AND_ASSIGN(HttpStreamFactoryImplJobControllerTest); 299 DISALLOW_COPY_AND_ASSIGN(HttpStreamFactoryImplJobControllerTest);
297 }; 300 };
298 301
299 TEST_F(HttpStreamFactoryImplJobControllerTest, ProxyResolutionFailsSync) { 302 TEST_F(HttpStreamFactoryImplJobControllerTest, ProxyResolutionFailsSync) {
300 ProxyConfig proxy_config; 303 ProxyConfig proxy_config;
301 proxy_config.set_pac_url(GURL("http://fooproxyurl")); 304 proxy_config.set_pac_url(GURL("http://fooproxyurl"));
302 proxy_config.set_pac_mandatory(true); 305 proxy_config.set_pac_mandatory(true);
303 session_deps_.proxy_service.reset(new ProxyService( 306 session_deps_.proxy_service.reset(new ProxyService(
304 base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), 307 base::MakeUnique<ProxyConfigServiceFixed>(proxy_config),
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1556 PreconnectMultipleStreamsToH2Server) { 1559 PreconnectMultipleStreamsToH2Server) {
1557 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0); 1560 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0);
1558 tcp_data_->set_connect_data(MockConnect(ASYNC, OK)); 1561 tcp_data_->set_connect_data(MockConnect(ASYNC, OK));
1559 SetPreconnect(); 1562 SetPreconnect();
1560 1563
1561 HttpRequestInfo request_info; 1564 HttpRequestInfo request_info;
1562 request_info.method = "GET"; 1565 request_info.method = "GET";
1563 request_info.url = GURL("http://www.example.com"); 1566 request_info.url = GURL("http://www.example.com");
1564 Initialize(request_info); 1567 Initialize(request_info);
1565 1568
1569 // Sets server support Http/2.
1566 url::SchemeHostPort server(request_info.url); 1570 url::SchemeHostPort server(request_info.url);
1567
1568 // Sets server support Http/2.
1569 session_->http_server_properties()->SetSupportsSpdy(server, true); 1571 session_->http_server_properties()->SetSupportsSpdy(server, true);
1570 1572
1571 job_controller_->Preconnect(/*num_streams=*/5); 1573 job_controller_->Preconnect(/*num_streams=*/5);
1572 // Only one job is started. 1574 // Only one job is started.
1573 EXPECT_TRUE(job_controller_->main_job()); 1575 EXPECT_TRUE(job_controller_->main_job());
1574 EXPECT_FALSE(job_controller_->alternative_job()); 1576 EXPECT_FALSE(job_controller_->alternative_job());
1575 EXPECT_EQ(HttpStreamFactoryImpl::PRECONNECT, 1577 EXPECT_EQ(HttpStreamFactoryImpl::PRECONNECT,
1576 job_controller_->main_job()->job_type()); 1578 job_controller_->main_job()->job_type());
1577 // There is only 1 connect even though multiple streams were requested. 1579 // There is only 1 connect even though multiple streams were requested.
1578 EXPECT_EQ(1, HttpStreamFactoryImplJobPeer::GetNumStreams( 1580 EXPECT_EQ(1, HttpStreamFactoryImplJobPeer::GetNumStreams(
1579 job_controller_->main_job())); 1581 job_controller_->main_job()));
1580 1582
1581 base::RunLoop().RunUntilIdle(); 1583 base::RunLoop().RunUntilIdle();
1582 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); 1584 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
1583 } 1585 }
1584 1586
1587 class LimitMultipleH2Requests : public HttpStreamFactoryImplJobControllerTest {
Bence 2017/06/09 23:14:02 Optional: add a test case where the server is thou
xunjieli 2017/06/13 15:23:11 Good idea. Done.
1588 protected:
1589 const int kNumRequests = 5;
1590 void SetUp() override { SetSkipCreateJobController(); }
Bence 2017/06/09 19:17:39 Why not set |skip_create_job_controller_| directly
xunjieli 2017/06/13 15:23:11 Done.
1591 };
1592
1593 TEST_F(LimitMultipleH2Requests, MultipleRequests) {
1594 // Make sure there are only one socket connect.
Bence 2017/06/09 19:17:39 s/are/is/
xunjieli 2017/06/13 15:23:10 Done.
1595 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)};
1596 tcp_data_ = base::MakeUnique<SequencedSocketData>(reads, arraysize(reads),
1597 nullptr, 0);
1598 tcp_data_->set_connect_data(MockConnect(ASYNC, OK));
1599 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK);
1600 ssl_data->next_proto = kProtoHTTP2;
1601 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get());
1602 HttpRequestInfo request_info;
1603 request_info.method = "GET";
1604 request_info.url = GURL("https://www.example.com");
1605 Initialize(request_info);
1606 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool());
1607 pool_peer.SetEnableSendingInitialData(false);
1608
1609 // Sets server support Http/2.
1610 url::SchemeHostPort server(request_info.url);
1611 session_->http_server_properties()->SetSupportsSpdy(server, true);
1612
1613 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates;
Bence 2017/06/09 19:17:39 Could you use std::vector<MockHttpStreamRequestDel
xunjieli 2017/06/13 15:23:11 Acknowledged. MockHttpStreamRequestDelegate has no
1614 std::vector<std::unique_ptr<HttpStreamRequest>> requests;
Bence 2017/06/09 19:17:39 I understand that this needs to use unique_ptr bec
xunjieli 2017/06/13 15:23:11 Acknowledged.
1615 for (int i = 0; i < kNumRequests; ++i) {
1616 request_delegates.emplace_back(
Bence 2017/06/09 19:17:39 I think a simple push_back() would be enough here.
xunjieli 2017/06/13 15:23:10 Done.
1617 base::MakeUnique<MockHttpStreamRequestDelegate>());
1618 HttpStreamFactoryImpl::JobController* job_controller =
1619 new HttpStreamFactoryImpl::JobController(
1620 factory_, request_delegates[i].get(), session_.get(), &job_factory_,
1621 request_info, is_preconnect_, enable_ip_based_pooling_,
1622 enable_alternative_services_, SSLConfig(), SSLConfig());
1623 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
1624 auto request = job_controller->Start(
1625 request_delegates[i].get(), nullptr, NetLogWithSource(),
1626 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
1627 EXPECT_TRUE(job_controller->main_job());
1628 EXPECT_FALSE(job_controller->alternative_job());
1629 requests.push_back(std::move(request));
1630 }
1631
1632 for (int i = 0; i < kNumRequests; ++i) {
1633 EXPECT_CALL(*request_delegates[i].get(), OnStreamReadyImpl(_, _, _));
1634 }
1635
1636 base::RunLoop().RunUntilIdle();
1637 requests.clear();
1638 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
1639 }
1640
1641 TEST_F(LimitMultipleH2Requests, MultipleRequestsFirstRequestHang) {
1642 base::ScopedMockTimeMessageLoopTaskRunner test_task_runner;
1643 // First socket connect hang.
1644 auto hangdata = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0);
1645 hangdata->set_connect_data(MockConnect(SYNCHRONOUS, ERR_IO_PENDING));
1646 session_deps_.socket_factory->AddSocketDataProvider(hangdata.get());
1647 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)};
1648 std::vector<std::unique_ptr<SequencedSocketData>> socket_data;
Bence 2017/06/09 19:17:39 Hm, could you not just use std::vector<SequencedSo
xunjieli 2017/06/13 15:23:11 Same here. SequencedSocketData has DISALLOW_COPY_A
1649 std::vector<std::unique_ptr<SSLSocketDataProvider>> ssl_socket_data;
Bence 2017/06/09 19:17:39 Same here.
xunjieli 2017/06/13 15:23:11 Acknowledged.
1650 // kNumRequests - 1 will resume themselves after a delay. There will be
1651 // kNumRequests - 1 sockets opened.
1652 for (int i = 0; i < kNumRequests - 1; i++) {
1653 // Only the first one needs a MockRead because subsequent sockets are
1654 // not used to establish a SpdySession.
1655 auto tcp_data =
1656 i == 0 ? base::MakeUnique<SequencedSocketData>(reads, arraysize(reads),
1657 nullptr, 0)
1658 : base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0);
1659 tcp_data->set_connect_data(MockConnect(ASYNC, OK));
1660 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK);
1661 ssl_data->next_proto = kProtoHTTP2;
1662 session_deps_.socket_factory->AddSocketDataProvider(tcp_data.get());
1663 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get());
1664 socket_data.push_back(std::move(tcp_data));
1665 ssl_socket_data.push_back(std::move(ssl_data));
1666 }
1667 HttpRequestInfo request_info;
1668 request_info.method = "GET";
1669 request_info.url = GURL("https://www.example.com");
1670 SetSkipCreateJobController();
Bence 2017/06/09 19:17:39 Please remove this call, as SetUp() already takes
xunjieli 2017/06/13 15:23:10 Done.
1671 Initialize(request_info);
1672 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool());
1673 pool_peer.SetEnableSendingInitialData(false);
1674
1675 // Sets server support Http/2.
1676 url::SchemeHostPort server(request_info.url);
1677 session_->http_server_properties()->SetSupportsSpdy(server, true);
1678
1679 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates;
1680 std::vector<std::unique_ptr<HttpStreamRequest>> requests;
1681 for (int i = 0; i < kNumRequests; ++i) {
1682 request_delegates.emplace_back(
1683 base::MakeUnique<MockHttpStreamRequestDelegate>());
1684 HttpStreamFactoryImpl::JobController* job_controller =
1685 new HttpStreamFactoryImpl::JobController(
1686 factory_, request_delegates[i].get(), session_.get(), &job_factory_,
1687 request_info, is_preconnect_, enable_ip_based_pooling_,
1688 enable_alternative_services_, SSLConfig(), SSLConfig());
1689 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
1690 auto request = job_controller->Start(
1691 request_delegates[i].get(), nullptr, NetLogWithSource(),
1692 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
1693 EXPECT_TRUE(job_controller->main_job());
1694 EXPECT_FALSE(job_controller->alternative_job());
1695 requests.push_back(std::move(request));
1696 }
1697
1698 for (int i = 0; i < kNumRequests; ++i) {
1699 // Delete |request[i] when request completes is needed because
Bence 2017/06/09 19:17:39 s/request/requests/
Bence 2017/06/09 19:17:39 Nit: unmatched '|'.
xunjieli 2017/06/13 15:23:10 Done.
xunjieli 2017/06/13 15:23:11 Done.
1700 // otherwise request will be completed twice. See crbug.com/706974.
1701 EXPECT_CALL(*request_delegates[i].get(), OnStreamReadyImpl(_, _, _))
1702 .WillOnce(testing::InvokeWithoutArgs(
1703 [this, &requests, i]() { requests[i].reset(); }));
1704 }
1705
1706 EXPECT_TRUE(test_task_runner->HasPendingTask());
1707 test_task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(300));
Bence 2017/06/09 19:17:39 Do you not need to use a larger time here to make
xunjieli 2017/06/13 15:23:11 Probably not. The delayed task is posted when |job
Bence 2017/06/13 16:04:51 Acknowledged.
1708 base::RunLoop().RunUntilIdle();
1709
1710 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
1711 for (const auto& data : socket_data) {
1712 EXPECT_TRUE(data->AllReadDataConsumed());
1713 EXPECT_TRUE(data->AllWriteDataConsumed());
1714 }
1715 }
1716
1717 TEST_F(LimitMultipleH2Requests, MultipleRequestsFirstRequestCanceled) {
1718 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)};
1719 auto first_socket = base::MakeUnique<SequencedSocketData>(
1720 reads, arraysize(reads), nullptr, 0);
1721 first_socket->set_connect_data(MockConnect(ASYNC, OK));
1722 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK);
1723 ssl_data->next_proto = kProtoHTTP2;
1724 session_deps_.socket_factory->AddSocketDataProvider(first_socket.get());
1725 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get());
1726 auto second_socket =
1727 base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0);
1728 second_socket->set_connect_data(MockConnect(ASYNC, OK));
1729 session_deps_.socket_factory->AddSocketDataProvider(second_socket.get());
1730 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get());
1731
1732 HttpRequestInfo request_info;
1733 request_info.method = "GET";
1734 request_info.url = GURL("https://www.example.com");
1735 SetSkipCreateJobController();
Bence 2017/06/09 19:17:39 Please remove this call, as SetUp() already takes
xunjieli 2017/06/13 15:23:11 Done.
1736 Initialize(request_info);
1737 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool());
1738 pool_peer.SetEnableSendingInitialData(false);
1739
1740 // Sets server support Http/2.
1741 url::SchemeHostPort server(request_info.url);
1742 session_->http_server_properties()->SetSupportsSpdy(server, true);
1743
1744 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates;
1745 std::vector<std::unique_ptr<HttpStreamRequest>> requests;
1746 for (int i = 0; i < kNumRequests; ++i) {
1747 request_delegates.emplace_back(
1748 base::MakeUnique<MockHttpStreamRequestDelegate>());
1749 HttpStreamFactoryImpl::JobController* job_controller =
1750 new HttpStreamFactoryImpl::JobController(
1751 factory_, request_delegates[i].get(), session_.get(), &job_factory_,
1752 request_info, is_preconnect_, enable_ip_based_pooling_,
1753 enable_alternative_services_, SSLConfig(), SSLConfig());
1754 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
1755 auto request = job_controller->Start(
1756 request_delegates[i].get(), nullptr, NetLogWithSource(),
1757 HttpStreamRequest::HTTP_STREAM, DEFAULT_PRIORITY);
1758 EXPECT_TRUE(job_controller->main_job());
1759 EXPECT_FALSE(job_controller->alternative_job());
1760 requests.push_back(std::move(request));
1761 }
1762 // Cancel the first one.
1763 requests[0].reset();
1764
1765 for (int i = 1; i < kNumRequests; ++i) {
1766 EXPECT_CALL(*request_delegates[i].get(), OnStreamReadyImpl(_, _, _));
1767 }
1768 base::RunLoop().RunUntilIdle();
1769 requests.clear();
1770 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
1771 EXPECT_TRUE(first_socket->AllReadDataConsumed());
1772 EXPECT_TRUE(second_socket->AllReadDataConsumed());
1773 }
1774
1775 TEST_F(LimitMultipleH2Requests, MultiplePreconnects) {
1776 // Make sure there are only one socket connect.
Bence 2017/06/09 19:17:38 s/are/is.
xunjieli 2017/06/13 15:23:11 Done.
1777 tcp_data_ = base::MakeUnique<SequencedSocketData>(nullptr, 0, nullptr, 0);
1778 tcp_data_->set_connect_data(MockConnect(ASYNC, OK));
1779 auto ssl_data = base::MakeUnique<SSLSocketDataProvider>(ASYNC, OK);
1780 ssl_data->next_proto = kProtoHTTP2;
1781 session_deps_.socket_factory->AddSSLSocketDataProvider(ssl_data.get());
1782 HttpRequestInfo request_info;
1783 request_info.method = "GET";
1784 request_info.url = GURL("https://www.example.com");
1785 SetPreconnect();
1786 Initialize(request_info);
1787 SpdySessionPoolPeer pool_peer(session_->spdy_session_pool());
1788 pool_peer.SetEnableSendingInitialData(false);
Bence 2017/06/09 19:17:39 Turns out these two lines are not necessary for th
xunjieli 2017/06/13 15:23:10 Done. Good catch.
1789
1790 // Sets server support Http/2.
1791 url::SchemeHostPort server(request_info.url);
1792 session_->http_server_properties()->SetSupportsSpdy(server, true);
1793
1794 std::vector<std::unique_ptr<MockHttpStreamRequestDelegate>> request_delegates;
1795 std::vector<std::unique_ptr<HttpStreamRequest>> requests;
1796 for (int i = 0; i < kNumRequests; ++i) {
1797 request_delegates.emplace_back(
1798 base::MakeUnique<MockHttpStreamRequestDelegate>());
1799 HttpStreamFactoryImpl::JobController* job_controller =
1800 new HttpStreamFactoryImpl::JobController(
1801 factory_, request_delegates[i].get(), session_.get(), &job_factory_,
1802 request_info, is_preconnect_, enable_ip_based_pooling_,
1803 enable_alternative_services_, SSLConfig(), SSLConfig());
1804 HttpStreamFactoryImplPeer::AddJobController(factory_, job_controller);
1805 job_controller->Preconnect(1);
1806 EXPECT_TRUE(job_controller->main_job());
1807 EXPECT_FALSE(job_controller->alternative_job());
1808 }
1809 base::RunLoop().RunUntilIdle();
1810 requests.clear();
1811 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
1812 }
1813
1585 class HttpStreamFactoryImplJobControllerMisdirectedRequestRetry 1814 class HttpStreamFactoryImplJobControllerMisdirectedRequestRetry
1586 : public HttpStreamFactoryImplJobControllerTest, 1815 : public HttpStreamFactoryImplJobControllerTest,
1587 public ::testing::WithParamInterface<::testing::tuple<bool, bool>> {}; 1816 public ::testing::WithParamInterface<::testing::tuple<bool, bool>> {};
1588 1817
1589 INSTANTIATE_TEST_CASE_P( 1818 INSTANTIATE_TEST_CASE_P(
1590 /* no prefix */, 1819 /* no prefix */,
1591 HttpStreamFactoryImplJobControllerMisdirectedRequestRetry, 1820 HttpStreamFactoryImplJobControllerMisdirectedRequestRetry,
1592 ::testing::Combine(::testing::Bool(), ::testing::Bool())); 1821 ::testing::Combine(::testing::Bool(), ::testing::Bool()));
1593 1822
1594 TEST_P(HttpStreamFactoryImplJobControllerMisdirectedRequestRetry, 1823 TEST_P(HttpStreamFactoryImplJobControllerMisdirectedRequestRetry,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 Preconnect(kNumPreconects); 1931 Preconnect(kNumPreconects);
1703 // If experiment is enabled, only 1 stream is requested. 1932 // If experiment is enabled, only 1 stream is requested.
1704 EXPECT_EQ( 1933 EXPECT_EQ(
1705 (int)actual_num_connects, 1934 (int)actual_num_connects,
1706 HttpStreamFactoryImplJobPeer::GetNumStreams(job_controller_->main_job())); 1935 HttpStreamFactoryImplJobPeer::GetNumStreams(job_controller_->main_job()));
1707 base::RunLoop().RunUntilIdle(); 1936 base::RunLoop().RunUntilIdle();
1708 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_)); 1937 EXPECT_TRUE(HttpStreamFactoryImplPeer::IsJobControllerDeleted(factory_));
1709 } 1938 }
1710 1939
1711 } // namespace net 1940 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698