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

Side by Side Diff: net/quic/quic_network_transaction_unittest.cc

Issue 1878143005: SHP 4: Change AlternativeServiceMap to use SchemeHostPort as the key. No change to Pref data. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@SHP_3
Patch Set: fix a comment Created 4 years, 8 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 <vector> 5 #include <vector>
6 6
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 #include "net/socket/client_socket_factory.h" 46 #include "net/socket/client_socket_factory.h"
47 #include "net/socket/mock_client_socket_pool_manager.h" 47 #include "net/socket/mock_client_socket_pool_manager.h"
48 #include "net/socket/socket_test_util.h" 48 #include "net/socket/socket_test_util.h"
49 #include "net/socket/ssl_client_socket.h" 49 #include "net/socket/ssl_client_socket.h"
50 #include "net/spdy/spdy_frame_builder.h" 50 #include "net/spdy/spdy_frame_builder.h"
51 #include "net/spdy/spdy_framer.h" 51 #include "net/spdy/spdy_framer.h"
52 #include "net/ssl/ssl_config_service_defaults.h" 52 #include "net/ssl/ssl_config_service_defaults.h"
53 #include "net/test/cert_test_util.h" 53 #include "net/test/cert_test_util.h"
54 #include "testing/gtest/include/gtest/gtest.h" 54 #include "testing/gtest/include/gtest/gtest.h"
55 #include "testing/platform_test.h" 55 #include "testing/platform_test.h"
56 #include "url/gurl.h"
56 57
57 namespace net { 58 namespace net {
58 namespace test { 59 namespace test {
59 60
60 namespace { 61 namespace {
61 62
62 static const char kQuicAlternateProtocolHeader[] = 63 static const char kQuicAlternateProtocolHeader[] =
63 "Alternate-Protocol: 443:quic\r\n\r\n"; 64 "Alternate-Protocol: 443:quic\r\n\r\n";
64 static const char kQuicAlternateProtocolWithProbabilityHeader[] = 65 static const char kQuicAlternateProtocolWithProbabilityHeader[] =
65 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n"; 66 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n";
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 529
529 void SendRequestAndExpectQuicResponseFromProxyOnPort( 530 void SendRequestAndExpectQuicResponseFromProxyOnPort(
530 const std::string& expected, 531 const std::string& expected,
531 uint16_t port) { 532 uint16_t port) {
532 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); 533 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port);
533 } 534 }
534 535
535 void AddQuicAlternateProtocolMapping( 536 void AddQuicAlternateProtocolMapping(
536 MockCryptoClientStream::HandshakeMode handshake_mode) { 537 MockCryptoClientStream::HandshakeMode handshake_mode) {
537 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); 538 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
538 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); 539 url::SchemeHostPort server(request_.url);
539 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); 540 AlternativeService alternative_service(QUIC, server.host(), 443);
540 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 541 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
541 http_server_properties_.SetAlternativeService( 542 http_server_properties_.SetAlternativeService(server, alternative_service,
542 host_port_pair, alternative_service, expiration); 543 expiration);
543 } 544 }
544 545
545 void AddQuicRemoteAlternativeServiceMapping( 546 void AddQuicRemoteAlternativeServiceMapping(
546 MockCryptoClientStream::HandshakeMode handshake_mode, 547 MockCryptoClientStream::HandshakeMode handshake_mode,
547 const HostPortPair& alternative) { 548 const HostPortPair& alternative) {
548 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); 549 crypto_client_stream_factory_.set_handshake_mode(handshake_mode);
549 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); 550 url::SchemeHostPort server(request_.url);
550 AlternativeService alternative_service(QUIC, alternative.host(), 551 AlternativeService alternative_service(QUIC, alternative.host(),
551 alternative.port()); 552 alternative.port());
552 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 553 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
553 http_server_properties_.SetAlternativeService( 554 http_server_properties_.SetAlternativeService(server, alternative_service,
554 host_port_pair, alternative_service, expiration); 555 expiration);
555 } 556 }
556 557
557 void ExpectBrokenAlternateProtocolMapping() { 558 void ExpectBrokenAlternateProtocolMapping() {
558 const HostPortPair origin = HostPortPair::FromURL(request_.url); 559 const url::SchemeHostPort server(request_.url);
559 const AlternativeServiceVector alternative_service_vector = 560 const AlternativeServiceVector alternative_service_vector =
560 http_server_properties_.GetAlternativeServices(origin); 561 http_server_properties_.GetAlternativeServices(server);
561 EXPECT_EQ(1u, alternative_service_vector.size()); 562 EXPECT_EQ(1u, alternative_service_vector.size());
562 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( 563 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken(
563 alternative_service_vector[0])); 564 alternative_service_vector[0]));
564 } 565 }
565 566
566 void ExpectQuicAlternateProtocolMapping() { 567 void ExpectQuicAlternateProtocolMapping() {
567 const HostPortPair origin = HostPortPair::FromURL(request_.url); 568 const url::SchemeHostPort server(request_.url);
568 const AlternativeServiceVector alternative_service_vector = 569 const AlternativeServiceVector alternative_service_vector =
569 http_server_properties_.GetAlternativeServices(origin); 570 http_server_properties_.GetAlternativeServices(server);
570 EXPECT_EQ(1u, alternative_service_vector.size()); 571 EXPECT_EQ(1u, alternative_service_vector.size());
571 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); 572 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
572 } 573 }
573 574
574 void AddHangingNonAlternateProtocolSocketData() { 575 void AddHangingNonAlternateProtocolSocketData() {
575 scoped_ptr<StaticSocketDataProvider> hanging_data; 576 scoped_ptr<StaticSocketDataProvider> hanging_data;
576 hanging_data.reset(new StaticSocketDataProvider()); 577 hanging_data.reset(new StaticSocketDataProvider());
577 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); 578 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
578 hanging_data->set_connect_data(hanging_connect); 579 hanging_data->set_connect_data(hanging_connect);
579 hanging_data_.push_back(std::move(hanging_data)); 580 hanging_data_.push_back(std::move(hanging_data));
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
933 934
934 mock_quic_data.AddSocketDataToFactory(&socket_factory_); 935 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
935 936
936 AddHangingNonAlternateProtocolSocketData(); 937 AddHangingNonAlternateProtocolSocketData();
937 CreateSession(); 938 CreateSession();
938 939
939 SendRequestAndExpectHttpResponse("hello world"); 940 SendRequestAndExpectHttpResponse("hello world");
940 SendRequestAndExpectQuicResponse("hello!"); 941 SendRequestAndExpectQuicResponse("hello!");
941 } 942 }
942 943
944 TEST_P(QuicNetworkTransactionTest, SetAlternativeServiceWithScheme) {
945 MockRead http_reads[] = {
946 MockRead("HTTP/1.1 200 OK\r\n"),
947 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
948 MockRead("hello world"),
949 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
950 MockRead(ASYNC, OK)};
951
952 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
953 0);
954
955 socket_factory_.AddSocketDataProvider(&http_data);
956 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
957
958 CreateSession();
959 // Send http request, ignore alternative service advertising if response
960 // header advertises alternative service for mail.example.org.
961 request_.url = GURL("http://mail.example.org:443");
962 SendRequestAndExpectHttpResponse("hello world");
963 base::WeakPtr<HttpServerProperties> http_server_properties =
964 session_->http_server_properties();
965 url::SchemeHostPort http_server("http", "mail.example.org", 443);
966 url::SchemeHostPort https_server("https", "mail.example.org", 443);
967 // Check alternative service is set for the correct origin.
968 EXPECT_EQ(2u,
969 http_server_properties->GetAlternativeServices(http_server).size());
970 EXPECT_EQ(
971 0u, http_server_properties->GetAlternativeServices(https_server).size());
972 }
973
974 TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
975 MockRead http_reads[] = {
976 MockRead("HTTP/1.1 200 OK\r\n"),
977 MockRead("Alt-Svc: quic=\"foo.example.org:443\", quic=\":444\"\r\n\r\n"),
978 MockRead("hello world"),
979 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
980 MockRead(ASYNC, OK)};
981
982 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
983 0);
984
985 socket_factory_.AddSocketDataProvider(&http_data);
986 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
987 socket_factory_.AddSocketDataProvider(&http_data);
988 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
989
990 CreateSession();
991
992 // Send https request and set alternative services if response header
993 // advertises alternative service for mail.example.org.
994 SendRequestAndExpectHttpResponse("hello world");
995 base::WeakPtr<HttpServerProperties> http_server_properties =
996 session_->http_server_properties();
997
998 const url::SchemeHostPort https_server(request_.url);
999 // Check alternative service is set.
1000 AlternativeServiceVector alternative_service_vector =
1001 http_server_properties->GetAlternativeServices(https_server);
1002 EXPECT_EQ(2u, alternative_service_vector.size());
1003
1004 // Send http request to the same origin but with diffrent scheme, should not
1005 // use QUIC.
1006 request_.url = GURL("http://mail.example.org:443");
1007 SendRequestAndExpectHttpResponse("hello world");
1008 }
1009
943 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) { 1010 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceQuicSupportedVersion) {
944 std::string altsvc_header = base::StringPrintf( 1011 std::string altsvc_header = base::StringPrintf(
945 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam()); 1012 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam());
946 MockRead http_reads[] = { 1013 MockRead http_reads[] = {
947 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()), 1014 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
948 MockRead("hello world"), 1015 MockRead("hello world"),
949 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 1016 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
950 MockRead(ASYNC, OK)}; 1017 MockRead(ASYNC, OK)};
951 1018
952 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, 1019 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
(...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 CreateSession(); 1769 CreateSession();
1703 1770
1704 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). 1771 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo().
1705 SendRequestAndExpectHttpResponse("hello world"); 1772 SendRequestAndExpectHttpResponse("hello world");
1706 } 1773 }
1707 1774
1708 class QuicAltSvcCertificateVerificationTest 1775 class QuicAltSvcCertificateVerificationTest
1709 : public QuicNetworkTransactionTest { 1776 : public QuicNetworkTransactionTest {
1710 public: 1777 public:
1711 void Run(bool valid) { 1778 void Run(bool valid) {
1712 HostPortPair origin(valid ? "mail.example.org" : "mail.example.com", 443); 1779 url::SchemeHostPort server(GURL(valid ? "https://mail.example.org:443"
1780 : "https://mail.example.com:443"));
1713 HostPortPair alternative("www.example.org", 443); 1781 HostPortPair alternative("www.example.org", 443);
1714 std::string url("https://"); 1782 std::string url("https://");
1715 url.append(origin.host()); 1783 url.append(server.host());
1716 url.append(":443"); 1784 url.append(":443");
1717 request_.url = GURL(url); 1785 request_.url = GURL(url);
1718 1786
1719 maker_.set_hostname(origin.host()); 1787 maker_.set_hostname(server.host());
1720 MockQuicData mock_quic_data; 1788 MockQuicData mock_quic_data;
1721 mock_quic_data.AddWrite( 1789 mock_quic_data.AddWrite(
1722 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, 1790 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
1723 GetRequestHeaders("GET", "https", "/"))); 1791 GetRequestHeaders("GET", "https", "/")));
1724 mock_quic_data.AddRead(ConstructResponseHeadersPacket( 1792 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1725 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); 1793 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
1726 mock_quic_data.AddRead( 1794 mock_quic_data.AddRead(
1727 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); 1795 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
1728 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 1796 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
1729 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); 1797 mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
1730 mock_quic_data.AddSocketDataToFactory(&socket_factory_); 1798 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1731 1799
1732 scoped_refptr<X509Certificate> cert( 1800 scoped_refptr<X509Certificate> cert(
1733 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem")); 1801 ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
1734 ASSERT_TRUE(cert.get()); 1802 ASSERT_TRUE(cert.get());
1735 bool common_name_fallback_used; 1803 bool common_name_fallback_used;
1736 EXPECT_EQ(valid, 1804 EXPECT_EQ(valid,
1737 cert->VerifyNameMatch(origin.host(), &common_name_fallback_used)); 1805 cert->VerifyNameMatch(server.host(), &common_name_fallback_used));
1738 EXPECT_TRUE( 1806 EXPECT_TRUE(
1739 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used)); 1807 cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
1740 ProofVerifyDetailsChromium verify_details; 1808 ProofVerifyDetailsChromium verify_details;
1741 verify_details.cert_verify_result.verified_cert = cert; 1809 verify_details.cert_verify_result.verified_cert = cert;
1742 verify_details.cert_verify_result.is_issued_by_known_root = true; 1810 verify_details.cert_verify_result.is_issued_by_known_root = true;
1743 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 1811 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
1744 crypto_client_stream_factory_.set_handshake_mode( 1812 crypto_client_stream_factory_.set_handshake_mode(
1745 MockCryptoClientStream::CONFIRM_HANDSHAKE); 1813 MockCryptoClientStream::CONFIRM_HANDSHAKE);
1746 1814
1747 // Connection to |origin| fails, so that success of |request| depends on 1815 // Connection to |server| fails, so that success of |request| depends on
1748 // connection to |alternate| only. 1816 // connection to |alternate| only.
1749 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); 1817 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED);
1750 StaticSocketDataProvider refused_data; 1818 StaticSocketDataProvider refused_data;
1751 refused_data.set_connect_data(refused_connect); 1819 refused_data.set_connect_data(refused_connect);
1752 socket_factory_.AddSocketDataProvider(&refused_data); 1820 socket_factory_.AddSocketDataProvider(&refused_data);
1753 1821
1754 CreateSession(); 1822 CreateSession();
1755 AlternativeService alternative_service(QUIC, alternative); 1823 AlternativeService alternative_service(QUIC, alternative);
1756 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); 1824 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
1757 session_->http_server_properties()->SetAlternativeService( 1825 session_->http_server_properties()->SetAlternativeService(
1758 origin, alternative_service, expiration); 1826 server, alternative_service, expiration);
1759 scoped_ptr<HttpNetworkTransaction> trans( 1827 scoped_ptr<HttpNetworkTransaction> trans(
1760 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 1828 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
1761 TestCompletionCallback callback; 1829 TestCompletionCallback callback;
1762 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); 1830 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
1763 EXPECT_EQ(ERR_IO_PENDING, rv); 1831 EXPECT_EQ(ERR_IO_PENDING, rv);
1764 rv = callback.WaitForResult(); 1832 rv = callback.WaitForResult();
1765 if (valid) { 1833 if (valid) {
1766 EXPECT_EQ(OK, rv); 1834 EXPECT_EQ(OK, rv);
1767 CheckWasQuicResponse(trans); 1835 CheckWasQuicResponse(trans);
1768 CheckResponsePort(trans, 443); 1836 CheckResponsePort(trans, 443);
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
2347 scoped_ptr<HttpNetworkTransaction> trans( 2415 scoped_ptr<HttpNetworkTransaction> trans(
2348 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); 2416 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get()));
2349 TestCompletionCallback callback; 2417 TestCompletionCallback callback;
2350 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); 2418 int rv = trans->Start(&request_, callback.callback(), net_log_.bound());
2351 EXPECT_EQ(ERR_IO_PENDING, rv); 2419 EXPECT_EQ(ERR_IO_PENDING, rv);
2352 EXPECT_NE(OK, callback.WaitForResult()); 2420 EXPECT_NE(OK, callback.WaitForResult());
2353 } 2421 }
2354 2422
2355 } // namespace test 2423 } // namespace test
2356 } // namespace net 2424 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698