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

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

Issue 2177743002: Migrate page_load_metrics out of components. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: migrate page_load_metrics_messages to common message generator Created 4 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 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_timing.h"
10 #include "components/page_load_metrics/renderer/fake_page_timing_metrics_ipc_sen der.h"
11 #include "ipc/ipc_message.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace page_load_metrics {
15
16 // Thin wrapper around PageTimingMetricsSender that provides access to the
17 // MockTimer instance.
18 class TestPageTimingMetricsSender : public PageTimingMetricsSender {
19 public:
20 explicit TestPageTimingMetricsSender(IPC::Sender* ipc_sender,
21 const PageLoadTiming& initial_timing)
22 : PageTimingMetricsSender(
23 ipc_sender,
24 MSG_ROUTING_NONE,
25 std::unique_ptr<base::Timer>(new base::MockTimer(false, false)),
26 initial_timing) {}
27
28 base::MockTimer* mock_timer() const {
29 return reinterpret_cast<base::MockTimer*>(timer());
30 }
31 };
32
33 class PageTimingMetricsSenderTest : public testing::Test {
34 public:
35 PageTimingMetricsSenderTest()
36 : metrics_sender_(new TestPageTimingMetricsSender(&fake_ipc_sender_,
37 PageLoadTiming())) {}
38
39 protected:
40 FakePageTimingMetricsIPCSender fake_ipc_sender_;
41 std::unique_ptr<TestPageTimingMetricsSender> metrics_sender_;
42 };
43
44 TEST_F(PageTimingMetricsSenderTest, Basic) {
45 base::Time nav_start = base::Time::FromDoubleT(10);
46 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
47
48 PageLoadTiming timing;
49 timing.navigation_start = nav_start;
50 timing.first_layout = first_layout;
51
52 metrics_sender_->Send(timing);
53
54 // Firing the timer should trigger sending of an OnTimingUpdated IPC.
55 fake_ipc_sender_.ExpectPageLoadTiming(timing);
56 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
57 metrics_sender_->mock_timer()->Fire();
58 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
59
60 // At this point, we should have triggered the send of the PageLoadTiming IPC.
61 fake_ipc_sender_.VerifyExpectedTimings();
62
63 // Attempt to send the same timing instance again. The send should be
64 // suppressed, since the timing instance hasn't changed since the last send.
65 metrics_sender_->Send(timing);
66 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
67 }
68
69 TEST_F(PageTimingMetricsSenderTest, CoalesceMultipleIPCs) {
70 base::Time nav_start = base::Time::FromDoubleT(10);
71 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
72 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4);
73
74 PageLoadTiming timing;
75 timing.navigation_start = nav_start;
76 timing.first_layout = first_layout;
77
78 metrics_sender_->Send(timing);
79 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
80
81 // Send an updated PageLoadTiming before the timer has fired. When the timer
82 // fires, the updated PageLoadTiming should be sent.
83 timing.load_event_start = load_event;
84 metrics_sender_->Send(timing);
85
86 // Firing the timer should trigger sending of the OnTimingUpdated IPC with
87 // the most recently provided PageLoadTiming instance.
88 fake_ipc_sender_.ExpectPageLoadTiming(timing);
89 metrics_sender_->mock_timer()->Fire();
90 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
91 }
92
93 TEST_F(PageTimingMetricsSenderTest, MultipleIPCs) {
94 base::Time nav_start = base::Time::FromDoubleT(10);
95 base::TimeDelta first_layout = base::TimeDelta::FromMillisecondsD(2);
96 base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4);
97
98 PageLoadTiming timing;
99 timing.navigation_start = nav_start;
100 timing.first_layout = first_layout;
101
102 metrics_sender_->Send(timing);
103 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
104 fake_ipc_sender_.ExpectPageLoadTiming(timing);
105 metrics_sender_->mock_timer()->Fire();
106 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
107 fake_ipc_sender_.VerifyExpectedTimings();
108
109 // Send an updated PageLoadTiming after the timer for the first send request
110 // has fired, and verify that a second IPC is sent.
111 timing.load_event_start = load_event;
112 metrics_sender_->Send(timing);
113 ASSERT_TRUE(metrics_sender_->mock_timer()->IsRunning());
114 fake_ipc_sender_.ExpectPageLoadTiming(timing);
115 metrics_sender_->mock_timer()->Fire();
116 EXPECT_FALSE(metrics_sender_->mock_timer()->IsRunning());
117 }
118
119 TEST_F(PageTimingMetricsSenderTest, SendIPCOnDestructor) {
120 PageLoadTiming timing;
121 timing.navigation_start = base::Time::FromDoubleT(10);
122 timing.first_layout = base::TimeDelta::FromMilliseconds(10);
123
124 // This test wants to verify behavior in the PageTimingMetricsSender
125 // destructor. The EXPECT_CALL will be satisfied when the |metrics_sender_|
126 // is destroyed below.
127 metrics_sender_->Send(timing);
128 fake_ipc_sender_.ExpectPageLoadTiming(timing);
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();
133 }
134
135 } // namespace page_load_metrics
OLDNEW
« no previous file with comments | « components/page_load_metrics/renderer/page_timing_metrics_sender.cc ('k') | tools/ipc_fuzzer/message_lib/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698