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

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

Issue 1802893002: Revert of Remove support for Alt-Svc/Alternate Protocol Probability (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/http/http_stream_factory_impl_unittest.cc ('k') | net/quic/quic_stream_factory_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <vector> 5 #include <vector>
6 6
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/http/http_stream_factory_impl_unittest.cc ('k') | net/quic/quic_stream_factory_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698