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

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

Issue 1282303002: PageLoadMetrics renderer and browser implementation (deprecated) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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.
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_OnTimingUpdated,
26 OnTimingUpdated)
27 IPC_MESSAGE_UNHANDLED(ADD_FAILURE())
28 IPC_END_MESSAGE_MAP()
29
30 delete message;
31 return true;
32 }
33
34 MOCK_METHOD1(OnTimingUpdated, void(PageLoadTiming));
35 };
36
37 // Thin wrapper around PageTimingMetricsSender that provides access to the
38 // MockTimer instance.
39 class TestPageTimingMetricsSender : public PageTimingMetricsSender {
40 public:
41 explicit TestPageTimingMetricsSender(IPC::Sender* ipc_sender)
42 : PageTimingMetricsSender(
43 ipc_sender,
44 MSG_ROUTING_NONE,
45 scoped_ptr<base::Timer>(new base::MockTimer(false, false))) {
46 }
47
48 base::MockTimer* mock_timer() const {
49 return reinterpret_cast<base::MockTimer*>(timer());
50 }
51 };
52
53 class PageTimingMetricsSenderTest : public testing::Test {
54 public:
55 PageTimingMetricsSenderTest() : metrics_sender_(&mock_ipc_sender_) {}
56
57 protected:
58 testing::StrictMock<MockIPCSender> mock_ipc_sender_;
59 TestPageTimingMetricsSender metrics_sender_;
60 };
61
62 TEST_F(PageTimingMetricsSenderTest, Basic) {
63 base::Time nav_start = base::Time::FromDoubleT(10);
64 base::Time first_layout = base::Time::FromDoubleT(12);
65
66 PageLoadTiming timing;
67 timing.navigation_start = nav_start;
68 timing.first_layout = first_layout;
69
70 metrics_sender_.Send(timing);
71
72 // Firing the timer should trigger sending of an OnTimingUpdated IPC.
73 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
74 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning());
75 metrics_sender_.mock_timer()->Fire();
76 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
77
78 // At this point, we should have triggered the send of the PageLoadTiming IPC.
79 testing::Mock::VerifyAndClearExpectations(&mock_ipc_sender_);
80
81 // Attempt to send the same timing instance again. The send should be
82 // suppressed, since the timing instance hasn't changed since the last send.
83 metrics_sender_.Send(timing);
84 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
85 }
86
87 TEST_F(PageTimingMetricsSenderTest, CoalesceMultipleIPCs) {
88 base::Time nav_start = base::Time::FromDoubleT(10);
89 base::Time first_layout = base::Time::FromDoubleT(12);
90 base::Time load_event = base::Time::FromDoubleT(16);
91
92 PageLoadTiming timing;
93 timing.navigation_start = nav_start;
94 timing.first_layout = first_layout;
95
96 metrics_sender_.Send(timing);
97 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning());
98
99 // Send an updated PageLoadTiming before the timer has fired. When the timer
100 // fires, the updated PageLoadTiming should be sent.
101 timing.load_event_start = load_event;
102 metrics_sender_.Send(timing);
103
104 // Firing the timer should trigger sending of the OnTimingUpdated IPC with
105 // the most recently provided PageLoadTiming instance.
106 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
107 metrics_sender_.mock_timer()->Fire();
108 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
109 }
110
111 TEST_F(PageTimingMetricsSenderTest, MultipleIPCs) {
112 base::Time nav_start = base::Time::FromDoubleT(10);
113 base::Time first_layout = base::Time::FromDoubleT(12);
114 base::Time load_event = base::Time::FromDoubleT(16);
115
116 PageLoadTiming timing;
117 timing.navigation_start = nav_start;
118 timing.first_layout = first_layout;
119
120 metrics_sender_.Send(timing);
121 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning());
122 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
123 metrics_sender_.mock_timer()->Fire();
124 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
125 testing::Mock::VerifyAndClearExpectations(&mock_ipc_sender_);
126
127 // Send an updated PageLoadTiming after the timer for the first send request
128 // has fired, and verify that a second IPC is sent.
129 timing.load_event_start = load_event;
130 metrics_sender_.Send(timing);
131 ASSERT_TRUE(metrics_sender_.mock_timer()->IsRunning());
132 EXPECT_CALL(mock_ipc_sender_, OnTimingUpdated(timing));
133 metrics_sender_.mock_timer()->Fire();
134 EXPECT_FALSE(metrics_sender_.mock_timer()->IsRunning());
135 }
136
137 } // namespace
138
139 } // namespace page_load_metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698