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

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

Issue 1312213010: PageLoadMetrics renderer and browser implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Prevent data loss on sender destruction Created 5 years, 3 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
(Empty)
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
Alexei Svitkine (slow) 2015/09/11 21:26:48 Nit: No (c)
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/page_load_metrics/renderer/page_timing_metrics_sender.h"
6
7 #include "base/time/time.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"
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"
16
17 namespace page_load_metrics {
18
19 namespace {
20
21 class MockIPCSender : public IPC::Sender {
22 public:
23 bool Send(IPC::Message* message) {
24 IPC_BEGIN_MESSAGE_MAP(MockIPCSender, *message)
25 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated)
26 IPC_MESSAGE_UNHANDLED(ADD_FAILURE())
27 IPC_END_MESSAGE_MAP()
28
29 delete message;
30 return true;
31 }
32
33 MOCK_METHOD1(OnTimingUpdated, void(PageLoadTiming));
34 };
35
36 // Thin wrapper around PageTimingMetricsSender that provides access to the
37 // MockTimer instance.
38 class TestPageTimingMetricsSender : public PageTimingMetricsSender {
39 public:
40 explicit TestPageTimingMetricsSender(IPC::Sender* ipc_sender)
41 : PageTimingMetricsSender(
42 ipc_sender,
43 MSG_ROUTING_NONE,
44 scoped_ptr<base::Timer>(new base::MockTimer(false, false))) {}
45
46 base::MockTimer* mock_timer() const {
47 return reinterpret_cast<base::MockTimer*>(timer());
48 }
49 };
50
51 class PageTimingMetricsSenderTest : public testing::Test {
52 public:
53 PageTimingMetricsSenderTest() : metrics_sender_(&mock_ipc_sender_) {}
54
55 protected:
56 testing::StrictMock<MockIPCSender> mock_ipc_sender_;
57 TestPageTimingMetricsSender metrics_sender_;
58 };
59
60 TEST_F(PageTimingMetricsSenderTest, Basic) {
61 base::Time nav_start = base::Time::FromDoubleT(10);
62 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
63
64 PageLoadTiming timing;
65 timing.navigation_start = nav_start;
66 timing.first_layout = first_layout;
67
68 metrics_sender_.Send(timing);
69
70 // Firing the timer should trigger sending of an OnTimingUpdated IPC.
71 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
72 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning());
73 metrics_sender_.mock_timer()->Fire();
74 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
75
76 // At this point, we should have triggered the send of the PageLoadTiming IPC.
77 testing::Mock::VerifyAndClearExpectations(&mock_ipc_sender_);
78
79 // Attempt to send the same timing instance again. The send should be
80 // suppressed, since the timing instance hasn't changed since the last send.
81 metrics_sender_.Send(timing);
82 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
83 }
84
85 TEST_F(PageTimingMetricsSenderTest, CoalesceMultipleIPCs) {
86 base::Time nav_start = base::Time::FromDoubleT(10);
87 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
88 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4);
89
90 PageLoadTiming timing;
91 timing.navigation_start = nav_start;
92 timing.first_layout = first_layout;
93
94 metrics_sender_.Send(timing);
95 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning());
96
97 // Send an updated PageLoadTiming before the timer has fired. When the timer
98 // fires, the updated PageLoadTiming should be sent.
99 timing.load_event_start = load_event;
100 metrics_sender_.Send(timing);
101
102 // Firing the timer should trigger sending of the OnTimingUpdated IPC with
103 // the most recently provided PageLoadTiming instance.
104 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
105 metrics_sender_.mock_timer()->Fire();
106 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
107 }
108
109 TEST_F(PageTimingMetricsSenderTest, MultipleIPCs) {
110 base::Time nav_start = base::Time::FromDoubleT(10);
111 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
112 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4);
113
114 PageLoadTiming timing;
115 timing.navigation_start = nav_start;
116 timing.first_layout = first_layout;
117
118 metrics_sender_.Send(timing);
119 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning());
120 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
121 metrics_sender_.mock_timer()->Fire();
122 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
123 testing::Mock::VerifyAndClearExpectations(&mock_ipc_sender_);
124
125 // Send an updated PageLoadTiming after the timer for the first send request
126 // has fired, and verify that a second IPC is sent.
127 timing.load_event_start = load_event;
128 metrics_sender_.Send(timing);
129 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning());
130 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
131 metrics_sender_.mock_timer()->Fire();
132 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
133 }
134
135 TEST_F(PageTimingMetricsSenderTest, SendIPCOnDestructor) {
136 PageLoadTiming timing;
137 timing.navigation_start = base::Time::FromDoubleT(10);
138 {
139 // This test wants to verify behavior in the PageTimingMetricsSender
140 // destructor, so we create our own instance to make it go out of scope
141 // before the end of the test body.
142 TestPageTimingMetricsSender sender(&mock_ipc_sender_);
143
144 sender.Send(timing);
145 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
146 ASSERT_TRUE(sender.mock_timer()->IsRunning());
147 }
148 }
149
150 } // namespace
151
152 } // namespace page_load_metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698