Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Unified Diff: chrome/browser/extensions/extension_gcm_app_handler_unittest.cc

Issue 225403021: Extract Profile-independent GCMService from GCMProfileService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Restore real IO thread in unit tests. Remove sources of flakiness by waiting instead of pumping whe… Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
diff --git a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
index 1adc3dc21f20895e15847fbc7c2c781fbf3e6168..6b5726191be778baeedb8a85aed76a937082faef 100644
--- a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
+++ b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
@@ -2,35 +2,54 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "chrome/browser/extensions/extension_gcm_app_handler.h"
+
+#include <vector>
+
#include "base/bind.h"
+#include "base/bind_helpers.h"
#include "base/command_line.h"
-#include "base/prefs/pref_service.h"
-#include "chrome/browser/extensions/extension_gcm_app_handler.h"
+#include "base/files/file_path.h"
+#include "base/location.h"
+#include "base/logging.h"
+#include "base/memory/ref_counted.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/test_extension_service.h"
#include "chrome/browser/extensions/test_extension_system.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/services/gcm/fake_gcm_client_factory.h"
+#include "chrome/browser/services/gcm/fake_signin_manager.h"
+#include "chrome/browser/services/gcm/gcm_client_factory.h"
#include "chrome/browser/services/gcm/gcm_client_mock.h"
#include "chrome/browser/services/gcm/gcm_profile_service.h"
#include "chrome/browser/services/gcm/gcm_profile_service_factory.h"
-#include "chrome/browser/services/gcm/gcm_profile_service_test_helper.h"
#include "chrome/browser/signin/signin_manager_factory.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/browser/extension_system.h"
#include "extensions/common/extension.h"
+#include "extensions/common/manifest.h"
#include "extensions/common/manifest_constants.h"
+#include "extensions/common/permissions/api_permission.h"
#include "testing/gtest/include/gtest/gtest.h"
+#if !defined(OS_ANDROID)
+#include "chrome/browser/extensions/api/gcm/gcm_api.h"
+#endif
+
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/chromeos/settings/device_settings_service.h"
-#else
-#include "components/signin/core/browser/signin_manager.h"
#endif
-using namespace gcm;
-
namespace extensions {
namespace {
@@ -40,12 +59,75 @@ const char kTestingUsername[] = "user1@example.com";
} // namespace
+// Helper class for asynchronous waiting.
+class Waiter {
+ public:
+ Waiter() {}
+ ~Waiter() {}
+
+ // Waits until the asynchronous operation finishes.
+ void WaitUntilCompleted() {
+ run_loop_.reset(new base::RunLoop);
+ run_loop_->Run();
+ }
+
+ // Signals that the asynchronous operation finishes.
+ void SignalCompleted() {
+ if (run_loop_ && run_loop_->running())
+ run_loop_->Quit();
+ }
+
+ // Runs until UI loop becomes idle.
+ void PumpUILoop() {
+ base::MessageLoop::current()->RunUntilIdle();
+ }
+
+ // Runs until IO loop becomes idle.
+ void PumpIOLoop() {
+ content::BrowserThread::PostTask(
+ content::BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&Waiter::OnIOLoopPump, base::Unretained(this)));
+
+ WaitUntilCompleted();
+ }
+
+ private:
+ void PumpIOLoopCompleted() {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+
+ SignalCompleted();
+ }
+
+ void OnIOLoopPump() {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
+
+ content::BrowserThread::PostTask(
+ content::BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&Waiter::OnIOLoopPumpCompleted, base::Unretained(this)));
+ }
+
+ void OnIOLoopPumpCompleted() {
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
+
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&Waiter::PumpIOLoopCompleted, base::Unretained(this)));
+ }
+
+ scoped_ptr<base::RunLoop> run_loop_;
+
+ DISALLOW_COPY_AND_ASSIGN(Waiter);
+};
+
class FakeExtensionGCMAppHandler : public ExtensionGCMAppHandler {
public:
FakeExtensionGCMAppHandler(Profile* profile, Waiter* waiter)
: ExtensionGCMAppHandler(profile),
waiter_(waiter),
- unregistration_result_(GCMClient::UNKNOWN_ERROR) {
+ unregistration_result_(gcm::GCMClient::UNKNOWN_ERROR) {
}
virtual ~FakeExtensionGCMAppHandler() {
@@ -53,7 +135,7 @@ class FakeExtensionGCMAppHandler : public ExtensionGCMAppHandler {
virtual void OnMessage(
const std::string& app_id,
- const GCMClient::IncomingMessage& message)OVERRIDE {
+ const gcm::GCMClient::IncomingMessage& message) OVERRIDE {
}
virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE {
@@ -61,22 +143,22 @@ class FakeExtensionGCMAppHandler : public ExtensionGCMAppHandler {
virtual void OnSendError(
const std::string& app_id,
- const GCMClient::SendErrorDetails& send_error_details) OVERRIDE {
+ const gcm::GCMClient::SendErrorDetails& send_error_details) OVERRIDE {
}
virtual void OnUnregisterCompleted(const std::string& app_id,
- GCMClient::Result result) OVERRIDE {
+ gcm::GCMClient::Result result) OVERRIDE {
unregistration_result_ = result;
waiter_->SignalCompleted();
}
- GCMClient::Result unregistration_result() const {
+ gcm::GCMClient::Result unregistration_result() const {
return unregistration_result_;
}
private:
Waiter* waiter_;
- GCMClient::Result unregistration_result_;
+ gcm::GCMClient::Result unregistration_result_;
DISALLOW_COPY_AND_ASSIGN(FakeExtensionGCMAppHandler);
};
@@ -85,13 +167,13 @@ class ExtensionGCMAppHandlerTest : public testing::Test {
public:
static KeyedService* BuildGCMProfileService(
content::BrowserContext* context) {
- return new GCMProfileService(static_cast<Profile*>(context));
+ return new gcm::GCMProfileService(static_cast<Profile*>(context));
}
ExtensionGCMAppHandlerTest()
: extension_service_(NULL),
- registration_result_(GCMClient::UNKNOWN_ERROR),
- unregistration_result_(GCMClient::UNKNOWN_ERROR) {
+ registration_result_(gcm::GCMClient::UNKNOWN_ERROR),
+ unregistration_result_(gcm::GCMClient::UNKNOWN_ERROR) {
}
virtual ~ExtensionGCMAppHandlerTest() {
@@ -127,12 +209,14 @@ class ExtensionGCMAppHandlerTest : public testing::Test {
profile()->GetPrefs()->SetBoolean(prefs::kGCMChannelEnabled, true);
// Create GCMProfileService that talks with fake GCMClient.
- GCMProfileService* gcm_profile_service = static_cast<GCMProfileService*>(
- GCMProfileServiceFactory::GetInstance()->SetTestingFactoryAndUse(
- profile(),
- &ExtensionGCMAppHandlerTest::BuildGCMProfileService));
- scoped_ptr<GCMClientFactory> gcm_client_factory(
- new FakeGCMClientFactory(GCMClientMock::NO_DELAY_LOADING));
+ gcm::GCMProfileService* gcm_profile_service =
+ static_cast<gcm::GCMProfileService*>(
+ gcm::GCMProfileServiceFactory::GetInstance()->
+ SetTestingFactoryAndUse(
+ profile(),
+ &ExtensionGCMAppHandlerTest::BuildGCMProfileService));
+ scoped_ptr<gcm::GCMClientFactory> gcm_client_factory(
+ new gcm::FakeGCMClientFactory(gcm::GCMClientMock::NO_DELAY_LOADING));
gcm_profile_service->Initialize(gcm_client_factory.Pass());
// Create a fake version of ExtensionGCMAppHandler.
@@ -212,13 +296,13 @@ class ExtensionGCMAppHandlerTest : public testing::Test {
}
void RegisterCompleted(const std::string& registration_id,
- GCMClient::Result result) {
+ gcm::GCMClient::Result result) {
registration_result_ = result;
waiter_.SignalCompleted();
}
- GCMProfileService* GetGCMProfileService() const {
- return GCMProfileServiceFactory::GetForProfile(profile());
+ gcm::GCMProfileService* GetGCMProfileService() const {
+ return gcm::GCMProfileServiceFactory::GetForProfile(profile());
}
bool HasAppHandlers(const std::string& app_id) const {
@@ -230,8 +314,10 @@ class ExtensionGCMAppHandlerTest : public testing::Test {
FakeExtensionGCMAppHandler* gcm_app_handler() const {
return gcm_app_handler_.get();
}
- GCMClient::Result registration_result() const { return registration_result_; }
- GCMClient::Result unregistration_result() const {
+ gcm::GCMClient::Result registration_result() const {
+ return registration_result_;
+ }
+ gcm::GCMClient::Result unregistration_result() const {
return unregistration_result_;
}
@@ -250,8 +336,8 @@ class ExtensionGCMAppHandlerTest : public testing::Test {
Waiter waiter_;
scoped_ptr<FakeExtensionGCMAppHandler> gcm_app_handler_;
- GCMClient::Result registration_result_;
- GCMClient::Result unregistration_result_;
+ gcm::GCMClient::Result registration_result_;
+ gcm::GCMClient::Result unregistration_result_;
DISALLOW_COPY_AND_ASSIGN(ExtensionGCMAppHandlerTest);
};
@@ -292,12 +378,13 @@ TEST_F(ExtensionGCMAppHandlerTest, UnregisterOnExtensionUninstall) {
sender_ids.push_back("sender1");
Register(extension->id(), sender_ids);
waiter()->WaitUntilCompleted();
- EXPECT_EQ(GCMClient::SUCCESS, registration_result());
+ EXPECT_EQ(gcm::GCMClient::SUCCESS, registration_result());
// Unregistration should be triggered when the extension is uninstalled.
UninstallExtension(extension);
waiter()->WaitUntilCompleted();
- EXPECT_EQ(GCMClient::SUCCESS, gcm_app_handler()->unregistration_result());
+ EXPECT_EQ(gcm::GCMClient::SUCCESS,
+ gcm_app_handler()->unregistration_result());
}
} // namespace extensions
« no previous file with comments | « chrome/browser/extensions/extension_gcm_app_handler.h ('k') | chrome/browser/invalidation/gcm_invalidation_bridge.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698