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"; |
64 static const char kQuicAlternateProtocolDifferentPortHeader[] = | 66 static const char kQuicAlternateProtocolDifferentPortHeader[] = |
65 "Alternate-Protocol: 137:quic\r\n\r\n"; | 67 "Alternate-Protocol: 137:quic\r\n\r\n"; |
66 static const char kQuicAlternativeServiceHeader[] = | 68 static const char kQuicAlternativeServiceHeader[] = |
67 "Alt-Svc: quic=\":443\"\r\n\r\n"; | 69 "Alt-Svc: quic=\":443\"\r\n\r\n"; |
| 70 static const char kQuicAlternativeService50pctHeader[] = |
| 71 "Alt-Svc: quic=\":443\";p=\".5\"\r\n\r\n"; |
68 static const char kQuicAlternativeServiceDifferentPortHeader[] = | 72 static const char kQuicAlternativeServiceDifferentPortHeader[] = |
69 "Alt-Svc: quic=\":137\"\r\n\r\n"; | 73 "Alt-Svc: quic=\":137\"\r\n\r\n"; |
70 | 74 |
71 const char kDefaultServerHostName[] = "mail.example.org"; | 75 const char kDefaultServerHostName[] = "mail.example.org"; |
72 | 76 |
73 } // namespace | 77 } // namespace |
74 | 78 |
75 // Helper class to encapsulate MockReads and MockWrites for QUIC. | 79 // Helper class to encapsulate MockReads and MockWrites for QUIC. |
76 // Simplify ownership issues and the interaction with the MockSocketFactory. | 80 // Simplify ownership issues and the interaction with the MockSocketFactory. |
77 class MockQuicData { | 81 class MockQuicData { |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); | 510 SendRequestAndExpectQuicResponseMaybeFromProxy(expected, true, port); |
507 } | 511 } |
508 | 512 |
509 void AddQuicAlternateProtocolMapping( | 513 void AddQuicAlternateProtocolMapping( |
510 MockCryptoClientStream::HandshakeMode handshake_mode) { | 514 MockCryptoClientStream::HandshakeMode handshake_mode) { |
511 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 515 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
512 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 516 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); |
513 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); | 517 AlternativeService alternative_service(QUIC, host_port_pair.host(), 443); |
514 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 518 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
515 http_server_properties_.SetAlternativeService( | 519 http_server_properties_.SetAlternativeService( |
516 host_port_pair, alternative_service, expiration); | 520 host_port_pair, alternative_service, 1.0, expiration); |
517 } | 521 } |
518 | 522 |
519 void AddQuicRemoteAlternativeServiceMapping( | 523 void AddQuicRemoteAlternativeServiceMapping( |
520 MockCryptoClientStream::HandshakeMode handshake_mode, | 524 MockCryptoClientStream::HandshakeMode handshake_mode, |
521 const HostPortPair& alternative) { | 525 const HostPortPair& alternative) { |
522 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); | 526 crypto_client_stream_factory_.set_handshake_mode(handshake_mode); |
523 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); | 527 HostPortPair host_port_pair = HostPortPair::FromURL(request_.url); |
524 AlternativeService alternative_service(QUIC, alternative.host(), | 528 AlternativeService alternative_service(QUIC, alternative.host(), |
525 alternative.port()); | 529 alternative.port()); |
526 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 530 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
527 http_server_properties_.SetAlternativeService( | 531 http_server_properties_.SetAlternativeService( |
528 host_port_pair, alternative_service, expiration); | 532 host_port_pair, alternative_service, 1.0, expiration); |
529 } | 533 } |
530 | 534 |
531 void ExpectBrokenAlternateProtocolMapping() { | 535 void ExpectBrokenAlternateProtocolMapping() { |
532 const HostPortPair origin = HostPortPair::FromURL(request_.url); | 536 const HostPortPair origin = HostPortPair::FromURL(request_.url); |
533 const AlternativeServiceVector alternative_service_vector = | 537 const AlternativeServiceVector alternative_service_vector = |
534 http_server_properties_.GetAlternativeServices(origin); | 538 http_server_properties_.GetAlternativeServices(origin); |
535 EXPECT_EQ(1u, alternative_service_vector.size()); | 539 EXPECT_EQ(1u, alternative_service_vector.size()); |
536 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( | 540 EXPECT_TRUE(http_server_properties_.IsAlternativeServiceBroken( |
537 alternative_service_vector[0])); | 541 alternative_service_vector[0])); |
538 } | 542 } |
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1341 | 1345 |
1342 SendRequestAndExpectHttpResponse("hello world"); | 1346 SendRequestAndExpectHttpResponse("hello world"); |
1343 SendRequestAndExpectQuicResponse("hello!"); | 1347 SendRequestAndExpectQuicResponse("hello!"); |
1344 | 1348 |
1345 mock_quic_data.Resume(); | 1349 mock_quic_data.Resume(); |
1346 | 1350 |
1347 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 1351 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
1348 alternative_service)); | 1352 alternative_service)); |
1349 } | 1353 } |
1350 | 1354 |
1351 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceForQuicForHttps) { | 1355 TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceProbabilityForQuic) { |
1352 MockRead http_reads[] = { | 1356 MockRead http_reads[] = { |
1353 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), | 1357 MockRead("HTTP/1.1 200 OK\r\n"), |
1354 MockRead("hello world"), | 1358 MockRead(kQuicAlternativeService50pctHeader), MockRead("hello world"), |
1355 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1359 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
1356 MockRead(ASYNC, OK)}; | 1360 MockRead(ASYNC, OK)}; |
1357 | 1361 |
1358 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | |
1359 0); | |
1360 socket_factory_.AddSocketDataProvider(&http_data); | |
1361 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | |
1362 | |
1363 MockQuicData mock_quic_data; | |
1364 mock_quic_data.AddWrite( | |
1365 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | |
1366 GetRequestHeaders("GET", "https", "/"))); | |
1367 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | |
1368 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | |
1369 mock_quic_data.AddRead( | |
1370 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | |
1371 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
1372 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | |
1373 | |
1374 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | |
1375 | |
1376 AddHangingNonAlternateProtocolSocketData(); | |
1377 CreateSession(); | |
1378 | |
1379 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). | |
1380 SendRequestAndExpectHttpResponse("hello world"); | |
1381 } | |
1382 | |
1383 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { | |
1384 MockRead http_reads[] = { | |
1385 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), | |
1386 MockRead("hello world"), | |
1387 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | |
1388 MockRead(ASYNC, OK)}; | |
1389 | |
1390 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1362 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
1391 0); | 1363 0); |
1392 socket_factory_.AddSocketDataProvider(&http_data); | 1364 socket_factory_.AddSocketDataProvider(&http_data); |
1393 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 1365 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
1394 | 1366 |
1395 MockQuicData mock_quic_data; | 1367 MockQuicData mock_quic_data; |
1396 mock_quic_data.AddWrite( | 1368 mock_quic_data.AddWrite( |
1397 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1369 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
1398 GetRequestHeaders("GET", "https", "/"))); | 1370 GetRequestHeaders("GET", "https", "/"))); |
1399 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1371 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
1400 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 1372 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
1401 mock_quic_data.AddRead( | 1373 mock_quic_data.AddRead( |
1402 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1374 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
1403 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1375 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
1404 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1376 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
1405 mock_quic_data.AddRead(ASYNC, 0); // EOF | 1377 mock_quic_data.AddRead(ASYNC, 0); // EOF |
1406 | 1378 |
1407 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1379 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
1408 | 1380 |
1409 // The non-alternate protocol job needs to hang in order to guarantee that | |
1410 // the alternate-protocol job will "win". | |
1411 AddHangingNonAlternateProtocolSocketData(); | 1381 AddHangingNonAlternateProtocolSocketData(); |
1412 | 1382 params_.alternative_service_probability_threshold = 0.25; |
1413 params_.parse_alternative_services = false; | |
1414 params_.parse_alternative_services = false; | |
1415 CreateSession(); | 1383 CreateSession(); |
1416 | 1384 |
1417 SendRequestAndExpectHttpResponse("hello world"); | 1385 SendRequestAndExpectHttpResponse("hello world"); |
1418 SendRequestAndExpectQuicResponse("hello!"); | 1386 SendRequestAndExpectQuicResponse("hello!"); |
1419 } | 1387 } |
1420 | 1388 |
1421 TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) { | 1389 TEST_P(QuicNetworkTransactionTest, |
| 1390 DontUseAlternativeServiceProbabilityForQuic) { |
1422 MockRead http_reads[] = { | 1391 MockRead http_reads[] = { |
1423 MockRead("HTTP/1.1 200 OK\r\n"), | 1392 MockRead("HTTP/1.1 200 OK\r\n"), |
1424 MockRead(kQuicAlternateProtocolDifferentPortHeader), | 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) { |
| 1434 MockRead http_reads[] = { |
| 1435 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternativeServiceHeader), |
1425 MockRead("hello world"), | 1436 MockRead("hello world"), |
1426 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1437 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
1427 MockRead(ASYNC, OK)}; | 1438 MockRead(ASYNC, OK)}; |
| 1439 |
| 1440 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 1441 0); |
| 1442 socket_factory_.AddSocketDataProvider(&http_data); |
| 1443 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1444 |
| 1445 MockQuicData mock_quic_data; |
| 1446 mock_quic_data.AddWrite( |
| 1447 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1448 GetRequestHeaders("GET", "https", "/"))); |
| 1449 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1450 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1451 mock_quic_data.AddRead( |
| 1452 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1453 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1454 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 1455 |
| 1456 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1457 |
| 1458 AddHangingNonAlternateProtocolSocketData(); |
| 1459 CreateSession(); |
| 1460 |
| 1461 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). |
| 1462 SendRequestAndExpectHttpResponse("hello world"); |
| 1463 } |
| 1464 |
| 1465 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { |
| 1466 MockRead http_reads[] = { |
| 1467 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
| 1468 MockRead("hello world"), |
| 1469 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1470 MockRead(ASYNC, OK)}; |
1428 | 1471 |
1429 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1472 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
1430 0); | 1473 0); |
1431 socket_factory_.AddSocketDataProvider(&http_data); | 1474 socket_factory_.AddSocketDataProvider(&http_data); |
1432 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 1475 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
1433 | 1476 |
1434 MockQuicData mock_quic_data; | 1477 MockQuicData mock_quic_data; |
1435 mock_quic_data.AddWrite( | 1478 mock_quic_data.AddWrite( |
1436 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, | 1479 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
1437 GetRequestHeaders("GET", "https", "/"))); | 1480 GetRequestHeaders("GET", "https", "/"))); |
1438 mock_quic_data.AddRead(ConstructResponseHeadersPacket( | 1481 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
1439 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); | 1482 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
1440 mock_quic_data.AddRead( | 1483 mock_quic_data.AddRead( |
1441 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); | 1484 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
1442 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | 1485 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
1443 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read | 1486 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
1444 mock_quic_data.AddRead(ASYNC, 0); // EOF | 1487 mock_quic_data.AddRead(ASYNC, 0); // EOF |
1445 | 1488 |
1446 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1489 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
1447 | 1490 |
1448 // The non-alternate protocol job needs to hang in order to guarantee that | 1491 // The non-alternate protocol job needs to hang in order to guarantee that |
1449 // the alternate-protocol job will "win". | 1492 // the alternate-protocol job will "win". |
1450 AddHangingNonAlternateProtocolSocketData(); | 1493 AddHangingNonAlternateProtocolSocketData(); |
1451 | 1494 |
1452 params_.parse_alternative_services = false; | 1495 params_.parse_alternative_services = false; |
| 1496 params_.parse_alternative_services = false; |
1453 CreateSession(); | 1497 CreateSession(); |
1454 | 1498 |
1455 SendRequestAndExpectHttpResponse("hello world"); | 1499 SendRequestAndExpectHttpResponse("hello world"); |
1456 SendRequestAndExpectQuicResponseOnPort("hello!", 137); | 1500 SendRequestAndExpectQuicResponse("hello!"); |
1457 } | 1501 } |
1458 | 1502 |
1459 TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) { | 1503 TEST_P(QuicNetworkTransactionTest, AlternateProtocolDifferentPort) { |
1460 MockRead http_reads[] = { | 1504 MockRead http_reads[] = { |
1461 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), | 1505 MockRead("HTTP/1.1 200 OK\r\n"), |
| 1506 MockRead(kQuicAlternateProtocolDifferentPortHeader), |
1462 MockRead("hello world"), | 1507 MockRead("hello world"), |
1463 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1508 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
1464 MockRead(ASYNC, OK)}; | 1509 MockRead(ASYNC, OK)}; |
1465 | 1510 |
1466 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1511 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
1467 0); | 1512 0); |
1468 socket_factory_.AddSocketDataProvider(&http_data); | 1513 socket_factory_.AddSocketDataProvider(&http_data); |
1469 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); | 1514 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
1470 | 1515 |
1471 MockQuicData mock_quic_data; | 1516 MockQuicData mock_quic_data; |
(...skipping 10 matching lines...) Expand all Loading... |
1482 | 1527 |
1483 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 1528 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
1484 | 1529 |
1485 // The non-alternate protocol job needs to hang in order to guarantee that | 1530 // The non-alternate protocol job needs to hang in order to guarantee that |
1486 // the alternate-protocol job will "win". | 1531 // the alternate-protocol job will "win". |
1487 AddHangingNonAlternateProtocolSocketData(); | 1532 AddHangingNonAlternateProtocolSocketData(); |
1488 | 1533 |
1489 params_.parse_alternative_services = false; | 1534 params_.parse_alternative_services = false; |
1490 CreateSession(); | 1535 CreateSession(); |
1491 | 1536 |
| 1537 SendRequestAndExpectHttpResponse("hello world"); |
| 1538 SendRequestAndExpectQuicResponseOnPort("hello!", 137); |
| 1539 } |
| 1540 |
| 1541 TEST_P(QuicNetworkTransactionTest, ConfirmAlternateProtocol) { |
| 1542 MockRead http_reads[] = { |
| 1543 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
| 1544 MockRead("hello world"), |
| 1545 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 1546 MockRead(ASYNC, OK)}; |
| 1547 |
| 1548 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 1549 0); |
| 1550 socket_factory_.AddSocketDataProvider(&http_data); |
| 1551 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); |
| 1552 |
| 1553 MockQuicData mock_quic_data; |
| 1554 mock_quic_data.AddWrite( |
| 1555 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 1556 GetRequestHeaders("GET", "https", "/"))); |
| 1557 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 1558 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 1559 mock_quic_data.AddRead( |
| 1560 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); |
| 1561 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 1562 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 1563 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 1564 |
| 1565 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 1566 |
| 1567 // The non-alternate protocol job needs to hang in order to guarantee that |
| 1568 // the alternate-protocol job will "win". |
| 1569 AddHangingNonAlternateProtocolSocketData(); |
| 1570 |
| 1571 params_.parse_alternative_services = false; |
| 1572 CreateSession(); |
| 1573 |
1492 AlternativeService alternative_service(QUIC, | 1574 AlternativeService alternative_service(QUIC, |
1493 HostPortPair::FromURL(request_.url)); | 1575 HostPortPair::FromURL(request_.url)); |
1494 http_server_properties_.MarkAlternativeServiceRecentlyBroken( | 1576 http_server_properties_.MarkAlternativeServiceRecentlyBroken( |
1495 alternative_service); | 1577 alternative_service); |
1496 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 1578 EXPECT_TRUE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
1497 alternative_service)); | 1579 alternative_service)); |
1498 | 1580 |
1499 SendRequestAndExpectHttpResponse("hello world"); | 1581 SendRequestAndExpectHttpResponse("hello world"); |
1500 SendRequestAndExpectQuicResponse("hello!"); | 1582 SendRequestAndExpectQuicResponse("hello!"); |
1501 | 1583 |
1502 mock_quic_data.Resume(); | 1584 mock_quic_data.Resume(); |
1503 | 1585 |
1504 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( | 1586 EXPECT_FALSE(http_server_properties_.WasAlternativeServiceRecentlyBroken( |
1505 alternative_service)); | 1587 alternative_service)); |
1506 } | 1588 } |
1507 | 1589 |
| 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 |
1508 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { | 1674 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { |
1509 params_.parse_alternative_services = false; | 1675 params_.parse_alternative_services = false; |
1510 MockRead http_reads[] = { | 1676 MockRead http_reads[] = { |
1511 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), | 1677 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kQuicAlternateProtocolHeader), |
1512 MockRead("hello world"), | 1678 MockRead("hello world"), |
1513 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1679 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
1514 MockRead(ASYNC, OK)}; | 1680 MockRead(ASYNC, OK)}; |
1515 | 1681 |
1516 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 1682 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
1517 0); | 1683 0); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1584 // connection to |alternate| only. | 1750 // connection to |alternate| only. |
1585 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); | 1751 MockConnect refused_connect(ASYNC, ERR_CONNECTION_REFUSED); |
1586 StaticSocketDataProvider refused_data; | 1752 StaticSocketDataProvider refused_data; |
1587 refused_data.set_connect_data(refused_connect); | 1753 refused_data.set_connect_data(refused_connect); |
1588 socket_factory_.AddSocketDataProvider(&refused_data); | 1754 socket_factory_.AddSocketDataProvider(&refused_data); |
1589 | 1755 |
1590 CreateSession(); | 1756 CreateSession(); |
1591 AlternativeService alternative_service(QUIC, alternative); | 1757 AlternativeService alternative_service(QUIC, alternative); |
1592 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); | 1758 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1); |
1593 session_->http_server_properties()->SetAlternativeService( | 1759 session_->http_server_properties()->SetAlternativeService( |
1594 origin, alternative_service, expiration); | 1760 origin, alternative_service, 1.0, expiration); |
1595 scoped_ptr<HttpNetworkTransaction> trans( | 1761 scoped_ptr<HttpNetworkTransaction> trans( |
1596 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 1762 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
1597 TestCompletionCallback callback; | 1763 TestCompletionCallback callback; |
1598 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 1764 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
1599 EXPECT_EQ(ERR_IO_PENDING, rv); | 1765 EXPECT_EQ(ERR_IO_PENDING, rv); |
1600 rv = callback.WaitForResult(); | 1766 rv = callback.WaitForResult(); |
1601 if (valid) { | 1767 if (valid) { |
1602 EXPECT_EQ(OK, rv); | 1768 EXPECT_EQ(OK, rv); |
1603 CheckWasQuicResponse(trans); | 1769 CheckWasQuicResponse(trans); |
1604 CheckResponsePort(trans, 443); | 1770 CheckResponsePort(trans, 443); |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2181 scoped_ptr<HttpNetworkTransaction> trans( | 2347 scoped_ptr<HttpNetworkTransaction> trans( |
2182 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 2348 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
2183 TestCompletionCallback callback; | 2349 TestCompletionCallback callback; |
2184 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 2350 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
2185 EXPECT_EQ(ERR_IO_PENDING, rv); | 2351 EXPECT_EQ(ERR_IO_PENDING, rv); |
2186 EXPECT_NE(OK, callback.WaitForResult()); | 2352 EXPECT_NE(OK, callback.WaitForResult()); |
2187 } | 2353 } |
2188 | 2354 |
2189 } // namespace test | 2355 } // namespace test |
2190 } // namespace net | 2356 } // namespace net |
OLD | NEW |