| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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 "components/page_load_metrics/renderer/metrics_render_frame_observer.h" | 5 #include "components/page_load_metrics/renderer/metrics_render_frame_observer.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 // messages get sent. | 25 // messages get sent. |
| 26 class MockIPCInterceptor { | 26 class MockIPCInterceptor { |
| 27 public: | 27 public: |
| 28 void OnMessage(const IPC::Message& message) { | 28 void OnMessage(const IPC::Message& message) { |
| 29 IPC_BEGIN_MESSAGE_MAP(MockIPCInterceptor, message) | 29 IPC_BEGIN_MESSAGE_MAP(MockIPCInterceptor, message) |
| 30 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) | 30 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) |
| 31 IPC_MESSAGE_UNHANDLED(ADD_FAILURE()) | 31 IPC_MESSAGE_UNHANDLED(ADD_FAILURE()) |
| 32 IPC_END_MESSAGE_MAP() | 32 IPC_END_MESSAGE_MAP() |
| 33 } | 33 } |
| 34 | 34 |
| 35 MOCK_METHOD1(OnTimingUpdated, void(PageLoadTiming)); | 35 MOCK_METHOD2(OnTimingUpdated, void(PageLoadTiming, PageLoadMetadata)); |
| 36 }; | 36 }; |
| 37 | 37 |
| 38 // Implementation of the MetricsRenderFrameObserver class we're testing, | 38 // Implementation of the MetricsRenderFrameObserver class we're testing, |
| 39 // with the GetTiming() and ShouldSendMetrics() methods stubbed out to make | 39 // with the GetTiming() and ShouldSendMetrics() methods stubbed out to make |
| 40 // the rest of the class more testable. | 40 // the rest of the class more testable. |
| 41 class MockMetricsRenderFrameObserver : public MetricsRenderFrameObserver { | 41 class MockMetricsRenderFrameObserver : public MetricsRenderFrameObserver { |
| 42 public: | 42 public: |
| 43 MockMetricsRenderFrameObserver() : MetricsRenderFrameObserver(nullptr) { | 43 MockMetricsRenderFrameObserver() : MetricsRenderFrameObserver(nullptr) { |
| 44 ON_CALL(*this, ShouldSendMetrics()).WillByDefault(Return(true)); | 44 ON_CALL(*this, ShouldSendMetrics()).WillByDefault(Return(true)); |
| 45 ON_CALL(*this, HasNoRenderFrame()).WillByDefault(Return(false)); | 45 ON_CALL(*this, HasNoRenderFrame()).WillByDefault(Return(false)); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 NiceMock<MockMetricsRenderFrameObserver> observer; | 94 NiceMock<MockMetricsRenderFrameObserver> observer; |
| 95 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 95 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
| 96 observer.set_mock_timer(make_scoped_ptr(mock_timer)); | 96 observer.set_mock_timer(make_scoped_ptr(mock_timer)); |
| 97 observer.DidCommitProvisionalLoad(true, false); | 97 observer.DidCommitProvisionalLoad(true, false); |
| 98 | 98 |
| 99 PageLoadTiming timing; | 99 PageLoadTiming timing; |
| 100 timing.navigation_start = nav_start; | 100 timing.navigation_start = nav_start; |
| 101 timing.first_layout = first_layout; | 101 timing.first_layout = first_layout; |
| 102 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); | 102 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); |
| 103 | 103 |
| 104 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 104 EXPECT_CALL(*observer.ipc_interceptor(), |
| 105 OnTimingUpdated(timing, PageLoadMetadata())); |
| 105 | 106 |
| 106 observer.DidChangePerformanceTiming(); | 107 observer.DidChangePerformanceTiming(); |
| 107 mock_timer->Fire(); | 108 mock_timer->Fire(); |
| 108 } | 109 } |
| 109 | 110 |
| 110 TEST_F(MetricsRenderFrameObserverTest, MultipleMetrics) { | 111 TEST_F(MetricsRenderFrameObserverTest, MultipleMetrics) { |
| 111 base::Time nav_start = base::Time::FromDoubleT(10); | 112 base::Time nav_start = base::Time::FromDoubleT(10); |
| 112 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); | 113 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); |
| 113 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); | 114 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); |
| 114 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); | 115 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); |
| 115 | 116 |
| 116 NiceMock<MockMetricsRenderFrameObserver> observer; | 117 NiceMock<MockMetricsRenderFrameObserver> observer; |
| 117 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 118 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
| 118 observer.set_mock_timer(make_scoped_ptr(mock_timer)); | 119 observer.set_mock_timer(make_scoped_ptr(mock_timer)); |
| 119 observer.DidCommitProvisionalLoad(true, false); | 120 observer.DidCommitProvisionalLoad(true, false); |
| 120 | 121 |
| 121 PageLoadTiming timing; | 122 PageLoadTiming timing; |
| 122 timing.navigation_start = nav_start; | 123 timing.navigation_start = nav_start; |
| 123 timing.first_layout = first_layout; | 124 timing.first_layout = first_layout; |
| 124 timing.dom_content_loaded_event_start = dom_event; | 125 timing.dom_content_loaded_event_start = dom_event; |
| 125 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); | 126 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); |
| 126 | 127 |
| 127 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 128 EXPECT_CALL(*observer.ipc_interceptor(), |
| 129 OnTimingUpdated(timing, PageLoadMetadata())); |
| 128 observer.DidChangePerformanceTiming(); | 130 observer.DidChangePerformanceTiming(); |
| 129 mock_timer->Fire(); | 131 mock_timer->Fire(); |
| 130 | 132 |
| 131 // At this point, we should have triggered the generation of two metrics. | 133 // At this point, we should have triggered the generation of two metrics. |
| 132 // Verify and reset the observer's expectations before moving on to the next | 134 // Verify and reset the observer's expectations before moving on to the next |
| 133 // part of the test. | 135 // part of the test. |
| 134 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); | 136 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); |
| 135 | 137 |
| 136 timing.load_event_start = load_event; | 138 timing.load_event_start = load_event; |
| 137 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); | 139 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); |
| 138 | 140 |
| 139 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 141 EXPECT_CALL(*observer.ipc_interceptor(), |
| 142 OnTimingUpdated(timing, PageLoadMetadata())); |
| 140 observer.DidChangePerformanceTiming(); | 143 observer.DidChangePerformanceTiming(); |
| 141 mock_timer->Fire(); | 144 mock_timer->Fire(); |
| 142 | 145 |
| 143 // Verify and reset the observer's expectations before moving on to the next | 146 // Verify and reset the observer's expectations before moving on to the next |
| 144 // part of the test. | 147 // part of the test. |
| 145 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); | 148 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); |
| 146 | 149 |
| 147 // The PageLoadTiming above includes timing information for the first layout, | 150 // The PageLoadTiming above includes timing information for the first layout, |
| 148 // dom content, and load metrics. However, since we've already generated | 151 // dom content, and load metrics. However, since we've already generated |
| 149 // timing information for all of these metrics previously, we do not expect | 152 // timing information for all of these metrics previously, we do not expect |
| (...skipping 12 matching lines...) Expand all Loading... |
| 162 base::MockTimer* mock_timer = new base::MockTimer(false, false); | 165 base::MockTimer* mock_timer = new base::MockTimer(false, false); |
| 163 observer.set_mock_timer(make_scoped_ptr(mock_timer)); | 166 observer.set_mock_timer(make_scoped_ptr(mock_timer)); |
| 164 observer.DidCommitProvisionalLoad(true, false); | 167 observer.DidCommitProvisionalLoad(true, false); |
| 165 | 168 |
| 166 PageLoadTiming timing; | 169 PageLoadTiming timing; |
| 167 timing.navigation_start = nav_start; | 170 timing.navigation_start = nav_start; |
| 168 timing.first_layout = first_layout; | 171 timing.first_layout = first_layout; |
| 169 timing.dom_content_loaded_event_start = dom_event; | 172 timing.dom_content_loaded_event_start = dom_event; |
| 170 timing.load_event_start = load_event; | 173 timing.load_event_start = load_event; |
| 171 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); | 174 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); |
| 172 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 175 EXPECT_CALL(*observer.ipc_interceptor(), |
| 176 OnTimingUpdated(timing, PageLoadMetadata())); |
| 173 observer.DidChangePerformanceTiming(); | 177 observer.DidChangePerformanceTiming(); |
| 174 mock_timer->Fire(); | 178 mock_timer->Fire(); |
| 175 | 179 |
| 176 // At this point, we should have triggered the generation of two metrics. | 180 // At this point, we should have triggered the generation of two metrics. |
| 177 // Verify and reset the observer's expectations before moving on to the next | 181 // Verify and reset the observer's expectations before moving on to the next |
| 178 // part of the test. | 182 // part of the test. |
| 179 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); | 183 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); |
| 180 | 184 |
| 181 base::Time nav_start_2 = base::Time::FromDoubleT(100); | 185 base::Time nav_start_2 = base::Time::FromDoubleT(100); |
| 182 base::TimeDelta first_layout_2 = base::TimeDelta::FromMillisecondsD(20); | 186 base::TimeDelta first_layout_2 = base::TimeDelta::FromMillisecondsD(20); |
| 183 base::TimeDelta dom_event_2 = base::TimeDelta::FromMillisecondsD(20); | 187 base::TimeDelta dom_event_2 = base::TimeDelta::FromMillisecondsD(20); |
| 184 base::TimeDelta load_event_2 = base::TimeDelta::FromMillisecondsD(20); | 188 base::TimeDelta load_event_2 = base::TimeDelta::FromMillisecondsD(20); |
| 185 PageLoadTiming timing_2; | 189 PageLoadTiming timing_2; |
| 186 timing_2.navigation_start = nav_start_2; | 190 timing_2.navigation_start = nav_start_2; |
| 187 timing_2.first_layout = first_layout_2; | 191 timing_2.first_layout = first_layout_2; |
| 188 timing_2.dom_content_loaded_event_start = dom_event_2; | 192 timing_2.dom_content_loaded_event_start = dom_event_2; |
| 189 timing_2.load_event_start = load_event_2; | 193 timing_2.load_event_start = load_event_2; |
| 190 | 194 |
| 191 base::MockTimer* mock_timer2 = new base::MockTimer(false, false); | 195 base::MockTimer* mock_timer2 = new base::MockTimer(false, false); |
| 192 observer.set_mock_timer(make_scoped_ptr(mock_timer2)); | 196 observer.set_mock_timer(make_scoped_ptr(mock_timer2)); |
| 193 observer.DidCommitProvisionalLoad(true, false); | 197 observer.DidCommitProvisionalLoad(true, false); |
| 194 EXPECT_CALL(*observer.ipc_interceptor(), OnTimingUpdated(timing)); | 198 EXPECT_CALL(*observer.ipc_interceptor(), |
| 199 OnTimingUpdated(timing, PageLoadMetadata())); |
| 195 observer.DidChangePerformanceTiming(); | 200 observer.DidChangePerformanceTiming(); |
| 196 mock_timer2->Fire(); | 201 mock_timer2->Fire(); |
| 197 } | 202 } |
| 198 | 203 |
| 199 } // namespace page_load_metrics | 204 } // namespace page_load_metrics |
| OLD | NEW |