| 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
|
|
|