OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/host/it2me/it2me_host.h" | 5 #include "remoting/host/it2me/it2me_host.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 const char kResourceOnly[] = "/jid_resource"; | 43 const char kResourceOnly[] = "/jid_resource"; |
44 const char kMatchingDomain[] = "gmail.com"; | 44 const char kMatchingDomain[] = "gmail.com"; |
45 const char kMismatchedDomain1[] = "similar_to_gmail.com"; | 45 const char kMismatchedDomain1[] = "similar_to_gmail.com"; |
46 const char kMismatchedDomain2[] = "gmail_at_the_beginning.com"; | 46 const char kMismatchedDomain2[] = "gmail_at_the_beginning.com"; |
47 const char kMismatchedDomain3[] = "not_even_close.com"; | 47 const char kMismatchedDomain3[] = "not_even_close.com"; |
48 | 48 |
49 } // namespace | 49 } // namespace |
50 | 50 |
51 class FakeIt2MeConfirmationDialog : public It2MeConfirmationDialog { | 51 class FakeIt2MeConfirmationDialog : public It2MeConfirmationDialog { |
52 public: | 52 public: |
53 FakeIt2MeConfirmationDialog(); | 53 FakeIt2MeConfirmationDialog(const std::string& remote_user_email, |
| 54 DialogResult dialog_result); |
54 ~FakeIt2MeConfirmationDialog() override; | 55 ~FakeIt2MeConfirmationDialog() override; |
55 | 56 |
56 // It2MeConfirmationDialog implementation. | 57 // It2MeConfirmationDialog implementation. |
57 void Show(const std::string& remote_user_email, | 58 void Show(const std::string& remote_user_email, |
58 const ResultCallback& callback) override; | 59 const ResultCallback& callback) override; |
59 | 60 |
60 void set_dialog_result(DialogResult dialog_result) { | 61 private: |
61 dialog_result_ = dialog_result; | 62 FakeIt2MeConfirmationDialog(); |
62 } | |
63 | 63 |
64 const std::string& get_remote_user_email() { return remote_user_email_; } | |
65 | |
66 private: | |
67 std::string remote_user_email_; | 64 std::string remote_user_email_; |
68 DialogResult dialog_result_ = DialogResult::OK; | 65 DialogResult dialog_result_ = DialogResult::OK; |
69 | 66 |
70 DISALLOW_COPY_AND_ASSIGN(FakeIt2MeConfirmationDialog); | 67 DISALLOW_COPY_AND_ASSIGN(FakeIt2MeConfirmationDialog); |
71 }; | 68 }; |
72 | 69 |
73 FakeIt2MeConfirmationDialog::FakeIt2MeConfirmationDialog() {} | 70 FakeIt2MeConfirmationDialog::FakeIt2MeConfirmationDialog() {} |
74 | 71 |
| 72 FakeIt2MeConfirmationDialog::FakeIt2MeConfirmationDialog( |
| 73 const std::string& remote_user_email, |
| 74 DialogResult dialog_result) |
| 75 : remote_user_email_(remote_user_email), dialog_result_(dialog_result) {} |
| 76 |
75 FakeIt2MeConfirmationDialog::~FakeIt2MeConfirmationDialog() {} | 77 FakeIt2MeConfirmationDialog::~FakeIt2MeConfirmationDialog() {} |
76 | 78 |
77 void FakeIt2MeConfirmationDialog::Show(const std::string& remote_user_email, | 79 void FakeIt2MeConfirmationDialog::Show(const std::string& remote_user_email, |
78 const ResultCallback& callback) { | 80 const ResultCallback& callback) { |
79 remote_user_email_ = remote_user_email; | 81 EXPECT_STREQ(remote_user_email_.c_str(), remote_user_email.c_str()); |
80 | 82 |
81 base::ThreadTaskRunnerHandle::Get()->PostTask( | 83 base::ThreadTaskRunnerHandle::Get()->PostTask( |
82 FROM_HERE, base::Bind(callback, dialog_result_)); | 84 FROM_HERE, base::Bind(callback, dialog_result_)); |
83 } | 85 } |
84 | 86 |
| 87 class FakeIt2MeDialogFactory : public It2MeConfirmationDialogFactory { |
| 88 public: |
| 89 FakeIt2MeDialogFactory(); |
| 90 ~FakeIt2MeDialogFactory() override; |
| 91 |
| 92 std::unique_ptr<It2MeConfirmationDialog> Create() override; |
| 93 |
| 94 void set_dialog_result(DialogResult dialog_result) { |
| 95 dialog_result_ = dialog_result; |
| 96 } |
| 97 |
| 98 void set_remote_user_email(const std::string& remote_user_email) { |
| 99 remote_user_email_ = remote_user_email; |
| 100 } |
| 101 |
| 102 private: |
| 103 std::string remote_user_email_; |
| 104 DialogResult dialog_result_ = DialogResult::OK; |
| 105 |
| 106 DISALLOW_COPY_AND_ASSIGN(FakeIt2MeDialogFactory); |
| 107 }; |
| 108 |
| 109 FakeIt2MeDialogFactory::FakeIt2MeDialogFactory() |
| 110 : remote_user_email_(kTestClientUserName) {} |
| 111 |
| 112 FakeIt2MeDialogFactory::~FakeIt2MeDialogFactory() {} |
| 113 |
| 114 std::unique_ptr<It2MeConfirmationDialog> FakeIt2MeDialogFactory::Create() { |
| 115 EXPECT_FALSE(remote_user_email_.empty()); |
| 116 return base::MakeUnique<FakeIt2MeConfirmationDialog>(remote_user_email_, |
| 117 dialog_result_); |
| 118 } |
| 119 |
85 class It2MeHostTest : public testing::Test, public It2MeHost::Observer { | 120 class It2MeHostTest : public testing::Test, public It2MeHost::Observer { |
86 public: | 121 public: |
87 It2MeHostTest(); | 122 It2MeHostTest(); |
88 ~It2MeHostTest() override; | 123 ~It2MeHostTest() override; |
89 | 124 |
90 // testing::Test interface. | 125 // testing::Test interface. |
91 void SetUp() override; | 126 void SetUp() override; |
92 void TearDown() override; | 127 void TearDown() override; |
93 | 128 |
94 void OnValidationComplete(const base::Closure& resume_callback, | 129 void OnValidationComplete(const base::Closure& resume_callback, |
(...skipping 14 matching lines...) Expand all Loading... |
109 | 144 |
110 void SimulateClientConnection(); | 145 void SimulateClientConnection(); |
111 | 146 |
112 void RunIncomingConnectionCallback(const std::string& remote_jid); | 147 void RunIncomingConnectionCallback(const std::string& remote_jid); |
113 | 148 |
114 void RunAcceptedConnectionCallback(const std::string& remote_jid); | 149 void RunAcceptedConnectionCallback(const std::string& remote_jid); |
115 | 150 |
116 void DisconnectClient(); | 151 void DisconnectClient(); |
117 | 152 |
118 ValidationResult validation_result_ = ValidationResult::SUCCESS; | 153 ValidationResult validation_result_ = ValidationResult::SUCCESS; |
119 std::string remote_user_email_; | |
120 | 154 |
121 base::Closure state_change_callback_; | 155 base::Closure state_change_callback_; |
122 | 156 |
123 It2MeHostState last_host_state_ = It2MeHostState::kDisconnected; | 157 It2MeHostState last_host_state_ = It2MeHostState::kDisconnected; |
124 | 158 |
125 // Used to set ConfirmationDialog behavior. | 159 // Used to set ConfirmationDialog behavior. |
126 FakeIt2MeConfirmationDialog* dialog_ = nullptr; | 160 FakeIt2MeDialogFactory* dialog_factory_ = nullptr; |
127 | 161 |
128 private: | 162 private: |
129 std::unique_ptr<base::MessageLoop> message_loop_; | 163 std::unique_ptr<base::MessageLoop> message_loop_; |
130 std::unique_ptr<base::RunLoop> run_loop_; | 164 std::unique_ptr<base::RunLoop> run_loop_; |
131 | 165 |
132 scoped_refptr<AutoThreadTaskRunner> network_task_runner_; | 166 scoped_refptr<AutoThreadTaskRunner> network_task_runner_; |
133 scoped_refptr<AutoThreadTaskRunner> ui_task_runner_; | 167 scoped_refptr<AutoThreadTaskRunner> ui_task_runner_; |
134 | 168 |
135 scoped_refptr<It2MeHost> it2me_host_; | 169 scoped_refptr<It2MeHost> it2me_host_; |
136 | 170 |
137 base::WeakPtrFactory<It2MeHostTest> weak_factory_; | 171 base::WeakPtrFactory<It2MeHostTest> weak_factory_; |
138 | 172 |
139 DISALLOW_COPY_AND_ASSIGN(It2MeHostTest); | 173 DISALLOW_COPY_AND_ASSIGN(It2MeHostTest); |
140 }; | 174 }; |
141 | 175 |
142 It2MeHostTest::It2MeHostTest() : weak_factory_(this) {} | 176 It2MeHostTest::It2MeHostTest() : weak_factory_(this) {} |
143 | 177 |
144 It2MeHostTest::~It2MeHostTest() {} | 178 It2MeHostTest::~It2MeHostTest() {} |
145 | 179 |
146 void It2MeHostTest::SetUp() { | 180 void It2MeHostTest::SetUp() { |
147 message_loop_.reset(new base::MessageLoop()); | 181 message_loop_.reset(new base::MessageLoop()); |
148 run_loop_.reset(new base::RunLoop()); | 182 run_loop_.reset(new base::RunLoop()); |
149 | 183 |
150 std::unique_ptr<ChromotingHostContext> host_context( | 184 std::unique_ptr<ChromotingHostContext> host_context( |
151 ChromotingHostContext::Create(new AutoThreadTaskRunner( | 185 ChromotingHostContext::Create(new AutoThreadTaskRunner( |
152 base::ThreadTaskRunnerHandle::Get(), run_loop_->QuitClosure()))); | 186 base::ThreadTaskRunnerHandle::Get(), run_loop_->QuitClosure()))); |
153 network_task_runner_ = host_context->network_task_runner(); | 187 network_task_runner_ = host_context->network_task_runner(); |
154 ui_task_runner_ = host_context->ui_task_runner(); | 188 ui_task_runner_ = host_context->ui_task_runner(); |
155 | 189 |
156 dialog_ = new FakeIt2MeConfirmationDialog(); | 190 std::unique_ptr<FakeIt2MeDialogFactory> dialog_factory( |
| 191 new FakeIt2MeDialogFactory()); |
| 192 dialog_factory_ = dialog_factory.get(); |
157 it2me_host_ = | 193 it2me_host_ = |
158 new It2MeHost(std::move(host_context), | 194 new It2MeHost(std::move(host_context), /*policy_watcher=*/nullptr, |
159 /*policy_watcher=*/nullptr, base::WrapUnique(dialog_), | 195 std::move(dialog_factory), weak_factory_.GetWeakPtr(), |
160 weak_factory_.GetWeakPtr(), | |
161 base::WrapUnique(new FakeSignalStrategy("fake_local_jid")), | 196 base::WrapUnique(new FakeSignalStrategy("fake_local_jid")), |
162 "fake_user_name", "fake_bot_jid"); | 197 "fake_user_name", "fake_bot_jid"); |
163 } | 198 } |
164 | 199 |
165 void It2MeHostTest::TearDown() { | 200 void It2MeHostTest::TearDown() { |
166 network_task_runner_ = nullptr; | 201 network_task_runner_ = nullptr; |
167 ui_task_runner_ = nullptr; | 202 ui_task_runner_ = nullptr; |
168 it2me_host_ = nullptr; | 203 it2me_host_ = nullptr; |
169 run_loop_->Run(); | 204 run_loop_->Run(); |
170 } | 205 } |
171 | 206 |
172 void It2MeHostTest::OnValidationComplete(const base::Closure& resume_callback, | 207 void It2MeHostTest::OnValidationComplete(const base::Closure& resume_callback, |
173 ValidationResult validation_result) { | 208 ValidationResult validation_result) { |
174 validation_result_ = validation_result; | 209 validation_result_ = validation_result; |
175 remote_user_email_ = dialog_->get_remote_user_email(); | |
176 | 210 |
177 ui_task_runner_->PostTask(FROM_HERE, resume_callback); | 211 ui_task_runner_->PostTask(FROM_HERE, resume_callback); |
178 } | 212 } |
179 | 213 |
180 void It2MeHostTest::SetClientDomainPolicy(const std::string& policy_value) { | 214 void It2MeHostTest::SetClientDomainPolicy(const std::string& policy_value) { |
181 std::unique_ptr<base::DictionaryValue> policies(new base::DictionaryValue()); | 215 std::unique_ptr<base::DictionaryValue> policies(new base::DictionaryValue()); |
182 policies->SetString(policy::key::kRemoteAccessHostClientDomain, policy_value); | 216 policies->SetString(policy::key::kRemoteAccessHostClientDomain, policy_value); |
183 | 217 |
184 base::RunLoop run_loop; | 218 base::RunLoop run_loop; |
185 it2me_host_->SetPolicyForTesting(std::move(policies), run_loop.QuitClosure()); | 219 it2me_host_->SetPolicyForTesting(std::move(policies), run_loop.QuitClosure()); |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 } | 390 } |
357 | 391 |
358 TEST_F(It2MeHostTest, ConnectionValidation_ConfirmationDialog_Accept) { | 392 TEST_F(It2MeHostTest, ConnectionValidation_ConfirmationDialog_Accept) { |
359 SimulateClientConnection(); | 393 SimulateClientConnection(); |
360 RunIncomingConnectionCallback(kTestClientJid); | 394 RunIncomingConnectionCallback(kTestClientJid); |
361 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); | 395 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
362 ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); | 396 ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); |
363 | 397 |
364 RunAcceptedConnectionCallback(kTestClientJid); | 398 RunAcceptedConnectionCallback(kTestClientJid); |
365 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); | 399 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
366 ASSERT_STREQ(kTestClientUserName, remote_user_email_.c_str()); | |
367 ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); | 400 ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); |
368 | 401 |
369 DisconnectClient(); | 402 DisconnectClient(); |
370 ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); | 403 ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
371 } | 404 } |
372 | 405 |
373 TEST_F(It2MeHostTest, ConnectionValidation_ConfirmationDialog_Reject) { | 406 TEST_F(It2MeHostTest, ConnectionValidation_ConfirmationDialog_Reject) { |
374 dialog_->set_dialog_result(DialogResult::CANCEL); | 407 dialog_factory_->set_dialog_result(DialogResult::CANCEL); |
375 SimulateClientConnection(); | 408 SimulateClientConnection(); |
376 | 409 |
377 RunIncomingConnectionCallback(kTestClientJid); | 410 RunIncomingConnectionCallback(kTestClientJid); |
378 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); | 411 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
379 ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); | 412 ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); |
380 | 413 |
381 RunAcceptedConnectionCallback(kTestClientJid); | 414 RunAcceptedConnectionCallback(kTestClientJid); |
382 ASSERT_EQ(ValidationResult::ERROR_REJECTED_BY_USER, validation_result_); | 415 ASSERT_EQ(ValidationResult::ERROR_REJECTED_BY_USER, validation_result_); |
383 RunUntilStateChanged(It2MeHostState::kDisconnected); | 416 RunUntilStateChanged(It2MeHostState::kDisconnected); |
384 ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); | 417 ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
385 ASSERT_STREQ(kTestClientUserName, remote_user_email_.c_str()); | |
386 } | 418 } |
387 | 419 |
388 TEST_F(It2MeHostTest, MultipleConnectionsTriggerDisconnect) { | 420 TEST_F(It2MeHostTest, MultipleConnectionsTriggerDisconnect) { |
389 SimulateClientConnection(); | 421 SimulateClientConnection(); |
390 RunIncomingConnectionCallback(kTestClientJid); | 422 RunIncomingConnectionCallback(kTestClientJid); |
391 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); | 423 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
392 ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); | 424 ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); |
393 | 425 |
394 RunAcceptedConnectionCallback(kTestClientJid); | 426 RunAcceptedConnectionCallback(kTestClientJid); |
395 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); | 427 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
396 ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); | 428 ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); |
397 ASSERT_STREQ(kTestClientUserName, remote_user_email_.c_str()); | |
398 | 429 |
399 RunIncomingConnectionCallback(kTestClientJid2); | 430 RunIncomingConnectionCallback(kTestClientJid2); |
400 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); | 431 ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); |
401 ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); | 432 ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); |
402 | 433 |
403 RunAcceptedConnectionCallback(kTestClientJid2); | 434 RunAcceptedConnectionCallback(kTestClientJid2); |
404 ASSERT_EQ(ValidationResult::ERROR_TOO_MANY_CONNECTIONS, validation_result_); | 435 ASSERT_EQ(ValidationResult::ERROR_TOO_MANY_CONNECTIONS, validation_result_); |
405 RunUntilStateChanged(It2MeHostState::kDisconnected); | 436 RunUntilStateChanged(It2MeHostState::kDisconnected); |
406 ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); | 437 ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); |
407 } | 438 } |
408 | 439 |
409 } // namespace remoting | 440 } // namespace remoting |
OLD | NEW |