[Sync] Use GCMDriver to deliver invalidations in tests
This CL uses GCMDriver directly to simulate sending sync invalidations
from the server. FakeGCMDriver also allows now to wait for specific GCMAppHandler to be added before connection (in real scenario GCMClient starts when the first AppHandler is added).
Note that Android has a different implementation and does not check for actual token to match. This should work since Android tests don't support multiple clients yet.
Bug: 1331206
Change-Id: I0dba63cdae469cb7047f076df1fd1a4d78153977
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4150488
Reviewed-by: Marc Treib <[email protected]>
Commit-Queue: Rushan Suleymanov <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1095004}
diff --git a/components/gcm_driver/fake_gcm_profile_service.cc b/components/gcm_driver/fake_gcm_profile_service.cc
index 6437627..fa81e44 100644
--- a/components/gcm_driver/fake_gcm_profile_service.cc
+++ b/components/gcm_driver/fake_gcm_profile_service.cc
@@ -11,12 +11,10 @@
#include "base/location.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "components/gcm_driver/crypto/gcm_encryption_result.h"
-#include "components/gcm_driver/fake_gcm_client_factory.h"
#include "components/gcm_driver/gcm_driver.h"
#include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h"
@@ -25,7 +23,10 @@
class FakeGCMProfileService::CustomFakeGCMDriver
: public instance_id::FakeGCMDriverForInstanceID {
public:
- explicit CustomFakeGCMDriver(FakeGCMProfileService* service);
+ CustomFakeGCMDriver();
+
+ // Must be called before any other methods.
+ void SetService(FakeGCMProfileService* service);
CustomFakeGCMDriver(const CustomFakeGCMDriver&) = delete;
CustomFakeGCMDriver& operator=(const CustomFakeGCMDriver&) = delete;
@@ -39,9 +40,6 @@
const std::string& message_id,
GCMClient::Result result);
- void OnDispatchMessage(const std::string& app_id,
- const IncomingMessage& message);
-
// GCMDriver overrides:
void EncryptMessage(const std::string& app_id,
const std::string& authorized_entity,
@@ -80,7 +78,7 @@
const std::string& receiver_id,
const OutgoingMessage& message);
- raw_ptr<FakeGCMProfileService> service_;
+ raw_ptr<FakeGCMProfileService> service_ = nullptr;
// Used to give each registration a unique registration id. Does not decrease
// when unregister is called.
@@ -90,11 +88,9 @@
this}; // Must be last.
};
-FakeGCMProfileService::CustomFakeGCMDriver::CustomFakeGCMDriver(
- FakeGCMProfileService* service)
- : service_(service) {}
+FakeGCMProfileService::CustomFakeGCMDriver::CustomFakeGCMDriver() = default;
-FakeGCMProfileService::CustomFakeGCMDriver::~CustomFakeGCMDriver() {}
+FakeGCMProfileService::CustomFakeGCMDriver::~CustomFakeGCMDriver() = default;
void FakeGCMProfileService::CustomFakeGCMDriver::RegisterImpl(
const std::string& app_id,
@@ -171,6 +167,11 @@
std::move(callback).Run(GCMEncryptionResult::ENCRYPTED_DRAFT_08, message);
}
+void FakeGCMProfileService::CustomFakeGCMDriver::SetService(
+ FakeGCMProfileService* service) {
+ service_ = service;
+}
+
void FakeGCMProfileService::CustomFakeGCMDriver::DoSend(
const std::string& app_id,
const std::string& receiver_id,
@@ -207,24 +208,22 @@
app_id, authorized_entity, scope, std::move(callback));
}
-void FakeGCMProfileService::CustomFakeGCMDriver::OnDispatchMessage(
- const std::string& app_id,
- const IncomingMessage& message) {
- DispatchMessage(app_id, message);
-}
-
// static
std::unique_ptr<KeyedService> FakeGCMProfileService::Build(
content::BrowserContext* context) {
- std::unique_ptr<FakeGCMProfileService> service =
- std::make_unique<FakeGCMProfileService>();
- service->SetDriverForTesting(
- std::make_unique<CustomFakeGCMDriver>(service.get()));
+ auto custom_driver = std::make_unique<CustomFakeGCMDriver>();
+ CustomFakeGCMDriver* custom_driver_ptr = custom_driver.get();
+ std::unique_ptr<FakeGCMProfileService> service =
+ std::make_unique<FakeGCMProfileService>(std::move(custom_driver));
+
+ custom_driver_ptr->SetService(service.get());
return service;
}
-FakeGCMProfileService::FakeGCMProfileService() = default;
+FakeGCMProfileService::FakeGCMProfileService(
+ std::unique_ptr<instance_id::FakeGCMDriverForInstanceID> fake_gcm_driver)
+ : GCMProfileService(std::move(fake_gcm_driver)) {}
FakeGCMProfileService::~FakeGCMProfileService() = default;
@@ -235,9 +234,12 @@
void FakeGCMProfileService::DispatchMessage(const std::string& app_id,
const IncomingMessage& message) {
- CustomFakeGCMDriver* custom_driver =
- static_cast<CustomFakeGCMDriver*>(driver());
- custom_driver->OnDispatchMessage(app_id, message);
+ GetFakeGCMDriver()->DispatchMessage(app_id, message);
+}
+
+instance_id::FakeGCMDriverForInstanceID*
+FakeGCMProfileService::GetFakeGCMDriver() {
+ return static_cast<instance_id::FakeGCMDriverForInstanceID*>(driver());
}
} // namespace gcm