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

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 Ryan'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 // Disable bidirectional stream over QUIC. This should be invoked before
1536 // Initialize().
1537 void DisableQuicBidirectionalStream() {
1538 params_.quic_disable_bidirectional_stream = true;
1539 }
1540
1535 void Initialize() { 1541 void Initialize() {
1536 params_.enable_quic = true; 1542 params_.enable_quic = true;
1537 params_.http_server_properties = http_server_properties_.GetWeakPtr(); 1543 params_.http_server_properties = http_server_properties_.GetWeakPtr();
1538 params_.quic_host_whitelist.insert("www.example.org"); 1544 params_.quic_host_whitelist.insert("www.example.org");
1539 params_.quic_random = &random_generator_; 1545 params_.quic_random = &random_generator_;
1540 params_.quic_clock = clock_; 1546 params_.quic_clock = clock_;
1541 1547
1542 // Load a certificate that is valid for *.example.org 1548 // Load a certificate that is valid for *.example.org
1543 scoped_refptr<X509Certificate> test_cert( 1549 scoped_refptr<X509Certificate> test_cert(
1544 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); 1550 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1655 bidi_request_info.url = GURL("https://www.example.org/"); 1661 bidi_request_info.url = GURL("https://www.example.org/");
1656 bidi_request_info.end_stream_on_headers = true; 1662 bidi_request_info.end_stream_on_headers = true;
1657 bidi_request_info.priority = LOWEST; 1663 bidi_request_info.priority = LOWEST;
1658 1664
1659 TestBidirectionalDelegate delegate; 1665 TestBidirectionalDelegate delegate;
1660 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); 1666 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr);
1661 delegate.WaitUntilDone(); 1667 delegate.WaitUntilDone();
1662 1668
1663 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); 1669 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1);
1664 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); 1670 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1));
1671 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol());
1665 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); 1672 EXPECT_EQ("200", delegate.response_headers().find(":status")->second);
1666 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool( 1673 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1667 HttpNetworkSession::NORMAL_SOCKET_POOL))); 1674 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1668 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool( 1675 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1669 HttpNetworkSession::NORMAL_SOCKET_POOL))); 1676 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1670 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( 1677 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1671 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); 1678 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1672 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( 1679 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1673 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); 1680 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1674 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); 1681 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1675 } 1682 }
1676 1683
1684 // Tests that when QUIC is not enabled for bidirectional streaming, HTTP/2 is
1685 // used instead.
1686 TEST_P(HttpStreamFactoryBidirectionalQuicTest,
1687 RequestBidirectionalStreamJobQuicNotEnabled) {
1688 GURL url = GURL("https://www.example.org");
1689
1690 // Make the http job fail.
1691 scoped_ptr<StaticSocketDataProvider> http_job_data;
1692 http_job_data.reset(new StaticSocketDataProvider());
1693 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED);
1694 http_job_data->set_connect_data(failed_connect);
1695 socket_factory().AddSocketDataProvider(http_job_data.get());
1696 SSLSocketDataProvider ssl_data(ASYNC, OK);
1697 socket_factory().AddSSLSocketDataProvider(&ssl_data);
1698
1699 // Set up QUIC as alternative_service.
1700 AddQuicAlternativeService();
1701 DisableQuicBidirectionalStream();
1702 Initialize();
1703
1704 // Now request a stream.
1705 SSLConfig ssl_config;
1706 HttpRequestInfo request_info;
1707 request_info.method = "GET";
1708 request_info.url = GURL("https://www.example.org");
1709 request_info.load_flags = 0;
1710
1711 StreamRequestWaiter waiter;
1712 scoped_ptr<HttpStreamRequest> request(
1713 session()->http_stream_factory()->RequestBidirectionalStreamJob(
1714 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
1715 BoundNetLog()));
1716
1717 waiter.WaitForStream();
1718 EXPECT_TRUE(waiter.stream_done());
1719 EXPECT_FALSE(waiter.websocket_stream());
1720 ASSERT_FALSE(waiter.stream());
1721 ASSERT_FALSE(waiter.bidirectional_stream_job());
1722 // Since the alternative service job is not started, we will get the error
1723 // from the http job.
1724 ASSERT_EQ(ERR_CONNECTION_REFUSED, waiter.error_status());
1725 }
1726
1727 // Tests that if Http job fails, but Quic job succeeds, we return
1728 // BidirectionalStreamQuicImpl.
1729 TEST_P(HttpStreamFactoryBidirectionalQuicTest,
1730 RequestBidirectionalStreamJobHttpJobFailsQuicJobSucceeds) {
1731 GURL url = GURL("https://www.example.org");
1732
1733 // Set up Quic data.
1734 MockQuicData mock_quic_data;
1735 SpdyPriority priority =
1736 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1737 size_t spdy_headers_frame_length;
1738 mock_quic_data.AddWrite(packet_maker().MakeRequestHeadersPacket(
1739 1, test::kClientDataStreamId1, /*should_include_version=*/true,
1740 /*fin=*/true, priority,
1741 packet_maker().GetRequestHeaders("GET", "https", "/"),
1742 &spdy_headers_frame_length));
1743 size_t spdy_response_headers_frame_length;
1744 mock_quic_data.AddRead(packet_maker().MakeResponseHeadersPacket(
1745 1, test::kClientDataStreamId1, /*should_include_version=*/false,
1746 /*fin=*/true, packet_maker().GetResponseHeaders("200"),
1747 &spdy_response_headers_frame_length));
1748 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1749 mock_quic_data.AddSocketDataToFactory(&socket_factory());
1750
1751 // Make the http job fail.
1752 scoped_ptr<StaticSocketDataProvider> http_job_data;
1753 http_job_data.reset(new StaticSocketDataProvider());
1754 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED);
1755 http_job_data->set_connect_data(failed_connect);
1756 socket_factory().AddSocketDataProvider(http_job_data.get());
1757 SSLSocketDataProvider ssl_data(ASYNC, OK);
1758 socket_factory().AddSSLSocketDataProvider(&ssl_data);
1759
1760 // Set up QUIC as alternative_service.
1761 AddQuicAlternativeService();
1762 Initialize();
1763
1764 // Now request a stream.
1765 SSLConfig ssl_config;
1766 HttpRequestInfo request_info;
1767 request_info.method = "GET";
1768 request_info.url = GURL("https://www.example.org");
1769 request_info.load_flags = 0;
1770
1771 StreamRequestWaiter waiter;
1772 scoped_ptr<HttpStreamRequest> request(
1773 session()->http_stream_factory()->RequestBidirectionalStreamJob(
1774 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
1775 BoundNetLog()));
1776
1777 waiter.WaitForStream();
1778 EXPECT_TRUE(waiter.stream_done());
1779 EXPECT_FALSE(waiter.websocket_stream());
1780 ASSERT_FALSE(waiter.stream());
1781 ASSERT_TRUE(waiter.bidirectional_stream_job());
1782 BidirectionalStreamJob* job = waiter.bidirectional_stream_job();
1783
1784 BidirectionalStreamRequestInfo bidi_request_info;
1785 bidi_request_info.method = "GET";
1786 bidi_request_info.url = GURL("https://www.example.org/");
1787 bidi_request_info.end_stream_on_headers = true;
1788 bidi_request_info.priority = LOWEST;
1789
1790 TestBidirectionalDelegate delegate;
1791 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr);
1792 delegate.WaitUntilDone();
1793
1794 // Make sure the BidirectionalStream negotiated goes through QUIC.
1795 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1);
1796 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1));
1797 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol());
1798 EXPECT_EQ("200", delegate.response_headers().find(":status")->second);
1799 // There is no Http2 socket pool.
1800 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1801 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1802 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1803 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1804 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1805 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1806 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1807 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1808 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1809 }
1810
1677 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) { 1811 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) {
1678 SpdySessionDependencies session_deps(GetParam(), 1812 SpdySessionDependencies session_deps(GetParam(),
1679 ProxyService::CreateDirect()); 1813 ProxyService::CreateDirect());
1680 1814
1681 MockRead mock_read(ASYNC, OK); 1815 MockRead mock_read(ASYNC, OK);
1682 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0); 1816 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0);
1683 socket_data.set_connect_data(MockConnect(ASYNC, OK)); 1817 socket_data.set_connect_data(MockConnect(ASYNC, OK));
1684 session_deps.socket_factory->AddSocketDataProvider(&socket_data); 1818 session_deps.socket_factory->AddSocketDataProvider(&socket_data);
1685 1819
1686 SSLSocketDataProvider ssl_socket_data(ASYNC, OK); 1820 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()); 2057 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1924 2058
1925 // Make sure there is no orphaned job. it is already canceled. 2059 // Make sure there is no orphaned job. it is already canceled.
1926 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( 2060 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>(
1927 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); 2061 session->http_stream_factory_for_websocket())->num_orphaned_jobs());
1928 } 2062 }
1929 2063
1930 } // namespace 2064 } // namespace
1931 2065
1932 } // namespace net 2066 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698