diff options
Diffstat (limited to 'chromium/components/gcm_driver/fake_gcm_client.cc')
-rw-r--r-- | chromium/components/gcm_driver/fake_gcm_client.cc | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/chromium/components/gcm_driver/fake_gcm_client.cc b/chromium/components/gcm_driver/fake_gcm_client.cc new file mode 100644 index 00000000000..69d6d8693a6 --- /dev/null +++ b/chromium/components/gcm_driver/fake_gcm_client.cc @@ -0,0 +1,335 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/gcm_driver/fake_gcm_client.h" + +#include <stddef.h> + +#include <algorithm> + +#include "base/bind.h" +#include "base/check.h" +#include "base/location.h" +#include "base/strings/string_number_conversions.h" +#include "base/sys_byteorder.h" +#include "base/task/sequenced_task_runner.h" +#include "base/task/single_thread_task_runner.h" +#include "base/threading/thread_task_runner_handle.h" +#include "base/time/time.h" +#include "base/timer/timer.h" +#include "google_apis/gcm/base/encryptor.h" +#include "google_apis/gcm/engine/account_mapping.h" +#include "net/base/ip_endpoint.h" + +namespace gcm { + +// static +std::string FakeGCMClient::GenerateGCMRegistrationID( + const std::vector<std::string>& sender_ids) { + // GCMService normalizes the sender IDs by making them sorted. + std::vector<std::string> normalized_sender_ids = sender_ids; + std::sort(normalized_sender_ids.begin(), normalized_sender_ids.end()); + + // Simulate the registration_id by concaternating all sender IDs. + // Set registration_id to empty to denote an error if sender_ids contains a + // hint. + std::string registration_id; + if (sender_ids.size() != 1 || + sender_ids[0].find("error") == std::string::npos) { + for (size_t i = 0; i < normalized_sender_ids.size(); ++i) { + if (i > 0) + registration_id += ","; + registration_id += normalized_sender_ids[i]; + } + } + return registration_id; +} + +// static +std::string FakeGCMClient::GenerateInstanceIDToken( + const std::string& authorized_entity, const std::string& scope) { + if (authorized_entity.find("error") != std::string::npos) + return ""; + std::string token(authorized_entity); + token += ","; + token += scope; + return token; +} + +FakeGCMClient::FakeGCMClient( + const scoped_refptr<base::SequencedTaskRunner>& ui_thread, + const scoped_refptr<base::SequencedTaskRunner>& io_thread) + : delegate_(nullptr), + started_(false), + start_mode_(DELAYED_START), + start_mode_overridding_(RESPECT_START_MODE), + ui_thread_(ui_thread), + io_thread_(io_thread) {} + +FakeGCMClient::~FakeGCMClient() { +} + +void FakeGCMClient::Initialize( + const ChromeBuildInfo& chrome_build_info, + const base::FilePath& store_path, + bool remove_account_mappings_with_email_key, + const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, + scoped_refptr<base::SequencedTaskRunner> io_task_runner, + base::RepeatingCallback<void( + mojo::PendingReceiver<network::mojom::ProxyResolvingSocketFactory>)> + get_socket_factory_callback, + const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory, + network::NetworkConnectionTracker* network_connection_tracker, + std::unique_ptr<Encryptor> encryptor, + Delegate* delegate) { + product_category_for_subtypes_ = + chrome_build_info.product_category_for_subtypes; + delegate_ = delegate; +} + +void FakeGCMClient::Start(StartMode start_mode) { + DCHECK(io_thread_->RunsTasksInCurrentSequence()); + + if (started_) + return; + + if (start_mode == IMMEDIATE_START) + start_mode_ = IMMEDIATE_START; + if (start_mode_ == DELAYED_START || + start_mode_overridding_ == FORCE_TO_ALWAYS_DELAY_START_GCM) { + return; + } + + DoStart(); +} + +void FakeGCMClient::DoStart() { + started_ = true; + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&FakeGCMClient::Started, weak_ptr_factory_.GetWeakPtr())); +} + +void FakeGCMClient::Stop() { + DCHECK(io_thread_->RunsTasksInCurrentSequence()); + started_ = false; + delegate_->OnDisconnected(); +} + +void FakeGCMClient::Register( + scoped_refptr<RegistrationInfo> registration_info) { + DCHECK(io_thread_->RunsTasksInCurrentSequence()); + + std::string registration_id; + + GCMRegistrationInfo* gcm_registration_info = + GCMRegistrationInfo::FromRegistrationInfo(registration_info.get()); + if (gcm_registration_info) { + registration_id = GenerateGCMRegistrationID( + gcm_registration_info->sender_ids); + } + + InstanceIDTokenInfo* instance_id_token_info = + InstanceIDTokenInfo::FromRegistrationInfo(registration_info.get()); + if (instance_id_token_info) { + registration_id = GenerateInstanceIDToken( + instance_id_token_info->authorized_entity, + instance_id_token_info->scope); + } + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&FakeGCMClient::RegisterFinished, + weak_ptr_factory_.GetWeakPtr(), + std::move(registration_info), registration_id)); +} + +bool FakeGCMClient::ValidateRegistration( + scoped_refptr<RegistrationInfo> registration_info, + const std::string& registration_id) { + return true; +} + +void FakeGCMClient::Unregister( + scoped_refptr<RegistrationInfo> registration_info) { + DCHECK(io_thread_->RunsTasksInCurrentSequence()); + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&FakeGCMClient::UnregisterFinished, + weak_ptr_factory_.GetWeakPtr(), registration_info)); +} + +void FakeGCMClient::Send(const std::string& app_id, + const std::string& receiver_id, + const OutgoingMessage& message) { + DCHECK(io_thread_->RunsTasksInCurrentSequence()); + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&FakeGCMClient::SendFinished, + weak_ptr_factory_.GetWeakPtr(), app_id, message)); +} + +void FakeGCMClient::RecordDecryptionFailure(const std::string& app_id, + GCMDecryptionResult result) { + recorder_.RecordDecryptionFailure(app_id, result); +} + +void FakeGCMClient::SetRecording(bool recording) { + recorder_.set_is_recording(recording); +} + +void FakeGCMClient::ClearActivityLogs() { + recorder_.Clear(); +} + +GCMClient::GCMStatistics FakeGCMClient::GetStatistics() const { + GCMClient::GCMStatistics statistics; + statistics.is_recording = recorder_.is_recording(); + + recorder_.CollectActivities(&statistics.recorded_activities); + return statistics; +} + +void FakeGCMClient::SetAccountTokens( + const std::vector<AccountTokenInfo>& account_tokens) { +} + +void FakeGCMClient::UpdateAccountMapping( + const AccountMapping& account_mapping) { +} + +void FakeGCMClient::RemoveAccountMapping(const CoreAccountId& account_id) {} + +void FakeGCMClient::SetLastTokenFetchTime(const base::Time& time) { +} + +void FakeGCMClient::UpdateHeartbeatTimer( + std::unique_ptr<base::RetainingOneShotTimer> timer) {} + +void FakeGCMClient::AddInstanceIDData(const std::string& app_id, + const std::string& instance_id, + const std::string& extra_data) { + instance_id_data_[app_id] = make_pair(instance_id, extra_data); +} + +void FakeGCMClient::RemoveInstanceIDData(const std::string& app_id) { + instance_id_data_.erase(app_id); +} + +void FakeGCMClient::GetInstanceIDData(const std::string& app_id, + std::string* instance_id, + std::string* extra_data) { + auto iter = instance_id_data_.find(app_id); + if (iter == instance_id_data_.end()) { + instance_id->clear(); + extra_data->clear(); + return; + } + + *instance_id = iter->second.first; + *extra_data = iter->second.second; +} + +void FakeGCMClient::AddHeartbeatInterval(const std::string& scope, + int interval_ms) { +} + +void FakeGCMClient::RemoveHeartbeatInterval(const std::string& scope) { +} + +void FakeGCMClient::PerformDelayedStart() { + DCHECK(ui_thread_->RunsTasksInCurrentSequence()); + + io_thread_->PostTask( + FROM_HERE, + base::BindOnce(&FakeGCMClient::DoStart, weak_ptr_factory_.GetWeakPtr())); +} + +void FakeGCMClient::ReceiveMessage(const std::string& app_id, + const IncomingMessage& message) { + DCHECK(ui_thread_->RunsTasksInCurrentSequence()); + + io_thread_->PostTask( + FROM_HERE, + base::BindOnce(&FakeGCMClient::MessageReceived, + weak_ptr_factory_.GetWeakPtr(), app_id, message)); +} + +void FakeGCMClient::DeleteMessages(const std::string& app_id) { + DCHECK(ui_thread_->RunsTasksInCurrentSequence()); + + io_thread_->PostTask(FROM_HERE, + base::BindOnce(&FakeGCMClient::MessagesDeleted, + weak_ptr_factory_.GetWeakPtr(), app_id)); +} + +void FakeGCMClient::Started() { + delegate_->OnGCMReady(std::vector<AccountMapping>(), base::Time()); + delegate_->OnConnected(net::IPEndPoint()); +} + +void FakeGCMClient::RegisterFinished( + scoped_refptr<RegistrationInfo> registration_info, + const std::string& registrion_id) { + delegate_->OnRegisterFinished(std::move(registration_info), registrion_id, + registrion_id.empty() ? SERVER_ERROR : SUCCESS); +} + +void FakeGCMClient::UnregisterFinished( + scoped_refptr<RegistrationInfo> registration_info) { + delegate_->OnUnregisterFinished(std::move(registration_info), + GCMClient::SUCCESS); +} + +void FakeGCMClient::SendFinished(const std::string& app_id, + const OutgoingMessage& message) { + delegate_->OnSendFinished(app_id, message.id, SUCCESS); + + // Simulate send error if message id contains a hint. + if (message.id.find("error") != std::string::npos) { + SendErrorDetails send_error_details; + send_error_details.message_id = message.id; + send_error_details.result = NETWORK_ERROR; + send_error_details.additional_data = message.data; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&FakeGCMClient::MessageSendError, + weak_ptr_factory_.GetWeakPtr(), app_id, + send_error_details), + base::Milliseconds(200)); + } else if(message.id.find("ack") != std::string::npos) { + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&FakeGCMClient::SendAcknowledgement, + weak_ptr_factory_.GetWeakPtr(), app_id, message.id), + base::Milliseconds(200)); + } +} + +void FakeGCMClient::MessageReceived(const std::string& app_id, + const IncomingMessage& message) { + if (delegate_) + delegate_->OnMessageReceived(app_id, message); +} + +void FakeGCMClient::MessagesDeleted(const std::string& app_id) { + if (delegate_) + delegate_->OnMessagesDeleted(app_id); +} + +void FakeGCMClient::MessageSendError( + const std::string& app_id, + const GCMClient::SendErrorDetails& send_error_details) { + if (delegate_) + delegate_->OnMessageSendError(app_id, send_error_details); +} + +void FakeGCMClient::SendAcknowledgement(const std::string& app_id, + const std::string& message_id) { + if (delegate_) + delegate_->OnSendAcknowledged(app_id, message_id); +} + +} // namespace gcm |