| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/gcm_driver/gcm_driver_desktop.h" | 5 #include "components/gcm_driver/gcm_driver_desktop.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 FakeGCMConnectionObserver* gcm_connection_observer() { | 113 FakeGCMConnectionObserver* gcm_connection_observer() { |
| 114 return gcm_connection_observer_.get(); | 114 return gcm_connection_observer_.get(); |
| 115 } | 115 } |
| 116 const std::string& registration_id() const { return registration_id_; } | 116 const std::string& registration_id() const { return registration_id_; } |
| 117 GCMClient::Result registration_result() const { return registration_result_; } | 117 GCMClient::Result registration_result() const { return registration_result_; } |
| 118 const std::string& send_message_id() const { return send_message_id_; } | 118 const std::string& send_message_id() const { return send_message_id_; } |
| 119 GCMClient::Result send_result() const { return send_result_; } | 119 GCMClient::Result send_result() const { return send_result_; } |
| 120 GCMClient::Result unregistration_result() const { | 120 GCMClient::Result unregistration_result() const { |
| 121 return unregistration_result_; | 121 return unregistration_result_; |
| 122 } | 122 } |
| 123 const std::string& p256dh() const { return p256dh_; } |
| 124 const std::string& auth_secret() const { return auth_secret_; } |
| 123 | 125 |
| 124 void PumpIOLoop(); | 126 void PumpIOLoop(); |
| 125 | 127 |
| 126 void ClearResults(); | 128 void ClearResults(); |
| 127 | 129 |
| 128 bool HasAppHandlers() const; | 130 bool HasAppHandlers() const; |
| 129 FakeGCMClient* GetGCMClient(); | 131 FakeGCMClient* GetGCMClient(); |
| 130 | 132 |
| 131 void CreateDriver(); | 133 void CreateDriver(); |
| 132 void ShutdownDriver(); | 134 void ShutdownDriver(); |
| 133 void AddAppHandlers(); | 135 void AddAppHandlers(); |
| 134 void RemoveAppHandlers(); | 136 void RemoveAppHandlers(); |
| 135 | 137 |
| 136 void Register(const std::string& app_id, | 138 void Register(const std::string& app_id, |
| 137 const std::vector<std::string>& sender_ids, | 139 const std::vector<std::string>& sender_ids, |
| 138 WaitToFinish wait_to_finish); | 140 WaitToFinish wait_to_finish); |
| 139 void Send(const std::string& app_id, | 141 void Send(const std::string& app_id, |
| 140 const std::string& receiver_id, | 142 const std::string& receiver_id, |
| 141 const OutgoingMessage& message, | 143 const OutgoingMessage& message, |
| 142 WaitToFinish wait_to_finish); | 144 WaitToFinish wait_to_finish); |
| 145 void GetEncryptionInfo(const std::string& app_id, |
| 146 WaitToFinish wait_to_finish); |
| 143 void Unregister(const std::string& app_id, WaitToFinish wait_to_finish); | 147 void Unregister(const std::string& app_id, WaitToFinish wait_to_finish); |
| 144 | 148 |
| 145 void WaitForAsyncOperation(); | 149 void WaitForAsyncOperation(); |
| 146 | 150 |
| 147 void RegisterCompleted(const std::string& registration_id, | 151 void RegisterCompleted(const std::string& registration_id, |
| 148 GCMClient::Result result); | 152 GCMClient::Result result); |
| 149 void SendCompleted(const std::string& message_id, GCMClient::Result result); | 153 void SendCompleted(const std::string& message_id, GCMClient::Result result); |
| 154 void GetEncryptionInfoCompleted(const std::string& p256dh, |
| 155 const std::string& auth_secret); |
| 150 void UnregisterCompleted(GCMClient::Result result); | 156 void UnregisterCompleted(GCMClient::Result result); |
| 151 | 157 |
| 152 const base::Closure& async_operation_completed_callback() const { | 158 const base::Closure& async_operation_completed_callback() const { |
| 153 return async_operation_completed_callback_; | 159 return async_operation_completed_callback_; |
| 154 } | 160 } |
| 155 void set_async_operation_completed_callback(const base::Closure& callback) { | 161 void set_async_operation_completed_callback(const base::Closure& callback) { |
| 156 async_operation_completed_callback_ = callback; | 162 async_operation_completed_callback_ = callback; |
| 157 } | 163 } |
| 158 | 164 |
| 159 private: | 165 private: |
| 160 base::ScopedTempDir temp_dir_; | 166 base::ScopedTempDir temp_dir_; |
| 161 TestingPrefServiceSimple prefs_; | 167 TestingPrefServiceSimple prefs_; |
| 162 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | |
| 163 base::MessageLoopForUI message_loop_; | 168 base::MessageLoopForUI message_loop_; |
| 164 base::Thread io_thread_; | 169 base::Thread io_thread_; |
| 165 base::FieldTrialList field_trial_list_; | 170 base::FieldTrialList field_trial_list_; |
| 166 scoped_ptr<GCMDriverDesktop> driver_; | 171 scoped_ptr<GCMDriverDesktop> driver_; |
| 167 scoped_ptr<FakeGCMAppHandler> gcm_app_handler_; | 172 scoped_ptr<FakeGCMAppHandler> gcm_app_handler_; |
| 168 scoped_ptr<FakeGCMConnectionObserver> gcm_connection_observer_; | 173 scoped_ptr<FakeGCMConnectionObserver> gcm_connection_observer_; |
| 169 | 174 |
| 170 base::Closure async_operation_completed_callback_; | 175 base::Closure async_operation_completed_callback_; |
| 171 | 176 |
| 172 std::string registration_id_; | 177 std::string registration_id_; |
| 173 GCMClient::Result registration_result_; | 178 GCMClient::Result registration_result_; |
| 174 std::string send_message_id_; | 179 std::string send_message_id_; |
| 175 GCMClient::Result send_result_; | 180 GCMClient::Result send_result_; |
| 176 GCMClient::Result unregistration_result_; | 181 GCMClient::Result unregistration_result_; |
| 182 std::string p256dh_; |
| 183 std::string auth_secret_; |
| 177 | 184 |
| 178 DISALLOW_COPY_AND_ASSIGN(GCMDriverTest); | 185 DISALLOW_COPY_AND_ASSIGN(GCMDriverTest); |
| 179 }; | 186 }; |
| 180 | 187 |
| 181 GCMDriverTest::GCMDriverTest() | 188 GCMDriverTest::GCMDriverTest() |
| 182 : task_runner_(new base::TestSimpleTaskRunner()), | 189 : io_thread_("IOThread"), |
| 183 io_thread_("IOThread"), | |
| 184 field_trial_list_(NULL), | 190 field_trial_list_(NULL), |
| 185 registration_result_(GCMClient::UNKNOWN_ERROR), | 191 registration_result_(GCMClient::UNKNOWN_ERROR), |
| 186 send_result_(GCMClient::UNKNOWN_ERROR), | 192 send_result_(GCMClient::UNKNOWN_ERROR), |
| 187 unregistration_result_(GCMClient::UNKNOWN_ERROR) { | 193 unregistration_result_(GCMClient::UNKNOWN_ERROR) { |
| 188 } | 194 } |
| 189 | 195 |
| 190 GCMDriverTest::~GCMDriverTest() { | 196 GCMDriverTest::~GCMDriverTest() { |
| 191 } | 197 } |
| 192 | 198 |
| 193 void GCMDriverTest::SetUp() { | 199 void GCMDriverTest::SetUp() { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 return !driver_->app_handlers().empty(); | 234 return !driver_->app_handlers().empty(); |
| 229 } | 235 } |
| 230 | 236 |
| 231 FakeGCMClient* GCMDriverTest::GetGCMClient() { | 237 FakeGCMClient* GCMDriverTest::GetGCMClient() { |
| 232 return static_cast<FakeGCMClient*>(driver_->GetGCMClientForTesting()); | 238 return static_cast<FakeGCMClient*>(driver_->GetGCMClientForTesting()); |
| 233 } | 239 } |
| 234 | 240 |
| 235 void GCMDriverTest::CreateDriver() { | 241 void GCMDriverTest::CreateDriver() { |
| 236 scoped_refptr<net::URLRequestContextGetter> request_context = | 242 scoped_refptr<net::URLRequestContextGetter> request_context = |
| 237 new net::TestURLRequestContextGetter(io_thread_.task_runner()); | 243 new net::TestURLRequestContextGetter(io_thread_.task_runner()); |
| 238 // TODO(johnme): Need equivalent test coverage of GCMDriverAndroid. | |
| 239 driver_.reset(new GCMDriverDesktop( | 244 driver_.reset(new GCMDriverDesktop( |
| 240 scoped_ptr<GCMClientFactory>(new FakeGCMClientFactory( | 245 scoped_ptr<GCMClientFactory>(new FakeGCMClientFactory( |
| 241 base::ThreadTaskRunnerHandle::Get(), io_thread_.task_runner())), | 246 base::ThreadTaskRunnerHandle::Get(), io_thread_.task_runner())), |
| 242 GCMClient::ChromeBuildInfo(), "http://channel.status.request.url", | 247 GCMClient::ChromeBuildInfo(), "http://channel.status.request.url", |
| 243 "user-agent-string", &prefs_, temp_dir_.path(), request_context, | 248 "user-agent-string", &prefs_, temp_dir_.path(), request_context, |
| 244 base::ThreadTaskRunnerHandle::Get(), io_thread_.task_runner(), | 249 base::ThreadTaskRunnerHandle::Get(), io_thread_.task_runner(), |
| 245 task_runner_)); | 250 message_loop_.task_runner())); |
| 246 | 251 |
| 247 gcm_app_handler_.reset(new FakeGCMAppHandler); | 252 gcm_app_handler_.reset(new FakeGCMAppHandler); |
| 248 gcm_connection_observer_.reset(new FakeGCMConnectionObserver); | 253 gcm_connection_observer_.reset(new FakeGCMConnectionObserver); |
| 249 | 254 |
| 250 driver_->AddConnectionObserver(gcm_connection_observer_.get()); | 255 driver_->AddConnectionObserver(gcm_connection_observer_.get()); |
| 251 } | 256 } |
| 252 | 257 |
| 253 void GCMDriverTest::ShutdownDriver() { | 258 void GCMDriverTest::ShutdownDriver() { |
| 254 if (gcm_connection_observer()) | 259 if (gcm_connection_observer()) |
| 255 driver()->RemoveConnectionObserver(gcm_connection_observer()); | 260 driver()->RemoveConnectionObserver(gcm_connection_observer()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 async_operation_completed_callback_ = run_loop.QuitClosure(); | 292 async_operation_completed_callback_ = run_loop.QuitClosure(); |
| 288 driver_->Send(app_id, | 293 driver_->Send(app_id, |
| 289 receiver_id, | 294 receiver_id, |
| 290 message, | 295 message, |
| 291 base::Bind(&GCMDriverTest::SendCompleted, | 296 base::Bind(&GCMDriverTest::SendCompleted, |
| 292 base::Unretained(this))); | 297 base::Unretained(this))); |
| 293 if (wait_to_finish == WAIT) | 298 if (wait_to_finish == WAIT) |
| 294 run_loop.Run(); | 299 run_loop.Run(); |
| 295 } | 300 } |
| 296 | 301 |
| 302 void GCMDriverTest::GetEncryptionInfo(const std::string& app_id, |
| 303 WaitToFinish wait_to_finish) { |
| 304 base::RunLoop run_loop; |
| 305 async_operation_completed_callback_ = run_loop.QuitClosure(); |
| 306 driver_->GetEncryptionInfo( |
| 307 app_id, base::Bind(&GCMDriverTest::GetEncryptionInfoCompleted, |
| 308 base::Unretained(this))); |
| 309 if (wait_to_finish == WAIT) |
| 310 run_loop.Run(); |
| 311 } |
| 312 |
| 297 void GCMDriverTest::Unregister(const std::string& app_id, | 313 void GCMDriverTest::Unregister(const std::string& app_id, |
| 298 WaitToFinish wait_to_finish) { | 314 WaitToFinish wait_to_finish) { |
| 299 base::RunLoop run_loop; | 315 base::RunLoop run_loop; |
| 300 async_operation_completed_callback_ = run_loop.QuitClosure(); | 316 async_operation_completed_callback_ = run_loop.QuitClosure(); |
| 301 driver_->Unregister(app_id, | 317 driver_->Unregister(app_id, |
| 302 base::Bind(&GCMDriverTest::UnregisterCompleted, | 318 base::Bind(&GCMDriverTest::UnregisterCompleted, |
| 303 base::Unretained(this))); | 319 base::Unretained(this))); |
| 304 if (wait_to_finish == WAIT) | 320 if (wait_to_finish == WAIT) |
| 305 run_loop.Run(); | 321 run_loop.Run(); |
| 306 } | 322 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 320 } | 336 } |
| 321 | 337 |
| 322 void GCMDriverTest::SendCompleted(const std::string& message_id, | 338 void GCMDriverTest::SendCompleted(const std::string& message_id, |
| 323 GCMClient::Result result) { | 339 GCMClient::Result result) { |
| 324 send_message_id_ = message_id; | 340 send_message_id_ = message_id; |
| 325 send_result_ = result; | 341 send_result_ = result; |
| 326 if (!async_operation_completed_callback_.is_null()) | 342 if (!async_operation_completed_callback_.is_null()) |
| 327 async_operation_completed_callback_.Run(); | 343 async_operation_completed_callback_.Run(); |
| 328 } | 344 } |
| 329 | 345 |
| 346 void GCMDriverTest::GetEncryptionInfoCompleted(const std::string& p256dh, |
| 347 const std::string& auth_secret) { |
| 348 p256dh_ = p256dh; |
| 349 auth_secret_ = auth_secret; |
| 350 if (!async_operation_completed_callback_.is_null()) |
| 351 async_operation_completed_callback_.Run(); |
| 352 } |
| 353 |
| 330 void GCMDriverTest::UnregisterCompleted(GCMClient::Result result) { | 354 void GCMDriverTest::UnregisterCompleted(GCMClient::Result result) { |
| 331 unregistration_result_ = result; | 355 unregistration_result_ = result; |
| 332 if (!async_operation_completed_callback_.is_null()) | 356 if (!async_operation_completed_callback_.is_null()) |
| 333 async_operation_completed_callback_.Run(); | 357 async_operation_completed_callback_.Run(); |
| 334 } | 358 } |
| 335 | 359 |
| 336 TEST_F(GCMDriverTest, Create) { | 360 TEST_F(GCMDriverTest, Create) { |
| 337 // Create GCMDriver first. By default GCM is set to delay start. | 361 // Create GCMDriver first. By default GCM is set to delay start. |
| 338 CreateDriver(); | 362 CreateDriver(); |
| 339 EXPECT_FALSE(driver()->IsStarted()); | 363 EXPECT_FALSE(driver()->IsStarted()); |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 Register(kTestAppID1, sender_ids, GCMDriverTest::WAIT); | 675 Register(kTestAppID1, sender_ids, GCMDriverTest::WAIT); |
| 652 | 676 |
| 653 EXPECT_FALSE(registration_id().empty()); | 677 EXPECT_FALSE(registration_id().empty()); |
| 654 EXPECT_EQ(GCMClient::SUCCESS, registration_result()); | 678 EXPECT_EQ(GCMClient::SUCCESS, registration_result()); |
| 655 | 679 |
| 656 Unregister(kTestAppID1, GCMDriverTest::WAIT); | 680 Unregister(kTestAppID1, GCMDriverTest::WAIT); |
| 657 | 681 |
| 658 EXPECT_EQ(GCMClient::SUCCESS, unregistration_result()); | 682 EXPECT_EQ(GCMClient::SUCCESS, unregistration_result()); |
| 659 } | 683 } |
| 660 | 684 |
| 685 TEST_F(GCMDriverFunctionalTest, UnregisterRemovesEncryptionInfo) { |
| 686 std::vector<std::string> sender_ids; |
| 687 sender_ids.push_back("sender1"); |
| 688 Register(kTestAppID1, sender_ids, GCMDriverTest::WAIT); |
| 689 |
| 690 EXPECT_FALSE(registration_id().empty()); |
| 691 EXPECT_EQ(GCMClient::SUCCESS, registration_result()); |
| 692 |
| 693 GetEncryptionInfo(kTestAppID1, GCMDriverTest::WAIT); |
| 694 |
| 695 EXPECT_FALSE(p256dh().empty()); |
| 696 EXPECT_FALSE(auth_secret().empty()); |
| 697 |
| 698 const std::string app_p256dh = p256dh(); |
| 699 const std::string app_auth_secret = auth_secret(); |
| 700 |
| 701 GetEncryptionInfo(kTestAppID1, GCMDriverTest::WAIT); |
| 702 |
| 703 EXPECT_EQ(app_p256dh, p256dh()); |
| 704 EXPECT_EQ(app_auth_secret, auth_secret()); |
| 705 |
| 706 Unregister(kTestAppID1, GCMDriverTest::WAIT); |
| 707 |
| 708 EXPECT_EQ(GCMClient::SUCCESS, unregistration_result()); |
| 709 |
| 710 GetEncryptionInfo(kTestAppID1, GCMDriverTest::WAIT); |
| 711 |
| 712 // The GCMKeyStore eagerly creates new keying material for registrations that |
| 713 // don't have any associated with them, so the most appropriate check to do is |
| 714 // to verify that the returned material is different from before. |
| 715 |
| 716 EXPECT_NE(app_p256dh, p256dh()); |
| 717 EXPECT_NE(app_auth_secret, auth_secret()); |
| 718 } |
| 719 |
| 661 TEST_F(GCMDriverFunctionalTest, UnregisterWhenAsyncOperationPending) { | 720 TEST_F(GCMDriverFunctionalTest, UnregisterWhenAsyncOperationPending) { |
| 662 std::vector<std::string> sender_ids; | 721 std::vector<std::string> sender_ids; |
| 663 sender_ids.push_back("sender1"); | 722 sender_ids.push_back("sender1"); |
| 664 // First start registration without waiting for it to complete. | 723 // First start registration without waiting for it to complete. |
| 665 Register(kTestAppID1, sender_ids, GCMDriverTest::DO_NOT_WAIT); | 724 Register(kTestAppID1, sender_ids, GCMDriverTest::DO_NOT_WAIT); |
| 666 | 725 |
| 667 // Test that unregistration fails with async operation pending when there is a | 726 // Test that unregistration fails with async operation pending when there is a |
| 668 // registration already in progress. | 727 // registration already in progress. |
| 669 Unregister(kTestAppID1, GCMDriverTest::WAIT); | 728 Unregister(kTestAppID1, GCMDriverTest::WAIT); |
| 670 EXPECT_EQ(GCMClient::ASYNC_OPERATION_PENDING, | 729 EXPECT_EQ(GCMClient::ASYNC_OPERATION_PENDING, |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1313 PumpUILoop(); | 1372 PumpUILoop(); |
| 1314 EXPECT_EQ(GCMClient::UNKNOWN_ERROR, unregistration_result()); | 1373 EXPECT_EQ(GCMClient::UNKNOWN_ERROR, unregistration_result()); |
| 1315 | 1374 |
| 1316 // DeleteToken operation will be invoked after GCMClient becomes ready. | 1375 // DeleteToken operation will be invoked after GCMClient becomes ready. |
| 1317 GetGCMClient()->PerformDelayedStart(); | 1376 GetGCMClient()->PerformDelayedStart(); |
| 1318 WaitForAsyncOperation(); | 1377 WaitForAsyncOperation(); |
| 1319 EXPECT_EQ(GCMClient::SUCCESS, unregistration_result()); | 1378 EXPECT_EQ(GCMClient::SUCCESS, unregistration_result()); |
| 1320 } | 1379 } |
| 1321 | 1380 |
| 1322 } // namespace gcm | 1381 } // namespace gcm |
| OLD | NEW |