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

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: Rebased 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
« no previous file with comments | « net/http/http_stream_factory_impl.cc ('k') | net/url_request/url_request_context_builder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1499 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 protected: 1510 protected:
1511 HttpStreamFactoryBidirectionalQuicTest() 1511 HttpStreamFactoryBidirectionalQuicTest()
1512 : clock_(new MockClock), 1512 : clock_(new MockClock),
1513 packet_maker_(GetParam(), 0, clock_, "www.example.org"), 1513 packet_maker_(GetParam(), 0, clock_, "www.example.org"),
1514 random_generator_(0), 1514 random_generator_(0),
1515 proxy_service_(ProxyService::CreateDirect()), 1515 proxy_service_(ProxyService::CreateDirect()),
1516 ssl_config_service_(new SSLConfigServiceDefaults) { 1516 ssl_config_service_(new SSLConfigServiceDefaults) {
1517 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); 1517 clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
1518 } 1518 }
1519 1519
1520 // Disable bidirectional stream over QUIC. This should be invoked before
1521 // Initialize().
1522 void DisableQuicBidirectionalStream() {
1523 params_.quic_disable_bidirectional_streams = true;
1524 }
1525
1520 void Initialize() { 1526 void Initialize() {
1521 params_.enable_quic = true; 1527 params_.enable_quic = true;
1522 params_.http_server_properties = http_server_properties_.GetWeakPtr(); 1528 params_.http_server_properties = http_server_properties_.GetWeakPtr();
1523 params_.quic_host_whitelist.insert("www.example.org"); 1529 params_.quic_host_whitelist.insert("www.example.org");
1524 params_.quic_random = &random_generator_; 1530 params_.quic_random = &random_generator_;
1525 params_.quic_clock = clock_; 1531 params_.quic_clock = clock_;
1526 1532
1527 // Load a certificate that is valid for *.example.org 1533 // Load a certificate that is valid for *.example.org
1528 scoped_refptr<X509Certificate> test_cert( 1534 scoped_refptr<X509Certificate> test_cert(
1529 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); 1535 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1640 bidi_request_info.url = GURL("https://www.example.org/"); 1646 bidi_request_info.url = GURL("https://www.example.org/");
1641 bidi_request_info.end_stream_on_headers = true; 1647 bidi_request_info.end_stream_on_headers = true;
1642 bidi_request_info.priority = LOWEST; 1648 bidi_request_info.priority = LOWEST;
1643 1649
1644 TestBidirectionalDelegate delegate; 1650 TestBidirectionalDelegate delegate;
1645 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr); 1651 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr);
1646 delegate.WaitUntilDone(); 1652 delegate.WaitUntilDone();
1647 1653
1648 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1); 1654 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1);
1649 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1)); 1655 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1));
1656 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol());
1650 EXPECT_EQ("200", delegate.response_headers().find(":status")->second); 1657 EXPECT_EQ("200", delegate.response_headers().find(":status")->second);
1651 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool( 1658 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1652 HttpNetworkSession::NORMAL_SOCKET_POOL))); 1659 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1653 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool( 1660 EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1654 HttpNetworkSession::NORMAL_SOCKET_POOL))); 1661 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1655 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool( 1662 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1656 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); 1663 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1657 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool( 1664 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1658 HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); 1665 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1659 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); 1666 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1660 } 1667 }
1661 1668
1669 // Tests that when QUIC is not enabled for bidirectional streaming, HTTP/2 is
1670 // used instead.
1671 TEST_P(HttpStreamFactoryBidirectionalQuicTest,
1672 RequestBidirectionalStreamJobQuicNotEnabled) {
1673 GURL url = GURL("https://www.example.org");
1674
1675 // Make the http job fail.
1676 scoped_ptr<StaticSocketDataProvider> http_job_data;
1677 http_job_data.reset(new StaticSocketDataProvider());
1678 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED);
1679 http_job_data->set_connect_data(failed_connect);
1680 socket_factory().AddSocketDataProvider(http_job_data.get());
1681 SSLSocketDataProvider ssl_data(ASYNC, OK);
1682 socket_factory().AddSSLSocketDataProvider(&ssl_data);
1683
1684 // Set up QUIC as alternative_service.
1685 AddQuicAlternativeService();
1686 DisableQuicBidirectionalStream();
1687 Initialize();
1688
1689 // Now request a stream.
1690 SSLConfig ssl_config;
1691 HttpRequestInfo request_info;
1692 request_info.method = "GET";
1693 request_info.url = GURL("https://www.example.org");
1694 request_info.load_flags = 0;
1695
1696 StreamRequestWaiter waiter;
1697 scoped_ptr<HttpStreamRequest> request(
1698 session()->http_stream_factory()->RequestBidirectionalStreamJob(
1699 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
1700 BoundNetLog()));
1701
1702 waiter.WaitForStream();
1703 EXPECT_TRUE(waiter.stream_done());
1704 EXPECT_FALSE(waiter.websocket_stream());
1705 ASSERT_FALSE(waiter.stream());
1706 ASSERT_FALSE(waiter.bidirectional_stream_job());
1707 // Since the alternative service job is not started, we will get the error
1708 // from the http job.
1709 ASSERT_EQ(ERR_CONNECTION_REFUSED, waiter.error_status());
1710 }
1711
1712 // Tests that if Http job fails, but Quic job succeeds, we return
1713 // BidirectionalStreamQuicImpl.
1714 TEST_P(HttpStreamFactoryBidirectionalQuicTest,
1715 RequestBidirectionalStreamJobHttpJobFailsQuicJobSucceeds) {
1716 GURL url = GURL("https://www.example.org");
1717
1718 // Set up Quic data.
1719 MockQuicData mock_quic_data;
1720 SpdyPriority priority =
1721 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
1722 size_t spdy_headers_frame_length;
1723 mock_quic_data.AddWrite(packet_maker().MakeRequestHeadersPacket(
1724 1, test::kClientDataStreamId1, /*should_include_version=*/true,
1725 /*fin=*/true, priority,
1726 packet_maker().GetRequestHeaders("GET", "https", "/"),
1727 &spdy_headers_frame_length));
1728 size_t spdy_response_headers_frame_length;
1729 mock_quic_data.AddRead(packet_maker().MakeResponseHeadersPacket(
1730 1, test::kClientDataStreamId1, /*should_include_version=*/false,
1731 /*fin=*/true, packet_maker().GetResponseHeaders("200"),
1732 &spdy_response_headers_frame_length));
1733 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more read data.
1734 mock_quic_data.AddSocketDataToFactory(&socket_factory());
1735
1736 // Make the http job fail.
1737 scoped_ptr<StaticSocketDataProvider> http_job_data;
1738 http_job_data.reset(new StaticSocketDataProvider());
1739 MockConnect failed_connect(ASYNC, ERR_CONNECTION_REFUSED);
1740 http_job_data->set_connect_data(failed_connect);
1741 socket_factory().AddSocketDataProvider(http_job_data.get());
1742 SSLSocketDataProvider ssl_data(ASYNC, OK);
1743 socket_factory().AddSSLSocketDataProvider(&ssl_data);
1744
1745 // Set up QUIC as alternative_service.
1746 AddQuicAlternativeService();
1747 Initialize();
1748
1749 // Now request a stream.
1750 SSLConfig ssl_config;
1751 HttpRequestInfo request_info;
1752 request_info.method = "GET";
1753 request_info.url = GURL("https://www.example.org");
1754 request_info.load_flags = 0;
1755
1756 StreamRequestWaiter waiter;
1757 scoped_ptr<HttpStreamRequest> request(
1758 session()->http_stream_factory()->RequestBidirectionalStreamJob(
1759 request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter,
1760 BoundNetLog()));
1761
1762 waiter.WaitForStream();
1763 EXPECT_TRUE(waiter.stream_done());
1764 EXPECT_FALSE(waiter.websocket_stream());
1765 ASSERT_FALSE(waiter.stream());
1766 ASSERT_TRUE(waiter.bidirectional_stream_job());
1767 BidirectionalStreamJob* job = waiter.bidirectional_stream_job();
1768
1769 BidirectionalStreamRequestInfo bidi_request_info;
1770 bidi_request_info.method = "GET";
1771 bidi_request_info.url = GURL("https://www.example.org/");
1772 bidi_request_info.end_stream_on_headers = true;
1773 bidi_request_info.priority = LOWEST;
1774
1775 TestBidirectionalDelegate delegate;
1776 job->Start(&bidi_request_info, BoundNetLog(), &delegate, nullptr);
1777 delegate.WaitUntilDone();
1778
1779 // Make sure the BidirectionalStream negotiated goes through QUIC.
1780 scoped_refptr<IOBuffer> buffer = new net::IOBuffer(1);
1781 EXPECT_EQ(OK, job->ReadData(buffer.get(), 1));
1782 EXPECT_EQ(kProtoQUIC1SPDY3, job->GetProtocol());
1783 EXPECT_EQ("200", delegate.response_headers().find(":status")->second);
1784 // There is no Http2 socket pool.
1785 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1786 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1787 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1788 HttpNetworkSession::NORMAL_SOCKET_POOL)));
1789 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
1790 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1791 EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
1792 HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
1793 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1794 }
1795
1662 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) { 1796 TEST_P(HttpStreamFactoryTest, RequestBidirectionalStreamJobFailure) {
1663 SpdySessionDependencies session_deps(GetParam(), 1797 SpdySessionDependencies session_deps(GetParam(),
1664 ProxyService::CreateDirect()); 1798 ProxyService::CreateDirect());
1665 1799
1666 MockRead mock_read(ASYNC, OK); 1800 MockRead mock_read(ASYNC, OK);
1667 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0); 1801 SequencedSocketData socket_data(&mock_read, 1, nullptr, 0);
1668 socket_data.set_connect_data(MockConnect(ASYNC, OK)); 1802 socket_data.set_connect_data(MockConnect(ASYNC, OK));
1669 session_deps.socket_factory->AddSocketDataProvider(&socket_data); 1803 session_deps.socket_factory->AddSocketDataProvider(&socket_data);
1670 1804
1671 SSLSocketDataProvider ssl_socket_data(ASYNC, OK); 1805 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1907 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); 2041 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1908 2042
1909 // Make sure there is no orphaned job. it is already canceled. 2043 // Make sure there is no orphaned job. it is already canceled.
1910 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( 2044 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>(
1911 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); 2045 session->http_stream_factory_for_websocket())->num_orphaned_jobs());
1912 } 2046 }
1913 2047
1914 } // namespace 2048 } // namespace
1915 2049
1916 } // namespace net 2050 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_stream_factory_impl.cc ('k') | net/url_request/url_request_context_builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698