diff options
author | jianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-13 19:38:53 +0000 |
---|---|---|
committer | jianli@chromium.org <jianli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-13 19:38:53 +0000 |
commit | 1abdf2024dc5dcfd92b1e3b687d6a8048e60eaad (patch) | |
tree | c471d8382e0fef23330dcda6a4d0d813249170ec /components/gcm_driver | |
parent | 0928c80fbafcae32fb4d4ba8afefc7dada2a5d92 (diff) | |
download | chromium_src-1abdf2024dc5dcfd92b1e3b687d6a8048e60eaad.zip chromium_src-1abdf2024dc5dcfd92b1e3b687d6a8048e60eaad.tar.gz chromium_src-1abdf2024dc5dcfd92b1e3b687d6a8048e60eaad.tar.bz2 |
Fix the DCHECK failure when starting and stopping GCMClient immediately
BUG=383561
TEST=new test added
Review URL: https://codereview.chromium.org/327263003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@277072 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components/gcm_driver')
-rw-r--r-- | components/gcm_driver/gcm_client_impl.cc | 1 | ||||
-rw-r--r-- | components/gcm_driver/gcm_client_impl_unittest.cc | 60 |
2 files changed, 61 insertions, 0 deletions
diff --git a/components/gcm_driver/gcm_client_impl.cc b/components/gcm_driver/gcm_client_impl.cc index 2d05aea..2f19888 100644 --- a/components/gcm_driver/gcm_client_impl.cc +++ b/components/gcm_driver/gcm_client_impl.cc @@ -503,6 +503,7 @@ void GCMClientImpl::UpdateRegistrationCallback(bool success) { } void GCMClientImpl::Stop() { + weak_ptr_factory_.InvalidateWeakPtrs(); device_checkin_info_.Reset(); connection_factory_.reset(); mcs_client_.reset(); diff --git a/components/gcm_driver/gcm_client_impl_unittest.cc b/components/gcm_driver/gcm_client_impl_unittest.cc index 0363f86..2a16793 100644 --- a/components/gcm_driver/gcm_client_impl_unittest.cc +++ b/components/gcm_driver/gcm_client_impl_unittest.cc @@ -219,6 +219,7 @@ class GCMClientImplTest : public testing::Test, void BuildGCMClient(base::TimeDelta clock_step); void InitializeGCMClient(); + void StartGCMClient(); void ReceiveMessageFromMCS(const MCSMessage& message); void CompleteCheckin(uint64 android_id, uint64 security_token, @@ -333,6 +334,7 @@ void GCMClientImplTest::SetUp() { InitializeLoop(); BuildGCMClient(base::TimeDelta()); InitializeGCMClient(); + StartGCMClient(); CompleteCheckin(kDeviceAndroidId, kDeviceSecurityToken, std::string(), @@ -452,7 +454,9 @@ void GCMClientImplTest::InitializeGCMClient() { url_request_context_getter_, make_scoped_ptr<Encryptor>(new FakeEncryptor), this); +} +void GCMClientImplTest::StartGCMClient() { // Start loading and check-in. gcm_client_->Start(); @@ -556,6 +560,7 @@ TEST_F(GCMClientImplTest, DISABLED_RegisterAppFromCache) { // Recreate GCMClient in order to load from the persistent store. BuildGCMClient(base::TimeDelta()); InitializeGCMClient(); + StartGCMClient(); EXPECT_TRUE(ExistsRegistration(kAppId)); } @@ -704,6 +709,7 @@ void GCMClientImplCheckinTest::SetUp() { // Time will be advancing one hour every time it is checked. BuildGCMClient(base::TimeDelta::FromSeconds(kSettingsCheckinInterval)); InitializeGCMClient(); + StartGCMClient(); } TEST_F(GCMClientImplCheckinTest, GServicesSettingsAfterInitialCheckin) { @@ -764,6 +770,7 @@ TEST_F(GCMClientImplCheckinTest, LoadGSettingsFromStore) { BuildGCMClient(base::TimeDelta()); InitializeGCMClient(); + StartGCMClient(); EXPECT_EQ(base::TimeDelta::FromSeconds(kSettingsCheckinInterval), gservices_settings().GetCheckinInterval()); @@ -777,4 +784,57 @@ TEST_F(GCMClientImplCheckinTest, LoadGSettingsFromStore) { gservices_settings().GetMCSFallbackEndpoint()); } +class GCMClientImplStartAndStopTest : public GCMClientImplTest { +public: + GCMClientImplStartAndStopTest(); + virtual ~GCMClientImplStartAndStopTest(); + + virtual void SetUp() OVERRIDE; +}; + +GCMClientImplStartAndStopTest::GCMClientImplStartAndStopTest() { +} + +GCMClientImplStartAndStopTest::~GCMClientImplStartAndStopTest() { +} + +void GCMClientImplStartAndStopTest::SetUp() { + testing::Test::SetUp(); + ASSERT_TRUE(CreateUniqueTempDir()); + InitializeLoop(); + BuildGCMClient(base::TimeDelta()); + InitializeGCMClient(); +} + +TEST_F(GCMClientImplStartAndStopTest, StartStopAndRestart) { + // Start the GCM and wait until it is ready. + gcm_client()->Start(); + PumpLoopUntilIdle(); + + // Stop the GCM. + gcm_client()->Stop(); + PumpLoopUntilIdle(); + + // Restart the GCM. + gcm_client()->Start(); + PumpLoopUntilIdle(); +} + +TEST_F(GCMClientImplStartAndStopTest, StartAndStopImmediately) { + // Start the GCM and then stop it immediately. + gcm_client()->Start(); + gcm_client()->Stop(); + + PumpLoopUntilIdle(); +} + +TEST_F(GCMClientImplStartAndStopTest, StartStopAndRestartImmediately) { + // Start the GCM and then stop and restart it immediately. + gcm_client()->Start(); + gcm_client()->Stop(); + gcm_client()->Start(); + + PumpLoopUntilIdle(); +} + } // namespace gcm |