Chromium Code Reviews| Index: chrome/browser/services/gcm/gcm_profile_service_unittest.cc |
| diff --git a/chrome/browser/services/gcm/gcm_profile_service_unittest.cc b/chrome/browser/services/gcm/gcm_profile_service_unittest.cc |
| deleted file mode 100644 |
| index 9be82fea64571a1917d1ca0081bbdb0e0db43303..0000000000000000000000000000000000000000 |
| --- a/chrome/browser/services/gcm/gcm_profile_service_unittest.cc |
| +++ /dev/null |
| @@ -1,1243 +0,0 @@ |
| -// Copyright (c) 2013 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 "base/bind.h" |
| -#include "base/prefs/pref_service.h" |
| -#include "base/strings/string_util.h" |
| -#include "chrome/browser/chrome_notification_types.h" |
| -#include "chrome/browser/services/gcm/gcm_app_handler.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 "content/public/browser/browser_thread.h" |
| -#include "content/public/test/test_browser_thread_bundle.h" |
| -#include "testing/gtest/include/gtest/gtest.h" |
| - |
| -namespace gcm { |
| - |
| -namespace { |
| - |
| -const char kTestingUsername[] = "user1@example.com"; |
| -const char kTestingUsername2[] = "user2@example.com"; |
| -const char kTestingUsername3[] = "user3@example.com"; |
| -const char kTestingAppId[] = "TestApp1"; |
| -const char kTestingAppId2[] = "TestApp2"; |
| -const char kUserId[] = "user1"; |
| -const char kUserId2[] = "user2"; |
| - |
| -std::vector<std::string> ToSenderList(const std::string& sender_ids) { |
| - std::vector<std::string> senders; |
| - Tokenize(sender_ids, ",", &senders); |
| - return senders; |
| -} |
| - |
| -} // namespace |
| - |
| -class FakeGCMAppHandler : public GCMAppHandler { |
| - public: |
| - enum Event { |
| - NO_EVENT, |
| - MESSAGE_EVENT, |
| - MESSAGES_DELETED_EVENT, |
| - SEND_ERROR_EVENT |
| - }; |
| - |
| - explicit FakeGCMAppHandler(Waiter* waiter) |
| - : waiter_(waiter), |
| - received_event_(NO_EVENT) { |
| - } |
| - |
| - virtual ~FakeGCMAppHandler() { |
| - } |
| - |
| - virtual void ShutdownHandler() OVERRIDE { |
| - } |
| - |
| - virtual void OnMessage(const std::string& app_id, |
| - const GCMClient::IncomingMessage& message) OVERRIDE { |
| - clear_results(); |
| - received_event_ = MESSAGE_EVENT; |
| - app_id_ = app_id; |
| - message_ = message; |
| - waiter_->SignalCompleted(); |
| - } |
| - |
| - virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE { |
| - clear_results(); |
| - received_event_ = MESSAGES_DELETED_EVENT; |
| - app_id_ = app_id; |
| - waiter_->SignalCompleted(); |
| - } |
| - |
| - virtual void OnSendError( |
| - const std::string& app_id, |
| - const GCMClient::SendErrorDetails& send_error_details) OVERRIDE { |
| - clear_results(); |
| - received_event_ = SEND_ERROR_EVENT; |
| - app_id_ = app_id; |
| - send_error_details_ = send_error_details; |
| - waiter_->SignalCompleted(); |
| - } |
| - |
| - Event received_event() const { return received_event_; } |
| - const std::string& app_id() const { return app_id_; } |
| - const GCMClient::IncomingMessage& message() const { return message_; } |
| - const GCMClient::SendErrorDetails& send_error_details() const { |
| - return send_error_details_; |
| - } |
| - const std::string& send_error_message_id() const { |
| - return send_error_details_.message_id; |
| - } |
| - GCMClient::Result send_error_result() const { |
| - return send_error_details_.result; |
| - } |
| - const GCMClient::MessageData& send_error_data() const { |
| - return send_error_details_.additional_data; |
| - } |
| - |
| - void clear_results() { |
| - received_event_ = NO_EVENT; |
| - app_id_.clear(); |
| - message_.data.clear(); |
| - send_error_details_ = GCMClient::SendErrorDetails(); |
| - } |
| - |
| - private: |
| - Waiter* waiter_; |
| - Event received_event_; |
| - std::string app_id_; |
| - GCMClient::IncomingMessage message_; |
| - GCMClient::SendErrorDetails send_error_details_; |
| -}; |
| - |
| -class GCMProfileServiceTestConsumer { |
| - public: |
| - static KeyedService* BuildGCMProfileService( |
| - content::BrowserContext* context) { |
| - return new GCMProfileService(static_cast<Profile*>(context)); |
| - } |
| - |
| - explicit GCMProfileServiceTestConsumer(Waiter* waiter) |
| - : waiter_(waiter), |
| - signin_manager_(NULL), |
| - gcm_client_loading_delay_(GCMClientMock::NO_DELAY_LOADING), |
| - registration_result_(GCMClient::UNKNOWN_ERROR), |
| - unregistration_result_(GCMClient::UNKNOWN_ERROR), |
| - send_result_(GCMClient::UNKNOWN_ERROR) { |
| - // Create a new profile. |
| - TestingProfile::Builder builder; |
| - builder.AddTestingFactory(SigninManagerFactory::GetInstance(), |
| - FakeSigninManager::Build); |
| - profile_ = builder.Build(); |
| - signin_manager_ = static_cast<FakeSigninManager*>( |
| - SigninManagerFactory::GetInstance()->GetForProfile(profile_.get())); |
| - |
| - // Enable GCM such that tests could be run on all channels. |
| - profile()->GetPrefs()->SetBoolean(prefs::kGCMChannelEnabled, true); |
| - } |
| - |
| - virtual ~GCMProfileServiceTestConsumer() { |
| - GetGCMProfileService()->RemoveAppHandler(kTestingAppId); |
| - GetGCMProfileService()->RemoveAppHandler(kTestingAppId2); |
| - } |
| - |
| - void CreateGCMProfileServiceInstance() { |
| - GCMProfileService* gcm_profile_service = static_cast<GCMProfileService*>( |
| - GCMProfileServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
| - profile(), &GCMProfileServiceTestConsumer::BuildGCMProfileService)); |
| - scoped_ptr<GCMClientFactory> gcm_client_factory( |
| - new FakeGCMClientFactory(gcm_client_loading_delay_)); |
| - gcm_profile_service->Initialize(gcm_client_factory.Pass()); |
| - |
| - gcm_app_handler_.reset(new FakeGCMAppHandler(waiter_)); |
| - gcm_profile_service->AddAppHandler(kTestingAppId, gcm_app_handler()); |
| - gcm_profile_service->AddAppHandler(kTestingAppId2, gcm_app_handler()); |
| - |
| - waiter_->PumpIOLoop(); |
| - } |
| - |
| - void SignIn(const std::string& username) { |
| - signin_manager_->SignIn(username); |
| - waiter_->PumpIOLoop(); |
| - waiter_->PumpUILoop(); |
| - } |
| - |
| - void SignOut() { |
| - signin_manager_->SignOut(); |
| - waiter_->PumpIOLoop(); |
| - waiter_->PumpUILoop(); |
| - } |
| - |
| - void Register(const std::string& app_id, |
| - const std::vector<std::string>& sender_ids) { |
| - GetGCMProfileService()->Register( |
| - app_id, |
| - sender_ids, |
| - base::Bind(&GCMProfileServiceTestConsumer::RegisterCompleted, |
| - base::Unretained(this))); |
| - } |
| - |
| - void RegisterCompleted(const std::string& registration_id, |
| - GCMClient::Result result) { |
| - registration_id_ = registration_id; |
| - registration_result_ = result; |
| - waiter_->SignalCompleted(); |
| - } |
| - |
| - void Send(const std::string& app_id, |
| - const std::string& receiver_id, |
| - const GCMClient::OutgoingMessage& message) { |
| - GetGCMProfileService()->Send( |
| - app_id, |
| - receiver_id, |
| - message, |
| - base::Bind(&GCMProfileServiceTestConsumer::SendCompleted, |
| - base::Unretained(this))); |
| - } |
| - |
| - void SendCompleted(const std::string& message_id, GCMClient::Result result) { |
| - send_message_id_ = message_id; |
| - send_result_ = result; |
| - waiter_->SignalCompleted(); |
| - } |
| - |
| - void Unregister(const std::string& app_id) { |
| - GetGCMProfileService()->Unregister( |
| - app_id, |
| - base::Bind(&GCMProfileServiceTestConsumer::UnregisterCompleted, |
| - base::Unretained(this))); |
| - } |
| - |
| - void UnregisterCompleted(GCMClient::Result result) { |
| - unregistration_result_ = result; |
| - waiter_->SignalCompleted(); |
| - } |
| - |
| - GCMProfileService* GetGCMProfileService() const { |
| - return GCMProfileServiceFactory::GetForProfile(profile()); |
| - } |
| - |
| - GCMClientMock* GetGCMClient() const { |
| - return static_cast<GCMClientMock*>( |
| - GetGCMProfileService()->GetGCMClientForTesting()); |
| - } |
| - |
| - const std::string& GetUsername() const { |
| - return GetGCMProfileService()->username_; |
| - } |
| - |
| - bool IsGCMClientReady() const { |
| - return GetGCMProfileService()->gcm_client_ready_; |
| - } |
| - |
| - bool HasAppHandlers() const { |
| - return !GetGCMProfileService()->app_handlers_.empty(); |
| - } |
| - |
| - Profile* profile() const { return profile_.get(); } |
| - FakeGCMAppHandler* gcm_app_handler() const { |
| - return gcm_app_handler_.get(); |
| - } |
| - |
| - void set_gcm_client_loading_delay(GCMClientMock::LoadingDelay delay) { |
| - gcm_client_loading_delay_ = delay; |
| - } |
| - |
| - const std::string& registration_id() const { return registration_id_; } |
| - GCMClient::Result registration_result() const { return registration_result_; } |
| - GCMClient::Result unregistration_result() const { |
| - return unregistration_result_; |
| - } |
| - const std::string& send_message_id() const { return send_message_id_; } |
| - GCMClient::Result send_result() const { return send_result_; } |
| - |
| - void clear_registration_result() { |
| - registration_id_.clear(); |
| - registration_result_ = GCMClient::UNKNOWN_ERROR; |
| - } |
| - void clear_unregistration_result() { |
| - unregistration_result_ = GCMClient::UNKNOWN_ERROR; |
| - } |
| - void clear_send_result() { |
| - send_message_id_.clear(); |
| - send_result_ = GCMClient::UNKNOWN_ERROR; |
| - } |
| - |
| - private: |
| - Waiter* waiter_; // Not owned. |
| - scoped_ptr<TestingProfile> profile_; |
| - FakeSigninManager* signin_manager_; // Not owned. |
| - scoped_ptr<FakeGCMAppHandler> gcm_app_handler_; |
| - |
| - GCMClientMock::LoadingDelay gcm_client_loading_delay_; |
| - |
| - std::string registration_id_; |
| - GCMClient::Result registration_result_; |
| - |
| - GCMClient::Result unregistration_result_; |
| - |
| - std::string send_message_id_; |
| - GCMClient::Result send_result_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(GCMProfileServiceTestConsumer); |
| -}; |
| - |
| -class GCMProfileServiceTest : public testing::Test { |
| - public: |
| - GCMProfileServiceTest() { |
| - } |
| - |
| - virtual ~GCMProfileServiceTest() { |
| - } |
| - |
| - // Overridden from test::Test: |
| - virtual void SetUp() OVERRIDE { |
| - // Make BrowserThread work in unittest. |
| - thread_bundle_.reset(new content::TestBrowserThreadBundle( |
| - content::TestBrowserThreadBundle::REAL_IO_THREAD)); |
| - |
| - // Create a main profile consumer. |
| - consumer_.reset(new GCMProfileServiceTestConsumer(&waiter_)); |
| - } |
| - |
| - virtual void TearDown() OVERRIDE { |
| - consumer_.reset(); |
| - PumpUILoop(); |
| - } |
| - |
| - void WaitUntilCompleted() { |
| - waiter_.WaitUntilCompleted(); |
| - } |
| - |
| - void SignalCompleted() { |
| - waiter_.SignalCompleted(); |
| - } |
| - |
| - void PumpUILoop() { |
| - waiter_.PumpUILoop(); |
| - } |
| - |
| - void PumpIOLoop() { |
| - waiter_.PumpIOLoop(); |
| - } |
| - |
| - Profile* profile() const { return consumer_->profile(); } |
| - GCMProfileServiceTestConsumer* consumer() const { return consumer_.get(); } |
| - |
| - protected: |
| - Waiter waiter_; |
| - |
| - private: |
| - scoped_ptr<content::TestBrowserThreadBundle> thread_bundle_; |
| - scoped_ptr<GCMProfileServiceTestConsumer> consumer_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(GCMProfileServiceTest); |
| -}; |
| - |
| -TEST_F(GCMProfileServiceTest, Incognito) { |
| - EXPECT_TRUE(GCMProfileServiceFactory::GetForProfile(profile())); |
| - |
| - // Create an incognito profile. |
| - TestingProfile::Builder incognito_profile_builder; |
| - incognito_profile_builder.SetIncognito(); |
| - scoped_ptr<TestingProfile> incognito_profile = |
| - incognito_profile_builder.Build(); |
| - incognito_profile->SetOriginalProfile(profile()); |
| - |
| - EXPECT_FALSE(GCMProfileServiceFactory::GetForProfile( |
| - incognito_profile.get())); |
| -} |
| - |
| -TEST_F(GCMProfileServiceTest, CreateGCMProfileServiceBeforeProfileSignIn) { |
| - // Create GCMProfileService first. |
| - consumer()->CreateGCMProfileServiceInstance(); |
| - EXPECT_TRUE(consumer()->GetUsername().empty()); |
| - |
| - // Sign in to a profile. This will kick off the check-in. |
| - consumer()->SignIn(kTestingUsername); |
| - EXPECT_FALSE(consumer()->GetUsername().empty()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceTest, CreateGCMProfileServiceAfterProfileSignIn) { |
| - // Sign in to a profile. This will not initiate the check-in. |
| - consumer()->SignIn(kTestingUsername); |
| - |
| - // Create GCMProfileService after sign-in. |
| - consumer()->CreateGCMProfileServiceInstance(); |
| - EXPECT_FALSE(consumer()->GetUsername().empty()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceTest, Shutdown) { |
| - consumer()->CreateGCMProfileServiceInstance(); |
| - EXPECT_TRUE(consumer()->HasAppHandlers()); |
| - |
| - consumer()->GetGCMProfileService()->Shutdown(); |
| - EXPECT_FALSE(consumer()->HasAppHandlers()); |
| -} |
| - |
| -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, StopAndRestartGCM) { |
| - // 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()); |
| - |
| - // Stops the GCM. |
| - consumer()->GetGCMProfileService()->Stop(); |
| - PumpIOLoop(); |
| - |
| - // GCMClient should be stopped. |
| - EXPECT_FALSE(consumer()->IsGCMClientReady()); |
| - EXPECT_EQ(GCMClientMock::STOPPED, consumer()->GetGCMClient()->status()); |
| - |
| - // Restarts the GCM. |
| - consumer()->GetGCMProfileService()->Start(); |
| - PumpIOLoop(); |
| - |
| - // GCMClient should be loaded. |
| - EXPECT_TRUE(consumer()->IsGCMClientReady()); |
| - EXPECT_EQ(GCMClientMock::LOADED, consumer()->GetGCMClient()->status()); |
| - |
| - // Stops the GCM. |
| - consumer()->GetGCMProfileService()->Stop(); |
| - PumpIOLoop(); |
| - |
| - // GCMClient should be stopped. |
| - EXPECT_FALSE(consumer()->IsGCMClientReady()); |
| - EXPECT_EQ(GCMClientMock::STOPPED, consumer()->GetGCMClient()->status()); |
| - |
| - // Signs out. |
| - consumer()->SignOut(); |
| - |
| - // GCMClient should be checked out. |
| - EXPECT_FALSE(consumer()->IsGCMClientReady()); |
| - EXPECT_EQ(GCMClientMock::CHECKED_OUT, 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); |
| - |
| - EXPECT_TRUE(consumer()->registration_id().empty()); |
| - EXPECT_EQ(GCMClient::NOT_SIGNED_IN, consumer()->registration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceTest, RegisterUnderNeutralChannelSignal) { |
|
jianli
2014/04/17 00:33:19
I think we still need to keep this test for GCMPro
bartfab (slow)
2014/04/22 17:51:07
Done.
|
| - // 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"; |
| - consumer()->Send(kTestingAppId, kUserId, message); |
| - |
| - EXPECT_TRUE(consumer()->send_message_id().empty()); |
| - EXPECT_EQ(GCMClient::NOT_SIGNED_IN, consumer()->send_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceTest, SendUnderNeutralChannelSignal) { |
|
jianli
2014/04/17 00:33:19
ditto
bartfab (slow)
2014/04/22 17:51:07
Done.
|
| - // 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: |
| - GCMProfileServiceSingleProfileTest() { |
| - } |
| - |
| - virtual ~GCMProfileServiceSingleProfileTest() { |
| - } |
| - |
| - virtual void SetUp() OVERRIDE { |
| - GCMProfileServiceTest::SetUp(); |
| - |
| - consumer()->CreateGCMProfileServiceInstance(); |
| - consumer()->SignIn(kTestingUsername); |
| - } |
| -}; |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, Register) { |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - std::string expected_registration_id = |
| - GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids); |
| - |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(expected_registration_id, consumer()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, RegisterError) { |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1@error"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - |
| - WaitUntilCompleted(); |
| - EXPECT_TRUE(consumer()->registration_id().empty()); |
| - EXPECT_NE(GCMClient::SUCCESS, consumer()->registration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, RegisterAgainWithSameSenderIDs) { |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - sender_ids.push_back("sender2"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - std::string expected_registration_id = |
| - GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids); |
| - |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(expected_registration_id, consumer()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - // Clears the results the would be set by the Register callback in preparation |
| - // to call register 2nd time. |
| - consumer()->clear_registration_result(); |
| - |
| - // Calling register 2nd time with the same set of sender IDs but different |
| - // ordering will get back the same registration ID. |
| - std::vector<std::string> another_sender_ids; |
| - another_sender_ids.push_back("sender2"); |
| - another_sender_ids.push_back("sender1"); |
| - consumer()->Register(kTestingAppId, another_sender_ids); |
| - |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(expected_registration_id, consumer()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, |
| - RegisterAgainWithDifferentSenderIDs) { |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - std::string expected_registration_id = |
| - GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids); |
| - |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(expected_registration_id, consumer()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - // Make sender IDs different. |
| - sender_ids.push_back("sender2"); |
| - std::string expected_registration_id2 = |
| - GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids); |
| - |
| - // Calling register 2nd time with the different sender IDs will get back a new |
| - // registration ID. |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(expected_registration_id2, consumer()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, |
| - GCMClientNotReadyBeforeRegistration) { |
| - // Make GCMClient not ready initially. |
| - consumer()->set_gcm_client_loading_delay(GCMClientMock::DELAY_LOADING); |
| - consumer()->CreateGCMProfileServiceInstance(); |
| - |
| - // The registration is on hold until GCMClient is ready. |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - PumpIOLoop(); |
| - EXPECT_TRUE(consumer()->registration_id().empty()); |
| - EXPECT_EQ(GCMClient::UNKNOWN_ERROR, consumer()->registration_result()); |
| - |
| - // Register operation will be invoked after GCMClient becomes ready. |
| - consumer()->GetGCMClient()->PerformDelayedLoading(); |
| - PumpIOLoop(); // The 1st pump is to wait till the delayed loading is done. |
| - PumpIOLoop(); // The 2nd pump is to wait till the registration is done. |
| - EXPECT_FALSE(consumer()->registration_id().empty()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, RegisterAfterSignOut) { |
| - // This will trigger check-out. |
| - consumer()->SignOut(); |
| - |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - |
| - EXPECT_TRUE(consumer()->registration_id().empty()); |
| - EXPECT_EQ(GCMClient::NOT_SIGNED_IN, consumer()->registration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, UnregisterExplicitly) { |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - |
| - WaitUntilCompleted(); |
| - EXPECT_FALSE(consumer()->registration_id().empty()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - consumer()->Unregister(kTestingAppId); |
| - |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->unregistration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, |
| - UnregisterWhenAsyncOperationPending) { |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - // First start registration without waiting for it to complete. |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - |
| - // Test that unregistration fails with async operation pending when there is a |
| - // registration already in progress. |
| - consumer()->Unregister(kTestingAppId); |
| - EXPECT_EQ(GCMClient::ASYNC_OPERATION_PENDING, |
| - consumer()->unregistration_result()); |
| - |
| - // Complete the registration. |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - // Start unregistration without waiting for it to complete. This time no async |
| - // operation is pending. |
| - consumer()->Unregister(kTestingAppId); |
| - |
| - // Test that unregistration fails with async operation pending when there is |
| - // an unregistration already in progress. |
| - consumer()->Unregister(kTestingAppId); |
| - EXPECT_EQ(GCMClient::ASYNC_OPERATION_PENDING, |
| - consumer()->unregistration_result()); |
| - consumer()->clear_unregistration_result(); |
| - |
| - // Complete unregistration. |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->unregistration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, RegisterWhenAsyncOperationPending) { |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - // First start registration without waiting for it to complete. |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - |
| - // Test that registration fails with async operation pending when there is a |
| - // registration already in progress. |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - EXPECT_EQ(GCMClient::ASYNC_OPERATION_PENDING, |
| - consumer()->registration_result()); |
| - consumer()->clear_registration_result(); |
| - |
| - // Complete the registration. |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - // Start unregistration without waiting for it to complete. This time no async |
| - // operation is pending. |
| - consumer()->Unregister(kTestingAppId); |
| - |
| - // Test that registration fails with async operation pending when there is an |
| - // unregistration already in progress. |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - EXPECT_EQ(GCMClient::ASYNC_OPERATION_PENDING, |
| - consumer()->registration_result()); |
| - |
| - // Complete the first unregistration expecting success. |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->unregistration_result()); |
| - |
| - // Test that it is ok to register again after unregistration. |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| -} |
| - |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, Send) { |
| - GCMClient::OutgoingMessage message; |
| - message.id = "1"; |
| - message.data["key1"] = "value1"; |
| - message.data["key2"] = "value2"; |
| - consumer()->Send(kTestingAppId, kUserId, message); |
| - |
| - // Wait for the send callback is called. |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(consumer()->send_message_id(), message.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->send_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, GCMClientNotReadyBeforeSending) { |
| - // Make GCMClient not ready initially. |
| - consumer()->set_gcm_client_loading_delay(GCMClientMock::DELAY_LOADING); |
| - consumer()->CreateGCMProfileServiceInstance(); |
| - |
| - // The sending is on hold until GCMClient is ready. |
| - GCMClient::OutgoingMessage message; |
| - message.id = "1"; |
| - message.data["key1"] = "value1"; |
| - message.data["key2"] = "value2"; |
| - consumer()->Send(kTestingAppId, kUserId, message); |
| - PumpIOLoop(); |
| - EXPECT_TRUE(consumer()->send_message_id().empty()); |
| - EXPECT_EQ(GCMClient::UNKNOWN_ERROR, consumer()->send_result()); |
| - |
| - // Register operation will be invoked after GCMClient becomes ready. |
| - consumer()->GetGCMClient()->PerformDelayedLoading(); |
| - PumpIOLoop(); |
| - PumpIOLoop(); |
| - EXPECT_EQ(consumer()->send_message_id(), message.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->send_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, SendAfterSignOut) { |
| - // This will trigger check-out. |
| - consumer()->SignOut(); |
| - |
| - GCMClient::OutgoingMessage message; |
| - message.id = "1"; |
| - message.data["key1"] = "value1"; |
| - message.data["key2"] = "value2"; |
| - consumer()->Send(kTestingAppId, kUserId, message); |
| - |
| - EXPECT_TRUE(consumer()->send_message_id().empty()); |
| - EXPECT_EQ(GCMClient::NOT_SIGNED_IN, consumer()->send_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, SendError) { |
| - GCMClient::OutgoingMessage message; |
| - // Embedding error in id will tell the mock to simulate the send error. |
| - message.id = "1@error"; |
| - message.data["key1"] = "value1"; |
| - message.data["key2"] = "value2"; |
| - consumer()->Send(kTestingAppId, kUserId, message); |
| - |
| - // Wait for the send callback is called. |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(consumer()->send_message_id(), message.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->send_result()); |
| - |
| - // Wait for the send error. |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(FakeGCMAppHandler::SEND_ERROR_EVENT, |
| - consumer()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer()->gcm_app_handler()->app_id()); |
| - EXPECT_EQ(consumer()->send_message_id(), |
| - consumer()->gcm_app_handler()->send_error_message_id()); |
| - EXPECT_NE(GCMClient::SUCCESS, |
| - consumer()->gcm_app_handler()->send_error_result()); |
| - EXPECT_EQ(message.data, consumer()->gcm_app_handler()->send_error_data()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, MessageReceived) { |
| - consumer()->Register(kTestingAppId, ToSenderList("sender")); |
| - WaitUntilCompleted(); |
| - GCMClient::IncomingMessage message; |
| - message.data["key1"] = "value1"; |
| - message.data["key2"] = "value2"; |
| - message.sender_id = "sender"; |
| - consumer()->GetGCMClient()->ReceiveMessage(kTestingAppId, message); |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer()->gcm_app_handler()->app_id()); |
| - EXPECT_TRUE(message.data == consumer()->gcm_app_handler()->message().data); |
| - EXPECT_TRUE(consumer()->gcm_app_handler()->message().collapse_key.empty()); |
| - EXPECT_EQ(message.sender_id, |
| - consumer()->gcm_app_handler()->message().sender_id); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, MessageWithCollapseKeyReceived) { |
| - consumer()->Register(kTestingAppId, ToSenderList("sender")); |
| - WaitUntilCompleted(); |
| - GCMClient::IncomingMessage message; |
| - message.data["key1"] = "value1"; |
| - message.collapse_key = "collapse_key_value"; |
| - message.sender_id = "sender"; |
| - consumer()->GetGCMClient()->ReceiveMessage(kTestingAppId, message); |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer()->gcm_app_handler()->app_id()); |
| - EXPECT_TRUE(message.data == consumer()->gcm_app_handler()->message().data); |
| - EXPECT_EQ(message.collapse_key, |
| - consumer()->gcm_app_handler()->message().collapse_key); |
| -} |
| - |
| -TEST_F(GCMProfileServiceSingleProfileTest, MessagesDeleted) { |
| - consumer()->GetGCMClient()->DeleteMessages(kTestingAppId); |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGES_DELETED_EVENT, |
| - consumer()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer()->gcm_app_handler()->app_id()); |
| -} |
| - |
| -// Tests to make sure that GCMProfileService works for multiple profiles |
| -// regardless how GCMClient is created. |
| -class GCMProfileServiceMultiProfileTest : public GCMProfileServiceTest { |
| - public: |
| - GCMProfileServiceMultiProfileTest() { |
| - } |
| - |
| - virtual ~GCMProfileServiceMultiProfileTest() { |
| - } |
| - |
| - virtual void SetUp() OVERRIDE { |
| - GCMProfileServiceTest::SetUp(); |
| - |
| - // Create a 2nd profile consumer. |
| - consumer2_.reset(new GCMProfileServiceTestConsumer(&waiter_)); |
| - |
| - consumer()->CreateGCMProfileServiceInstance(); |
| - consumer2()->CreateGCMProfileServiceInstance(); |
| - |
| - // Initiate check-in for each profile. |
| - consumer2()->SignIn(kTestingUsername2); |
| - consumer()->SignIn(kTestingUsername); |
| - } |
| - |
| - virtual void TearDown() OVERRIDE { |
| - consumer2_.reset(); |
| - |
| - GCMProfileServiceTest::TearDown(); |
| - } |
| - |
| - Profile* profile2() const { return consumer2_->profile(); } |
| - GCMProfileServiceTestConsumer* consumer2() const { return consumer2_.get(); } |
| - |
| - protected: |
| - scoped_ptr<GCMProfileServiceTestConsumer> consumer2_; |
| -}; |
| - |
| -TEST_F(GCMProfileServiceMultiProfileTest, Register) { |
| - // Register an app. |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - |
| - // Register the same app in a different profile. |
| - std::vector<std::string> sender_ids2; |
| - sender_ids2.push_back("foo"); |
| - sender_ids2.push_back("bar"); |
| - consumer2()->Register(kTestingAppId, sender_ids2); |
| - |
| - WaitUntilCompleted(); |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids), |
| - consumer()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - EXPECT_EQ(GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids2), |
| - consumer2()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - // Register a different app in a different profile. |
| - std::vector<std::string> sender_ids3; |
| - sender_ids3.push_back("sender1"); |
| - sender_ids3.push_back("sender2"); |
| - sender_ids3.push_back("sender3"); |
| - consumer2()->Register(kTestingAppId2, sender_ids3); |
| - |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids3), |
| - consumer2()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer2()->registration_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceMultiProfileTest, Send) { |
| - // Send a message from one app in one profile. |
| - GCMClient::OutgoingMessage message; |
| - message.id = "1"; |
| - message.data["key1"] = "value1"; |
| - message.data["key2"] = "value2"; |
| - consumer()->Send(kTestingAppId, kUserId, message); |
| - |
| - // Send a message from same app in another profile. |
| - GCMClient::OutgoingMessage message2; |
| - message2.id = "2"; |
| - message2.data["foo"] = "bar"; |
| - consumer2()->Send(kTestingAppId, kUserId2, message2); |
| - |
| - WaitUntilCompleted(); |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(consumer()->send_message_id(), message.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->send_result()); |
| - |
| - EXPECT_EQ(consumer2()->send_message_id(), message2.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer2()->send_result()); |
| - |
| - // Send another message from different app in another profile. |
| - GCMClient::OutgoingMessage message3; |
| - message3.id = "3"; |
| - message3.data["hello"] = "world"; |
| - consumer2()->Send(kTestingAppId2, kUserId, message3); |
| - |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(consumer2()->send_message_id(), message3.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->send_result()); |
| -} |
| - |
| -TEST_F(GCMProfileServiceMultiProfileTest, MessageReceived) { |
| - consumer()->Register(kTestingAppId, ToSenderList("sender")); |
| - WaitUntilCompleted(); |
| - consumer2()->Register(kTestingAppId, ToSenderList("sender")); |
| - WaitUntilCompleted(); |
| - consumer2()->Register(kTestingAppId2, ToSenderList("sender2")); |
| - WaitUntilCompleted(); |
| - |
| - // Trigger an incoming message for an app in one profile. |
| - GCMClient::IncomingMessage message; |
| - message.data["key1"] = "value1"; |
| - message.data["key2"] = "value2"; |
| - message.sender_id = "sender"; |
| - consumer()->GetGCMClient()->ReceiveMessage(kTestingAppId, message); |
| - |
| - // Trigger an incoming message for the same app in another profile. |
| - GCMClient::IncomingMessage message2; |
| - message2.data["foo"] = "bar"; |
| - message2.sender_id = "sender"; |
| - consumer2()->GetGCMClient()->ReceiveMessage(kTestingAppId, message2); |
| - |
| - WaitUntilCompleted(); |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer()->gcm_app_handler()->app_id()); |
| - EXPECT_TRUE(message.data == consumer()->gcm_app_handler()->message().data); |
| - EXPECT_EQ("sender", consumer()->gcm_app_handler()->message().sender_id); |
| - |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer2()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer2()->gcm_app_handler()->app_id()); |
| - EXPECT_TRUE(message2.data == consumer2()->gcm_app_handler()->message().data); |
| - EXPECT_EQ("sender", consumer2()->gcm_app_handler()->message().sender_id); |
| - |
| - // Trigger another incoming message for a different app in another profile. |
| - GCMClient::IncomingMessage message3; |
| - message3.data["bar1"] = "foo1"; |
| - message3.data["bar2"] = "foo2"; |
| - message3.sender_id = "sender2"; |
| - consumer2()->GetGCMClient()->ReceiveMessage(kTestingAppId2, message3); |
| - |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer2()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId2, consumer2()->gcm_app_handler()->app_id()); |
| - EXPECT_TRUE(message3.data == consumer2()->gcm_app_handler()->message().data); |
| - EXPECT_EQ("sender2", consumer2()->gcm_app_handler()->message().sender_id); |
| -} |
| - |
| -// Test a set of GCM operations on multiple profiles. |
| -// 1) Register 1 app in profile1 and register 2 apps in profile2; |
| -// 2) Send a message from profile1; |
| -// 3) Receive a message to an app in profile1 and receive a message for each of |
| -// two apps in profile2; |
| -// 4) Send a message foe ach of two apps in profile2; |
| -// 5) Sign out of profile1. |
| -// 6) Register/send stops working for profile1; |
| -// 7) The app in profile2 could still receive these events; |
| -// 8) Sign into profile1 with a different user. |
| -// 9) The message to the new signed-in user will be routed. |
| -TEST_F(GCMProfileServiceMultiProfileTest, Combined) { |
| - // Register an app. |
| - std::vector<std::string> sender_ids; |
| - sender_ids.push_back("sender1"); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - |
| - // Register the same app in a different profile. |
| - std::vector<std::string> sender_ids2; |
| - sender_ids2.push_back("foo"); |
| - sender_ids2.push_back("bar"); |
| - consumer2()->Register(kTestingAppId, sender_ids2); |
| - |
| - // Register a different app in a different profile. |
| - std::vector<std::string> sender_ids3; |
| - sender_ids3.push_back("sender1"); |
| - sender_ids3.push_back("sender2"); |
| - sender_ids3.push_back("sender3"); |
| - consumer2()->Register(kTestingAppId2, sender_ids3); |
| - |
| - WaitUntilCompleted(); |
| - WaitUntilCompleted(); |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids), |
| - consumer()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - EXPECT_EQ(GCMClientMock::GetRegistrationIdFromSenderIds(sender_ids3), |
| - consumer2()->registration_id()); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->registration_result()); |
| - |
| - // Send a message from one profile. |
| - GCMClient::OutgoingMessage out_message; |
| - out_message.id = "1"; |
| - out_message.data["out1"] = "out_data1"; |
| - out_message.data["out1_2"] = "out_data1_2"; |
| - consumer()->Send(kTestingAppId, kUserId, out_message); |
| - |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(consumer()->send_message_id(), out_message.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer()->send_result()); |
| - |
| - // Trigger an incoming message for an app in one profile. |
| - GCMClient::IncomingMessage in_message; |
| - in_message.data["in1"] = "in_data1"; |
| - in_message.data["in1_2"] = "in_data1_2"; |
| - in_message.sender_id = "sender1"; |
| - consumer()->GetGCMClient()->ReceiveMessage(kTestingAppId, in_message); |
| - |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer()->gcm_app_handler()->app_id()); |
| - EXPECT_TRUE( |
| - in_message.data == consumer()->gcm_app_handler()->message().data); |
| - |
| - // Trigger 2 incoming messages, one for each app respectively, in another |
| - // profile. |
| - GCMClient::IncomingMessage in_message2; |
| - in_message2.data["in2"] = "in_data2"; |
| - in_message2.sender_id = "sender3"; |
| - consumer2()->GetGCMClient()->ReceiveMessage(kTestingAppId2, in_message2); |
| - |
| - GCMClient::IncomingMessage in_message3; |
| - in_message3.data["in3"] = "in_data3"; |
| - in_message3.data["in3_2"] = "in_data3_2"; |
| - in_message3.sender_id = "foo"; |
| - consumer2()->GetGCMClient()->ReceiveMessage(kTestingAppId, in_message3); |
| - |
| - consumer2()->gcm_app_handler()->clear_results(); |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer2()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId2, consumer2()->gcm_app_handler()->app_id()); |
| - EXPECT_TRUE( |
| - in_message2.data == consumer2()->gcm_app_handler()->message().data); |
| - |
| - consumer2()->gcm_app_handler()->clear_results(); |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer2()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer2()->gcm_app_handler()->app_id()); |
| - EXPECT_TRUE( |
| - in_message3.data == consumer2()->gcm_app_handler()->message().data); |
| - |
| - // Send two messages, one for each app respectively, from another profile. |
| - GCMClient::OutgoingMessage out_message2; |
| - out_message2.id = "2"; |
| - out_message2.data["out2"] = "out_data2"; |
| - consumer2()->Send(kTestingAppId, kUserId2, out_message2); |
| - |
| - GCMClient::OutgoingMessage out_message3; |
| - out_message3.id = "2"; |
| - out_message3.data["out3"] = "out_data3"; |
| - consumer2()->Send(kTestingAppId2, kUserId2, out_message3); |
| - |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(consumer2()->send_message_id(), out_message2.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer2()->send_result()); |
| - |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(consumer2()->send_message_id(), out_message3.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer2()->send_result()); |
| - |
| - // Sign out of one profile. |
| - consumer()->SignOut(); |
| - |
| - // Register/send stops working for signed-out profile. |
| - consumer()->gcm_app_handler()->clear_results(); |
| - consumer()->Register(kTestingAppId, sender_ids); |
| - EXPECT_TRUE(consumer()->registration_id().empty()); |
| - EXPECT_EQ(GCMClient::NOT_SIGNED_IN, consumer()->registration_result()); |
| - |
| - consumer()->gcm_app_handler()->clear_results(); |
| - consumer()->Send(kTestingAppId2, kUserId2, out_message3); |
| - EXPECT_TRUE(consumer()->send_message_id().empty()); |
| - EXPECT_EQ(GCMClient::NOT_SIGNED_IN, consumer()->send_result()); |
| - |
| - // Deleted messages event will go through for another signed-in profile. |
| - consumer2()->GetGCMClient()->DeleteMessages(kTestingAppId2); |
| - |
| - consumer2()->gcm_app_handler()->clear_results(); |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGES_DELETED_EVENT, |
| - consumer2()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId2, consumer2()->gcm_app_handler()->app_id()); |
| - |
| - // Send error event will go through for another signed-in profile. |
| - GCMClient::OutgoingMessage out_message4; |
| - out_message4.id = "1@error"; |
| - out_message4.data["out4"] = "out_data4"; |
| - consumer2()->Send(kTestingAppId, kUserId, out_message4); |
| - |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(consumer2()->send_message_id(), out_message4.id); |
| - EXPECT_EQ(GCMClient::SUCCESS, consumer2()->send_result()); |
| - |
| - consumer2()->gcm_app_handler()->clear_results(); |
| - WaitUntilCompleted(); |
| - EXPECT_EQ(FakeGCMAppHandler::SEND_ERROR_EVENT, |
| - consumer2()->gcm_app_handler()->received_event()); |
| - EXPECT_EQ(kTestingAppId, consumer2()->gcm_app_handler()->app_id()); |
| - EXPECT_EQ(out_message4.id, |
| - consumer2()->gcm_app_handler()->send_error_message_id()); |
| - EXPECT_NE(GCMClient::SUCCESS, |
| - consumer2()->gcm_app_handler()->send_error_result()); |
| - EXPECT_EQ(out_message4.data, |
| - consumer2()->gcm_app_handler()->send_error_data()); |
| - |
| - // Sign in with a different user. |
| - consumer()->SignIn(kTestingUsername3); |
| - |
| - // Signing out cleared all registrations, so we need to register again. |
| - consumer()->Register(kTestingAppId, ToSenderList("sender1")); |
| - WaitUntilCompleted(); |
| - |
| - // Incoming message will go through for the new signed-in user. |
| - GCMClient::IncomingMessage in_message5; |
| - in_message5.data["in5"] = "in_data5"; |
| - in_message5.sender_id = "sender1"; |
| - consumer()->GetGCMClient()->ReceiveMessage(kTestingAppId, in_message5); |
| - |
| - consumer()->gcm_app_handler()->clear_results(); |
| - WaitUntilCompleted(); |
| - |
| - EXPECT_EQ(FakeGCMAppHandler::MESSAGE_EVENT, |
| - consumer()->gcm_app_handler()->received_event()); |
| - EXPECT_TRUE( |
| - in_message5.data == consumer()->gcm_app_handler()->message().data); |
| -} |
| - |
| -} // namespace gcm |