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

Unified Diff: remoting/host/it2me/it2me_host_unittest.cc

Issue 2724223003: Disconnect all users if too many connection requests are received for It2Me (Closed)
Patch Set: Pre-review cleanup Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698