OLD | NEW |
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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 | 56 |
57 namespace net { | 57 namespace net { |
58 namespace test { | 58 namespace test { |
59 | 59 |
60 namespace { | 60 namespace { |
61 | 61 |
62 static const char kQuicAlternateProtocolHeader[] = | 62 static const char kQuicAlternateProtocolHeader[] = |
63 "Alternate-Protocol: 443:quic\r\n\r\n"; | 63 "Alternate-Protocol: 443:quic\r\n\r\n"; |
64 static const char kQuicAlternateProtocol50pctHeader[] = | |
65 "Alternate-Protocol: 443:quic,p=.5\r\n\r\n"; | |
66 static const char kQuicAlternateProtocolDifferentPortHeader[] = | 64 static const char kQuicAlternateProtocolDifferentPortHeader[] = |
67 "Alternate-Protocol: 137:quic\r\n\r\n"; | 65 "Alternate-Protocol: 137:quic\r\n\r\n"; |
68 static const char kQuicAlternativeServiceHeader[] = | 66 static const char kQuicAlternativeServiceHeader[] = |
69 "Alt-Svc: quic=\":443\"\r\n\r\n"; | 67 "Alt-Svc: quic=\":443\"\r\n\r\n"; |
70 static const char kQuicAlternativeService50pctHeader[] = | |
71 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n"; | |
72 static const char kQuicAlternativeServiceDifferentPortHeader[] = | 68 static const char kQuicAlternativeServiceDifferentPortHeader[] = |
73 "Alt-Svc: quic=\":137\"\r\n\r\n"; | 69 "Alt-Svc: quic=\":137\"\r\n\r\n"; |
74 | 70 |
75 const char kDefaultServerHostName[] = "mail.example.org"; | 71 const char kDefaultServerHostName[] = "mail.example.org"; |
76 | 72 |
77 } // namespace | 73 } // namespace |
78 | 74 |
79 // Helper class to encapsulate MockReads and MockWrites for QUIC. | 75 // Helper class to encapsulate MockReads and MockWrites for QUIC. |
80 // Simplify ownership issues and the interaction with the MockSocketFactory. | 76 // Simplify ownership issues and the interaction with the MockSocketFactory. |
81 class MockQuicData { | 77 class MockQuicData { |
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); | 525 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); |
530 } | 526 } |
531 | 527 |
532 void AddQuicAlternateProtocolMapping( | 528 void AddQuicAlternateProtocolMapping( |
533 MockCryptoClientStream::HandshakeMode handshake_mode) { | 529 MockCryptoClientStream::HandshakeMode handshake_mode) { |
534 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 530 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
535 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 531 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); |
536 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); | 532 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); |
537 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 533 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
538 http_server_properties_.SetAlternativeService( | 534 http_server_properties_.SetAlternativeService( |
539 host_port_pair, alternative_service, 1.0, expiration); | 535 host_port_pair, alternative_service, expiration); |
540 } | 536 } |
541 | 537 |
542 void AddQuicRemoteAlternativeServiceMapping( | 538 void AddQuicRemoteAlternativeServiceMapping( |
543 MockCryptoClientStream::HandshakeMode handshake_mode, | 539 MockCryptoClientStream::HandshakeMode handshake_mode, |
544 const HostPortPair& alternative) { | 540 const HostPortPair& alternative) { |
545 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 541 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
546 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 542 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); |
547 AlternativeService alternative_service(QUIC, alternative.host(), | 543 AlternativeService alternative_service(QUIC, alternative.host(), |
548 alternative.port()); | 544 alternative.port()); |
549 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 545 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
550 http_server_properties_.SetAlternativeService( | 546 http_server_properties_.SetAlternativeService( |
551 host_port_pair, alternative_service, 1.0, expiration); | 547 host_port_pair, alternative_service, expiration); |
552 } | 548 } |
553 | 549 |
554 void ExpectBrokenAlternateProtocolMapping() { | 550 void ExpectBrokenAlternateProtocolMapping() { |
555 const HostPortPair origin = HostPortPair::FromURL(request_.url); | 551 const HostPortPair origin = HostPortPair::FromURL(request_.url); |
556 const AlternativeServiceVector alternative_service_vector = | 552 const AlternativeServiceVector alternative_service_vector = |
557 http_server_properties_.GetAlternativeServices(origin); | 553 http_server_properties_.GetAlternativeServices(origin); |
558 EXPECT_EQ(1u, alternative_service_vector.size()); | 554 EXPECT_EQ(1u, alternative_service_vector.size()); |
559 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( | 555 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( |
560 alternative_service_vector[0])); | 556 alternative_service_vector[0])); |
561 } | 557 } |
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1425 | 1421 |
1426 SendRequestAndExpectHttpResponse("hello world"); | 1422 SendRequestAndExpectHttpResponse("hello world"); |
1427 SendRequestAndExpectQuicResponse("hello!"); | 1423 SendRequestAndExpectQuicResponse("hello!"); |
1428 | 1424 |
1429 mock_quic_data.Resume(); | 1425 mock_quic_data.Resume(); |
1430 | 1426 |
1431 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 1427 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
1432 alternative_service)); | 1428 alternative_service)); |
1433 } | 1429 } |
1434 | 1430 |
1435 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) { | |
1436 MockRead http_reads[] = { | |
1437 MockRead("HTTP/1.1 200 OK\r\n"), | |
1438 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"), | |
1439 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1440 MockRead(ASYNC, OK)}; | |
1441 | |
1442 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1443 0); | |
1444 socket_factory_.AddSocketDataProvider(&http_data); | |
1445 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1446 | |
1447 MockQuicData mock_quic_data; | |
1448 mock_quic_data.AddWrite( | |
1449 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | |
1450 GetRequestHeaders("GET", "https", "/"))); | |
1451 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
1452 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | |
1453 mock_quic_data.AddRead( | |
1454 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | |
1455 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
1456 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | |
1457 mock_quic_data.AddRead(ASYNC, 0); // EOF | |
1458 | |
1459 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | |
1460 | |
1461 AddHangingNonAlternateProtocolSocketData(); | |
1462 params_.alternative_service_probability_threshold = 0.25; | |
1463 CreateSession(); | |
1464 | |
1465 SendRequestAndExpectHttpResponse("hello world"); | |
1466 SendRequestAndExpectQuicResponse("hello!"); | |
1467 } | |
1468 | |
1469 TEST_P(QuicNetworkTransactionTest, | |
1470 DontUseAlternativeServiceProbabilityForQuic) { | |
1471 MockRead http_reads[] = { | |
1472 MockRead("HTTP/1.1 200 OK\r\n"), | |
1473 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"), | |
1474 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1475 MockRead(ASYNC, OK)}; | |
1476 | |
1477 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1478 0); | |
1479 socket_factory_.AddSocketDataProvider(&http_data); | |
1480 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1481 socket_factory_.AddSocketDataProvider(&http_data); | |
1482 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1483 | |
1484 params_.alternative_service_probability_threshold = 0.75; | |
1485 CreateSession(); | |
1486 | |
1487 SendRequestAndExpectHttpResponse("hello world"); | |
1488 SendRequestAndExpectHttpResponse("hello world"); | |
1489 } | |
1490 | |
1491 TEST_P(QuicNetworkTransactionTest, | |
1492 DontUseAlternativeServiceWithBadProbabilityForQuic) { | |
1493 MockRead http_reads[] = { | |
1494 MockRead("HTTP/1.1 200 OK\r\n"), | |
1495 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"), | |
1496 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1497 MockRead(ASYNC, OK)}; | |
1498 | |
1499 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1500 0); | |
1501 socket_factory_.AddSocketDataProvider(&http_data); | |
1502 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1503 socket_factory_.AddSocketDataProvider(&http_data); | |
1504 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1505 | |
1506 params_.alternative_service_probability_threshold = 0.75; | |
1507 CreateSession(); | |
1508 | |
1509 SendRequestAndExpectHttpResponse("hello world"); | |
1510 SendRequestAndExpectHttpResponse("hello world"); | |
1511 } | |
1512 | |
1513 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) { | 1431 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) { |
1514 MockRead http_reads[] = { | 1432 MockRead http_reads[] = { |
1515 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), | 1433 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), |
1516 MockRead("hello world"), | 1434 MockRead("hello world"), |
1517 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1435 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
1518 MockRead(ASYNC, OK)}; | 1436 MockRead(ASYNC, OK)}; |
1519 | 1437 |
1520 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1438 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
1521 0); | 1439 0); |
1522 socket_factory_.AddSocketDataProvider(&http_data); | 1440 socket_factory_.AddSocketDataProvider(&http_data); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1660 | 1578 |
1661 SendRequestAndExpectHttpResponse("hello world"); | 1579 SendRequestAndExpectHttpResponse("hello world"); |
1662 SendRequestAndExpectQuicResponse("hello!"); | 1580 SendRequestAndExpectQuicResponse("hello!"); |
1663 | 1581 |
1664 mock_quic_data.Resume(); | 1582 mock_quic_data.Resume(); |
1665 | 1583 |
1666 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 1584 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
1667 alternative_service)); | 1585 alternative_service)); |
1668 } | 1586 } |
1669 | 1587 |
1670 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) { | |
1671 params_.parse_alternative_services = false; | |
1672 MockRead http_reads[] = { | |
1673 MockRead("HTTP/1.1 200 OK\r\n"), | |
1674 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"), | |
1675 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1676 MockRead(ASYNC, OK)}; | |
1677 | |
1678 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1679 0); | |
1680 socket_factory_.AddSocketDataProvider(&http_data); | |
1681 | |
1682 MockQuicData mock_quic_data; | |
1683 mock_quic_data.AddWrite( | |
1684 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | |
1685 GetRequestHeaders("GET", "https", "/"))); | |
1686 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
1687 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | |
1688 mock_quic_data.AddRead( | |
1689 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | |
1690 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
1691 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | |
1692 mock_quic_data.AddRead(ASYNC, 0); // EOF | |
1693 | |
1694 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | |
1695 | |
1696 // The non-alternate protocol job needs to hang in order to guarantee that | |
1697 // the alternate-protocol job will "win". | |
1698 AddHangingNonAlternateProtocolSocketData(); | |
1699 | |
1700 params_.alternative_service_probability_threshold = .25; | |
1701 params_.parse_alternative_services = false; | |
1702 CreateSession(); | |
1703 | |
1704 SendRequestAndExpectHttpResponse("hello world"); | |
1705 SendRequestAndExpectQuicResponse("hello!"); | |
1706 } | |
1707 | |
1708 TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) { | |
1709 params_.parse_alternative_services = false; | |
1710 MockRead http_reads[] = { | |
1711 MockRead("HTTP/1.1 200 OK\r\n"), | |
1712 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"), | |
1713 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1714 MockRead(ASYNC, OK)}; | |
1715 | |
1716 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1717 0); | |
1718 socket_factory_.AddSocketDataProvider(&http_data); | |
1719 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1720 socket_factory_.AddSocketDataProvider(&http_data); | |
1721 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1722 | |
1723 params_.alternative_service_probability_threshold = .75; | |
1724 CreateSession(); | |
1725 | |
1726 SendRequestAndExpectHttpResponse("hello world"); | |
1727 SendRequestAndExpectHttpResponse("hello world"); | |
1728 } | |
1729 | |
1730 TEST_P(QuicNetworkTransactionTest, | |
1731 DontUseAlternateProtocolWithBadProbabilityForQuic) { | |
1732 params_.parse_alternative_services = false; | |
1733 MockRead http_reads[] = { | |
1734 MockRead("HTTP/1.1 200 OK\r\n"), | |
1735 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"), | |
1736 MockRead("hello world"), | |
1737 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1738 MockRead(ASYNC, OK)}; | |
1739 | |
1740 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1741 0); | |
1742 socket_factory_.AddSocketDataProvider(&http_data); | |
1743 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1744 socket_factory_.AddSocketDataProvider(&http_data); | |
1745 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1746 | |
1747 params_.alternative_service_probability_threshold = .75; | |
1748 CreateSession(); | |
1749 | |
1750 SendRequestAndExpectHttpResponse("hello world"); | |
1751 SendRequestAndExpectHttpResponse("hello world"); | |
1752 } | |
1753 | |
1754 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { | 1588 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { |
1755 params_.parse_alternative_services = false; | 1589 params_.parse_alternative_services = false; |
1756 MockRead http_reads[] = { | 1590 MockRead http_reads[] = { |
1757 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), | 1591 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
1758 MockRead("hello world"), | 1592 MockRead("hello world"), |
1759 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1593 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
1760 MockRead(ASYNC, OK)}; | 1594 MockRead(ASYNC, OK)}; |
1761 | 1595 |
1762 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1596 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
1763 0); | 1597 0); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1830 // connection to |alternate| only. | 1664 // connection to |alternate| only. |
1831 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); | 1665 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); |
1832 StaticSocketDataProvider refused_data; | 1666 StaticSocketDataProvider refused_data; |
1833 refused_data.set_connect_data(refused_connect); | 1667 refused_data.set_connect_data(refused_connect); |
1834 socket_factory_.AddSocketDataProvider(&refused_data); | 1668 socket_factory_.AddSocketDataProvider(&refused_data); |
1835 | 1669 |
1836 CreateSession(); | 1670 CreateSession(); |
1837 AlternativeService alternative_service(QUIC, alternative); | 1671 AlternativeService alternative_service(QUIC, alternative); |
1838 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 1672 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
1839 session_->http_server_properties()->SetAlternativeService( | 1673 session_->http_server_properties()->SetAlternativeService( |
1840 origin, alternative_service, 1.0, expiration); | 1674 origin, alternative_service, expiration); |
1841 scoped_ptr<HttpNetworkTransaction> trans( | 1675 scoped_ptr<HttpNetworkTransaction> trans( |
1842 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 1676 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
1843 TestCompletionCallback callback; | 1677 TestCompletionCallback callback; |
1844 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 1678 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
1845 EXPECT_EQ(ERR_IO_PENDING, rv); | 1679 EXPECT_EQ(ERR_IO_PENDING, rv); |
1846 rv = callback.WaitForResult(); | 1680 rv = callback.WaitForResult(); |
1847 if (valid) { | 1681 if (valid) { |
1848 EXPECT_EQ(OK, rv); | 1682 EXPECT_EQ(OK, rv); |
1849 CheckWasQuicResponse(trans); | 1683 CheckWasQuicResponse(trans); |
1850 CheckResponsePort(trans, 443); | 1684 CheckResponsePort(trans, 443); |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2427 scoped_ptr<HttpNetworkTransaction> trans( | 2261 scoped_ptr<HttpNetworkTransaction> trans( |
2428 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 2262 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
2429 TestCompletionCallback callback; | 2263 TestCompletionCallback callback; |
2430 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 2264 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
2431 EXPECT_EQ(ERR_IO_PENDING, rv); | 2265 EXPECT_EQ(ERR_IO_PENDING, rv); |
2432 EXPECT_NE(OK, callback.WaitForResult()); | 2266 EXPECT_NE(OK, callback.WaitForResult()); |
2433 } | 2267 } |
2434 | 2268 |
2435 } // namespace test | 2269 } // namespace test |
2436 } // namespace net | 2270 } // namespace net |
OLD | NEW |