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

Side by Side Diff: components/cast_channel/keep_alive_delegate_unittest.cc

Issue 2926313002: Revert of [cast_channel] Move cast_channel related files from //extensions to //components (Closed)
Patch Set: Created 3 years, 6 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/cast_channel/keep_alive_delegate.cc ('k') | components/cast_channel/logger.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/cast_channel/keep_alive_delegate.h"
6
7 #include <stdint.h>
8
9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h"
11 #include "base/message_loop/message_loop.h"
12 #include "base/run_loop.h"
13 #include "base/timer/mock_timer.h"
14 #include "components/cast_channel/cast_test_util.h"
15 #include "net/base/net_errors.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 using testing::_;
20 using testing::Sequence;
21
22 namespace cast_channel {
23 namespace {
24
25 const int64_t kTestPingTimeoutMillis = 1000;
26 const int64_t kTestLivenessTimeoutMillis = 10000;
27
28 // Extends MockTimer with a mockable method ResetTriggered() which permits
29 // test code to set GMock expectations for Timer::Reset().
30 class MockTimerWithMonitoredReset : public base::MockTimer {
31 public:
32 MockTimerWithMonitoredReset(bool retain_user_task, bool is_repeating)
33 : base::MockTimer(retain_user_task, is_repeating) {}
34 ~MockTimerWithMonitoredReset() override {}
35
36 // Instrumentation point for determining how many times Reset() was called.
37 MOCK_METHOD0(ResetTriggered, void(void));
38 MOCK_METHOD0(Stop, void(void));
39
40 // Passes through the Reset call to the base MockTimer and visits the mock
41 // ResetTriggered method.
42 void Reset() override {
43 base::MockTimer::Reset();
44 ResetTriggered();
45 }
46 };
47
48 class KeepAliveDelegateTest : public testing::Test {
49 public:
50 using ChannelError = ::cast_channel::ChannelError;
51
52 KeepAliveDelegateTest() {}
53 ~KeepAliveDelegateTest() override {}
54
55 protected:
56 void SetUp() override {
57 inner_delegate_ = new MockCastTransportDelegate;
58 logger_ = new Logger();
59 keep_alive_.reset(new KeepAliveDelegate(
60 &socket_, logger_, base::WrapUnique(inner_delegate_),
61 base::TimeDelta::FromMilliseconds(kTestPingTimeoutMillis),
62 base::TimeDelta::FromMilliseconds(kTestLivenessTimeoutMillis)));
63 liveness_timer_ = new MockTimerWithMonitoredReset(true, false);
64 ping_timer_ = new MockTimerWithMonitoredReset(true, false);
65 EXPECT_CALL(*liveness_timer_, Stop()).Times(0);
66 EXPECT_CALL(*ping_timer_, Stop()).Times(0);
67 keep_alive_->SetTimersForTest(base::WrapUnique(ping_timer_),
68 base::WrapUnique(liveness_timer_));
69 }
70
71 // Runs all pending tasks in the message loop.
72 void RunPendingTasks() {
73 base::RunLoop run_loop;
74 run_loop.RunUntilIdle();
75 }
76
77 base::MessageLoop message_loop_;
78 MockCastSocket socket_;
79 std::unique_ptr<KeepAliveDelegate> keep_alive_;
80 scoped_refptr<Logger> logger_;
81 MockCastTransportDelegate* inner_delegate_;
82 MockTimerWithMonitoredReset* liveness_timer_;
83 MockTimerWithMonitoredReset* ping_timer_;
84
85 private:
86 DISALLOW_COPY_AND_ASSIGN(KeepAliveDelegateTest);
87 };
88
89 TEST_F(KeepAliveDelegateTest, TestErrorHandledBeforeStarting) {
90 keep_alive_->OnError(ChannelError::CONNECT_ERROR);
91 }
92
93 TEST_F(KeepAliveDelegateTest, TestPing) {
94 EXPECT_CALL(*socket_.mock_transport(),
95 SendMessage(EqualsProto(KeepAliveDelegate::CreateKeepAliveMessage(
96 KeepAliveDelegate::kHeartbeatPingType)),
97 _))
98 .WillOnce(PostCompletionCallbackTask<1>(net::OK));
99 EXPECT_CALL(*inner_delegate_, Start());
100 EXPECT_CALL(*ping_timer_, ResetTriggered()).Times(2);
101 EXPECT_CALL(*liveness_timer_, ResetTriggered()).Times(2);
102 EXPECT_CALL(*ping_timer_, Stop());
103
104 keep_alive_->Start();
105 ping_timer_->Fire();
106 keep_alive_->OnMessage(KeepAliveDelegate::CreateKeepAliveMessage(
107 KeepAliveDelegate::kHeartbeatPongType));
108 RunPendingTasks();
109 }
110
111 TEST_F(KeepAliveDelegateTest, TestPingFailed) {
112 EXPECT_CALL(*socket_.mock_transport(),
113 SendMessage(EqualsProto(KeepAliveDelegate::CreateKeepAliveMessage(
114 KeepAliveDelegate::kHeartbeatPingType)),
115 _))
116 .WillOnce(PostCompletionCallbackTask<1>(net::ERR_CONNECTION_RESET));
117 EXPECT_CALL(*inner_delegate_, Start());
118 EXPECT_CALL(*inner_delegate_, OnError(ChannelError::CAST_SOCKET_ERROR));
119 EXPECT_CALL(*ping_timer_, ResetTriggered()).Times(1);
120 EXPECT_CALL(*liveness_timer_, ResetTriggered()).Times(1);
121 EXPECT_CALL(*liveness_timer_, Stop());
122 EXPECT_CALL(*ping_timer_, Stop()).Times(2);
123
124 keep_alive_->Start();
125 ping_timer_->Fire();
126 RunPendingTasks();
127 EXPECT_EQ(proto::PING_WRITE_ERROR,
128 logger_->GetLastErrors(socket_.id()).event_type);
129 EXPECT_EQ(net::ERR_CONNECTION_RESET,
130 logger_->GetLastErrors(socket_.id()).net_return_value);
131 }
132
133 TEST_F(KeepAliveDelegateTest, TestPingAndLivenessTimeout) {
134 EXPECT_CALL(*socket_.mock_transport(),
135 SendMessage(EqualsProto(KeepAliveDelegate::CreateKeepAliveMessage(
136 KeepAliveDelegate::kHeartbeatPingType)),
137 _))
138 .WillOnce(PostCompletionCallbackTask<1>(net::OK));
139 EXPECT_CALL(*inner_delegate_, OnError(ChannelError::PING_TIMEOUT));
140 EXPECT_CALL(*inner_delegate_, Start());
141 EXPECT_CALL(*ping_timer_, ResetTriggered()).Times(1);
142 EXPECT_CALL(*liveness_timer_, ResetTriggered()).Times(1);
143 EXPECT_CALL(*liveness_timer_, Stop()).Times(2);
144 EXPECT_CALL(*ping_timer_, Stop()).Times(2);
145
146 keep_alive_->Start();
147 ping_timer_->Fire();
148 liveness_timer_->Fire();
149 RunPendingTasks();
150 }
151
152 TEST_F(KeepAliveDelegateTest, TestResetTimersAndPassthroughAllOtherTraffic) {
153 CastMessage other_message =
154 KeepAliveDelegate::CreateKeepAliveMessage("NEITHER_PING_NOR_PONG");
155
156 EXPECT_CALL(*inner_delegate_, OnMessage(EqualsProto(other_message)));
157 EXPECT_CALL(*inner_delegate_, Start());
158 EXPECT_CALL(*ping_timer_, ResetTriggered()).Times(2);
159 EXPECT_CALL(*liveness_timer_, ResetTriggered()).Times(2);
160
161 keep_alive_->Start();
162 keep_alive_->OnMessage(other_message);
163 RunPendingTasks();
164 }
165
166 TEST_F(KeepAliveDelegateTest, TestPassthroughMessagesAfterError) {
167 CastMessage message =
168 KeepAliveDelegate::CreateKeepAliveMessage("NEITHER_PING_NOR_PONG");
169 CastMessage message_after_error =
170 KeepAliveDelegate::CreateKeepAliveMessage("ANOTHER_NOT_PING_NOR_PONG");
171 CastMessage late_ping_message = KeepAliveDelegate::CreateKeepAliveMessage(
172 KeepAliveDelegate::kHeartbeatPingType);
173
174 EXPECT_CALL(*inner_delegate_, Start()).Times(1);
175 EXPECT_CALL(*ping_timer_, ResetTriggered()).Times(2);
176 EXPECT_CALL(*liveness_timer_, ResetTriggered()).Times(2);
177 EXPECT_CALL(*liveness_timer_, Stop()).Times(1);
178 EXPECT_CALL(*ping_timer_, Stop()).Times(1);
179
180 Sequence message_and_error_sequence;
181 EXPECT_CALL(*inner_delegate_, OnMessage(EqualsProto(message)))
182 .Times(1)
183 .InSequence(message_and_error_sequence)
184 .RetiresOnSaturation();
185 EXPECT_CALL(*inner_delegate_, OnError(ChannelError::INVALID_MESSAGE))
186 .Times(1)
187 .InSequence(message_and_error_sequence);
188 EXPECT_CALL(*inner_delegate_, OnMessage(EqualsProto(message_after_error)))
189 .Times(1)
190 .InSequence(message_and_error_sequence)
191 .RetiresOnSaturation();
192 EXPECT_CALL(*inner_delegate_, OnMessage(EqualsProto(late_ping_message)))
193 .Times(0)
194 .InSequence(message_and_error_sequence)
195 .RetiresOnSaturation();
196
197 // Start, process one message, then error-out. KeepAliveDelegate will
198 // automatically stop itself.
199 keep_alive_->Start();
200 keep_alive_->OnMessage(message);
201 RunPendingTasks();
202 keep_alive_->OnError(ChannelError::INVALID_MESSAGE);
203 RunPendingTasks();
204
205 // Process a non-PING/PONG message and expect it to pass through.
206 keep_alive_->OnMessage(message_after_error);
207 RunPendingTasks();
208
209 // Process a late-arriving PING/PONG message, which should have no effect.
210 keep_alive_->OnMessage(late_ping_message);
211 RunPendingTasks();
212 }
213
214 } // namespace
215 } // namespace cast_channel
OLDNEW
« no previous file with comments | « components/cast_channel/keep_alive_delegate.cc ('k') | components/cast_channel/logger.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698