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

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

Issue 1796253002: Add an option to disable net::BidirectionalStreamQuicImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Misha's comments Created 4 years, 9 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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.h" 5 #include "net/http/http_stream_factory_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 protected: 1525 protected:
1526 HttpStreamFactoryBidirectionalQuicTest() 1526 HttpStreamFactoryBidirectionalQuicTest()
1527 : clock_(new MockClock), 1527 : clock_(new MockClock),
1528 packet_maker_(GetParam(), 0, clock_, "www.example.org"), 1528 packet_maker_(GetParam(), 0, clock_, "www.example.org"),
1529 random_generator_(0), 1529 random_generator_(0),
1530 proxy_service_(ProxyService::CreateDirect()), 1530 proxy_service_(ProxyService::CreateDirect()),
1531 ssl_config_service_(new SSLConfigServiceDefaults) { 1531 ssl_config_service_(new SSLConfigServiceDefaults) {
1532 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); 1532 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
1533 } 1533 }
1534 1534
1535 void Initialize() { 1535 void Initialize(bool disable_bidirectional_stream_quic_impl) {
1536 params_.enable_quic = true; 1536 params_.enable_quic = true;
1537 params_.http_server_properties = http_server_properties_.GetWeakPtr(); 1537 params_.http_server_properties = http_server_properties_.GetWeakPtr();
1538 params_.quic_host_whitelist.insert("www.example.org"); 1538 params_.quic_host_whitelist.insert("www.example.org");
1539 params_.quic_random = &random_generator_; 1539 params_.quic_random = &random_generator_;
1540 params_.quic_clock = clock_; 1540 params_.quic_clock = clock_;
1541 1541
1542 // Load a certificate that is valid for *.example.org 1542 // Load a certificate that is valid for *.example.org
1543 scoped_refptr<X509Certificate> test_cert( 1543 scoped_refptr<X509Certificate> test_cert(
1544 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); 1544 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
1545 EXPECT_TRUE(test_cert.get()); 1545 EXPECT_TRUE(test_cert.get());
1546 verify_details_.cert_verify_result.verified_cert = test_cert; 1546 verify_details_.cert_verify_result.verified_cert = test_cert;
1547 verify_details_.cert_verify_result.is_issued_by_known_root = true; 1547 verify_details_.cert_verify_result.is_issued_by_known_root = true;
1548 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_); 1548 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
1549 crypto_client_stream_factory_.set_handshake_mode( 1549 crypto_client_stream_factory_.set_handshake_mode(
1550 MockCryptoClientStream::CONFIRM_HANDSHAKE); 1550 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1551 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; 1551 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_;
1552 params_.quic_supported_versions = test::SupportedVersions(GetParam()); 1552 params_.quic_supported_versions = test::SupportedVersions(GetParam());
1553 params_.transport_security_state = &transport_security_state_; 1553 params_.transport_security_state = &transport_security_state_;
1554 params_.host_resolver = &host_resolver_; 1554 params_.host_resolver = &host_resolver_;
1555 params_.proxy_service = proxy_service_.get(); 1555 params_.proxy_service = proxy_service_.get();
1556 params_.ssl_config_service = ssl_config_service_.get(); 1556 params_.ssl_config_service = ssl_config_service_.get();
1557 params_.client_socket_factory = &socket_factory_; 1557 params_.client_socket_factory = &socket_factory_;
1558 params_.disable_bidirectional_stream_quic_impl =
1559 disable_bidirectional_stream_quic_impl;
1558 session_.reset(new HttpNetworkSession(params_)); 1560 session_.reset(new HttpNetworkSession(params_));
1559 session_->quic_stream_factory()->set_require_confirmation(false); 1561 session_->quic_stream_factory()->set_require_confirmation(false);
1560 } 1562 }
1561 1563
1562 void AddQuicAlternativeService() { 1564 void AddQuicAlternativeService() {
1563 const AlternativeService alternative_service(QUIC, "www.example.org", 443); 1565 const AlternativeService alternative_service(QUIC, "www.example.org", 443);
1564 AlternativeServiceInfoVector alternative_service_info_vector; 1566 AlternativeServiceInfoVector alternative_service_info_vector;
1565 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 1567 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1566 alternative_service_info_vector.push_back( 1568 alternative_service_info_vector.push_back(
1567 AlternativeServiceInfo(alternative_service, 1.0, expiration)); 1569 AlternativeServiceInfo(alternative_service, 1.0, expiration));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 scoped_ptr<StaticSocketDataProvider> hanging_data; 1623 scoped_ptr<StaticSocketDataProvider> hanging_data;
1622 hanging_data.reset(new StaticSocketDataProvider()); 1624 hanging_data.reset(new StaticSocketDataProvider());
1623 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); 1625 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
1624 hanging_data->set_connect_data(hanging_connect); 1626 hanging_data->set_connect_data(hanging_connect);
1625 socket_factory().AddSocketDataProvider(hanging_data.get()); 1627 socket_factory().AddSocketDataProvider(hanging_data.get());
1626 SSLSocketDataProvider ssl_data(ASYNC, OK); 1628 SSLSocketDataProvider ssl_data(ASYNC, OK);
1627 socket_factory().AddSSLSocketDataProvider(&ssl_data); 1629 socket_factory().AddSSLSocketDataProvider(&ssl_data);
1628 1630
1629 // Set up QUIC as alternative_service. 1631 // Set up QUIC as alternative_service.
1630 AddQuicAlternativeService(); 1632 AddQuicAlternativeService();
1631 Initialize(); 1633 Initialize(/*disable_bidirectional_stream_quic_impl=*/false);
1632 1634
1633 // Now request a stream. 1635 // Now request a stream.
1634 SSLConfig ssl_config; 1636 SSLConfig ssl_config;
1635 HttpRequestInfo request_info; 1637 HttpRequestInfo request_info;
1636 request_info.method = "GET"; 1638 request_info.method = "GET";
1637 request_info.url = GURL("https://www.example.org"); 1639 request_info.url = GURL("https://www.example.org");
1638 request_info.load_flags = 0; 1640 request_info.load_flags = 0;
1639 1641
1640 StreamRequestWaiter waiter; 1642 StreamRequestWaiter waiter;
1641 scoped_ptr<HttpStreamRequest> request( 1643 scoped_ptr<HttpStreamRequest> request(
(...skipping 13 matching lines...) Expand all
1655 bidi_request_info.url = GURL("https://www.example.org/"); 1657 bidi_request_info.url = GURL("https://www.example.org/");
1656 bidi_request_info.end_stream_on_headers = true; 1658 bidi_request_info.end_stream_on_headers = true;
1657 bidi_request_info.priority = LOWEST; 1659 bidi_request_info.priority = LOWEST;
1658 1660
1659 TestBidirectionalDelegate delegate; 1661 TestBidirectionalDelegate delegate;
1660 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); 1662 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr);
1661 delegate.WaitUntilDone(); 1663 delegate.WaitUntilDone();
1662 1664
1663 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); 1665 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1);
1664 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); 1666 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1));
1667 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol());
1665 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); 1668 EXPECT_EQ("200", delegate.response_headers().find(":status")->second);
1666 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool( 1669 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1667 HttpNetworkSession::NORMAL_SOCKET_POOL))); 1670 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1668 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool( 1671 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1669 HttpNetworkSession::NORMAL_SOCKET_POOL))); 1672 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1670 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( 1673 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1671 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); 1674 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1672 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( 1675 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1673 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); 1676 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1674 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); 1677 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1675 } 1678 }
1676 1679
1680 // Tests that when QUIC is not enabled for bidirectional streaming, HTTP/2 is
1681 // used instead.
1682 TEST_P(HttpStreamFactoryBidirectionalQuicTest,
1683 RequestBidirectionalStreamJobQuicNotEnabled) {
1684 GURL url = GURL("https://www.example.org");
1685
1686 // Make the http job fail.
1687 scoped_ptr<StaticSocketDataProvider> http_job_data;
1688 http_job_data.reset(new StaticSocketDataProvider());
1689 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED);
1690 http_job_data->set_connect_data(failed_connect);
1691 socket_factory().AddSocketDataProvider(http_job_data.get());
1692 SSLSocketDataProvider ssl_data(ASYNC, OK);
1693 socket_factory().AddSSLSocketDataProvider(&ssl_data);
1694
1695 // Set up QUIC as alternative_service.
1696 AddQuicAlternativeService();
1697 Initialize(/*disable_bidirectional_stream_quic_impl=*/true);
Ryan Hamilton 2016/03/15 22:41:45 Instead of adding a new arg to Initialized, how ab
xunjieli 2016/03/16 15:47:04 Partially done. |params_| is private. I try not to
Ryan Hamilton 2016/03/16 20:33:55 That works too. FWIW in tests, making members prot
xunjieli 2016/03/16 20:45:01 Good to know! Matt advised me to keep members priv
Ryan Hamilton 2016/03/16 20:47:09 I am happy to defer to Matt in all things! :>
1698
1699 // Now request a stream.
1700 SSLConfig ssl_config;
1701 HttpRequestInfo request_info;
1702 request_info.method = "GET";
1703 request_info.url = GURL("https://www.example.org");
1704 request_info.load_flags = 0;
1705
1706 StreamRequestWaiter waiter;
1707 scoped_ptr<HttpStreamRequest> request(
1708 session()->http_stream_factory()->RequestBidirectionalStreamJob(
1709 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
1710 BoundNetLog()));
1711
1712 waiter.WaitForStream();
1713 EXPECT_TRUE(waiter.stream_done());
1714 EXPECT_FALSE(waiter.websocket_stream());
1715 ASSERT_FALSE(waiter.stream());
1716 ASSERT_FALSE(waiter.bidirectional_stream_job());
1717 // Since the alternative service job is not started, we will get the error
1718 // from the http job.
1719 ASSERT_EQ(ERR_CONNECTION_REFUSED, waiter.error_status());
1720 }
1721
1722 // Tests that if Http job fails, but Quic job succeeds, we return
1723 // BidirectionalStreamQuicImpl.
1724 TEST_P(HttpStreamFactoryBidirectionalQuicTest,
1725 RequestBidirectionalStreamJobHttpJobFailsQuicJobSucceeds) {
1726 GURL url = GURL("https://www.example.org");
1727
1728 // Set up Quic data.
1729 MockQuicData mock_quic_data;
1730 SpdyPriority priority =
1731 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1732 size_t spdy_headers_frame_length;
1733 mock_quic_data.AddWrite(packet_maker().MakeRequestHeadersPacket(
1734 1, test::kClientDataStreamId1, /*should_include_version=*/true,
1735 /*fin=*/true, priority,
1736 packet_maker().GetRequestHeaders("GET", "https", "/"),
1737 &spdy_headers_frame_length));
1738 size_t spdy_response_headers_frame_length;
1739 mock_quic_data.AddRead(packet_maker().MakeResponseHeadersPacket(
1740 1, test::kClientDataStreamId1, /*should_include_version=*/false,
1741 /*fin=*/true, packet_maker().GetResponseHeaders("200"),
1742 &spdy_response_headers_frame_length));
1743 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1744 mock_quic_data.AddSocketDataToFactory(&socket_factory());
1745
1746 // Make the http job fail.
1747 scoped_ptr<StaticSocketDataProvider> http_job_data;
1748 http_job_data.reset(new StaticSocketDataProvider());
1749 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED);
1750 http_job_data->set_connect_data(failed_connect);
1751 socket_factory().AddSocketDataProvider(http_job_data.get());
1752 SSLSocketDataProvider ssl_data(ASYNC, OK);
1753 socket_factory().AddSSLSocketDataProvider(&ssl_data);
1754
1755 // Set up QUIC as alternative_service.
1756 AddQuicAlternativeService();
1757 Initialize(/*disable_bidirectional_stream_quic_impl=*/false);
1758
1759 // Now request a stream.
1760 SSLConfig ssl_config;
1761 HttpRequestInfo request_info;
1762 request_info.method = "GET";
1763 request_info.url = GURL("https://www.example.org");
1764 request_info.load_flags = 0;
1765
1766 StreamRequestWaiter waiter;
1767 scoped_ptr<HttpStreamRequest> request(
1768 session()->http_stream_factory()->RequestBidirectionalStreamJob(
1769 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
1770 BoundNetLog()));
1771
1772 waiter.WaitForStream();
1773 EXPECT_TRUE(waiter.stream_done());
1774 EXPECT_FALSE(waiter.websocket_stream());
1775 ASSERT_FALSE(waiter.stream());
1776 ASSERT_TRUE(waiter.bidirectional_stream_job());
1777 BidirectionalStreamJob* job = waiter.bidirectional_stream_job();
1778
1779 BidirectionalStreamRequestInfo bidi_request_info;
1780 bidi_request_info.method = "GET";
1781 bidi_request_info.url = GURL("https://www.example.org/");
1782 bidi_request_info.end_stream_on_headers = true;
1783 bidi_request_info.priority = LOWEST;
1784
1785 TestBidirectionalDelegate delegate;
1786 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr);
1787 delegate.WaitUntilDone();
1788
1789 // Make sure the BidirectionalStream negotiated goes through QUIC.
1790 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1);
1791 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1));
1792 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol());
1793 EXPECT_EQ("200", delegate.response_headers().find(":status")->second);
1794 // There is no Http2 socket pool.
1795 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1796 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1797 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1798 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1799 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1800 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1801 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1802 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1803 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1804 }
1805
1677 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) { 1806 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) {
1678 SpdySessionDependencies session_deps(GetParam(), 1807 SpdySessionDependencies session_deps(GetParam(),
1679 ProxyService::CreateDirect()); 1808 ProxyService::CreateDirect());
1680 1809
1681 MockRead mock_read(ASYNC, OK); 1810 MockRead mock_read(ASYNC, OK);
1682 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0); 1811 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0);
1683 socket_data.set_connect_data(MockConnect(ASYNC, OK)); 1812 socket_data.set_connect_data(MockConnect(ASYNC, OK));
1684 session_deps.socket_factory->AddSocketDataProvider(&socket_data); 1813 session_deps.socket_factory->AddSocketDataProvider(&socket_data);
1685 1814
1686 SSLSocketDataProvider ssl_socket_data(ASYNC, OK); 1815 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1923 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); 2052 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1924 2053
1925 // Make sure there is no orphaned job. it is already canceled. 2054 // Make sure there is no orphaned job. it is already canceled.
1926 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( 2055 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>(
1927 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); 2056 session->http_stream_factory_for_websocket())->num_orphaned_jobs());
1928 } 2057 }
1929 2058
1930 } // namespace 2059 } // namespace
1931 2060
1932 } // namespace net 2061 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698