Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 1 | // 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 Charette | c710874 | 2019-08-23 03:31:40 | [diff] [blame] | 10 | #include "base/test/task_environment.h" |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 11 | #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 | |
| 16 | namespace remoting { |
| 17 | |
| 18 | namespace { |
| 19 | |
| 20 | using testing::_; |
| 21 | |
| 22 | constexpr char kLocalFtlId[] = "[email protected]/chromoting_ftl_abc123"; |
| 23 | |
| 24 | } // namespace |
| 25 | |
| 26 | class 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 Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 36 | task_environment_.FastForwardUntilNoTasksRemain(); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 37 | } |
| 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 Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 48 | base::test::TaskEnvironment task_environment_{ |
| 49 | base::test::TaskEnvironment::TimeSource::MOCK_TIME}; |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 50 | FakeSignalStrategy signal_strategy_{SignalingAddress(kLocalFtlId)}; |
| 51 | base::MockCallback<base::OnceClosure> auth_failed_callback_; |
| 52 | std::unique_ptr<FtlSignalingConnector> signaling_connector_; |
| 53 | }; |
| 54 | |
| 55 | TEST_F(FtlSignalingConnectorTest, StartAndSucceed) { |
| 56 | signaling_connector_->Start(); |
Gabriel Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 57 | task_environment_.FastForwardUntilNoTasksRemain(); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 58 | 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 | |
| 64 | TEST_F(FtlSignalingConnectorTest, StartAndAuthFailed) { |
| 65 | signaling_connector_->Start(); |
Gabriel Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 66 | task_environment_.FastForwardUntilNoTasksRemain(); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 67 | 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 | |
| 76 | TEST_F(FtlSignalingConnectorTest, StartAndFailedThenRetryAndSucceeded) { |
| 77 | ASSERT_EQ(0, GetBackoff().failure_count()); |
| 78 | signaling_connector_->Start(); |
Gabriel Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 79 | task_environment_.FastForwardUntilNoTasksRemain(); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 80 | 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 Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 86 | task_environment_.FastForwardBy(GetBackoff().GetTimeUntilRelease()); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 87 | 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 Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 94 | task_environment_.FastForwardUntilNoTasksRemain(); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 95 | ASSERT_EQ(0, GetBackoff().failure_count()); |
| 96 | } |
| 97 | |
| 98 | TEST_F(FtlSignalingConnectorTest, |
| 99 | StartAndImmediatelyDisconnected_RetryWithBackoff) { |
| 100 | ASSERT_EQ(0, GetBackoff().failure_count()); |
| 101 | signaling_connector_->Start(); |
Gabriel Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 102 | task_environment_.FastForwardUntilNoTasksRemain(); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 103 | 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 Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 111 | task_environment_.FastForwardBy(GetBackoff().GetTimeUntilRelease()); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 112 | 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 Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 119 | task_environment_.FastForwardUntilNoTasksRemain(); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 120 | ASSERT_EQ(0, GetBackoff().failure_count()); |
| 121 | } |
| 122 | |
| 123 | TEST_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 Charette | dfa3604 | 2019-08-19 17:30:11 | [diff] [blame] | 128 | task_environment_.FastForwardUntilNoTasksRemain(); |
Yuwei Huang | b03b792 | 2019-07-08 22:38:15 | [diff] [blame] | 129 | ASSERT_EQ(SignalStrategy::CONNECTING, signal_strategy_.GetState()); |
| 130 | } |
| 131 | |
| 132 | } // namespace remoting |