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

Side by Side Diff: components/page_load_metrics/renderer/metrics_render_frame_observer_unittest.cc

Issue 2100653002: PageLoadTiming fixes in prep for using base::Optional (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: revert changes to PageLoadTiming Created 4 years, 5 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
OLDNEW
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 <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/time/time.h" 11 #include "base/time/time.h"
12 #include "base/timer/mock_timer.h" 12 #include "base/timer/mock_timer.h"
13 #include "components/page_load_metrics/common/page_load_metrics_messages.h"
14 #include "components/page_load_metrics/common/page_load_timing.h" 13 #include "components/page_load_metrics/common/page_load_timing.h"
15 #include "ipc/ipc_message_macros.h" 14 #include "components/page_load_metrics/renderer/fake_page_timing_metrics_ipc_sen der.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
18 16
19 using testing::NiceMock;
20 using testing::Return;
21 using testing::StrictMock;
22
23 namespace page_load_metrics { 17 namespace page_load_metrics {
24 18
25 // IPC interceptor class, which we use to verify that certain IPC
26 // messages get sent.
27 class MockIPCInterceptor {
28 public:
29 void OnMessage(const IPC::Message& message) {
30 IPC_BEGIN_MESSAGE_MAP(MockIPCInterceptor, message)
31 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated)
32 IPC_MESSAGE_UNHANDLED(ADD_FAILURE())
33 IPC_END_MESSAGE_MAP()
34 }
35
36 MOCK_METHOD2(OnTimingUpdated, void(PageLoadTiming, PageLoadMetadata));
37 };
38
39 // Implementation of the MetricsRenderFrameObserver class we're testing, 19 // Implementation of the MetricsRenderFrameObserver class we're testing,
40 // with the GetTiming() and ShouldSendMetrics() methods stubbed out to make 20 // with the GetTiming() and ShouldSendMetrics() methods stubbed out to make
41 // the rest of the class more testable. 21 // the rest of the class more testable.
42 class MockMetricsRenderFrameObserver : public MetricsRenderFrameObserver { 22 class TestMetricsRenderFrameObserver : public MetricsRenderFrameObserver {
43 public: 23 public:
44 MockMetricsRenderFrameObserver() : MetricsRenderFrameObserver(nullptr) { 24 TestMetricsRenderFrameObserver() : MetricsRenderFrameObserver(nullptr) {}
45 ON_CALL(*this, ShouldSendMetrics()).WillByDefault(Return(true));
46 ON_CALL(*this, HasNoRenderFrame()).WillByDefault(Return(false));
47 }
48 25
49 std::unique_ptr<base::Timer> CreateTimer() const override { 26 std::unique_ptr<base::Timer> CreateTimer() const override {
50 if (!mock_timer_) 27 if (!mock_timer_)
51 ADD_FAILURE() << "CreateTimer() called, but no MockTimer available."; 28 ADD_FAILURE() << "CreateTimer() called, but no MockTimer available.";
52 return std::move(mock_timer_); 29 return std::move(mock_timer_);
53 } 30 }
54 31
55 // We intercept sent messages and dispatch them to a MockIPCInterceptor, which 32 // We intercept sent messages and dispatch them to our
56 // we use to verify that the expected IPC messages get sent. 33 // FakePageTimingMetricsIPCSender, which we use to verify that the expected
57 virtual bool Send(IPC::Message* message) { 34 // IPC messages get sent.
58 interceptor_.OnMessage(*message); 35 bool Send(IPC::Message* message) override {
59 delete message; 36 return fake_timing_ipc_sender_.Send(message);
60 return true;
61 } 37 }
62 38
63 void set_mock_timer(std::unique_ptr<base::Timer> timer) { 39 void set_mock_timer(std::unique_ptr<base::Timer> timer) {
64 ASSERT_EQ(nullptr, mock_timer_); 40 ASSERT_EQ(nullptr, mock_timer_);
65 mock_timer_ = std::move(timer); 41 mock_timer_ = std::move(timer);
66 } 42 }
67 43
68 MOCK_CONST_METHOD0(GetTiming, PageLoadTiming()); 44 void ExpectPageLoadTiming(const PageLoadTiming& timing) {
69 MOCK_CONST_METHOD0(ShouldSendMetrics, bool()); 45 fake_timing_ipc_sender_.ExpectPageLoadTiming(timing);
70 MOCK_CONST_METHOD0(HasNoRenderFrame, bool()); 46 }
71 MockIPCInterceptor* ipc_interceptor() { return &interceptor_; } 47
48 PageLoadTiming GetTiming() const override {
49 return fake_timing_ipc_sender_.expected_timings().empty()
50 ? PageLoadTiming()
51 : fake_timing_ipc_sender_.expected_timings().back();
52 }
53
54 void VerifyExpectedTimings() const {
55 fake_timing_ipc_sender_.VerifyExpectedTimings();
56 }
57
58 bool ShouldSendMetrics() const override { return true; }
59 bool HasNoRenderFrame() const override { return false; }
72 60
73 private: 61 private:
74 StrictMock<MockIPCInterceptor> interceptor_; 62 FakePageTimingMetricsIPCSender fake_timing_ipc_sender_;
75 mutable std::unique_ptr<base::Timer> mock_timer_; 63 mutable std::unique_ptr<base::Timer> mock_timer_;
76 }; 64 };
77 65
78 typedef testing::Test MetricsRenderFrameObserverTest; 66 typedef testing::Test MetricsRenderFrameObserverTest;
79 67
80 TEST_F(MetricsRenderFrameObserverTest, NoMetrics) { 68 TEST_F(MetricsRenderFrameObserverTest, NoMetrics) {
81 NiceMock<MockMetricsRenderFrameObserver> observer; 69 TestMetricsRenderFrameObserver observer;
82 base::MockTimer* mock_timer = new base::MockTimer(false, false); 70 base::MockTimer* mock_timer = new base::MockTimer(false, false);
83 observer.set_mock_timer(base::WrapUnique(mock_timer)); 71 observer.set_mock_timer(base::WrapUnique(mock_timer));
84 72
85 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(PageLoadTiming()));
86
87 observer.DidChangePerformanceTiming(); 73 observer.DidChangePerformanceTiming();
88 ASSERT_FALSE(mock_timer->IsRunning()); 74 ASSERT_FALSE(mock_timer->IsRunning());
89 } 75 }
90 76
91 TEST_F(MetricsRenderFrameObserverTest, SingleMetric) { 77 TEST_F(MetricsRenderFrameObserverTest, SingleMetric) {
92 base::Time nav_start = base::Time::FromDoubleT(10); 78 base::Time nav_start = base::Time::FromDoubleT(10);
93 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(10); 79 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(10);
94 80
95 NiceMock<MockMetricsRenderFrameObserver> observer; 81 TestMetricsRenderFrameObserver observer;
96 base::MockTimer* mock_timer = new base::MockTimer(false, false); 82 base::MockTimer* mock_timer = new base::MockTimer(false, false);
97 observer.set_mock_timer(base::WrapUnique(mock_timer)); 83 observer.set_mock_timer(base::WrapUnique(mock_timer));
98 84
99 PageLoadTiming timing; 85 PageLoadTiming timing;
100 timing.navigation_start = nav_start; 86 timing.navigation_start = nav_start;
101 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); 87 observer.ExpectPageLoadTiming(timing);
102 observer.DidCommitProvisionalLoad(true, false); 88 observer.DidCommitProvisionalLoad(true, false);
103 EXPECT_CALL(*observer.ipc_interceptor(),
104 OnTimingUpdated(timing, PageLoadMetadata()));
105 mock_timer->Fire(); 89 mock_timer->Fire();
106 90
107 timing.first_layout = first_layout; 91 timing.first_layout = first_layout;
108 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); 92 observer.ExpectPageLoadTiming(timing);
109
110 EXPECT_CALL(*observer.ipc_interceptor(),
111 OnTimingUpdated(timing, PageLoadMetadata()));
112 93
113 observer.DidChangePerformanceTiming(); 94 observer.DidChangePerformanceTiming();
114 mock_timer->Fire(); 95 mock_timer->Fire();
115 } 96 }
116 97
117 TEST_F(MetricsRenderFrameObserverTest, MultipleMetrics) { 98 TEST_F(MetricsRenderFrameObserverTest, MultipleMetrics) {
118 base::Time nav_start = base::Time::FromDoubleT(10); 99 base::Time nav_start = base::Time::FromDoubleT(10);
119 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); 100 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
120 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); 101 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2);
121 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); 102 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2);
122 103
123 NiceMock<MockMetricsRenderFrameObserver> observer; 104 TestMetricsRenderFrameObserver observer;
124 base::MockTimer* mock_timer = new base::MockTimer(false, false); 105 base::MockTimer* mock_timer = new base::MockTimer(false, false);
125 observer.set_mock_timer(base::WrapUnique(mock_timer)); 106 observer.set_mock_timer(base::WrapUnique(mock_timer));
126 107
127 PageLoadTiming timing; 108 PageLoadTiming timing;
128 timing.navigation_start = nav_start; 109 timing.navigation_start = nav_start;
129 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); 110 observer.ExpectPageLoadTiming(timing);
130 observer.DidCommitProvisionalLoad(true, false); 111 observer.DidCommitProvisionalLoad(true, false);
131 EXPECT_CALL(*observer.ipc_interceptor(),
132 OnTimingUpdated(timing, PageLoadMetadata()));
133 mock_timer->Fire(); 112 mock_timer->Fire();
134 113
135 timing.first_layout = first_layout; 114 timing.first_layout = first_layout;
136 timing.dom_content_loaded_event_start = dom_event; 115 timing.dom_content_loaded_event_start = dom_event;
137 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); 116 observer.ExpectPageLoadTiming(timing);
138 117
139 EXPECT_CALL(*observer.ipc_interceptor(),
140 OnTimingUpdated(timing, PageLoadMetadata()));
141 observer.DidChangePerformanceTiming(); 118 observer.DidChangePerformanceTiming();
142 mock_timer->Fire(); 119 mock_timer->Fire();
143 120
144 // At this point, we should have triggered the generation of two metrics. 121 // At this point, we should have triggered the generation of two metrics.
145 // Verify and reset the observer's expectations before moving on to the next 122 // Verify and reset the observer's expectations before moving on to the next
146 // part of the test. 123 // part of the test.
147 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); 124 observer.VerifyExpectedTimings();
148 125
149 timing.load_event_start = load_event; 126 timing.load_event_start = load_event;
150 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); 127 observer.ExpectPageLoadTiming(timing);
151 128
152 EXPECT_CALL(*observer.ipc_interceptor(),
153 OnTimingUpdated(timing, PageLoadMetadata()));
154 observer.DidChangePerformanceTiming(); 129 observer.DidChangePerformanceTiming();
155 mock_timer->Fire(); 130 mock_timer->Fire();
156 131
157 // Verify and reset the observer's expectations before moving on to the next 132 // Verify and reset the observer's expectations before moving on to the next
158 // part of the test. 133 // part of the test.
159 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); 134 observer.VerifyExpectedTimings();
160 135
161 // The PageLoadTiming above includes timing information for the first layout, 136 // The PageLoadTiming above includes timing information for the first layout,
162 // dom content, and load metrics. However, since we've already generated 137 // dom content, and load metrics. However, since we've already generated
163 // timing information for all of these metrics previously, we do not expect 138 // timing information for all of these metrics previously, we do not expect
164 // this invocation to generate any additional metrics. 139 // this invocation to generate any additional metrics.
165 observer.DidChangePerformanceTiming(); 140 observer.DidChangePerformanceTiming();
166 ASSERT_FALSE(mock_timer->IsRunning()); 141 ASSERT_FALSE(mock_timer->IsRunning());
167 } 142 }
168 143
169 TEST_F(MetricsRenderFrameObserverTest, MultipleNavigations) { 144 TEST_F(MetricsRenderFrameObserverTest, MultipleNavigations) {
170 base::Time nav_start = base::Time::FromDoubleT(10); 145 base::Time nav_start = base::Time::FromDoubleT(10);
171 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); 146 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
172 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2); 147 base::TimeDelta dom_event = base::TimeDelta::FromMillisecondsD(2);
173 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2); 148 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(2);
174 149
175 NiceMock<MockMetricsRenderFrameObserver> observer; 150 TestMetricsRenderFrameObserver observer;
176 base::MockTimer* mock_timer = new base::MockTimer(false, false); 151 base::MockTimer* mock_timer = new base::MockTimer(false, false);
177 observer.set_mock_timer(base::WrapUnique(mock_timer)); 152 observer.set_mock_timer(base::WrapUnique(mock_timer));
178 153
179 PageLoadTiming timing; 154 PageLoadTiming timing;
180 timing.navigation_start = nav_start; 155 timing.navigation_start = nav_start;
181 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); 156 observer.ExpectPageLoadTiming(timing);
182 observer.DidCommitProvisionalLoad(true, false); 157 observer.DidCommitProvisionalLoad(true, false);
183 EXPECT_CALL(*observer.ipc_interceptor(),
184 OnTimingUpdated(timing, PageLoadMetadata()));
185 mock_timer->Fire(); 158 mock_timer->Fire();
186 159
187 timing.first_layout = first_layout; 160 timing.first_layout = first_layout;
188 timing.dom_content_loaded_event_start = dom_event; 161 timing.dom_content_loaded_event_start = dom_event;
189 timing.load_event_start = load_event; 162 timing.load_event_start = load_event;
190 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing)); 163 observer.ExpectPageLoadTiming(timing);
191 EXPECT_CALL(*observer.ipc_interceptor(),
192 OnTimingUpdated(timing, PageLoadMetadata()));
193 observer.DidChangePerformanceTiming(); 164 observer.DidChangePerformanceTiming();
194 mock_timer->Fire(); 165 mock_timer->Fire();
195 166
196 // At this point, we should have triggered the generation of two metrics. 167 // At this point, we should have triggered the generation of two metrics.
197 // Verify and reset the observer's expectations before moving on to the next 168 // Verify and reset the observer's expectations before moving on to the next
198 // part of the test. 169 // part of the test.
199 testing::Mock::VerifyAndClearExpectations(observer.ipc_interceptor()); 170 observer.VerifyExpectedTimings();
200 171
201 base::Time nav_start_2 = base::Time::FromDoubleT(100); 172 base::Time nav_start_2 = base::Time::FromDoubleT(100);
202 base::TimeDelta first_layout_2 = base::TimeDelta::FromMillisecondsD(20); 173 base::TimeDelta first_layout_2 = base::TimeDelta::FromMillisecondsD(20);
203 base::TimeDelta dom_event_2 = base::TimeDelta::FromMillisecondsD(20); 174 base::TimeDelta dom_event_2 = base::TimeDelta::FromMillisecondsD(20);
204 base::TimeDelta load_event_2 = base::TimeDelta::FromMillisecondsD(20); 175 base::TimeDelta load_event_2 = base::TimeDelta::FromMillisecondsD(20);
205 PageLoadTiming timing_2; 176 PageLoadTiming timing_2;
206 timing_2.navigation_start = nav_start_2; 177 timing_2.navigation_start = nav_start_2;
207 178
208 base::MockTimer* mock_timer2 = new base::MockTimer(false, false); 179 base::MockTimer* mock_timer2 = new base::MockTimer(false, false);
209 observer.set_mock_timer(base::WrapUnique(mock_timer2)); 180 observer.set_mock_timer(base::WrapUnique(mock_timer2));
210 181
211 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing_2)); 182 observer.ExpectPageLoadTiming(timing_2);
212 observer.DidCommitProvisionalLoad(true, false); 183 observer.DidCommitProvisionalLoad(true, false);
213 EXPECT_CALL(*observer.ipc_interceptor(),
214 OnTimingUpdated(timing_2, PageLoadMetadata()));
215 mock_timer2->Fire(); 184 mock_timer2->Fire();
216 185
217 timing_2.first_layout = first_layout_2; 186 timing_2.first_layout = first_layout_2;
218 timing_2.dom_content_loaded_event_start = dom_event_2; 187 timing_2.dom_content_loaded_event_start = dom_event_2;
219 timing_2.load_event_start = load_event_2; 188 timing_2.load_event_start = load_event_2;
220 EXPECT_CALL(observer, GetTiming()).WillRepeatedly(Return(timing_2)); 189 observer.ExpectPageLoadTiming(timing_2);
221 190
222 EXPECT_CALL(*observer.ipc_interceptor(),
223 OnTimingUpdated(timing_2, PageLoadMetadata()));
224 observer.DidChangePerformanceTiming(); 191 observer.DidChangePerformanceTiming();
225 mock_timer2->Fire(); 192 mock_timer2->Fire();
226 } 193 }
227 194
228 } // namespace page_load_metrics 195 } // namespace page_load_metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698