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

Side by Side Diff: components/page_load_metrics/renderer/page_timing_metrics_sender_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
« no previous file with comments | « components/page_load_metrics/renderer/metrics_render_frame_observer_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 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/page_timing_metrics_sender.h" 5 #include "components/page_load_metrics/renderer/page_timing_metrics_sender.h"
6 6
7 #include "base/time/time.h" 7 #include "base/time/time.h"
8 #include "base/timer/mock_timer.h" 8 #include "base/timer/mock_timer.h"
9 #include "components/page_load_metrics/common/page_load_metrics_messages.h"
10 #include "components/page_load_metrics/common/page_load_timing.h" 9 #include "components/page_load_metrics/common/page_load_timing.h"
10 #include "components/page_load_metrics/renderer/fake_page_timing_metrics_ipc_sen der.h"
11 #include "ipc/ipc_message.h" 11 #include "ipc/ipc_message.h"
12 #include "ipc/ipc_message_macros.h"
13 #include "ipc/ipc_sender.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
16 13
17 namespace page_load_metrics { 14 namespace page_load_metrics {
18 15
19 class MockIPCSender : public IPC::Sender {
20 public:
21 bool Send(IPC::Message* message) {
22 IPC_BEGIN_MESSAGE_MAP(MockIPCSender, *message)
23 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated)
24 IPC_MESSAGE_UNHANDLED(ADD_FAILURE())
25 IPC_END_MESSAGE_MAP()
26
27 delete message;
28 return true;
29 }
30
31 MOCK_METHOD2(OnTimingUpdated, void(PageLoadTiming, PageLoadMetadata));
32 };
33
34 // Thin wrapper around PageTimingMetricsSender that provides access to the 16 // Thin wrapper around PageTimingMetricsSender that provides access to the
35 // MockTimer instance. 17 // MockTimer instance.
36 class TestPageTimingMetricsSender : public PageTimingMetricsSender { 18 class TestPageTimingMetricsSender : public PageTimingMetricsSender {
37 public: 19 public:
38 explicit TestPageTimingMetricsSender(IPC::Sender* ipc_sender, 20 explicit TestPageTimingMetricsSender(IPC::Sender* ipc_sender,
39 const PageLoadTiming& initial_timing) 21 const PageLoadTiming& initial_timing)
40 : PageTimingMetricsSender( 22 : PageTimingMetricsSender(
41 ipc_sender, 23 ipc_sender,
42 MSG_ROUTING_NONE, 24 MSG_ROUTING_NONE,
43 std::unique_ptr<base::Timer>(new base::MockTimer(false, false)), 25 std::unique_ptr<base::Timer>(new base::MockTimer(false, false)),
44 initial_timing) {} 26 initial_timing) {}
45 27
46 base::MockTimer* mock_timer() const { 28 base::MockTimer* mock_timer() const {
47 return reinterpret_cast<base::MockTimer*>(timer()); 29 return reinterpret_cast<base::MockTimer*>(timer());
48 } 30 }
49 }; 31 };
50 32
51 class PageTimingMetricsSenderTest : public testing::Test { 33 class PageTimingMetricsSenderTest : public testing::Test {
52 public: 34 public:
53 PageTimingMetricsSenderTest() 35 PageTimingMetricsSenderTest()
54 : metrics_sender_(&mock_ipc_sender_, PageLoadTiming()) {} 36 : metrics_sender_(new TestPageTimingMetricsSender(&fake_ipc_sender_,
37 PageLoadTiming())) {}
55 38
56 protected: 39 protected:
57 testing::StrictMock<MockIPCSender> mock_ipc_sender_; 40 FakePageTimingMetricsIPCSender fake_ipc_sender_;
58 TestPageTimingMetricsSender metrics_sender_; 41 std::unique_ptr<TestPageTimingMetricsSender> metrics_sender_;
59 }; 42 };
60 43
61 TEST_F(PageTimingMetricsSenderTest, Basic) { 44 TEST_F(PageTimingMetricsSenderTest, Basic) {
62 base::Time nav_start = base::Time::FromDoubleT(10); 45 base::Time nav_start = base::Time::FromDoubleT(10);
63 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); 46 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
64 47
65 PageLoadTiming timing; 48 PageLoadTiming timing;
66 timing.navigation_start = nav_start; 49 timing.navigation_start = nav_start;
67 timing.first_layout = first_layout; 50 timing.first_layout = first_layout;
68 51
69 metrics_sender_.Send(timing); 52 metrics_sender_->Send(timing);
70 53
71 // Firing the timer should trigger sending of an OnTimingUpdated IPC. 54 // Firing the timer should trigger sending of an OnTimingUpdated IPC.
72 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing, PageLoadMetadata())); 55 fake_ipc_sender_.ExpectPageLoadTiming(timing);
73 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning()); 56 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
74 metrics_sender_.mock_timer()->Fire(); 57 metrics_sender_->mock_timer()->Fire();
75 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning()); 58 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
76 59
77 // At this point, we should have triggered the send of the PageLoadTiming IPC. 60 // At this point, we should have triggered the send of the PageLoadTiming IPC.
78 testing::Mock::VerifyAndClearExpectations(&mock_ipc_sender_); 61 fake_ipc_sender_.VerifyExpectedTimings();
79 62
80 // Attempt to send the same timing instance again. The send should be 63 // Attempt to send the same timing instance again. The send should be
81 // suppressed, since the timing instance hasn't changed since the last send. 64 // suppressed, since the timing instance hasn't changed since the last send.
82 metrics_sender_.Send(timing); 65 metrics_sender_->Send(timing);
83 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning()); 66 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
84 } 67 }
85 68
86 TEST_F(PageTimingMetricsSenderTest, CoalesceMultipleIPCs) { 69 TEST_F(PageTimingMetricsSenderTest, CoalesceMultipleIPCs) {
87 base::Time nav_start = base::Time::FromDoubleT(10); 70 base::Time nav_start = base::Time::FromDoubleT(10);
88 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); 71 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
89 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4); 72 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4);
90 73
91 PageLoadTiming timing; 74 PageLoadTiming timing;
92 timing.navigation_start = nav_start; 75 timing.navigation_start = nav_start;
93 timing.first_layout = first_layout; 76 timing.first_layout = first_layout;
94 77
95 metrics_sender_.Send(timing); 78 metrics_sender_->Send(timing);
96 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning()); 79 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
97 80
98 // Send an updated PageLoadTiming before the timer has fired. When the timer 81 // Send an updated PageLoadTiming before the timer has fired. When the timer
99 // fires, the updated PageLoadTiming should be sent. 82 // fires, the updated PageLoadTiming should be sent.
100 timing.load_event_start = load_event; 83 timing.load_event_start = load_event;
101 metrics_sender_.Send(timing); 84 metrics_sender_->Send(timing);
102 85
103 // Firing the timer should trigger sending of the OnTimingUpdated IPC with 86 // Firing the timer should trigger sending of the OnTimingUpdated IPC with
104 // the most recently provided PageLoadTiming instance. 87 // the most recently provided PageLoadTiming instance.
105 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing, PageLoadMetadata())); 88 fake_ipc_sender_.ExpectPageLoadTiming(timing);
106 metrics_sender_.mock_timer()->Fire(); 89 metrics_sender_->mock_timer()->Fire();
107 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning()); 90 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
108 } 91 }
109 92
110 TEST_F(PageTimingMetricsSenderTest, MultipleIPCs) { 93 TEST_F(PageTimingMetricsSenderTest, MultipleIPCs) {
111 base::Time nav_start = base::Time::FromDoubleT(10); 94 base::Time nav_start = base::Time::FromDoubleT(10);
112 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2); 95 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
113 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4); 96 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4);
114 97
115 PageLoadTiming timing; 98 PageLoadTiming timing;
116 timing.navigation_start = nav_start; 99 timing.navigation_start = nav_start;
117 timing.first_layout = first_layout; 100 timing.first_layout = first_layout;
118 101
119 metrics_sender_.Send(timing); 102 metrics_sender_->Send(timing);
120 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning()); 103 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
121 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing, PageLoadMetadata())); 104 fake_ipc_sender_.ExpectPageLoadTiming(timing);
122 metrics_sender_.mock_timer()->Fire(); 105 metrics_sender_->mock_timer()->Fire();
123 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning()); 106 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
124 testing::Mock::VerifyAndClearExpectations(&mock_ipc_sender_); 107 fake_ipc_sender_.VerifyExpectedTimings();
125 108
126 // Send an updated PageLoadTiming after the timer for the first send request 109 // Send an updated PageLoadTiming after the timer for the first send request
127 // has fired, and verify that a second IPC is sent. 110 // has fired, and verify that a second IPC is sent.
128 timing.load_event_start = load_event; 111 timing.load_event_start = load_event;
129 metrics_sender_.Send(timing); 112 metrics_sender_->Send(timing);
130 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning()); 113 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
131 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing, PageLoadMetadata())); 114 fake_ipc_sender_.ExpectPageLoadTiming(timing);
132 metrics_sender_.mock_timer()->Fire(); 115 metrics_sender_->mock_timer()->Fire();
133 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning()); 116 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
134 } 117 }
135 118
136 TEST_F(PageTimingMetricsSenderTest, SendIPCOnDestructor) { 119 TEST_F(PageTimingMetricsSenderTest, SendIPCOnDestructor) {
137 PageLoadTiming timing; 120 PageLoadTiming timing;
138 timing.navigation_start = base::Time::FromDoubleT(10); 121 timing.navigation_start = base::Time::FromDoubleT(10);
139 timing.first_layout = base::TimeDelta::FromMilliseconds(10); 122 timing.first_layout = base::TimeDelta::FromMilliseconds(10);
140 123
141 // This test wants to verify behavior in the PageTimingMetricsSender 124 // This test wants to verify behavior in the PageTimingMetricsSender
142 // destructor, the EXPECT_CALL will be verified when the test tears down and 125 // destructor. The EXPECT_CALL will be satisfied when the |metrics_sender_|
143 // |metrics_sender_| goes out of scope. 126 // is destroyed below.
144 metrics_sender_.Send(timing); 127 metrics_sender_->Send(timing);
145 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing, PageLoadMetadata())); 128 fake_ipc_sender_.ExpectPageLoadTiming(timing);
146 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning()); 129 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
130
131 // Destroy |metrics_sender_|, in order to force its destructor to run.
132 metrics_sender_.reset();
147 } 133 }
148 134
149 } // namespace page_load_metrics 135 } // namespace page_load_metrics
OLDNEW
« no previous file with comments | « components/page_load_metrics/renderer/metrics_render_frame_observer_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698