blob: fa81e440e097fce7bd90d48bc9a77ae105ac3006 [file] [log] [blame]
Avi Drissman8ba1bad2022-09-13 19:22:361// Copyright 2013 The Chromium Authors
[email protected]2508c652013-11-27 01:49:502// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Peter Beverloo34139462018-04-10 14:18:065#include "components/gcm_driver/fake_gcm_profile_service.h"
[email protected]2508c652013-11-27 01:49:506
dchenge73d8520c2015-12-27 01:19:097#include <utility>
8
johnme29022c52014-12-11 16:26:309#include "base/format_macros.h"
Avi Drissman12be0312023-01-11 09:16:0910#include "base/functional/bind.h"
skyostil02598352015-06-12 12:37:2511#include "base/location.h"
Keishi Hattori0e45c022021-11-27 09:25:5212#include "base/memory/raw_ptr.h"
johnmeef71bd02017-02-09 17:45:5613#include "base/memory/weak_ptr.h"
johnme29022c52014-12-11 16:26:3014#include "base/strings/stringprintf.h"
Patrick Monette643cdf62021-10-15 19:13:4215#include "base/task/single_thread_task_runner.h"
johnmeef71bd02017-02-09 17:45:5616#include "base/time/time.h"
Alex Chauda2073d62020-01-29 11:26:0817#include "components/gcm_driver/crypto/gcm_encryption_result.h"
johnmeef71bd02017-02-09 17:45:5618#include "components/gcm_driver/gcm_driver.h"
johnmea5045732016-09-08 17:23:2919#include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h"
[email protected]2508c652013-11-27 01:49:5020
21namespace gcm {
22
johnmeef71bd02017-02-09 17:45:5623class FakeGCMProfileService::CustomFakeGCMDriver
24 : public instance_id::FakeGCMDriverForInstanceID {
[email protected]9d7e5c02014-05-21 03:09:0325 public:
Rushan Suleymanov79aba4e2023-01-23 18:14:1626 CustomFakeGCMDriver();
27
28 // Must be called before any other methods.
29 void SetService(FakeGCMProfileService* service);
Peter Boström09c01822021-09-20 22:43:2730
31 CustomFakeGCMDriver(const CustomFakeGCMDriver&) = delete;
32 CustomFakeGCMDriver& operator=(const CustomFakeGCMDriver&) = delete;
33
Daniel Chenga542fca2014-10-21 09:51:2934 ~CustomFakeGCMDriver() override;
[email protected]9d7e5c02014-05-21 03:09:0335
[email protected]c27c10792014-06-05 15:27:2336 void OnRegisterFinished(const std::string& app_id,
37 const std::string& registration_id,
38 GCMClient::Result result);
[email protected]c27c10792014-06-05 15:27:2339 void OnSendFinished(const std::string& app_id,
40 const std::string& message_id,
41 GCMClient::Result result);
42
Alex Chauda2073d62020-01-29 11:26:0843 // GCMDriver overrides:
44 void EncryptMessage(const std::string& app_id,
45 const std::string& authorized_entity,
46 const std::string& p256dh,
47 const std::string& auth_secret,
48 const std::string& message,
49 EncryptMessageCallback callback) override;
Himanshu Jaju3dc84e82019-08-01 16:46:0150
[email protected]c27c10792014-06-05 15:27:2351 protected:
johnmeef71bd02017-02-09 17:45:5652 // FakeGCMDriver overrides:
Daniel Chenga542fca2014-10-21 09:51:2953 void RegisterImpl(const std::string& app_id,
54 const std::vector<std::string>& sender_ids) override;
55 void UnregisterImpl(const std::string& app_id) override;
peterc5634e8f2015-12-02 15:34:5956 void UnregisterWithSenderIdImpl(const std::string& app_id,
57 const std::string& sender_id) override;
Daniel Chenga542fca2014-10-21 09:51:2958 void SendImpl(const std::string& app_id,
59 const std::string& receiver_id,
mvanouwerkerkf8633deb2015-07-13 11:04:0660 const OutgoingMessage& message) override;
[email protected]9d7e5c02014-05-21 03:09:0361
johnmeef71bd02017-02-09 17:45:5662 // FakeGCMDriverForInstanceID overrides:
63 void GetToken(const std::string& app_id,
64 const std::string& authorized_entity,
65 const std::string& scope,
Maksim Moskvitin8b448982020-02-06 13:23:1966 base::TimeDelta time_to_live,
danakjb534bf72019-05-02 17:10:1467 GetTokenCallback callback) override;
johnmeef71bd02017-02-09 17:45:5668 void DeleteToken(const std::string& app_id,
69 const std::string& authorized_entity,
70 const std::string& scope,
danakjb534bf72019-05-02 17:10:1471 DeleteTokenCallback callback) override;
johnmeef71bd02017-02-09 17:45:5672
[email protected]9d7e5c02014-05-21 03:09:0373 private:
johnmeef71bd02017-02-09 17:45:5674 void DoRegister(const std::string& app_id,
75 const std::vector<std::string>& sender_ids,
76 const std::string& registration_id);
77 void DoSend(const std::string& app_id,
78 const std::string& receiver_id,
79 const OutgoingMessage& message);
80
Rushan Suleymanov79aba4e2023-01-23 18:14:1681 raw_ptr<FakeGCMProfileService> service_ = nullptr;
[email protected]9d7e5c02014-05-21 03:09:0382
johnmeef71bd02017-02-09 17:45:5683 // Used to give each registration a unique registration id. Does not decrease
84 // when unregister is called.
85 int registration_count_ = 0;
86
Jeremy Roman5c341f6d2019-07-15 15:56:1087 base::WeakPtrFactory<CustomFakeGCMDriver> weak_factory_{
88 this}; // Must be last.
[email protected]9d7e5c02014-05-21 03:09:0389};
90
Rushan Suleymanov79aba4e2023-01-23 18:14:1691FakeGCMProfileService::CustomFakeGCMDriver::CustomFakeGCMDriver() = default;
[email protected]2508c652013-11-27 01:49:5092
Rushan Suleymanov79aba4e2023-01-23 18:14:1693FakeGCMProfileService::CustomFakeGCMDriver::~CustomFakeGCMDriver() = default;
[email protected]2508c652013-11-27 01:49:5094
johnmeef71bd02017-02-09 17:45:5695void FakeGCMProfileService::CustomFakeGCMDriver::RegisterImpl(
[email protected]c27c10792014-06-05 15:27:2396 const std::string& app_id,
97 const std::vector<std::string>& sender_ids) {
johnmeef71bd02017-02-09 17:45:5698 if (service_->is_offline_)
99 return; // Drop request.
[email protected]2508c652013-11-27 01:49:50100
johnmeef71bd02017-02-09 17:45:56101 // Generate fake registration IDs, encoding the number of sender IDs (used by
102 // GcmApiTest.RegisterValidation), then an incrementing count (even for the
103 // same app_id - there's no caching) so tests can distinguish registrations.
104 std::string registration_id = base::StringPrintf(
105 "%" PRIuS "-%d", sender_ids.size(), registration_count_);
106 ++registration_count_;
[email protected]9d7e5c02014-05-21 03:09:03107
Sean Maher5b9af51f2022-11-21 15:32:47108 base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
tzik29ea5c72017-04-20 02:16:51109 FROM_HERE, base::BindOnce(&CustomFakeGCMDriver::DoRegister,
110 weak_factory_.GetWeakPtr(), app_id, sender_ids,
111 registration_id));
[email protected]c27c10792014-06-05 15:27:23112}
113
johnmeef71bd02017-02-09 17:45:56114void FakeGCMProfileService::CustomFakeGCMDriver::DoRegister(
[email protected]c27c10792014-06-05 15:27:23115 const std::string& app_id,
johnmeef71bd02017-02-09 17:45:56116 const std::vector<std::string>& sender_ids,
117 const std::string& registration_id) {
118 if (service_->collect_) {
119 service_->last_registered_app_id_ = app_id;
120 service_->last_registered_sender_ids_ = sender_ids;
121 }
122 RegisterFinished(app_id, registration_id, GCMClient::SUCCESS);
[email protected]c27c10792014-06-05 15:27:23123}
peterc5634e8f2015-12-02 15:34:59124
johnmeef71bd02017-02-09 17:45:56125void FakeGCMProfileService::CustomFakeGCMDriver::UnregisterImpl(
126 const std::string& app_id) {
127 if (service_->is_offline_)
128 return; // Drop request.
129
130 GCMClient::Result result = GCMClient::SUCCESS;
131 if (!service_->unregister_responses_.empty()) {
132 result = service_->unregister_responses_.front();
133 service_->unregister_responses_.pop_front();
134 }
Sean Maher5b9af51f2022-11-21 15:32:47135 base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
tzik29ea5c72017-04-20 02:16:51136 FROM_HERE, base::BindOnce(&CustomFakeGCMDriver::UnregisterFinished,
137 weak_factory_.GetWeakPtr(), app_id, result));
[email protected]c27c10792014-06-05 15:27:23138}
peterc5634e8f2015-12-02 15:34:59139
johnmeef71bd02017-02-09 17:45:56140void FakeGCMProfileService::CustomFakeGCMDriver::UnregisterWithSenderIdImpl(
141 const std::string& app_id,
142 const std::string& sender_id) {
143 NOTREACHED() << "This Android-specific method is not yet faked.";
[email protected]9d7e5c02014-05-21 03:09:03144}
145
johnmeef71bd02017-02-09 17:45:56146void FakeGCMProfileService::CustomFakeGCMDriver::SendImpl(
147 const std::string& app_id,
148 const std::string& receiver_id,
149 const OutgoingMessage& message) {
150 if (service_->is_offline_)
151 return; // Drop request.
152
Sean Maher5b9af51f2022-11-21 15:32:47153 base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
johnmeef71bd02017-02-09 17:45:56154 FROM_HERE,
tzik29ea5c72017-04-20 02:16:51155 base::BindOnce(&CustomFakeGCMDriver::DoSend, weak_factory_.GetWeakPtr(),
156 app_id, receiver_id, message));
johnmeef71bd02017-02-09 17:45:56157}
158
Alex Chauda2073d62020-01-29 11:26:08159void FakeGCMProfileService::CustomFakeGCMDriver::EncryptMessage(
Himanshu Jaju3dc84e82019-08-01 16:46:01160 const std::string& app_id,
161 const std::string& authorized_entity,
162 const std::string& p256dh,
163 const std::string& auth_secret,
Alex Chauda2073d62020-01-29 11:26:08164 const std::string& message,
165 EncryptMessageCallback callback) {
166 // Pretend that message has been encrypted.
167 std::move(callback).Run(GCMEncryptionResult::ENCRYPTED_DRAFT_08, message);
Himanshu Jaju3dc84e82019-08-01 16:46:01168}
169
Rushan Suleymanov79aba4e2023-01-23 18:14:16170void FakeGCMProfileService::CustomFakeGCMDriver::SetService(
171 FakeGCMProfileService* service) {
172 service_ = service;
173}
174
johnmeef71bd02017-02-09 17:45:56175void FakeGCMProfileService::CustomFakeGCMDriver::DoSend(
176 const std::string& app_id,
177 const std::string& receiver_id,
178 const OutgoingMessage& message) {
179 if (service_->collect_) {
180 service_->last_sent_message_ = message;
181 service_->last_receiver_id_ = receiver_id;
182 }
183 SendFinished(app_id, message.id, GCMClient::SUCCESS);
184}
185
186void FakeGCMProfileService::CustomFakeGCMDriver::GetToken(
187 const std::string& app_id,
188 const std::string& authorized_entity,
189 const std::string& scope,
Maksim Moskvitin8b448982020-02-06 13:23:19190 base::TimeDelta time_to_live,
danakjb534bf72019-05-02 17:10:14191 GetTokenCallback callback) {
johnmeef71bd02017-02-09 17:45:56192 if (service_->is_offline_)
193 return; // Drop request.
194
danakjb534bf72019-05-02 17:10:14195 instance_id::FakeGCMDriverForInstanceID::GetToken(
Richard Knoll943b81a2020-12-10 12:07:28196 app_id, authorized_entity, scope, time_to_live, std::move(callback));
johnmeef71bd02017-02-09 17:45:56197}
198
199void FakeGCMProfileService::CustomFakeGCMDriver::DeleteToken(
200 const std::string& app_id,
201 const std::string& authorized_entity,
202 const std::string& scope,
danakjb534bf72019-05-02 17:10:14203 DeleteTokenCallback callback) {
johnmeef71bd02017-02-09 17:45:56204 if (service_->is_offline_)
205 return; // Drop request.
206
207 instance_id::FakeGCMDriverForInstanceID::DeleteToken(
danakjb534bf72019-05-02 17:10:14208 app_id, authorized_entity, scope, std::move(callback));
johnmeef71bd02017-02-09 17:45:56209}
210
[email protected]9d7e5c02014-05-21 03:09:03211// static
dcheng4af48582016-04-19 00:29:35212std::unique_ptr<KeyedService> FakeGCMProfileService::Build(
isherman30fa851a2015-06-09 23:32:10213 content::BrowserContext* context) {
Rushan Suleymanov79aba4e2023-01-23 18:14:16214 auto custom_driver = std::make_unique<CustomFakeGCMDriver>();
215 CustomFakeGCMDriver* custom_driver_ptr = custom_driver.get();
Rushan Suleymanov9b9b88b62023-01-20 13:40:45216
Rushan Suleymanov79aba4e2023-01-23 18:14:16217 std::unique_ptr<FakeGCMProfileService> service =
218 std::make_unique<FakeGCMProfileService>(std::move(custom_driver));
219
220 custom_driver_ptr->SetService(service.get());
Peter Beverloo34139462018-04-10 14:18:06221 return service;
[email protected]9d7e5c02014-05-21 03:09:03222}
223
Rushan Suleymanov79aba4e2023-01-23 18:14:16224FakeGCMProfileService::FakeGCMProfileService(
225 std::unique_ptr<instance_id::FakeGCMDriverForInstanceID> fake_gcm_driver)
226 : GCMProfileService(std::move(fake_gcm_driver)) {}
[email protected]9d7e5c02014-05-21 03:09:03227
Peter Beverloo34139462018-04-10 14:18:06228FakeGCMProfileService::~FakeGCMProfileService() = default;
[email protected]9d7e5c02014-05-21 03:09:03229
[email protected]0e88e1d12014-03-19 06:53:08230void FakeGCMProfileService::AddExpectedUnregisterResponse(
231 GCMClient::Result result) {
232 unregister_responses_.push_back(result);
233}
234
peterc5634e8f2015-12-02 15:34:59235void FakeGCMProfileService::DispatchMessage(const std::string& app_id,
236 const IncomingMessage& message) {
Rushan Suleymanov79aba4e2023-01-23 18:14:16237 GetFakeGCMDriver()->DispatchMessage(app_id, message);
238}
239
240instance_id::FakeGCMDriverForInstanceID*
241FakeGCMProfileService::GetFakeGCMDriver() {
242 return static_cast<instance_id::FakeGCMDriverForInstanceID*>(driver());
peterc5634e8f2015-12-02 15:34:59243}
244
[email protected]2508c652013-11-27 01:49:50245} // namespace gcm