Index: remoting/host/it2me/it2me_host_unittest.cc |
diff --git a/remoting/host/it2me/it2me_host_unittest.cc b/remoting/host/it2me/it2me_host_unittest.cc |
index c578985257a9ca65847a00d1673b582939e96d56..0489a7ea7a0fd104692bfba4bba3215042d0f123 100644 |
--- a/remoting/host/it2me/it2me_host_unittest.cc |
+++ b/remoting/host/it2me/it2me_host_unittest.cc |
@@ -10,10 +10,12 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
+#include "base/callback_helpers.h" |
#include "base/location.h" |
#include "base/macros.h" |
#include "base/memory/ptr_util.h" |
#include "base/memory/ref_counted.h" |
+#include "base/memory/weak_ptr.h" |
#include "base/message_loop/message_loop.h" |
#include "base/run_loop.h" |
#include "base/threading/thread_task_runner_handle.h" |
@@ -79,10 +81,10 @@ void FakeIt2MeConfirmationDialog::Show(const std::string& remote_user_email, |
FROM_HERE, base::Bind(callback, dialog_result_)); |
} |
-class It2MeHostTest : public testing::Test { |
+class It2MeHostTest : public testing::Test, public It2MeHost::Observer { |
public: |
- It2MeHostTest() {} |
- ~It2MeHostTest() override {} |
+ It2MeHostTest(); |
+ ~It2MeHostTest() override; |
// testing::Test interface. |
void SetUp() override; |
@@ -92,13 +94,31 @@ class It2MeHostTest : public testing::Test { |
ValidationResult validation_result); |
protected: |
+ // It2MeHost::Observer interface. |
+ void OnClientAuthenticated(const std::string& client_username) override; |
+ void OnStoreAccessCode(const std::string& access_code, |
+ base::TimeDelta access_code_lifetime) override; |
+ void OnNatPolicyChanged(bool nat_traversal_enabled) override; |
+ void OnStateChanged(It2MeHostState state, |
+ const std::string& error_message) override; |
+ |
void SetClientDomainPolicy(const std::string& policy_value); |
+ void RunUntilStateChanged(It2MeHostState expected_state); |
+ |
+ void SimulateHostConnected(); |
+ |
void RunValidationCallback(const std::string& remote_jid); |
+ void DisconnectFromHost(); |
+ |
ValidationResult validation_result_ = ValidationResult::SUCCESS; |
std::string remote_user_email_; |
+ base::Closure state_change_callback_; |
+ |
+ It2MeHostState last_host_state_ = It2MeHostState::kDisconnected; |
+ |
// Used to set ConfirmationDialog behavior. |
FakeIt2MeConfirmationDialog* dialog_ = nullptr; |
@@ -111,9 +131,15 @@ class It2MeHostTest : public testing::Test { |
scoped_refptr<It2MeHost> it2me_host_; |
+ base::WeakPtrFactory<It2MeHostTest> weak_factory_; |
+ |
DISALLOW_COPY_AND_ASSIGN(It2MeHostTest); |
}; |
+It2MeHostTest::It2MeHostTest() : weak_factory_(this) {} |
+ |
+It2MeHostTest::~It2MeHostTest() {} |
+ |
void It2MeHostTest::SetUp() { |
message_loop_.reset(new base::MessageLoop()); |
run_loop_.reset(new base::RunLoop()); |
@@ -128,7 +154,7 @@ void It2MeHostTest::SetUp() { |
it2me_host_ = |
new It2MeHost(std::move(host_context), |
/*policy_watcher=*/nullptr, base::WrapUnique(dialog_), |
- /*observer=*/nullptr, |
+ weak_factory_.GetWeakPtr(), |
base::WrapUnique(new FakeSignalStrategy("fake_local_jid")), |
"fake_user_name", "fake_bot_jid"); |
} |
@@ -157,9 +183,18 @@ void It2MeHostTest::SetClientDomainPolicy(const std::string& policy_value) { |
run_loop.Run(); |
} |
-void It2MeHostTest::RunValidationCallback(const std::string& remote_jid) { |
+void It2MeHostTest::RunUntilStateChanged(It2MeHostState expected_state) { |
+ if (last_host_state_ == expected_state) { |
+ // Bail out early if the state is already correct. |
+ return; |
+ } |
+ |
base::RunLoop run_loop; |
+ state_change_callback_ = run_loop.QuitClosure(); |
+ run_loop.Run(); |
+} |
+void It2MeHostTest::SimulateHostConnected() { |
network_task_runner_->PostTask( |
FROM_HERE, base::Bind(&It2MeHost::SetStateForTesting, it2me_host_.get(), |
It2MeHostState::kStarting, std::string())); |
@@ -173,6 +208,10 @@ void It2MeHostTest::RunValidationCallback(const std::string& remote_jid) { |
FROM_HERE, |
base::Bind(&It2MeHost::SetStateForTesting, it2me_host_.get(), |
It2MeHostState::kReceivedAccessCode, std::string())); |
+} |
+ |
+void It2MeHostTest::RunValidationCallback(const std::string& remote_jid) { |
+ base::RunLoop run_loop; |
network_task_runner_->PostTask( |
FROM_HERE, |
@@ -181,78 +220,152 @@ void It2MeHostTest::RunValidationCallback(const std::string& remote_jid) { |
base::Unretained(this), run_loop.QuitClosure()))); |
run_loop.Run(); |
+} |
+ |
+void It2MeHostTest::OnClientAuthenticated(const std::string& client_username) {} |
+ |
+void It2MeHostTest::OnStoreAccessCode(const std::string& access_code, |
+ base::TimeDelta access_code_lifetime) {} |
+ |
+void It2MeHostTest::OnNatPolicyChanged(bool nat_traversal_enabled) {} |
+ |
+void It2MeHostTest::OnStateChanged(It2MeHostState state, |
+ const std::string& error_message) { |
+ last_host_state_ = state; |
+ |
+ if (state_change_callback_) { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::ResetAndReturn(&state_change_callback_)); |
+ } |
+} |
- it2me_host_->Disconnect(); |
+void It2MeHostTest::DisconnectFromHost() { |
+ if (it2me_host_) { |
+ it2me_host_->Disconnect(); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ } |
} |
TEST_F(It2MeHostTest, ConnectionValidation_NoClientDomainPolicy_ValidJid) { |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJid); |
ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
+ ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); |
+ DisconnectFromHost(); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_NoClientDomainPolicy_InvalidJid) { |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientUsernameNoJid); |
ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, |
ConnectionValidation_NoClientDomainPolicy_InvalidUsername) { |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJidWithSlash); |
ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
+ ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); |
+ DisconnectFromHost(); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_NoClientDomainPolicy_ResourceOnly) { |
+ SimulateHostConnected(); |
RunValidationCallback(kResourceOnly); |
ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_ClientDomainPolicy_MatchingDomain) { |
SetClientDomainPolicy(kMatchingDomain); |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJid); |
ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
+ ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); |
+ DisconnectFromHost(); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_ClientDomainPolicy_InvalidUserName) { |
SetClientDomainPolicy(kMatchingDomain); |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJidWithSlash); |
ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_ClientDomainPolicy_NoJid) { |
SetClientDomainPolicy(kMatchingDomain); |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientUsernameNoJid); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_WrongClientDomain_NoMatch) { |
SetClientDomainPolicy(kMismatchedDomain3); |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJid); |
ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_WrongClientDomain_MatchStart) { |
SetClientDomainPolicy(kMismatchedDomain2); |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJid); |
ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_WrongClientDomain_MatchEnd) { |
SetClientDomainPolicy(kMismatchedDomain1); |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJid); |
ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_ConfirmationDialog_Accept) { |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJid); |
ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
ASSERT_STREQ(kTestClientUserName, remote_user_email_.c_str()); |
+ ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); |
+ DisconnectFromHost(); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
TEST_F(It2MeHostTest, ConnectionValidation_ConfirmationDialog_Reject) { |
dialog_->set_dialog_result(DialogResult::CANCEL); |
+ SimulateHostConnected(); |
RunValidationCallback(kTestClientJid); |
ASSERT_EQ(ValidationResult::ERROR_REJECTED_BY_USER, validation_result_); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
+ ASSERT_STREQ(kTestClientUserName, remote_user_email_.c_str()); |
+} |
+ |
+TEST_F(It2MeHostTest, MultipleConnectionsTriggerDisconnect) { |
+ SimulateHostConnected(); |
+ RunValidationCallback(kTestClientJid); |
+ ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
+ ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); |
ASSERT_STREQ(kTestClientUserName, remote_user_email_.c_str()); |
+ RunValidationCallback(kTestClientJid); |
+ ASSERT_EQ(ValidationResult::ERROR_TOO_MANY_CONNECTIONS, validation_result_); |
+ RunUntilStateChanged(It2MeHostState::kDisconnected); |
+ ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
} |
} // namespace remoting |