blob: 70e3da34ca46403378173a69d94cda4db1119d88 [file] [log] [blame]
Yuwei Huangb03b7922019-07-08 22:38:151// Copyright 2019 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 "remoting/host/ftl_signaling_connector.h"
6
7#include <memory>
8
9#include "base/test/mock_callback.h"
Gabriel Charettec7108742019-08-23 03:31:4010#include "base/test/task_environment.h"
Yuwei Huangb03b7922019-07-08 22:38:1511#include "remoting/signaling/fake_signal_strategy.h"
12#include "remoting/signaling/signaling_address.h"
13#include "testing/gmock/include/gmock/gmock.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace remoting {
17
18namespace {
19
20using testing::_;
21
22constexpr char kLocalFtlId[] = "[email protected]/chromoting_ftl_abc123";
23
24} // namespace
25
26class FtlSignalingConnectorTest : public testing::Test {
27 public:
28 FtlSignalingConnectorTest() {
29 signal_strategy_.SimulateTwoStageConnect();
30 signal_strategy_.Disconnect();
31 signaling_connector_ = std::make_unique<FtlSignalingConnector>(
32 &signal_strategy_, auth_failed_callback_.Get());
33 }
34
35 ~FtlSignalingConnectorTest() override {
Gabriel Charettedfa36042019-08-19 17:30:1136 task_environment_.FastForwardUntilNoTasksRemain();
Yuwei Huangb03b7922019-07-08 22:38:1537 }
38
39 protected:
40 const net::BackoffEntry& GetBackoff() {
41 return signaling_connector_->backoff_;
42 }
43
44 const base::OneShotTimer& GetBackoffResetTimer() {
45 return signaling_connector_->backoff_reset_timer_;
46 }
47
Gabriel Charettedfa36042019-08-19 17:30:1148 base::test::TaskEnvironment task_environment_{
49 base::test::TaskEnvironment::TimeSource::MOCK_TIME};
Yuwei Huangb03b7922019-07-08 22:38:1550 FakeSignalStrategy signal_strategy_{SignalingAddress(kLocalFtlId)};
51 base::MockCallback<base::OnceClosure> auth_failed_callback_;
52 std::unique_ptr<FtlSignalingConnector> signaling_connector_;
53};
54
55TEST_F(FtlSignalingConnectorTest, StartAndSucceed) {
56 signaling_connector_->Start();
Gabriel Charettedfa36042019-08-19 17:30:1157 task_environment_.FastForwardUntilNoTasksRemain();
Yuwei Huangb03b7922019-07-08 22:38:1558 ASSERT_EQ(SignalStrategy::CONNECTING, signal_strategy_.GetState());
59 signal_strategy_.ProceedConnect();
60 ASSERT_EQ(SignalStrategy::CONNECTED, signal_strategy_.GetState());
61 ASSERT_TRUE(GetBackoffResetTimer().IsRunning());
62}
63
64TEST_F(FtlSignalingConnectorTest, StartAndAuthFailed) {
65 signaling_connector_->Start();
Gabriel Charettedfa36042019-08-19 17:30:1166 task_environment_.FastForwardUntilNoTasksRemain();
Yuwei Huangb03b7922019-07-08 22:38:1567 ASSERT_EQ(SignalStrategy::CONNECTING, signal_strategy_.GetState());
68
69 signal_strategy_.SetIsSignInError(true);
70 signal_strategy_.SetError(SignalStrategy::AUTHENTICATION_FAILED);
71
72 EXPECT_CALL(auth_failed_callback_, Run()).Times(1);
73 signal_strategy_.Disconnect();
74}
75
76TEST_F(FtlSignalingConnectorTest, StartAndFailedThenRetryAndSucceeded) {
77 ASSERT_EQ(0, GetBackoff().failure_count());
78 signaling_connector_->Start();
Gabriel Charettedfa36042019-08-19 17:30:1179 task_environment_.FastForwardUntilNoTasksRemain();
Yuwei Huangb03b7922019-07-08 22:38:1580 ASSERT_EQ(SignalStrategy::CONNECTING, signal_strategy_.GetState());
81
82 signal_strategy_.SetError(SignalStrategy::NETWORK_ERROR);
83 signal_strategy_.Disconnect();
84 ASSERT_EQ(1, GetBackoff().failure_count());
85
Gabriel Charettedfa36042019-08-19 17:30:1186 task_environment_.FastForwardBy(GetBackoff().GetTimeUntilRelease());
Yuwei Huangb03b7922019-07-08 22:38:1587 ASSERT_EQ(SignalStrategy::CONNECTING, signal_strategy_.GetState());
88 signal_strategy_.ProceedConnect();
89
90 // Failure count is not reset immediately.
91 ASSERT_EQ(1, GetBackoff().failure_count());
92
93 // Failure count is eventually reset to 0.
Gabriel Charettedfa36042019-08-19 17:30:1194 task_environment_.FastForwardUntilNoTasksRemain();
Yuwei Huangb03b7922019-07-08 22:38:1595 ASSERT_EQ(0, GetBackoff().failure_count());
96}
97
98TEST_F(FtlSignalingConnectorTest,
99 StartAndImmediatelyDisconnected_RetryWithBackoff) {
100 ASSERT_EQ(0, GetBackoff().failure_count());
101 signaling_connector_->Start();
Gabriel Charettedfa36042019-08-19 17:30:11102 task_environment_.FastForwardUntilNoTasksRemain();
Yuwei Huangb03b7922019-07-08 22:38:15103 ASSERT_EQ(SignalStrategy::CONNECTING, signal_strategy_.GetState());
104
105 signal_strategy_.ProceedConnect();
106 ASSERT_EQ(0, GetBackoff().failure_count());
107
108 signal_strategy_.Disconnect();
109 ASSERT_EQ(1, GetBackoff().failure_count());
110
Gabriel Charettedfa36042019-08-19 17:30:11111 task_environment_.FastForwardBy(GetBackoff().GetTimeUntilRelease());
Yuwei Huangb03b7922019-07-08 22:38:15112 ASSERT_EQ(SignalStrategy::CONNECTING, signal_strategy_.GetState());
113 signal_strategy_.ProceedConnect();
114
115 // Failure count is not reset immediately.
116 ASSERT_EQ(1, GetBackoff().failure_count());
117
118 // Failure count is eventually reset to 0.
Gabriel Charettedfa36042019-08-19 17:30:11119 task_environment_.FastForwardUntilNoTasksRemain();
Yuwei Huangb03b7922019-07-08 22:38:15120 ASSERT_EQ(0, GetBackoff().failure_count());
121}
122
123TEST_F(FtlSignalingConnectorTest, AutoConnectOnNetworkChange) {
124 signaling_connector_->OnNetworkChanged(
125 net::NetworkChangeNotifier::CONNECTION_ETHERNET);
126 // Reconnection starts with some delay.
127 ASSERT_EQ(SignalStrategy::DISCONNECTED, signal_strategy_.GetState());
Gabriel Charettedfa36042019-08-19 17:30:11128 task_environment_.FastForwardUntilNoTasksRemain();
Yuwei Huangb03b7922019-07-08 22:38:15129 ASSERT_EQ(SignalStrategy::CONNECTING, signal_strategy_.GetState());
130}
131
132} // namespace remoting