| 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 |