| 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 "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <windows.h> | 8 #include <windows.h> |
| 9 #include <shlobj.h> | 9 #include <shlobj.h> |
| 10 #endif | 10 #endif |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 using base::Time; | 78 using base::Time; |
| 79 | 79 |
| 80 namespace net { | 80 namespace net { |
| 81 | 81 |
| 82 namespace { | 82 namespace { |
| 83 | 83 |
| 84 const base::string16 kChrome(ASCIIToUTF16("chrome")); | 84 const base::string16 kChrome(ASCIIToUTF16("chrome")); |
| 85 const base::string16 kSecret(ASCIIToUTF16("secret")); | 85 const base::string16 kSecret(ASCIIToUTF16("secret")); |
| 86 const base::string16 kUser(ASCIIToUTF16("user")); | 86 const base::string16 kUser(ASCIIToUTF16("user")); |
| 87 | 87 |
| 88 // Tests load timing information in the case a fresh connection was used. | 88 // Tests load timing information in the case a fresh connection was used, with |
| 89 // These tests use the TestServer, which doesn't support keep-alive sockets, | 89 // no proxy. |
| 90 // so there are no tests here that reuse sockets. | |
| 91 void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info, | 90 void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info, |
| 92 int connect_timing_flags) { | 91 int connect_timing_flags) { |
| 93 EXPECT_FALSE(load_timing_info.socket_reused); | 92 EXPECT_FALSE(load_timing_info.socket_reused); |
| 94 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); | 93 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); |
| 95 | 94 |
| 96 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); | 95 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); |
| 97 EXPECT_FALSE(load_timing_info.request_start.is_null()); | 96 EXPECT_FALSE(load_timing_info.request_start.is_null()); |
| 98 | 97 |
| 99 EXPECT_LE(load_timing_info.request_start, | 98 EXPECT_LE(load_timing_info.request_start, |
| 100 load_timing_info.connect_timing.connect_start); | 99 load_timing_info.connect_timing.connect_start); |
| 101 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, | 100 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, |
| 102 connect_timing_flags); | 101 connect_timing_flags); |
| 103 EXPECT_LE(load_timing_info.connect_timing.connect_end, | 102 EXPECT_LE(load_timing_info.connect_timing.connect_end, |
| 104 load_timing_info.send_start); | 103 load_timing_info.send_start); |
| 105 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); | 104 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); |
| 106 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); | 105 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); |
| 107 | 106 |
| 108 // Not set by these tests. | |
| 109 EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); | 107 EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); |
| 110 EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); | 108 EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); |
| 111 } | 109 } |
| 112 | 110 |
| 111 // Same as above, but with proxy times. |
| 112 void TestLoadTimingNotReusedWithProxy( |
| 113 const net::LoadTimingInfo& load_timing_info, |
| 114 int connect_timing_flags) { |
| 115 EXPECT_FALSE(load_timing_info.socket_reused); |
| 116 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); |
| 117 |
| 118 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); |
| 119 EXPECT_FALSE(load_timing_info.request_start.is_null()); |
| 120 |
| 121 EXPECT_LE(load_timing_info.request_start, |
| 122 load_timing_info.proxy_resolve_start); |
| 123 EXPECT_LE(load_timing_info.proxy_resolve_start, |
| 124 load_timing_info.proxy_resolve_end); |
| 125 EXPECT_LE(load_timing_info.proxy_resolve_end, |
| 126 load_timing_info.connect_timing.connect_start); |
| 127 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, |
| 128 connect_timing_flags); |
| 129 EXPECT_LE(load_timing_info.connect_timing.connect_end, |
| 130 load_timing_info.send_start); |
| 131 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); |
| 132 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); |
| 133 } |
| 134 |
| 135 // Same as above, but with a reused socket and proxy times. |
| 136 void TestLoadTimingReusedWithProxy( |
| 137 const net::LoadTimingInfo& load_timing_info) { |
| 138 EXPECT_TRUE(load_timing_info.socket_reused); |
| 139 EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); |
| 140 |
| 141 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); |
| 142 EXPECT_FALSE(load_timing_info.request_start.is_null()); |
| 143 |
| 144 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); |
| 145 |
| 146 EXPECT_LE(load_timing_info.request_start, |
| 147 load_timing_info.proxy_resolve_start); |
| 148 EXPECT_LE(load_timing_info.proxy_resolve_start, |
| 149 load_timing_info.proxy_resolve_end); |
| 150 EXPECT_LE(load_timing_info.proxy_resolve_end, |
| 151 load_timing_info.send_start); |
| 152 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); |
| 153 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); |
| 154 } |
| 155 |
| 113 // Tests load timing in the case that there is no underlying connection. This | 156 // Tests load timing in the case that there is no underlying connection. This |
| 114 // can be used to test in the case of cached responses, errors, or non-HTTP | 157 // can be used to test in the case of cached responses, errors, or non-HTTP |
| 115 // requests. | 158 // requests. |
| 116 void TestLoadTimingNoHttpConnection( | 159 void TestLoadTimingNoHttpConnection( |
| 117 const net::LoadTimingInfo& load_timing_info) { | 160 const net::LoadTimingInfo& load_timing_info) { |
| 118 EXPECT_FALSE(load_timing_info.socket_reused); | 161 EXPECT_FALSE(load_timing_info.socket_reused); |
| 119 EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); | 162 EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); |
| 120 | 163 |
| 121 // Only the request times should be non-null. | 164 // Only the request times should be non-null. |
| 122 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); | 165 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); |
| (...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 972 if (simulate_main_network_error_) { | 1015 if (simulate_main_network_error_) { |
| 973 simulate_main_network_error_ = false; | 1016 simulate_main_network_error_ = false; |
| 974 did_simulate_error_main_ = true; | 1017 did_simulate_error_main_ = true; |
| 975 // will error since the requeted url is not one of its canned urls | 1018 // will error since the requeted url is not one of its canned urls |
| 976 return new URLRequestTestJob(request, network_delegate, true); | 1019 return new URLRequestTestJob(request, network_delegate, true); |
| 977 } | 1020 } |
| 978 if (!intercept_main_request_) | 1021 if (!intercept_main_request_) |
| 979 return NULL; | 1022 return NULL; |
| 980 intercept_main_request_ = false; | 1023 intercept_main_request_ = false; |
| 981 did_intercept_main_ = true; | 1024 did_intercept_main_ = true; |
| 982 return new URLRequestTestJob(request, | 1025 URLRequestTestJob* job = new URLRequestTestJob(request, |
| 983 network_delegate, | 1026 network_delegate, |
| 984 main_headers_, | 1027 main_headers_, |
| 985 main_data_, | 1028 main_data_, |
| 986 true); | 1029 true); |
| 1030 job->set_load_timing_info(main_request_load_timing_info_); |
| 1031 return job; |
| 987 } | 1032 } |
| 988 | 1033 |
| 989 virtual URLRequestJob* MaybeInterceptRedirect( | 1034 virtual URLRequestJob* MaybeInterceptRedirect( |
| 990 URLRequest* request, | 1035 URLRequest* request, |
| 991 NetworkDelegate* network_delegate, | 1036 NetworkDelegate* network_delegate, |
| 992 const GURL& location) OVERRIDE { | 1037 const GURL& location) OVERRIDE { |
| 993 if (cancel_redirect_request_) { | 1038 if (cancel_redirect_request_) { |
| 994 cancel_redirect_request_ = false; | 1039 cancel_redirect_request_ = false; |
| 995 did_cancel_redirect_ = true; | 1040 did_cancel_redirect_ = true; |
| 996 return new CancelTestJob(request, network_delegate); | 1041 return new CancelTestJob(request, network_delegate); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1017 return NULL; | 1062 return NULL; |
| 1018 intercept_final_response_ = false; | 1063 intercept_final_response_ = false; |
| 1019 did_intercept_final_ = true; | 1064 did_intercept_final_ = true; |
| 1020 return new URLRequestTestJob(request, | 1065 return new URLRequestTestJob(request, |
| 1021 network_delegate, | 1066 network_delegate, |
| 1022 final_headers_, | 1067 final_headers_, |
| 1023 final_data_, | 1068 final_data_, |
| 1024 true); | 1069 true); |
| 1025 } | 1070 } |
| 1026 | 1071 |
| 1027 // Whether to intercept the main request, and if so the response to return. | 1072 // Whether to intercept the main request, and if so the response to return and |
| 1073 // the LoadTimingInfo to use. |
| 1028 bool intercept_main_request_; | 1074 bool intercept_main_request_; |
| 1029 std::string main_headers_; | 1075 std::string main_headers_; |
| 1030 std::string main_data_; | 1076 std::string main_data_; |
| 1077 LoadTimingInfo main_request_load_timing_info_; |
| 1031 | 1078 |
| 1032 // Other actions we take at MaybeIntercept time | 1079 // Other actions we take at MaybeIntercept time |
| 1033 bool restart_main_request_; | 1080 bool restart_main_request_; |
| 1034 bool cancel_main_request_; | 1081 bool cancel_main_request_; |
| 1035 bool cancel_then_restart_main_request_; | 1082 bool cancel_then_restart_main_request_; |
| 1036 bool simulate_main_network_error_; | 1083 bool simulate_main_network_error_; |
| 1037 | 1084 |
| 1038 // Whether to intercept redirects, and if so the response to return. | 1085 // Whether to intercept redirects, and if so the response to return. |
| 1039 bool intercept_redirect_; | 1086 bool intercept_redirect_; |
| 1040 std::string redirect_headers_; | 1087 std::string redirect_headers_; |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1350 | 1397 |
| 1351 // Check the interceptor got called as expected | 1398 // Check the interceptor got called as expected |
| 1352 EXPECT_TRUE(interceptor.did_cancel_then_restart_main_); | 1399 EXPECT_TRUE(interceptor.did_cancel_then_restart_main_); |
| 1353 EXPECT_FALSE(interceptor.did_intercept_final_); | 1400 EXPECT_FALSE(interceptor.did_intercept_final_); |
| 1354 | 1401 |
| 1355 // Check we see a canceled request | 1402 // Check we see a canceled request |
| 1356 EXPECT_FALSE(req.status().is_success()); | 1403 EXPECT_FALSE(req.status().is_success()); |
| 1357 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); | 1404 EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); |
| 1358 } | 1405 } |
| 1359 | 1406 |
| 1407 LoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing, |
| 1408 URLRequestContext* context) { |
| 1409 TestInterceptor interceptor; |
| 1410 interceptor.intercept_main_request_ = true; |
| 1411 interceptor.main_request_load_timing_info_ = job_load_timing; |
| 1412 TestDelegate d; |
| 1413 URLRequest req(GURL("http://test_intercept/foo"), &d, context); |
| 1414 req.Start(); |
| 1415 MessageLoop::current()->Run(); |
| 1416 |
| 1417 LoadTimingInfo resulting_load_timing; |
| 1418 req.GetLoadTimingInfo(&resulting_load_timing); |
| 1419 |
| 1420 // None of these should be modified by the URLRequest. |
| 1421 EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused); |
| 1422 EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id); |
| 1423 EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start); |
| 1424 EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end); |
| 1425 EXPECT_EQ(job_load_timing.receive_headers_end, |
| 1426 resulting_load_timing.receive_headers_end); |
| 1427 |
| 1428 return resulting_load_timing; |
| 1429 } |
| 1430 |
| 1431 // "Normal" LoadTimingInfo as returned by a job. Everything is in order, not |
| 1432 // reused. |connect_time_flags| is used to indicate if there should be dns |
| 1433 // or SSL times, and |used_proxy| is used for proxy times. |
| 1434 LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now, |
| 1435 int connect_time_flags, |
| 1436 bool used_proxy) { |
| 1437 LoadTimingInfo load_timing; |
| 1438 load_timing.socket_log_id = 1; |
| 1439 |
| 1440 if (used_proxy) { |
| 1441 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); |
| 1442 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); |
| 1443 } |
| 1444 |
| 1445 LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing; |
| 1446 if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) { |
| 1447 connect_timing.dns_start = now + base::TimeDelta::FromDays(3); |
| 1448 connect_timing.dns_end = now + base::TimeDelta::FromDays(4); |
| 1449 } |
| 1450 connect_timing.connect_start = now + base::TimeDelta::FromDays(5); |
| 1451 if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) { |
| 1452 connect_timing.ssl_start = now + base::TimeDelta::FromDays(6); |
| 1453 connect_timing.ssl_end = now + base::TimeDelta::FromDays(7); |
| 1454 } |
| 1455 connect_timing.connect_end = now + base::TimeDelta::FromDays(8); |
| 1456 |
| 1457 load_timing.send_start = now + base::TimeDelta::FromDays(9); |
| 1458 load_timing.send_end = now + base::TimeDelta::FromDays(10); |
| 1459 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); |
| 1460 return load_timing; |
| 1461 } |
| 1462 |
| 1463 // Same as above, but in the case of a reused socket. |
| 1464 LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now, |
| 1465 bool used_proxy) { |
| 1466 LoadTimingInfo load_timing; |
| 1467 load_timing.socket_log_id = 1; |
| 1468 load_timing.socket_reused = true; |
| 1469 |
| 1470 if (used_proxy) { |
| 1471 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); |
| 1472 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); |
| 1473 } |
| 1474 |
| 1475 load_timing.send_start = now + base::TimeDelta::FromDays(9); |
| 1476 load_timing.send_end = now + base::TimeDelta::FromDays(10); |
| 1477 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); |
| 1478 return load_timing; |
| 1479 } |
| 1480 |
| 1481 // Basic test that the intercept + load timing tests work. |
| 1482 TEST_F(URLRequestTest, InterceptLoadTiming) { |
| 1483 base::TimeTicks now = base::TimeTicks::Now(); |
| 1484 LoadTimingInfo job_load_timing = |
| 1485 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false); |
| 1486 |
| 1487 LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, |
| 1488 &default_context_); |
| 1489 |
| 1490 // Nothing should have been changed by the URLRequest. |
| 1491 EXPECT_EQ(job_load_timing.proxy_resolve_start, |
| 1492 load_timing_result.proxy_resolve_start); |
| 1493 EXPECT_EQ(job_load_timing.proxy_resolve_end, |
| 1494 load_timing_result.proxy_resolve_end); |
| 1495 EXPECT_EQ(job_load_timing.connect_timing.dns_start, |
| 1496 load_timing_result.connect_timing.dns_start); |
| 1497 EXPECT_EQ(job_load_timing.connect_timing.dns_end, |
| 1498 load_timing_result.connect_timing.dns_end); |
| 1499 EXPECT_EQ(job_load_timing.connect_timing.connect_start, |
| 1500 load_timing_result.connect_timing.connect_start); |
| 1501 EXPECT_EQ(job_load_timing.connect_timing.connect_end, |
| 1502 load_timing_result.connect_timing.connect_end); |
| 1503 EXPECT_EQ(job_load_timing.connect_timing.ssl_start, |
| 1504 load_timing_result.connect_timing.ssl_start); |
| 1505 EXPECT_EQ(job_load_timing.connect_timing.ssl_end, |
| 1506 load_timing_result.connect_timing.ssl_end); |
| 1507 |
| 1508 // Redundant sanity check. |
| 1509 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES); |
| 1510 } |
| 1511 |
| 1512 // Another basic test, with proxy and SSL times, but no DNS times. |
| 1513 TEST_F(URLRequestTest, InterceptLoadTimingProxy) { |
| 1514 base::TimeTicks now = base::TimeTicks::Now(); |
| 1515 LoadTimingInfo job_load_timing = |
| 1516 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true); |
| 1517 |
| 1518 LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, |
| 1519 &default_context_); |
| 1520 |
| 1521 // Nothing should have been changed by the URLRequest. |
| 1522 EXPECT_EQ(job_load_timing.proxy_resolve_start, |
| 1523 load_timing_result.proxy_resolve_start); |
| 1524 EXPECT_EQ(job_load_timing.proxy_resolve_end, |
| 1525 load_timing_result.proxy_resolve_end); |
| 1526 EXPECT_EQ(job_load_timing.connect_timing.dns_start, |
| 1527 load_timing_result.connect_timing.dns_start); |
| 1528 EXPECT_EQ(job_load_timing.connect_timing.dns_end, |
| 1529 load_timing_result.connect_timing.dns_end); |
| 1530 EXPECT_EQ(job_load_timing.connect_timing.connect_start, |
| 1531 load_timing_result.connect_timing.connect_start); |
| 1532 EXPECT_EQ(job_load_timing.connect_timing.connect_end, |
| 1533 load_timing_result.connect_timing.connect_end); |
| 1534 EXPECT_EQ(job_load_timing.connect_timing.ssl_start, |
| 1535 load_timing_result.connect_timing.ssl_start); |
| 1536 EXPECT_EQ(job_load_timing.connect_timing.ssl_end, |
| 1537 load_timing_result.connect_timing.ssl_end); |
| 1538 |
| 1539 // Redundant sanity check. |
| 1540 TestLoadTimingNotReusedWithProxy(load_timing_result, |
| 1541 CONNECT_TIMING_HAS_SSL_TIMES); |
| 1542 } |
| 1543 |
| 1544 // Make sure that URLRequest correctly adjusts proxy times when they're before |
| 1545 // |request_start|, due to already having a connected socket. This happens in |
| 1546 // the case of reusing a SPDY session or HTTP pipeline. The connected socket is |
| 1547 // not considered reused in this test (May be a preconnect). |
| 1548 // |
| 1549 // To mix things up from the test above, assumes DNS times but no SSL times. |
| 1550 TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) { |
| 1551 base::TimeTicks now = base::TimeTicks::Now(); |
| 1552 LoadTimingInfo job_load_timing = |
| 1553 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true); |
| 1554 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6); |
| 1555 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5); |
| 1556 job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4); |
| 1557 job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3); |
| 1558 job_load_timing.connect_timing.connect_start = |
| 1559 now - base::TimeDelta::FromDays(2); |
| 1560 job_load_timing.connect_timing.connect_end = |
| 1561 now - base::TimeDelta::FromDays(1); |
| 1562 |
| 1563 LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, |
| 1564 &default_context_); |
| 1565 |
| 1566 // Proxy times, connect times, and DNS times should all be replaced with |
| 1567 // request_start. |
| 1568 EXPECT_EQ(load_timing_result.request_start, |
| 1569 load_timing_result.proxy_resolve_start); |
| 1570 EXPECT_EQ(load_timing_result.request_start, |
| 1571 load_timing_result.proxy_resolve_end); |
| 1572 EXPECT_EQ(load_timing_result.request_start, |
| 1573 load_timing_result.connect_timing.dns_start); |
| 1574 EXPECT_EQ(load_timing_result.request_start, |
| 1575 load_timing_result.connect_timing.dns_end); |
| 1576 EXPECT_EQ(load_timing_result.request_start, |
| 1577 load_timing_result.connect_timing.connect_start); |
| 1578 EXPECT_EQ(load_timing_result.request_start, |
| 1579 load_timing_result.connect_timing.connect_end); |
| 1580 |
| 1581 // Other times should have been left null. |
| 1582 TestLoadTimingNotReusedWithProxy(load_timing_result, |
| 1583 CONNECT_TIMING_HAS_DNS_TIMES); |
| 1584 } |
| 1585 |
| 1586 // Same as above, but in the reused case. |
| 1587 TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) { |
| 1588 base::TimeTicks now = base::TimeTicks::Now(); |
| 1589 LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true); |
| 1590 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4); |
| 1591 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3); |
| 1592 |
| 1593 LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, |
| 1594 &default_context_); |
| 1595 |
| 1596 // Proxy times and connect times should all be replaced with request_start. |
| 1597 EXPECT_EQ(load_timing_result.request_start, |
| 1598 load_timing_result.proxy_resolve_start); |
| 1599 EXPECT_EQ(load_timing_result.request_start, |
| 1600 load_timing_result.proxy_resolve_end); |
| 1601 |
| 1602 // Other times should have been left null. |
| 1603 TestLoadTimingReusedWithProxy(load_timing_result); |
| 1604 } |
| 1605 |
| 1606 // Make sure that URLRequest correctly adjusts connect times when they're before |
| 1607 // |request_start|, due to reusing a connected socket. The connected socket is |
| 1608 // not considered reused in this test (May be a preconnect). |
| 1609 // |
| 1610 // To mix things up, the request has SSL times, but no DNS times. |
| 1611 TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) { |
| 1612 base::TimeTicks now = base::TimeTicks::Now(); |
| 1613 LoadTimingInfo job_load_timing = |
| 1614 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false); |
| 1615 job_load_timing.connect_timing.connect_start = |
| 1616 now - base::TimeDelta::FromDays(1); |
| 1617 job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2); |
| 1618 job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3); |
| 1619 job_load_timing.connect_timing.connect_end = |
| 1620 now - base::TimeDelta::FromDays(4); |
| 1621 |
| 1622 LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, |
| 1623 &default_context_); |
| 1624 |
| 1625 // Connect times, and SSL times should be replaced with request_start. |
| 1626 EXPECT_EQ(load_timing_result.request_start, |
| 1627 load_timing_result.connect_timing.connect_start); |
| 1628 EXPECT_EQ(load_timing_result.request_start, |
| 1629 load_timing_result.connect_timing.ssl_start); |
| 1630 EXPECT_EQ(load_timing_result.request_start, |
| 1631 load_timing_result.connect_timing.ssl_end); |
| 1632 EXPECT_EQ(load_timing_result.request_start, |
| 1633 load_timing_result.connect_timing.connect_end); |
| 1634 |
| 1635 // Other times should have been left null. |
| 1636 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES); |
| 1637 } |
| 1638 |
| 1639 // Make sure that URLRequest correctly adjusts connect times when they're before |
| 1640 // |request_start|, due to reusing a connected socket in the case that there |
| 1641 // are also proxy times. The connected socket is not considered reused in this |
| 1642 // test (May be a preconnect). |
| 1643 // |
| 1644 // In this test, there are no SSL or DNS times. |
| 1645 TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) { |
| 1646 base::TimeTicks now = base::TimeTicks::Now(); |
| 1647 LoadTimingInfo job_load_timing = |
| 1648 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true); |
| 1649 job_load_timing.connect_timing.connect_start = |
| 1650 now - base::TimeDelta::FromDays(1); |
| 1651 job_load_timing.connect_timing.connect_end = |
| 1652 now - base::TimeDelta::FromDays(2); |
| 1653 |
| 1654 LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, |
| 1655 &default_context_); |
| 1656 |
| 1657 // Connect times should be replaced with proxy_resolve_end. |
| 1658 EXPECT_EQ(load_timing_result.proxy_resolve_end, |
| 1659 load_timing_result.connect_timing.connect_start); |
| 1660 EXPECT_EQ(load_timing_result.proxy_resolve_end, |
| 1661 load_timing_result.connect_timing.connect_end); |
| 1662 |
| 1663 // Other times should have been left null. |
| 1664 TestLoadTimingNotReusedWithProxy(load_timing_result, |
| 1665 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); |
| 1666 } |
| 1667 |
| 1360 // Check that two different URL requests have different identifiers. | 1668 // Check that two different URL requests have different identifiers. |
| 1361 TEST_F(URLRequestTest, Identifiers) { | 1669 TEST_F(URLRequestTest, Identifiers) { |
| 1362 TestDelegate d; | 1670 TestDelegate d; |
| 1363 TestURLRequestContext context; | 1671 TestURLRequestContext context; |
| 1364 TestURLRequest req(GURL("http://example.com"), &d, &context, NULL); | 1672 TestURLRequest req(GURL("http://example.com"), &d, &context, NULL); |
| 1365 TestURLRequest other_req(GURL("http://example.com"), &d, &context, NULL); | 1673 TestURLRequest other_req(GURL("http://example.com"), &d, &context, NULL); |
| 1366 | 1674 |
| 1367 ASSERT_NE(req.identifier(), other_req.identifier()); | 1675 ASSERT_NE(req.identifier(), other_req.identifier()); |
| 1368 } | 1676 } |
| 1369 | 1677 |
| (...skipping 4034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5404 | 5712 |
| 5405 EXPECT_FALSE(r.is_pending()); | 5713 EXPECT_FALSE(r.is_pending()); |
| 5406 EXPECT_EQ(1, d->response_started_count()); | 5714 EXPECT_EQ(1, d->response_started_count()); |
| 5407 EXPECT_FALSE(d->received_data_before_response()); | 5715 EXPECT_FALSE(d->received_data_before_response()); |
| 5408 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); | 5716 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); |
| 5409 } | 5717 } |
| 5410 } | 5718 } |
| 5411 #endif // !defined(DISABLE_FTP_SUPPORT) | 5719 #endif // !defined(DISABLE_FTP_SUPPORT) |
| 5412 | 5720 |
| 5413 } // namespace net | 5721 } // namespace net |
| OLD | NEW |