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 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); | 506 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); |
511 } | 507 } |
512 | 508 |
513 void AddQuicAlternateProtocolMapping( | 509 void AddQuicAlternateProtocolMapping( |
514 MockCryptoClientStream::HandshakeMode handshake_mode) { | 510 MockCryptoClientStream::HandshakeMode handshake_mode) { |
515 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 511 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
516 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 512 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); |
517 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); | 513 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); |
518 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 514 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
519 http_server_properties_.SetAlternativeService( | 515 http_server_properties_.SetAlternativeService( |
520 host_port_pair, alternative_service, 1.0, expiration); | 516 host_port_pair, alternative_service, expiration); |
521 } | 517 } |
522 | 518 |
523 void AddQuicRemoteAlternativeServiceMapping( | 519 void AddQuicRemoteAlternativeServiceMapping( |
524 MockCryptoClientStream::HandshakeMode handshake_mode, | 520 MockCryptoClientStream::HandshakeMode handshake_mode, |
525 const HostPortPair& alternative) { | 521 const HostPortPair& alternative) { |
526 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 522 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
527 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 523 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); |
528 AlternativeService alternative_service(QUIC, alternative.host(), | 524 AlternativeService alternative_service(QUIC, alternative.host(), |
529 alternative.port()); | 525 alternative.port()); |
530 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 526 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
531 http_server_properties_.SetAlternativeService( | 527 http_server_properties_.SetAlternativeService( |
532 host_port_pair, alternative_service, 1.0, expiration); | 528 host_port_pair, alternative_service, expiration); |
533 } | 529 } |
534 | 530 |
535 void ExpectBrokenAlternateProtocolMapping() { | 531 void ExpectBrokenAlternateProtocolMapping() { |
536 const HostPortPair origin = HostPortPair::FromURL(request_.url); | 532 const HostPortPair origin = HostPortPair::FromURL(request_.url); |
537 const AlternativeServiceVector alternative_service_vector = | 533 const AlternativeServiceVector alternative_service_vector = |
538 http_server_properties_.GetAlternativeServices(origin); | 534 http_server_properties_.GetAlternativeServices(origin); |
539 EXPECT_EQ(1u, alternative_service_vector.size()); | 535 EXPECT_EQ(1u, alternative_service_vector.size()); |
540 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( | 536 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( |
541 alternative_service_vector[0])); | 537 alternative_service_vector[0])); |
542 } | 538 } |
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1345 | 1341 |
1346 SendRequestAndExpectHttpResponse("hello world"); | 1342 SendRequestAndExpectHttpResponse("hello world"); |
1347 SendRequestAndExpectQuicResponse("hello!"); | 1343 SendRequestAndExpectQuicResponse("hello!"); |
1348 | 1344 |
1349 mock_quic_data.Resume(); | 1345 mock_quic_data.Resume(); |
1350 | 1346 |
1351 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 1347 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
1352 alternative_service)); | 1348 alternative_service)); |
1353 } | 1349 } |
1354 | 1350 |
1355 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) { | |
1356 MockRead http_reads[] = { | |
1357 MockRead("HTTP/1.1 200 OK\r\n"), | |
1358 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"), | |
1359 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1360 MockRead(ASYNC, OK)}; | |
1361 | |
1362 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1363 0); | |
1364 socket_factory_.AddSocketDataProvider(&http_data); | |
1365 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1366 | |
1367 MockQuicData mock_quic_data; | |
1368 mock_quic_data.AddWrite( | |
1369 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | |
1370 GetRequestHeaders("GET", "https", "/"))); | |
1371 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
1372 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | |
1373 mock_quic_data.AddRead( | |
1374 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | |
1375 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
1376 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | |
1377 mock_quic_data.AddRead(ASYNC, 0); // EOF | |
1378 | |
1379 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | |
1380 | |
1381 AddHangingNonAlternateProtocolSocketData(); | |
1382 params_.alternative_service_probability_threshold = 0.25; | |
1383 CreateSession(); | |
1384 | |
1385 SendRequestAndExpectHttpResponse("hello world"); | |
1386 SendRequestAndExpectQuicResponse("hello!"); | |
1387 } | |
1388 | |
1389 TEST_P(QuicNetworkTransactionTest, | |
1390 DontUseAlternativeServiceProbabilityForQuic) { | |
1391 MockRead http_reads[] = { | |
1392 MockRead("HTTP/1.1 200 OK\r\n"), | |
1393 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"), | |
1394 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1395 MockRead(ASYNC, OK)}; | |
1396 | |
1397 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1398 0); | |
1399 socket_factory_.AddSocketDataProvider(&http_data); | |
1400 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1401 socket_factory_.AddSocketDataProvider(&http_data); | |
1402 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1403 | |
1404 params_.alternative_service_probability_threshold = 0.75; | |
1405 CreateSession(); | |
1406 | |
1407 SendRequestAndExpectHttpResponse("hello world"); | |
1408 SendRequestAndExpectHttpResponse("hello world"); | |
1409 } | |
1410 | |
1411 TEST_P(QuicNetworkTransactionTest, | |
1412 DontUseAlternativeServiceWithBadProbabilityForQuic) { | |
1413 MockRead http_reads[] = { | |
1414 MockRead("HTTP/1.1 200 OK\r\n"), | |
1415 MockRead("Alt-Svc: quic=\":443\";p=2\r\n\r\n"), MockRead("hello world"), | |
1416 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1417 MockRead(ASYNC, OK)}; | |
1418 | |
1419 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1420 0); | |
1421 socket_factory_.AddSocketDataProvider(&http_data); | |
1422 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1423 socket_factory_.AddSocketDataProvider(&http_data); | |
1424 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1425 | |
1426 params_.alternative_service_probability_threshold = 0.75; | |
1427 CreateSession(); | |
1428 | |
1429 SendRequestAndExpectHttpResponse("hello world"); | |
1430 SendRequestAndExpectHttpResponse("hello world"); | |
1431 } | |
1432 | |
1433 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) { | 1351 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) { |
1434 MockRead http_reads[] = { | 1352 MockRead http_reads[] = { |
1435 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), | 1353 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), |
1436 MockRead("hello world"), | 1354 MockRead("hello world"), |
1437 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1355 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
1438 MockRead(ASYNC, OK)}; | 1356 MockRead(ASYNC, OK)}; |
1439 | 1357 |
1440 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1358 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
1441 0); | 1359 0); |
1442 socket_factory_.AddSocketDataProvider(&http_data); | 1360 socket_factory_.AddSocketDataProvider(&http_data); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1580 | 1498 |
1581 SendRequestAndExpectHttpResponse("hello world"); | 1499 SendRequestAndExpectHttpResponse("hello world"); |
1582 SendRequestAndExpectQuicResponse("hello!"); | 1500 SendRequestAndExpectQuicResponse("hello!"); |
1583 | 1501 |
1584 mock_quic_data.Resume(); | 1502 mock_quic_data.Resume(); |
1585 | 1503 |
1586 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 1504 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
1587 alternative_service)); | 1505 alternative_service)); |
1588 } | 1506 } |
1589 | 1507 |
1590 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolProbabilityForQuic) { | |
1591 params_.parse_alternative_services = false; | |
1592 MockRead http_reads[] = { | |
1593 MockRead("HTTP/1.1 200 OK\r\n"), | |
1594 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"), | |
1595 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1596 MockRead(ASYNC, OK)}; | |
1597 | |
1598 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1599 0); | |
1600 socket_factory_.AddSocketDataProvider(&http_data); | |
1601 | |
1602 MockQuicData mock_quic_data; | |
1603 mock_quic_data.AddWrite( | |
1604 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | |
1605 GetRequestHeaders("GET", "https", "/"))); | |
1606 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
1607 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | |
1608 mock_quic_data.AddRead( | |
1609 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | |
1610 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
1611 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | |
1612 mock_quic_data.AddRead(ASYNC, 0); // EOF | |
1613 | |
1614 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | |
1615 | |
1616 // The non-alternate protocol job needs to hang in order to guarantee that | |
1617 // the alternate-protocol job will "win". | |
1618 AddHangingNonAlternateProtocolSocketData(); | |
1619 | |
1620 params_.alternative_service_probability_threshold = .25; | |
1621 params_.parse_alternative_services = false; | |
1622 CreateSession(); | |
1623 | |
1624 SendRequestAndExpectHttpResponse("hello world"); | |
1625 SendRequestAndExpectQuicResponse("hello!"); | |
1626 } | |
1627 | |
1628 TEST_P(QuicNetworkTransactionTest, DontUseAlternateProtocolProbabilityForQuic) { | |
1629 params_.parse_alternative_services = false; | |
1630 MockRead http_reads[] = { | |
1631 MockRead("HTTP/1.1 200 OK\r\n"), | |
1632 MockRead(kQuicAlternateProtocol50pctHeader), MockRead("hello world"), | |
1633 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1634 MockRead(ASYNC, OK)}; | |
1635 | |
1636 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1637 0); | |
1638 socket_factory_.AddSocketDataProvider(&http_data); | |
1639 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1640 socket_factory_.AddSocketDataProvider(&http_data); | |
1641 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1642 | |
1643 params_.alternative_service_probability_threshold = .75; | |
1644 CreateSession(); | |
1645 | |
1646 SendRequestAndExpectHttpResponse("hello world"); | |
1647 SendRequestAndExpectHttpResponse("hello world"); | |
1648 } | |
1649 | |
1650 TEST_P(QuicNetworkTransactionTest, | |
1651 DontUseAlternateProtocolWithBadProbabilityForQuic) { | |
1652 params_.parse_alternative_services = false; | |
1653 MockRead http_reads[] = { | |
1654 MockRead("HTTP/1.1 200 OK\r\n"), | |
1655 MockRead("Alternate-Protocol: 443:quic,p=2\r\n\r\n"), | |
1656 MockRead("hello world"), | |
1657 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1658 MockRead(ASYNC, OK)}; | |
1659 | |
1660 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1661 0); | |
1662 socket_factory_.AddSocketDataProvider(&http_data); | |
1663 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1664 socket_factory_.AddSocketDataProvider(&http_data); | |
1665 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1666 | |
1667 params_.alternative_service_probability_threshold = .75; | |
1668 CreateSession(); | |
1669 | |
1670 SendRequestAndExpectHttpResponse("hello world"); | |
1671 SendRequestAndExpectHttpResponse("hello world"); | |
1672 } | |
1673 | |
1674 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { | 1508 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { |
1675 params_.parse_alternative_services = false; | 1509 params_.parse_alternative_services = false; |
1676 MockRead http_reads[] = { | 1510 MockRead http_reads[] = { |
1677 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), | 1511 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
1678 MockRead("hello world"), | 1512 MockRead("hello world"), |
1679 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1513 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
1680 MockRead(ASYNC, OK)}; | 1514 MockRead(ASYNC, OK)}; |
1681 | 1515 |
1682 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1516 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
1683 0); | 1517 0); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1750 // connection to |alternate| only. | 1584 // connection to |alternate| only. |
1751 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); | 1585 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); |
1752 StaticSocketDataProvider refused_data; | 1586 StaticSocketDataProvider refused_data; |
1753 refused_data.set_connect_data(refused_connect); | 1587 refused_data.set_connect_data(refused_connect); |
1754 socket_factory_.AddSocketDataProvider(&refused_data); | 1588 socket_factory_.AddSocketDataProvider(&refused_data); |
1755 | 1589 |
1756 CreateSession(); | 1590 CreateSession(); |
1757 AlternativeService alternative_service(QUIC, alternative); | 1591 AlternativeService alternative_service(QUIC, alternative); |
1758 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 1592 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
1759 session_->http_server_properties()->SetAlternativeService( | 1593 session_->http_server_properties()->SetAlternativeService( |
1760 origin, alternative_service, 1.0, expiration); | 1594 origin, alternative_service, expiration); |
1761 scoped_ptr<HttpNetworkTransaction> trans( | 1595 scoped_ptr<HttpNetworkTransaction> trans( |
1762 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 1596 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
1763 TestCompletionCallback callback; | 1597 TestCompletionCallback callback; |
1764 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 1598 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
1765 EXPECT_EQ(ERR_IO_PENDING, rv); | 1599 EXPECT_EQ(ERR_IO_PENDING, rv); |
1766 rv = callback.WaitForResult(); | 1600 rv = callback.WaitForResult(); |
1767 if (valid) { | 1601 if (valid) { |
1768 EXPECT_EQ(OK, rv); | 1602 EXPECT_EQ(OK, rv); |
1769 CheckWasQuicResponse(trans); | 1603 CheckWasQuicResponse(trans); |
1770 CheckResponsePort(trans, 443); | 1604 CheckResponsePort(trans, 443); |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2347 scoped_ptr<HttpNetworkTransaction> trans( | 2181 scoped_ptr<HttpNetworkTransaction> trans( |
2348 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 2182 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
2349 TestCompletionCallback callback; | 2183 TestCompletionCallback callback; |
2350 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 2184 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
2351 EXPECT_EQ(ERR_IO_PENDING, rv); | 2185 EXPECT_EQ(ERR_IO_PENDING, rv); |
2352 EXPECT_NE(OK, callback.WaitForResult()); | 2186 EXPECT_NE(OK, callback.WaitForResult()); |
2353 } | 2187 } |
2354 | 2188 |
2355 } // namespace test | 2189 } // namespace test |
2356 } // namespace net | 2190 } // namespace net |
OLD | NEW |