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

Unified Diff: chrome/browser/services/gcm/gcm_profile_service_unittest.cc

Issue 184273011: Merge 253787 "[GCM] Make sure GCM checkout logic is invoked when..." (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1847/src/
Patch Set: Created 6 years, 10 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/services/gcm/gcm_profile_service_unittest.cc
===================================================================
--- chrome/browser/services/gcm/gcm_profile_service_unittest.cc (revision 255183)
+++ chrome/browser/services/gcm/gcm_profile_service_unittest.cc (working copy)
@@ -98,8 +98,15 @@
void OnIOLoopPump() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
- base::MessageLoop::current()->RunUntilIdle();
+ 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,
@@ -214,9 +221,9 @@
class FakeGCMClientFactory : public GCMClientFactory {
public:
FakeGCMClientFactory(
- GCMClientMock::Status gcm_client_initial_status,
+ GCMClientMock::LoadingDelay gcm_client_loading_delay,
GCMClientMock::ErrorSimulation gcm_client_error_simulation)
- : gcm_client_initial_status_(gcm_client_initial_status),
+ : gcm_client_loading_delay_(gcm_client_loading_delay),
gcm_client_error_simulation_(gcm_client_error_simulation),
gcm_client_(NULL) {
}
@@ -225,7 +232,7 @@
}
virtual scoped_ptr<GCMClient> BuildInstance() OVERRIDE {
- gcm_client_ = new GCMClientMock(gcm_client_initial_status_,
+ gcm_client_ = new GCMClientMock(gcm_client_loading_delay_,
gcm_client_error_simulation_);
return scoped_ptr<GCMClient>(gcm_client_);
}
@@ -233,7 +240,7 @@
GCMClientMock* gcm_client() const { return gcm_client_; }
private:
- GCMClientMock::Status gcm_client_initial_status_;
+ GCMClientMock::LoadingDelay gcm_client_loading_delay_;
GCMClientMock::ErrorSimulation gcm_client_error_simulation_;
GCMClientMock* gcm_client_;
@@ -256,7 +263,7 @@
: waiter_(waiter),
extension_service_(NULL),
signin_manager_(NULL),
- gcm_client_initial_status_(GCMClientMock::READY),
+ gcm_client_loading_delay_(GCMClientMock::NO_DELAY_LOADING),
gcm_client_error_simulation_(GCMClientMock::ALWAYS_SUCCEED),
registration_result_(GCMClient::SUCCESS),
has_persisted_registration_info_(false),
@@ -278,7 +285,7 @@
extension_service_ = extension_system->Get(profile())->extension_service();
// Enable GCM such that tests could be run on all channels.
- GCMProfileService::enable_gcm_for_testing_ = true;
+ profile()->GetPrefs()->SetBoolean(prefs::kGCMChannelEnabled, true);
// Mock a GCMEventRouter.
gcm_event_router_.reset(new FakeGCMEventRouter(waiter_));
@@ -334,7 +341,7 @@
profile(), &GCMProfileServiceTestConsumer::BuildGCMProfileService));
gcm_profile_service->set_testing_delegate(this);
scoped_ptr<GCMClientFactory> gcm_client_factory(
- new FakeGCMClientFactory(gcm_client_initial_status_,
+ new FakeGCMClientFactory(gcm_client_loading_delay_,
gcm_client_error_simulation_));
gcm_profile_service->Initialize(gcm_client_factory.Pass());
waiter_->PumpIOLoop();
@@ -411,8 +418,8 @@
}
GCMClientMock* GetGCMClient() const {
- return static_cast<FakeGCMClientFactory*>(
- GetGCMProfileService()->gcm_client_factory_.get())->gcm_client();
+ return static_cast<GCMClientMock*>(
+ GetGCMProfileService()->GetGCMClientForTesting());
}
const std::string& GetUsername() const {
@@ -432,8 +439,8 @@
return gcm_event_router_.get();
}
- void set_gcm_client_initial_status(GCMClientMock::Status status) {
- gcm_client_initial_status_ = status;
+ void set_gcm_client_loading_delay(GCMClientMock::LoadingDelay delay) {
+ gcm_client_loading_delay_ = delay;
}
void set_gcm_client_error_simulation(GCMClientMock::ErrorSimulation error) {
gcm_client_error_simulation_ = error;
@@ -465,7 +472,7 @@
FakeSigninManager* signin_manager_; // Not owned.
scoped_ptr<FakeGCMEventRouter> gcm_event_router_;
- GCMClientMock::Status gcm_client_initial_status_;
+ GCMClientMock::LoadingDelay gcm_client_loading_delay_;
GCMClientMock::ErrorSimulation gcm_client_error_simulation_;
std::string registration_id_;
@@ -584,7 +591,67 @@
EXPECT_FALSE(consumer()->GetUsername().empty());
}
-TEST_F(GCMProfileServiceTest, RegsiterWhenNotSignedIn) {
+TEST_F(GCMProfileServiceTest, SignInAndSignOutUnderPositiveChannelSignal) {
+ // Positive channel signal is provided in SetUp.
+ consumer()->CreateGCMProfileServiceInstance();
+ consumer()->SignIn(kTestingUsername);
+
+ // GCMClient should be loaded.
+ EXPECT_TRUE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::LOADED, consumer()->GetGCMClient()->status());
+
+ consumer()->SignOut();
+
+ // GCMClient should be checked out.
+ EXPECT_FALSE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::CHECKED_OUT, consumer()->GetGCMClient()->status());
+}
+
+TEST_F(GCMProfileServiceTest, SignInAndSignOutUnderNegativeChannelSignal) {
+ // Negative channel signal will prevent GCMClient from checking in when the
+ // profile is signed in.
+ profile()->GetPrefs()->SetBoolean(prefs::kGCMChannelEnabled, false);
+
+ consumer()->CreateGCMProfileServiceInstance();
+ consumer()->SignIn(kTestingUsername);
+
+ // GCMClient should not be loaded.
+ EXPECT_FALSE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::UNINITIALIZED, consumer()->GetGCMClient()->status());
+
+ consumer()->SignOut();
+
+ // Check-out should still be performed.
+ EXPECT_FALSE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::CHECKED_OUT, consumer()->GetGCMClient()->status());
+}
+
+TEST_F(GCMProfileServiceTest, SignOutAndThenSignIn) {
+ // Positive channel signal is provided in SetUp.
+ consumer()->CreateGCMProfileServiceInstance();
+ consumer()->SignIn(kTestingUsername);
+
+ // GCMClient should be loaded.
+ EXPECT_TRUE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::LOADED, consumer()->GetGCMClient()->status());
+
+ consumer()->SignOut();
+
+ // GCMClient should be checked out.
+ EXPECT_FALSE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::CHECKED_OUT, consumer()->GetGCMClient()->status());
+
+ // Sign-in with a different username.
+ consumer()->SignIn(kTestingUsername2);
+
+ // GCMClient should be loaded again.
+ EXPECT_TRUE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::LOADED, consumer()->GetGCMClient()->status());
+}
+
+TEST_F(GCMProfileServiceTest, RegisterWhenNotSignedIn) {
+ consumer()->CreateGCMProfileServiceInstance();
+
std::vector<std::string> sender_ids;
sender_ids.push_back("sender1");
consumer()->Register(kTestingAppId, sender_ids);
@@ -593,7 +660,38 @@
EXPECT_EQ(GCMClient::NOT_SIGNED_IN, consumer()->registration_result());
}
+TEST_F(GCMProfileServiceTest, RegisterUnderNeutralChannelSignal) {
+ // Neutral channel signal will prevent GCMClient from checking in when the
+ // profile is signed in.
+ profile()->GetPrefs()->ClearPref(prefs::kGCMChannelEnabled);
+
+ consumer()->CreateGCMProfileServiceInstance();
+ consumer()->SignIn(kTestingUsername);
+
+ // GCMClient should not be checked in.
+ EXPECT_FALSE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::UNINITIALIZED, consumer()->GetGCMClient()->status());
+
+ // Invoking register will make GCMClient checked in.
+ std::vector<std::string> sender_ids;
+ sender_ids.push_back("sender1");
+ consumer()->Register(kTestingAppId, sender_ids);
+ WaitUntilCompleted();
+
+ // GCMClient should be checked in.
+ EXPECT_TRUE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::LOADED, consumer()->GetGCMClient()->status());
+
+ // Registration should succeed.
+ std::string expected_registration_id =
+ GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids);
+ EXPECT_EQ(expected_registration_id, consumer()->registration_id());
+ EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result());
+}
+
TEST_F(GCMProfileServiceTest, SendWhenNotSignedIn) {
+ consumer()->CreateGCMProfileServiceInstance();
+
GCMClient::OutgoingMessage message;
message.id = "1";
message.data["key1"] = "value1";
@@ -603,6 +701,34 @@
EXPECT_EQ(GCMClient::NOT_SIGNED_IN, consumer()->send_result());
}
+TEST_F(GCMProfileServiceTest, SendUnderNeutralChannelSignal) {
+ // Neutral channel signal will prevent GCMClient from checking in when the
+ // profile is signed in.
+ profile()->GetPrefs()->ClearPref(prefs::kGCMChannelEnabled);
+
+ consumer()->CreateGCMProfileServiceInstance();
+ consumer()->SignIn(kTestingUsername);
+
+ // GCMClient should not be checked in.
+ EXPECT_FALSE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::UNINITIALIZED, consumer()->GetGCMClient()->status());
+
+ // Invoking send will make GCMClient checked in.
+ GCMClient::OutgoingMessage message;
+ message.id = "1";
+ message.data["key1"] = "value1";
+ consumer()->Send(kTestingAppId, kUserId, message);
+ WaitUntilCompleted();
+
+ // GCMClient should be checked in.
+ EXPECT_TRUE(consumer()->IsGCMClientReady());
+ EXPECT_EQ(GCMClientMock::LOADED, consumer()->GetGCMClient()->status());
+
+ // Sending should succeed.
+ EXPECT_EQ(consumer()->send_message_id(), message.id);
+ EXPECT_EQ(GCMClient::SUCCESS, consumer()->send_result());
+}
+
// Tests single-profile.
class GCMProfileServiceSingleProfileTest : public GCMProfileServiceTest {
public:
@@ -620,29 +746,6 @@
}
};
-TEST_F(GCMProfileServiceSingleProfileTest, SignOut) {
- EXPECT_TRUE(consumer()->IsGCMClientReady());
-
- // This will trigger check-out.
- consumer()->SignOut();
-
- EXPECT_FALSE(consumer()->IsGCMClientReady());
-}
-
-TEST_F(GCMProfileServiceSingleProfileTest, SignOutAndThenSignIn) {
- EXPECT_TRUE(consumer()->IsGCMClientReady());
-
- // This will trigger check-out.
- consumer()->SignOut();
-
- EXPECT_FALSE(consumer()->IsGCMClientReady());
-
- // Sign-in with a different username.
- consumer()->SignIn(kTestingUsername2);
-
- EXPECT_TRUE(consumer()->IsGCMClientReady());
-}
-
TEST_F(GCMProfileServiceSingleProfileTest, Register) {
std::vector<std::string> sender_ids;
sender_ids.push_back("sender1");
@@ -766,6 +869,7 @@
// This should read the registration info from the extension's state store.
consumer()->Register(extension->id(), sender_ids);
+ PumpIOLoop();
PumpUILoop();
EXPECT_EQ(old_registration_id, consumer()->registration_id());
EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result());
@@ -788,10 +892,8 @@
// preparation to call register 2nd time.
consumer()->clear_registration_result();
- // Needs to create a GCMClient instance that is not ready initiallly.
- consumer()->set_gcm_client_initial_status(GCMClientMock::NOT_READY);
-
// Simulate start-up by recreating GCMProfileService.
+ consumer()->set_gcm_client_loading_delay(GCMClientMock::DELAY_LOADING);
consumer()->CreateGCMProfileServiceInstance();
// Simulate start-up by reloading extension.
@@ -805,7 +907,7 @@
EXPECT_EQ(GCMClient::UNKNOWN_ERROR, consumer()->registration_result());
// Register operation will be invoked after GCMClient becomes ready.
- consumer()->GetGCMClient()->SetReady();
+ consumer()->GetGCMClient()->PerformDelayedLoading();
WaitUntilCompleted();
EXPECT_EQ(old_registration_id, consumer()->registration_id());
EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result());
« no previous file with comments | « chrome/browser/services/gcm/gcm_profile_service_factory.cc ('k') | chrome/browser/sync/profile_sync_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698