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

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

Powered by Google App Engine
This is Rietveld 408576698