Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 82 // Must be 0 when |is_null| is true. | 82 // Must be 0 when |is_null| is true. |
| 83 base::TimeDelta delta_; | 83 base::TimeDelta delta_; |
| 84 | 84 |
| 85 // This class is copyable and assignable. | 85 // This class is copyable and assignable. |
| 86 }; | 86 }; |
| 87 | 87 |
| 88 // Structure used for both setting the LoadTimingInfo used by mock requests | 88 // Structure used for both setting the LoadTimingInfo used by mock requests |
| 89 // and for times retrieved from the renderer process. | 89 // and for times retrieved from the renderer process. |
| 90 // | 90 // |
| 91 // Times used for mock requests are all expressed as TimeDeltas relative to | 91 // Times used for mock requests are all expressed as TimeDeltas relative to |
| 92 // request_start. Null RelativeTimes correspond to null TimeTicks(). | 92 // when the Job starts. Null RelativeTimes correspond to null TimeTicks(). |
| 93 // | 93 // |
| 94 // Times read from the renderer are expressed relative to fetchStart (Which is | 94 // Times read from the renderer are expressed relative to fetchStart (Which is |
| 95 // not the same as request_start). Null RelativeTimes correspond to times that | 95 // not the same as request_start). Null RelativeTimes correspond to times that |
| 96 // either cannot be retrieved (proxy times, send end) or times that are 0 (SSL | 96 // either cannot be retrieved (proxy times, send end) or times that are 0 (SSL |
| 97 // time when no new SSL connection was established). | 97 // time when no new SSL connection was established). |
| 98 struct TimingDeltas { | 98 struct TimingDeltas { |
| 99 RelativeTime proxy_resolve_start; | 99 RelativeTime proxy_resolve_start; |
| 100 RelativeTime proxy_resolve_end; | 100 RelativeTime proxy_resolve_end; |
| 101 RelativeTime dns_start; | 101 RelativeTime dns_start; |
| 102 RelativeTime dns_end; | 102 RelativeTime dns_end; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 120 const base::FilePath& path, | 120 const base::FilePath& path, |
| 121 const TimingDeltas& load_timing_deltas) | 121 const TimingDeltas& load_timing_deltas) |
| 122 : net::URLRequestFileJob(request, network_delegate, path), | 122 : net::URLRequestFileJob(request, network_delegate, path), |
| 123 load_timing_deltas_(load_timing_deltas), | 123 load_timing_deltas_(load_timing_deltas), |
| 124 weak_factory_(this) { | 124 weak_factory_(this) { |
| 125 } | 125 } |
| 126 | 126 |
| 127 // net::URLRequestFileJob implementation: | 127 // net::URLRequestFileJob implementation: |
| 128 virtual void Start() OVERRIDE { | 128 virtual void Start() OVERRIDE { |
| 129 base::TimeDelta time_to_wait; | 129 base::TimeDelta time_to_wait; |
| 130 start_time_ = base::TimeTicks::Now(); | |
| 130 if (!load_timing_deltas_.receive_headers_end.is_null()) { | 131 if (!load_timing_deltas_.receive_headers_end.is_null()) { |
| 131 // Need to delay starting until the largest of the times has elapsed. | 132 // Need to delay starting until the largest of the times has elapsed. |
| 132 // Wait a little longer than necessary, to be on the safe side. | 133 // Wait a little longer than necessary, to be on the safe side. |
| 133 time_to_wait = load_timing_deltas_.receive_headers_end.GetDelta() + | 134 time_to_wait = load_timing_deltas_.receive_headers_end.GetDelta() + |
| 134 base::TimeDelta::FromMilliseconds(100); | 135 base::TimeDelta::FromMilliseconds(100); |
| 135 } | 136 } |
| 136 | 137 |
| 137 MessageLoop::current()->PostDelayedTask( | 138 MessageLoop::current()->PostDelayedTask( |
| 138 FROM_HERE, | 139 FROM_HERE, |
| 139 base::Bind(&MockUrlRequestJobWithTiming::DelayedStart, | 140 base::Bind(&MockUrlRequestJobWithTiming::DelayedStart, |
| 140 weak_factory_.GetWeakPtr()), | 141 weak_factory_.GetWeakPtr()), |
| 141 time_to_wait); | 142 time_to_wait); |
| 142 } | 143 } |
| 143 | 144 |
| 144 virtual void GetLoadTimingInfo( | 145 virtual void GetLoadTimingInfo( |
| 145 net::LoadTimingInfo* load_timing_info) const OVERRIDE { | 146 net::LoadTimingInfo* load_timing_info) const OVERRIDE { |
| 146 // This should have been set by the URLRequest. | |
| 147 base::TimeTicks request_start = load_timing_info->request_start; | |
| 148 ASSERT_FALSE(request_start.is_null()); | |
| 149 | |
| 150 // Make sure enough time has elapsed since start was called. If this | 147 // Make sure enough time has elapsed since start was called. If this |
| 151 // fails, the test fixture itself is flaky. | 148 // fails, the test fixture itself is flaky. |
| 152 if (!load_timing_deltas_.receive_headers_end.is_null()) { | 149 if (!load_timing_deltas_.receive_headers_end.is_null()) { |
| 153 EXPECT_LE( | 150 EXPECT_LE( |
| 154 request_start + load_timing_deltas_.receive_headers_end.GetDelta(), | 151 start_time_ + load_timing_deltas_.receive_headers_end.GetDelta(), |
| 155 base::TimeTicks::Now()); | 152 base::TimeTicks::Now()); |
| 156 } | 153 } |
| 157 | 154 |
| 158 // If there are no connect times, but there is a receive headers end time, | 155 // If there are no connect times, but there is a receive headers end time, |
| 159 // then assume the socket is reused. This shouldn't affect the load timing | 156 // then assume the socket is reused. This shouldn't affect the load timing |
| 160 // information the test checks, just done for completeness. | 157 // information the test checks, just done for completeness. |
| 161 load_timing_info->socket_reused = false; | 158 load_timing_info->socket_reused = false; |
| 162 if (load_timing_deltas_.connect_start.is_null() && | 159 if (load_timing_deltas_.connect_start.is_null() && |
| 163 !load_timing_deltas_.receive_headers_end.is_null()) { | 160 !load_timing_deltas_.receive_headers_end.is_null()) { |
| 164 load_timing_info->socket_reused = true; | 161 load_timing_info->socket_reused = true; |
| 165 } | 162 } |
| 166 | 163 |
| 167 load_timing_info->proxy_resolve_start = | 164 load_timing_info->proxy_resolve_start = |
| 168 load_timing_deltas_.proxy_resolve_start.ToTimeTicks(request_start); | 165 load_timing_deltas_.proxy_resolve_start.ToTimeTicks(start_time_); |
| 169 load_timing_info->proxy_resolve_end = | 166 load_timing_info->proxy_resolve_end = |
| 170 load_timing_deltas_.proxy_resolve_end.ToTimeTicks(request_start); | 167 load_timing_deltas_.proxy_resolve_end.ToTimeTicks(start_time_); |
| 171 | 168 |
| 172 load_timing_info->connect_timing.dns_start = | 169 load_timing_info->connect_timing.dns_start = |
| 173 load_timing_deltas_.dns_start.ToTimeTicks(request_start); | 170 load_timing_deltas_.dns_start.ToTimeTicks(start_time_); |
| 174 load_timing_info->connect_timing.dns_end = | 171 load_timing_info->connect_timing.dns_end = |
| 175 load_timing_deltas_.dns_end.ToTimeTicks(request_start); | 172 load_timing_deltas_.dns_end.ToTimeTicks(start_time_); |
| 176 load_timing_info->connect_timing.connect_start = | 173 load_timing_info->connect_timing.connect_start = |
| 177 load_timing_deltas_.connect_start.ToTimeTicks(request_start); | 174 load_timing_deltas_.connect_start.ToTimeTicks(start_time_); |
| 178 load_timing_info->connect_timing.ssl_start = | 175 load_timing_info->connect_timing.ssl_start = |
| 179 load_timing_deltas_.ssl_start.ToTimeTicks(request_start); | 176 load_timing_deltas_.ssl_start.ToTimeTicks(start_time_); |
| 180 load_timing_info->connect_timing.connect_end = | 177 load_timing_info->connect_timing.connect_end = |
| 181 load_timing_deltas_.connect_end.ToTimeTicks(request_start); | 178 load_timing_deltas_.connect_end.ToTimeTicks(start_time_); |
| 182 | 179 |
| 183 // If there's an SSL start time, use connect end as the SSL end time. | 180 // If there's an SSL start time, use connect end as the SSL end time. |
| 184 // The NavigationTiming API does not have a corresponding field, and there's | 181 // The NavigationTiming API does not have a corresponding field, and there's |
| 185 // no need to test the case when the values are both non-NULL and different. | 182 // no need to test the case when the values are both non-NULL and different. |
| 186 if (!load_timing_deltas_.ssl_start.is_null()) { | 183 if (!load_timing_deltas_.ssl_start.is_null()) { |
| 187 load_timing_info->connect_timing.ssl_end = | 184 load_timing_info->connect_timing.ssl_end = |
| 188 load_timing_info->connect_timing.connect_end; | 185 load_timing_info->connect_timing.connect_end; |
| 189 } | 186 } |
| 190 | 187 |
| 191 load_timing_info->send_start = | 188 load_timing_info->send_start = |
| 192 load_timing_deltas_.send_start.ToTimeTicks(request_start); | 189 load_timing_deltas_.send_start.ToTimeTicks(start_time_); |
| 193 load_timing_info->send_end= | 190 load_timing_info->send_end= |
| 194 load_timing_deltas_.send_end.ToTimeTicks(request_start); | 191 load_timing_deltas_.send_end.ToTimeTicks(start_time_); |
| 195 load_timing_info->receive_headers_end = | 192 load_timing_info->receive_headers_end = |
| 196 load_timing_deltas_.receive_headers_end.ToTimeTicks(request_start); | 193 load_timing_deltas_.receive_headers_end.ToTimeTicks(start_time_); |
| 197 } | 194 } |
| 198 | 195 |
| 199 private: | 196 private: |
| 200 // Parent class is reference counted, so need to have a private destructor. | 197 // Parent class is reference counted, so need to have a private destructor. |
| 201 virtual ~MockUrlRequestJobWithTiming() {} | 198 virtual ~MockUrlRequestJobWithTiming() {} |
| 202 | 199 |
| 203 void DelayedStart() { | 200 void DelayedStart() { |
| 204 net::URLRequestFileJob::Start(); | 201 net::URLRequestFileJob::Start(); |
| 205 } | 202 } |
| 206 | 203 |
| 207 // Load times to use, relative to request_start from the URLRequest. | 204 // Load times to use, relative to |start_time_|. |
| 208 const TimingDeltas load_timing_deltas_; | 205 const TimingDeltas load_timing_deltas_; |
| 206 base::TimeTicks start_time_; | |
| 209 | 207 |
| 210 base::WeakPtrFactory<MockUrlRequestJobWithTiming> weak_factory_; | 208 base::WeakPtrFactory<MockUrlRequestJobWithTiming> weak_factory_; |
| 211 | 209 |
| 212 DISALLOW_COPY_AND_ASSIGN(MockUrlRequestJobWithTiming); | 210 DISALLOW_COPY_AND_ASSIGN(MockUrlRequestJobWithTiming); |
| 213 }; | 211 }; |
| 214 | 212 |
| 215 // A protocol handler that returns mock URLRequestJobs that return the specified | 213 // A protocol handler that returns mock URLRequestJobs that return the specified |
| 216 // file with the given timings. Constructed on the UI thread, but after that, | 214 // file with the given timings. Constructed on the UI thread, but after that, |
| 217 // lives and is destroyed on the IO thread. | 215 // lives and is destroyed on the IO thread. |
| 218 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { | 216 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 250 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 248 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 251 | 249 |
| 252 return new MockUrlRequestJobWithTiming(request, network_delegate, path_, | 250 return new MockUrlRequestJobWithTiming(request, network_delegate, path_, |
| 253 load_timing_deltas_); | 251 load_timing_deltas_); |
| 254 } | 252 } |
| 255 | 253 |
| 256 private: | 254 private: |
| 257 // Path of the file to use as the response body. | 255 // Path of the file to use as the response body. |
| 258 const base::FilePath path_; | 256 const base::FilePath path_; |
| 259 | 257 |
| 260 // Load times for each request to use, relative to their request_start times. | 258 // Load times for each request to use, relative to when the Job starts. |
| 261 const TimingDeltas load_timing_deltas_; | 259 const TimingDeltas load_timing_deltas_; |
| 262 | 260 |
| 263 DISALLOW_COPY_AND_ASSIGN(TestProtocolHandler); | 261 DISALLOW_COPY_AND_ASSIGN(TestProtocolHandler); |
| 264 }; | 262 }; |
| 265 | 263 |
| 266 class LoadTimingBrowserTest : public InProcessBrowserTest { | 264 class LoadTimingBrowserTest : public InProcessBrowserTest { |
| 267 public: | 265 public: |
| 268 LoadTimingBrowserTest() { | 266 LoadTimingBrowserTest() { |
| 269 } | 267 } |
| 270 | 268 |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 496 | 494 |
| 497 EXPECT_LT(navigation_deltas.send_start.GetDelta(), | 495 EXPECT_LT(navigation_deltas.send_start.GetDelta(), |
| 498 navigation_deltas.receive_headers_end.GetDelta()); | 496 navigation_deltas.receive_headers_end.GetDelta()); |
| 499 | 497 |
| 500 EXPECT_TRUE(navigation_deltas.ssl_start.is_null()); | 498 EXPECT_TRUE(navigation_deltas.ssl_start.is_null()); |
| 501 } | 499 } |
| 502 | 500 |
| 503 // Preconnect case. Connect times are all before the request was started. | 501 // Preconnect case. Connect times are all before the request was started. |
| 504 IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, Preconnect) { | 502 IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, Preconnect) { |
| 505 TimingDeltas load_timing_deltas; | 503 TimingDeltas load_timing_deltas; |
| 506 load_timing_deltas.dns_start = RelativeTime(-100300); | 504 load_timing_deltas.dns_start = RelativeTime(-1000300); |
|
eroman
2013/05/15 01:11:50
what is the significance of changing these times?
mmenke
2013/05/15 01:52:38
Paranoia. It used to be that request_start was ti
| |
| 507 load_timing_deltas.dns_end = RelativeTime(-100200); | 505 load_timing_deltas.dns_end = RelativeTime(-1000200); |
| 508 load_timing_deltas.connect_start = RelativeTime(-100100); | 506 load_timing_deltas.connect_start = RelativeTime(-1000100); |
| 509 load_timing_deltas.connect_end = RelativeTime(-100000); | 507 load_timing_deltas.connect_end = RelativeTime(-1000000); |
| 510 load_timing_deltas.send_start = RelativeTime(0); | 508 load_timing_deltas.send_start = RelativeTime(0); |
| 511 load_timing_deltas.send_end = RelativeTime(100); | 509 load_timing_deltas.send_end = RelativeTime(100); |
| 512 load_timing_deltas.receive_headers_end = RelativeTime(200); | 510 load_timing_deltas.receive_headers_end = RelativeTime(200); |
| 513 | 511 |
| 514 TimingDeltas navigation_deltas; | 512 TimingDeltas navigation_deltas; |
| 515 RunTest(load_timing_deltas, &navigation_deltas); | 513 RunTest(load_timing_deltas, &navigation_deltas); |
| 516 | 514 |
| 517 // Connect times should all be the same as request_start, which is also the | 515 // Connect times should all be the same as request_start. |
| 518 // same as send_start (Since send_start is 0). | |
| 519 EXPECT_EQ(navigation_deltas.dns_start.GetDelta(), | 516 EXPECT_EQ(navigation_deltas.dns_start.GetDelta(), |
| 520 navigation_deltas.dns_end.GetDelta()); | 517 navigation_deltas.dns_end.GetDelta()); |
| 521 EXPECT_EQ(navigation_deltas.dns_start.GetDelta(), | 518 EXPECT_EQ(navigation_deltas.dns_start.GetDelta(), |
| 522 navigation_deltas.connect_start.GetDelta()); | 519 navigation_deltas.connect_start.GetDelta()); |
| 523 EXPECT_EQ(navigation_deltas.dns_start.GetDelta(), | 520 EXPECT_EQ(navigation_deltas.dns_start.GetDelta(), |
| 524 navigation_deltas.connect_end.GetDelta()); | 521 navigation_deltas.connect_end.GetDelta()); |
| 525 EXPECT_EQ(navigation_deltas.dns_start.GetDelta(), | 522 |
| 523 EXPECT_LE(navigation_deltas.dns_start.GetDelta(), | |
| 526 navigation_deltas.send_start.GetDelta()); | 524 navigation_deltas.send_start.GetDelta()); |
| 527 | 525 |
| 528 EXPECT_LT(navigation_deltas.send_start.GetDelta(), | 526 EXPECT_LT(navigation_deltas.send_start.GetDelta(), |
| 529 navigation_deltas.receive_headers_end.GetDelta()); | 527 navigation_deltas.receive_headers_end.GetDelta()); |
| 530 EXPECT_LT(navigation_deltas.send_start.GetDelta(), | 528 EXPECT_LT(navigation_deltas.send_start.GetDelta(), |
| 531 navigation_deltas.receive_headers_end.GetDelta()); | 529 navigation_deltas.receive_headers_end.GetDelta()); |
| 532 | 530 |
| 533 EXPECT_TRUE(navigation_deltas.ssl_start.is_null()); | 531 EXPECT_TRUE(navigation_deltas.ssl_start.is_null()); |
| 534 } | 532 } |
| 535 | 533 |
| 536 // Preconnect case with a proxy. Connect times are all before the proxy lookup | 534 // Preconnect case with a proxy. Connect times are all before the proxy lookup |
| 537 // finished (Or at the same time). | 535 // finished (Or at the same time). |
| 538 IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, PreconnectProxySsl) { | 536 IN_PROC_BROWSER_TEST_F(LoadTimingBrowserTest, PreconnectProxySsl) { |
| 539 TimingDeltas load_timing_deltas; | 537 TimingDeltas load_timing_deltas; |
| 540 load_timing_deltas.proxy_resolve_start = RelativeTime(0); | 538 load_timing_deltas.proxy_resolve_start = RelativeTime(0); |
| 541 load_timing_deltas.proxy_resolve_end = RelativeTime(100); | 539 load_timing_deltas.proxy_resolve_end = RelativeTime(100); |
| 542 load_timing_deltas.dns_start = RelativeTime(-300); | 540 load_timing_deltas.dns_start = RelativeTime(-3000000); |
| 543 load_timing_deltas.dns_end = RelativeTime(-200); | 541 load_timing_deltas.dns_end = RelativeTime(-2000000); |
| 544 load_timing_deltas.connect_start = RelativeTime(-100); | 542 load_timing_deltas.connect_start = RelativeTime(-1000000); |
| 545 load_timing_deltas.ssl_start = RelativeTime(0); | 543 load_timing_deltas.ssl_start = RelativeTime(0); |
| 546 load_timing_deltas.connect_end = RelativeTime(100); | 544 load_timing_deltas.connect_end = RelativeTime(100); |
| 547 load_timing_deltas.send_start = RelativeTime(100); | 545 load_timing_deltas.send_start = RelativeTime(100); |
| 548 load_timing_deltas.send_end = RelativeTime(200); | 546 load_timing_deltas.send_end = RelativeTime(200); |
| 549 load_timing_deltas.receive_headers_end = RelativeTime(300); | 547 load_timing_deltas.receive_headers_end = RelativeTime(300); |
| 550 | 548 |
| 551 TimingDeltas navigation_deltas; | 549 TimingDeltas navigation_deltas; |
| 552 RunTest(load_timing_deltas, &navigation_deltas); | 550 RunTest(load_timing_deltas, &navigation_deltas); |
| 553 | 551 |
| 554 // Connect times should all be the same as proxy_end, which is also the | 552 // Connect times should all be the same as proxy_end, which is also the |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 580 // Due to potential roundoff issues, never check exact differences. | 578 // Due to potential roundoff issues, never check exact differences. |
| 581 EXPECT_LE(navigation_deltas.dns_start.GetDelta(), | 579 EXPECT_LE(navigation_deltas.dns_start.GetDelta(), |
| 582 navigation_deltas.dns_end.GetDelta()); | 580 navigation_deltas.dns_end.GetDelta()); |
| 583 EXPECT_LE(navigation_deltas.dns_end.GetDelta(), | 581 EXPECT_LE(navigation_deltas.dns_end.GetDelta(), |
| 584 navigation_deltas.connect_start.GetDelta()); | 582 navigation_deltas.connect_start.GetDelta()); |
| 585 EXPECT_LE(navigation_deltas.connect_start.GetDelta(), | 583 EXPECT_LE(navigation_deltas.connect_start.GetDelta(), |
| 586 navigation_deltas.connect_end.GetDelta()); | 584 navigation_deltas.connect_end.GetDelta()); |
| 587 EXPECT_LE(navigation_deltas.connect_end.GetDelta(), | 585 EXPECT_LE(navigation_deltas.connect_end.GetDelta(), |
| 588 navigation_deltas.send_start.GetDelta()); | 586 navigation_deltas.send_start.GetDelta()); |
| 589 // The only times that are guaranteed to be distinct are send_start and | 587 // The only times that are guaranteed to be distinct are send_start and |
| 590 // received_headers end. | 588 // received_headers_end. |
| 591 EXPECT_LT(navigation_deltas.send_start.GetDelta(), | 589 EXPECT_LT(navigation_deltas.send_start.GetDelta(), |
| 592 navigation_deltas.receive_headers_end.GetDelta()); | 590 navigation_deltas.receive_headers_end.GetDelta()); |
| 593 | 591 |
| 594 EXPECT_TRUE(navigation_deltas.ssl_start.is_null()); | 592 EXPECT_TRUE(navigation_deltas.ssl_start.is_null()); |
| 595 } | 593 } |
| 596 | 594 |
| 597 } // namespace | 595 } // namespace |
| OLD | NEW |