| OLD | NEW | 
|     1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |     1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include <list> |     5 #include <list> | 
|     6 #include <map> |     6 #include <map> | 
|     7 #include <set> |     7 #include <set> | 
|     8  |     8  | 
|     9 #include "base/lock.h" |     9 #include "base/lock.h" | 
|    10 #include "base/scoped_ptr.h" |    10 #include "base/scoped_ptr.h" | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|    21 #include "testing/gtest/include/gtest/gtest.h" |    21 #include "testing/gtest/include/gtest/gtest.h" | 
|    22  |    22  | 
|    23 using base::TimeTicks; |    23 using base::TimeTicks; | 
|    24 using base::TimeDelta; |    24 using base::TimeDelta; | 
|    25 using base::WaitableEvent; |    25 using base::WaitableEvent; | 
|    26 using testing::_; |    26 using testing::_; | 
|    27 using testing::AnyNumber; |    27 using testing::AnyNumber; | 
|    28 using testing::Field; |    28 using testing::Field; | 
|    29  |    29  | 
|    30 namespace browser_sync { |    30 namespace browser_sync { | 
 |    31 using sessions::ErrorCounters; | 
|    31 using sessions::SyncSessionContext; |    32 using sessions::SyncSessionContext; | 
 |    33 using sessions::SyncSessionSnapshot; | 
 |    34 using sessions::SyncerStatus; | 
|    32  |    35  | 
|    33 typedef testing::Test SyncerThreadTest; |    36 typedef testing::Test SyncerThreadTest; | 
|    34 typedef SyncerThread::WaitInterval WaitInterval; |    37 typedef SyncerThread::WaitInterval WaitInterval; | 
|    35  |    38  | 
|    36 ACTION_P(SignalEvent, event) { |    39 ACTION_P(SignalEvent, event) { | 
|    37   event->Signal(); |    40   event->Signal(); | 
|    38 } |    41 } | 
|    39  |    42  | 
 |    43 SyncSessionSnapshot SessionSnapshotForTest( | 
 |    44     int64 num_server_changes_remaining, int64 max_local_timestamp, | 
 |    45     int64 unsynced_count) { | 
 |    46   return SyncSessionSnapshot(SyncerStatus(), ErrorCounters(), | 
 |    47       num_server_changes_remaining, max_local_timestamp, false, | 
 |    48       syncable::ModelTypeBitSet(), false, false, unsynced_count, 0, false); | 
 |    49 } | 
 |    50  | 
|    40 class ListenerMock : public ChannelEventHandler<SyncerEvent> { |    51 class ListenerMock : public ChannelEventHandler<SyncerEvent> { | 
|    41  public: |    52  public: | 
|    42   MOCK_METHOD1(HandleChannelEvent, void(const SyncerEvent&)); |    53   MOCK_METHOD1(HandleChannelEvent, void(const SyncerEvent&)); | 
|    43 }; |    54 }; | 
|    44  |    55  | 
|    45 class SyncerThreadWithSyncerTest : public testing::Test, |    56 class SyncerThreadWithSyncerTest : public testing::Test, | 
|    46                                    public ModelSafeWorkerRegistrar, |    57                                    public ModelSafeWorkerRegistrar, | 
|    47                                    public ChannelEventHandler<SyncerEvent> { |    58                                    public ChannelEventHandler<SyncerEvent> { | 
|    48  public: |    59  public: | 
|    49   SyncerThreadWithSyncerTest() |    60   SyncerThreadWithSyncerTest() | 
|    50       : max_wait_time_(TimeDelta::FromSeconds(10)), |    61       : max_wait_time_(TimeDelta::FromSeconds(10)), | 
|    51         sync_cycle_ended_event_(false, false) {} |    62         sync_cycle_ended_event_(false, false) {} | 
|    52   virtual void SetUp() { |    63   virtual void SetUp() { | 
|    53     metadb_.SetUp(); |    64     metadb_.SetUp(); | 
|    54     connection_.reset(new MockConnectionManager(metadb_.manager(), |    65     connection_.reset(new MockConnectionManager(metadb_.manager(), | 
|    55                                                 metadb_.name())); |    66                                                 metadb_.name())); | 
|    56     allstatus_.reset(new AllStatus()); |  | 
|    57     worker_ = new ModelSafeWorker(); |    67     worker_ = new ModelSafeWorker(); | 
|    58     SyncSessionContext* context = new SyncSessionContext(connection_.get(), |    68     SyncSessionContext* context = new SyncSessionContext(connection_.get(), | 
|    59         NULL, metadb_.manager(), this); |    69         NULL, metadb_.manager(), this); | 
|    60     syncer_thread_ = new SyncerThread(context, allstatus_.get()); |    70     syncer_thread_ = new SyncerThread(context); | 
|    61     syncer_event_hookup_.reset( |    71     syncer_event_hookup_.reset( | 
|    62         syncer_thread_->relay_channel()->AddObserver(this)); |    72         syncer_thread_->relay_channel()->AddObserver(this)); | 
|    63     allstatus_->WatchSyncerThread(syncer_thread_); |  | 
|    64     syncer_thread_->SetConnected(true); |    73     syncer_thread_->SetConnected(true); | 
|    65     syncable::ModelTypeBitSet expected_types; |    74     syncable::ModelTypeBitSet expected_types; | 
|    66     expected_types[syncable::BOOKMARKS] = true; |    75     expected_types[syncable::BOOKMARKS] = true; | 
|    67     connection_->ExpectGetUpdatesRequestTypes(expected_types); |    76     connection_->ExpectGetUpdatesRequestTypes(expected_types); | 
|    68   } |    77   } | 
|    69   virtual void TearDown() { |    78   virtual void TearDown() { | 
|    70     syncer_event_hookup_.reset(); |    79     syncer_event_hookup_.reset(); | 
|    71     allstatus_.reset(); |  | 
|    72     syncer_thread_ = NULL; |    80     syncer_thread_ = NULL; | 
|    73     connection_.reset(); |    81     connection_.reset(); | 
|    74     metadb_.TearDown(); |    82     metadb_.TearDown(); | 
|    75   } |    83   } | 
|    76  |    84  | 
|    77   // ModelSafeWorkerRegistrar implementation. |    85   // ModelSafeWorkerRegistrar implementation. | 
|    78   virtual void GetWorkers(std::vector<ModelSafeWorker*>* out) { |    86   virtual void GetWorkers(std::vector<ModelSafeWorker*>* out) { | 
|    79     out->push_back(worker_.get()); |    87     out->push_back(worker_.get()); | 
|    80   } |    88   } | 
|    81  |    89  | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   152     if (event.what_happened == SyncerEvent::SYNC_CYCLE_ENDED) |   160     if (event.what_happened == SyncerEvent::SYNC_CYCLE_ENDED) | 
|   153       sync_cycle_ended_event_.Signal(); |   161       sync_cycle_ended_event_.Signal(); | 
|   154   } |   162   } | 
|   155  |   163  | 
|   156  protected: |   164  protected: | 
|   157   TimeDelta max_wait_time_; |   165   TimeDelta max_wait_time_; | 
|   158  |   166  | 
|   159  private: |   167  private: | 
|   160   ManuallyOpenedTestDirectorySetterUpper metadb_; |   168   ManuallyOpenedTestDirectorySetterUpper metadb_; | 
|   161   scoped_ptr<MockConnectionManager> connection_; |   169   scoped_ptr<MockConnectionManager> connection_; | 
|   162   scoped_ptr<AllStatus> allstatus_; |  | 
|   163   scoped_refptr<SyncerThread> syncer_thread_; |   170   scoped_refptr<SyncerThread> syncer_thread_; | 
|   164   scoped_refptr<ModelSafeWorker> worker_; |   171   scoped_refptr<ModelSafeWorker> worker_; | 
|   165   scoped_ptr<ChannelHookup<SyncerEvent> > syncer_event_hookup_; |   172   scoped_ptr<ChannelHookup<SyncerEvent> > syncer_event_hookup_; | 
|   166   base::WaitableEvent sync_cycle_ended_event_; |   173   base::WaitableEvent sync_cycle_ended_event_; | 
|   167   DISALLOW_COPY_AND_ASSIGN(SyncerThreadWithSyncerTest); |   174   DISALLOW_COPY_AND_ASSIGN(SyncerThreadWithSyncerTest); | 
|   168 }; |   175 }; | 
|   169  |   176  | 
|   170 class SyncShareIntercept |   177 class SyncShareIntercept | 
|   171     : public MockConnectionManager::ResponseCodeOverrideRequestor, |   178     : public MockConnectionManager::ResponseCodeOverrideRequestor, | 
|   172       public MockConnectionManager::MidCommitObserver { |   179       public MockConnectionManager::MidCommitObserver { | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   204   } |   211   } | 
|   205  private: |   212  private: | 
|   206   std::vector<TimeTicks> times_sync_occured_; |   213   std::vector<TimeTicks> times_sync_occured_; | 
|   207   base::WaitableEvent sync_occured_; |   214   base::WaitableEvent sync_occured_; | 
|   208   bool allow_multiple_interceptions_; |   215   bool allow_multiple_interceptions_; | 
|   209   DISALLOW_COPY_AND_ASSIGN(SyncShareIntercept); |   216   DISALLOW_COPY_AND_ASSIGN(SyncShareIntercept); | 
|   210 }; |   217 }; | 
|   211  |   218  | 
|   212 TEST_F(SyncerThreadTest, Construction) { |   219 TEST_F(SyncerThreadTest, Construction) { | 
|   213   SyncSessionContext* context = new SyncSessionContext(NULL, NULL, NULL, NULL); |   220   SyncSessionContext* context = new SyncSessionContext(NULL, NULL, NULL, NULL); | 
|   214   scoped_refptr<SyncerThread> syncer_thread(new SyncerThread(context, NULL)); |   221   scoped_refptr<SyncerThread> syncer_thread(new SyncerThread(context)); | 
|   215 } |   222 } | 
|   216  |   223  | 
|   217 TEST_F(SyncerThreadTest, StartStop) { |   224 TEST_F(SyncerThreadTest, StartStop) { | 
|   218   SyncSessionContext* context = new SyncSessionContext(NULL, NULL, NULL, NULL); |   225   SyncSessionContext* context = new SyncSessionContext(NULL, NULL, NULL, NULL); | 
|   219   scoped_refptr<SyncerThread> syncer_thread(new SyncerThread(context, NULL)); |   226   scoped_refptr<SyncerThread> syncer_thread(new SyncerThread(context)); | 
|   220   EXPECT_TRUE(syncer_thread->Start()); |   227   EXPECT_TRUE(syncer_thread->Start()); | 
|   221   EXPECT_TRUE(syncer_thread->Stop(2000)); |   228   EXPECT_TRUE(syncer_thread->Stop(2000)); | 
|   222  |   229  | 
|   223   // Do it again for good measure.  I caught some bugs by adding this so |   230   // Do it again for good measure.  I caught some bugs by adding this so | 
|   224   // I would recommend keeping it. |   231   // I would recommend keeping it. | 
|   225   EXPECT_TRUE(syncer_thread->Start()); |   232   EXPECT_TRUE(syncer_thread->Start()); | 
|   226   EXPECT_TRUE(syncer_thread->Stop(2000)); |   233   EXPECT_TRUE(syncer_thread->Stop(2000)); | 
|   227 } |   234 } | 
|   228  |   235  | 
 |   236 TEST(SyncerThread, GetRecommendedDelay) { | 
 |   237   EXPECT_LE(0, SyncerThread::GetRecommendedDelaySeconds(0)); | 
 |   238   EXPECT_LE(1, SyncerThread::GetRecommendedDelaySeconds(1)); | 
 |   239   EXPECT_LE(50, SyncerThread::GetRecommendedDelaySeconds(50)); | 
 |   240   EXPECT_LE(10, SyncerThread::GetRecommendedDelaySeconds(10)); | 
 |   241   EXPECT_EQ(SyncerThread::kMaxBackoffSeconds, | 
 |   242             SyncerThread::GetRecommendedDelaySeconds( | 
 |   243                 SyncerThread::kMaxBackoffSeconds)); | 
 |   244   EXPECT_EQ(SyncerThread::kMaxBackoffSeconds, | 
 |   245             SyncerThread::GetRecommendedDelaySeconds( | 
 |   246                 SyncerThread::kMaxBackoffSeconds+1)); | 
 |   247 } | 
 |   248  | 
|   229 TEST_F(SyncerThreadTest, CalculateSyncWaitTime) { |   249 TEST_F(SyncerThreadTest, CalculateSyncWaitTime) { | 
|   230   SyncSessionContext* context = new SyncSessionContext(NULL, NULL, NULL, NULL); |   250   SyncSessionContext* context = new SyncSessionContext(NULL, NULL, NULL, NULL); | 
|   231   scoped_refptr<SyncerThread> syncer_thread(new SyncerThread(context, NULL)); |   251   scoped_refptr<SyncerThread> syncer_thread(new SyncerThread(context)); | 
|   232   syncer_thread->DisableIdleDetection(); |   252   syncer_thread->DisableIdleDetection(); | 
|   233  |   253  | 
|   234   // Syncer_polling_interval_ is less than max poll interval. |   254   // Syncer_polling_interval_ is less than max poll interval. | 
|   235   TimeDelta syncer_polling_interval = TimeDelta::FromSeconds(1); |   255   TimeDelta syncer_polling_interval = TimeDelta::FromSeconds(1); | 
|   236  |   256  | 
|   237   syncer_thread->SetSyncerPollingInterval(syncer_polling_interval); |   257   syncer_thread->SetSyncerPollingInterval(syncer_polling_interval); | 
|   238  |   258  | 
|   239   // user_idle_ms is less than 10 * (syncer_polling_interval*1000). |   259   // user_idle_ms is less than 10 * (syncer_polling_interval*1000). | 
|   240   ASSERT_EQ(syncer_polling_interval.InMilliseconds(), |   260   ASSERT_EQ(syncer_polling_interval.InMilliseconds(), | 
|   241             syncer_thread->CalculateSyncWaitTime(1000, 0)); |   261             syncer_thread->CalculateSyncWaitTime(1000, 0)); | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   281                                                    over_sync_max_interval)); |   301                                                    over_sync_max_interval)); | 
|   282   ASSERT_TRUE(last_poll_time * 3 >= |   302   ASSERT_TRUE(last_poll_time * 3 >= | 
|   283               syncer_thread->CalculateSyncWaitTime(last_poll_time, |   303               syncer_thread->CalculateSyncWaitTime(last_poll_time, | 
|   284                                                    over_sync_max_interval)); |   304                                                    over_sync_max_interval)); | 
|   285 } |   305 } | 
|   286  |   306  | 
|   287 TEST_F(SyncerThreadTest, CalculatePollingWaitTime) { |   307 TEST_F(SyncerThreadTest, CalculatePollingWaitTime) { | 
|   288   // Set up the environment. |   308   // Set up the environment. | 
|   289   int user_idle_milliseconds_param = 0; |   309   int user_idle_milliseconds_param = 0; | 
|   290   SyncSessionContext* context = new SyncSessionContext(NULL, NULL, NULL, NULL); |   310   SyncSessionContext* context = new SyncSessionContext(NULL, NULL, NULL, NULL); | 
|   291   scoped_refptr<SyncerThread> syncer_thread(new SyncerThread(context, NULL)); |   311   scoped_refptr<SyncerThread> syncer_thread(new SyncerThread(context)); | 
|   292   syncer_thread->DisableIdleDetection(); |   312   syncer_thread->DisableIdleDetection(); | 
|   293   // Hold the lock to appease asserts in code. |   313   // Hold the lock to appease asserts in code. | 
|   294   AutoLock lock(syncer_thread->lock_); |   314   AutoLock lock(syncer_thread->lock_); | 
|   295  |   315  | 
|   296   // Notifications disabled should result in a polling interval of |   316   // Notifications disabled should result in a polling interval of | 
|   297   // kDefaultShortPollInterval. |   317   // kDefaultShortPollInterval. | 
|   298   { |   318   { | 
|   299     AllStatus::Status status = {}; |   319     context->set_notifications_enabled(false); | 
|   300     status.notifications_enabled = 0; |  | 
|   301     bool continue_sync_cycle_param = false; |   320     bool continue_sync_cycle_param = false; | 
|   302  |   321  | 
|   303     // No work and no backoff. |   322     // No work and no backoff. | 
|   304     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |   323     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( | 
|   305         status, |  | 
|   306         0, |   324         0, | 
|   307         &user_idle_milliseconds_param, |   325         &user_idle_milliseconds_param, | 
|   308         &continue_sync_cycle_param, |   326         &continue_sync_cycle_param, | 
|   309         false); |   327         false); | 
|   310  |   328  | 
|   311     ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |   329     ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, | 
|   312               interval.poll_delta.InSeconds()); |   330               interval.poll_delta.InSeconds()); | 
|   313     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   331     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   314     ASSERT_FALSE(interval.had_nudge_during_backoff); |   332     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   315     ASSERT_FALSE(continue_sync_cycle_param); |   333     ASSERT_FALSE(continue_sync_cycle_param); | 
|   316  |   334  | 
|   317     // In this case the continue_sync_cycle is turned off. |   335     // In this case the continue_sync_cycle is turned off. | 
|   318     continue_sync_cycle_param = true; |   336     continue_sync_cycle_param = true; | 
|   319     interval = syncer_thread->CalculatePollingWaitTime( |   337     interval = syncer_thread->CalculatePollingWaitTime( | 
|   320         status, |  | 
|   321         0, |   338         0, | 
|   322         &user_idle_milliseconds_param, |   339         &user_idle_milliseconds_param, | 
|   323         &continue_sync_cycle_param, |   340         &continue_sync_cycle_param, | 
|   324         false); |   341         false); | 
|   325  |   342  | 
|   326     ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |   343     ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, | 
|   327         interval.poll_delta.InSeconds()); |   344         interval.poll_delta.InSeconds()); | 
|   328     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   345     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   329     ASSERT_FALSE(interval.had_nudge_during_backoff); |   346     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   330     ASSERT_FALSE(continue_sync_cycle_param); |   347     ASSERT_FALSE(continue_sync_cycle_param); | 
|   331   } |   348   } | 
|   332  |   349  | 
|   333   // Notifications enabled should result in a polling interval of |   350   // Notifications enabled should result in a polling interval of | 
|   334   // SyncerThread::kDefaultLongPollIntervalSeconds. |   351   // SyncerThread::kDefaultLongPollIntervalSeconds. | 
|   335   { |   352   { | 
|   336     AllStatus::Status status = {}; |   353     context->set_notifications_enabled(true); | 
|   337     status.notifications_enabled = 1; |  | 
|   338     bool continue_sync_cycle_param = false; |   354     bool continue_sync_cycle_param = false; | 
|   339  |   355  | 
|   340     // No work and no backoff. |   356     // No work and no backoff. | 
|   341     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |   357     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( | 
|   342         status, |  | 
|   343         0, |   358         0, | 
|   344         &user_idle_milliseconds_param, |   359         &user_idle_milliseconds_param, | 
|   345         &continue_sync_cycle_param, |   360         &continue_sync_cycle_param, | 
|   346         false); |   361         false); | 
|   347  |   362  | 
|   348     ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, |   363     ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, | 
|   349               interval.poll_delta.InSeconds()); |   364               interval.poll_delta.InSeconds()); | 
|   350     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   365     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   351     ASSERT_FALSE(interval.had_nudge_during_backoff); |   366     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   352     ASSERT_FALSE(continue_sync_cycle_param); |   367     ASSERT_FALSE(continue_sync_cycle_param); | 
|   353  |   368  | 
|   354     // In this case the continue_sync_cycle is turned off. |   369     // In this case the continue_sync_cycle is turned off. | 
|   355     continue_sync_cycle_param = true; |   370     continue_sync_cycle_param = true; | 
|   356     interval = syncer_thread->CalculatePollingWaitTime( |   371     interval = syncer_thread->CalculatePollingWaitTime( | 
|   357         status, |  | 
|   358         0, |   372         0, | 
|   359         &user_idle_milliseconds_param, |   373         &user_idle_milliseconds_param, | 
|   360         &continue_sync_cycle_param, |   374         &continue_sync_cycle_param, | 
|   361         false); |   375         false); | 
|   362  |   376  | 
|   363     ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, |   377     ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, | 
|   364               interval.poll_delta.InSeconds()); |   378               interval.poll_delta.InSeconds()); | 
|   365     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   379     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   366     ASSERT_FALSE(interval.had_nudge_during_backoff); |   380     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   367     ASSERT_FALSE(continue_sync_cycle_param); |   381     ASSERT_FALSE(continue_sync_cycle_param); | 
|   368   } |   382   } | 
|   369  |   383  | 
|   370   // There are two states which can cause a continuation, either the updates |   384   // There are two states which can cause a continuation, either the updates | 
|   371   // available do not match the updates received, or the unsynced count is |   385   // available do not match the updates received, or the unsynced count is | 
|   372   // non-zero. |   386   // non-zero. | 
|   373   { |   387   { | 
|   374     AllStatus::Status status = {}; |   388     // More server changes remaining to download. | 
|   375     status.updates_available = 1; |   389     context->set_last_snapshot(SessionSnapshotForTest(1, 0, 0)); | 
|   376     status.updates_received = 0; |  | 
|   377     bool continue_sync_cycle_param = false; |   390     bool continue_sync_cycle_param = false; | 
|   378  |   391  | 
|   379     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |   392     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( | 
|   380         status, |  | 
|   381         0, |   393         0, | 
|   382         &user_idle_milliseconds_param, |   394         &user_idle_milliseconds_param, | 
|   383         &continue_sync_cycle_param, |   395         &continue_sync_cycle_param, | 
|   384         false); |   396         false); | 
|   385  |   397  | 
|   386     ASSERT_LE(0, interval.poll_delta.InSeconds()); |   398     ASSERT_LE(0, interval.poll_delta.InSeconds()); | 
|   387     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   399     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   388     ASSERT_FALSE(interval.had_nudge_during_backoff); |   400     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   389     ASSERT_TRUE(continue_sync_cycle_param); |   401     ASSERT_TRUE(continue_sync_cycle_param); | 
|   390  |   402  | 
|   391     continue_sync_cycle_param = false; |   403     continue_sync_cycle_param = false; | 
|   392     interval = syncer_thread->CalculatePollingWaitTime( |   404     interval = syncer_thread->CalculatePollingWaitTime( | 
|   393         status, |  | 
|   394         0, |   405         0, | 
|   395         &user_idle_milliseconds_param, |   406         &user_idle_milliseconds_param, | 
|   396         &continue_sync_cycle_param, |   407         &continue_sync_cycle_param, | 
|   397         false); |   408         false); | 
|   398  |   409  | 
|   399     ASSERT_GE(3, interval.poll_delta.InSeconds()); |   410     ASSERT_GE(3, interval.poll_delta.InSeconds()); | 
|   400     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   411     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   401     ASSERT_FALSE(interval.had_nudge_during_backoff); |   412     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   402     ASSERT_TRUE(continue_sync_cycle_param); |   413     ASSERT_TRUE(continue_sync_cycle_param); | 
|   403  |   414  | 
|   404     interval = syncer_thread->CalculatePollingWaitTime( |   415     interval = syncer_thread->CalculatePollingWaitTime( | 
|   405         status, |  | 
|   406         0, |   416         0, | 
|   407         &user_idle_milliseconds_param, |   417         &user_idle_milliseconds_param, | 
|   408         &continue_sync_cycle_param, |   418         &continue_sync_cycle_param, | 
|   409         false); |   419         false); | 
|   410  |   420  | 
|   411     ASSERT_LE(0, interval.poll_delta.InSeconds()); |   421     ASSERT_LE(0, interval.poll_delta.InSeconds()); | 
|   412     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |   422     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); | 
|   413     ASSERT_FALSE(interval.had_nudge_during_backoff); |   423     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   414  |   424  | 
|   415     interval = syncer_thread->CalculatePollingWaitTime( |   425     interval = syncer_thread->CalculatePollingWaitTime( | 
|   416         status, |  | 
|   417         0, |   426         0, | 
|   418         &user_idle_milliseconds_param, |   427         &user_idle_milliseconds_param, | 
|   419         &continue_sync_cycle_param, |   428         &continue_sync_cycle_param, | 
|   420         false); |   429         false); | 
|   421  |   430  | 
|   422     ASSERT_GE(2, interval.poll_delta.InSeconds()); |   431     ASSERT_GE(2, interval.poll_delta.InSeconds()); | 
|   423     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |   432     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); | 
|   424     ASSERT_FALSE(interval.had_nudge_during_backoff); |   433     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   425     ASSERT_TRUE(continue_sync_cycle_param); |   434     ASSERT_TRUE(continue_sync_cycle_param); | 
|   426  |   435  | 
|   427     status.updates_received = 1; |   436     // Now simulate no more server changes remaining. | 
 |   437     context->set_last_snapshot(SessionSnapshotForTest(1, 1, 0)); | 
|   428     interval = syncer_thread->CalculatePollingWaitTime( |   438     interval = syncer_thread->CalculatePollingWaitTime( | 
|   429         status, |  | 
|   430         0, |   439         0, | 
|   431         &user_idle_milliseconds_param, |   440         &user_idle_milliseconds_param, | 
|   432         &continue_sync_cycle_param, |   441         &continue_sync_cycle_param, | 
|   433         false); |   442         false); | 
|   434  |   443  | 
|   435     ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |   444     ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, | 
|   436                 interval.poll_delta.InSeconds()); |   445                 interval.poll_delta.InSeconds()); | 
|   437     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   446     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   438     ASSERT_FALSE(interval.had_nudge_during_backoff); |   447     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   439     ASSERT_FALSE(continue_sync_cycle_param); |   448     ASSERT_FALSE(continue_sync_cycle_param); | 
|   440   } |   449   } | 
|   441  |   450  | 
|   442   { |   451   { | 
|   443     AllStatus::Status status = {}; |   452  | 
|   444     status.unsynced_count = 1; |   453     // Now try with unsynced local items. | 
 |   454     context->set_last_snapshot(SessionSnapshotForTest(0, 0, 1)); | 
|   445     bool continue_sync_cycle_param = false; |   455     bool continue_sync_cycle_param = false; | 
|   446  |   456  | 
|   447     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |   457     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( | 
|   448         status, |  | 
|   449         0, |   458         0, | 
|   450         &user_idle_milliseconds_param, |   459         &user_idle_milliseconds_param, | 
|   451         &continue_sync_cycle_param, |   460         &continue_sync_cycle_param, | 
|   452         false); |   461         false); | 
|   453  |   462  | 
|   454     ASSERT_LE(0, interval.poll_delta.InSeconds()); |   463     ASSERT_LE(0, interval.poll_delta.InSeconds()); | 
|   455     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   464     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   456     ASSERT_FALSE(interval.had_nudge_during_backoff); |   465     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   457     ASSERT_TRUE(continue_sync_cycle_param); |   466     ASSERT_TRUE(continue_sync_cycle_param); | 
|   458  |   467  | 
|   459     continue_sync_cycle_param = false; |   468     continue_sync_cycle_param = false; | 
|   460     interval = syncer_thread->CalculatePollingWaitTime( |   469     interval = syncer_thread->CalculatePollingWaitTime( | 
|   461         status, |  | 
|   462         0, |   470         0, | 
|   463         &user_idle_milliseconds_param, |   471         &user_idle_milliseconds_param, | 
|   464         &continue_sync_cycle_param, |   472         &continue_sync_cycle_param, | 
|   465         false); |   473         false); | 
|   466  |   474  | 
|   467     ASSERT_GE(2, interval.poll_delta.InSeconds()); |   475     ASSERT_GE(2, interval.poll_delta.InSeconds()); | 
|   468     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   476     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   469     ASSERT_FALSE(interval.had_nudge_during_backoff); |   477     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   470     ASSERT_TRUE(continue_sync_cycle_param); |   478     ASSERT_TRUE(continue_sync_cycle_param); | 
|   471  |   479  | 
|   472     status.unsynced_count = 0; |   480     context->set_last_snapshot(SessionSnapshotForTest(0, 0, 0)); | 
|   473     interval = syncer_thread->CalculatePollingWaitTime( |   481     interval = syncer_thread->CalculatePollingWaitTime( | 
|   474         status, |  | 
|   475         4, |   482         4, | 
|   476         &user_idle_milliseconds_param, |   483         &user_idle_milliseconds_param, | 
|   477         &continue_sync_cycle_param, |   484         &continue_sync_cycle_param, | 
|   478         false); |   485         false); | 
|   479  |   486  | 
|   480     ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |   487     ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, | 
|   481               interval.poll_delta.InSeconds()); |   488               interval.poll_delta.InSeconds()); | 
|   482     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   489     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   483     ASSERT_FALSE(interval.had_nudge_during_backoff); |   490     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   484     ASSERT_FALSE(continue_sync_cycle_param); |   491     ASSERT_FALSE(continue_sync_cycle_param); | 
|   485   } |   492   } | 
|   486  |   493  | 
|   487   // Regression for exponential backoff reset when the syncer is nudged. |   494   // Regression for exponential backoff reset when the syncer is nudged. | 
|   488   { |   495   { | 
|   489     AllStatus::Status status = {}; |   496  | 
|   490     status.unsynced_count = 1; |   497     context->set_last_snapshot(SessionSnapshotForTest(0, 0, 1)); | 
|   491     bool continue_sync_cycle_param = false; |   498     bool continue_sync_cycle_param = false; | 
|   492  |   499  | 
|   493     // Expect move from default polling interval to exponential backoff due to |   500     // Expect move from default polling interval to exponential backoff due to | 
|   494     // unsynced_count != 0. |   501     // unsynced_count != 0. | 
|   495     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |   502     WaitInterval interval = syncer_thread->CalculatePollingWaitTime( | 
|   496         status, |  | 
|   497         3600, |   503         3600, | 
|   498         &user_idle_milliseconds_param, |   504         &user_idle_milliseconds_param, | 
|   499         &continue_sync_cycle_param, |   505         &continue_sync_cycle_param, | 
|   500         false); |   506         false); | 
|   501  |   507  | 
|   502     ASSERT_LE(0, interval.poll_delta.InSeconds()); |   508     ASSERT_LE(0, interval.poll_delta.InSeconds()); | 
|   503     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   509     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   504     ASSERT_FALSE(interval.had_nudge_during_backoff); |   510     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   505     ASSERT_TRUE(continue_sync_cycle_param); |   511     ASSERT_TRUE(continue_sync_cycle_param); | 
|   506  |   512  | 
|   507     continue_sync_cycle_param = false; |   513     continue_sync_cycle_param = false; | 
|   508     interval = syncer_thread->CalculatePollingWaitTime( |   514     interval = syncer_thread->CalculatePollingWaitTime( | 
|   509         status, |  | 
|   510         3600, |   515         3600, | 
|   511         &user_idle_milliseconds_param, |   516         &user_idle_milliseconds_param, | 
|   512         &continue_sync_cycle_param, |   517         &continue_sync_cycle_param, | 
|   513         false); |   518         false); | 
|   514  |   519  | 
|   515     ASSERT_GE(2, interval.poll_delta.InSeconds()); |   520     ASSERT_GE(2, interval.poll_delta.InSeconds()); | 
|   516     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   521     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   517     ASSERT_FALSE(interval.had_nudge_during_backoff); |   522     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   518     ASSERT_TRUE(continue_sync_cycle_param); |   523     ASSERT_TRUE(continue_sync_cycle_param); | 
|   519  |   524  | 
|   520     // Expect exponential backoff. |   525     // Expect exponential backoff. | 
|   521     interval = syncer_thread->CalculatePollingWaitTime( |   526     interval = syncer_thread->CalculatePollingWaitTime( | 
|   522         status, |  | 
|   523         2, |   527         2, | 
|   524         &user_idle_milliseconds_param, |   528         &user_idle_milliseconds_param, | 
|   525         &continue_sync_cycle_param, |   529         &continue_sync_cycle_param, | 
|   526         false); |   530         false); | 
|   527  |   531  | 
|   528     ASSERT_LE(2, interval.poll_delta.InSeconds()); |   532     ASSERT_LE(2, interval.poll_delta.InSeconds()); | 
|   529     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |   533     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); | 
|   530     ASSERT_FALSE(interval.had_nudge_during_backoff); |   534     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   531     ASSERT_TRUE(continue_sync_cycle_param); |   535     ASSERT_TRUE(continue_sync_cycle_param); | 
|   532  |   536  | 
|   533     interval = syncer_thread->CalculatePollingWaitTime( |   537     interval = syncer_thread->CalculatePollingWaitTime( | 
|   534         status, |  | 
|   535         2, |   538         2, | 
|   536         &user_idle_milliseconds_param, |   539         &user_idle_milliseconds_param, | 
|   537         &continue_sync_cycle_param, |   540         &continue_sync_cycle_param, | 
|   538         false); |   541         false); | 
|   539  |   542  | 
|   540     ASSERT_GE(6, interval.poll_delta.InSeconds()); |   543     ASSERT_GE(6, interval.poll_delta.InSeconds()); | 
|   541     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |   544     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); | 
|   542     ASSERT_FALSE(interval.had_nudge_during_backoff); |   545     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   543     ASSERT_TRUE(continue_sync_cycle_param); |   546     ASSERT_TRUE(continue_sync_cycle_param); | 
|   544  |   547  | 
|   545     syncer_thread->vault_.current_wait_interval_ = interval; |   548     syncer_thread->vault_.current_wait_interval_ = interval; | 
|   546  |   549  | 
|   547     interval = syncer_thread->CalculatePollingWaitTime( |   550     interval = syncer_thread->CalculatePollingWaitTime( | 
|   548         status, |  | 
|   549         static_cast<int>(interval.poll_delta.InSeconds()), |   551         static_cast<int>(interval.poll_delta.InSeconds()), | 
|   550         &user_idle_milliseconds_param, |   552         &user_idle_milliseconds_param, | 
|   551         &continue_sync_cycle_param, |   553         &continue_sync_cycle_param, | 
|   552         true); |   554         true); | 
|   553  |   555  | 
|   554     // Don't change poll on a failed nudge during backoff. |   556     // Don't change poll on a failed nudge during backoff. | 
|   555     ASSERT_TRUE(syncer_thread->vault_.current_wait_interval_.poll_delta == |   557     ASSERT_TRUE(syncer_thread->vault_.current_wait_interval_.poll_delta == | 
|   556               interval.poll_delta); |   558               interval.poll_delta); | 
|   557     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |   559     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); | 
|   558     ASSERT_TRUE(interval.had_nudge_during_backoff); |   560     ASSERT_TRUE(interval.had_nudge_during_backoff); | 
|   559     ASSERT_TRUE(continue_sync_cycle_param); |   561     ASSERT_TRUE(continue_sync_cycle_param); | 
|   560  |   562  | 
|   561     // If we got a nudge and we weren't in backoff mode, we see exponential |   563     // If we got a nudge and we weren't in backoff mode, we see exponential | 
|   562     // backoff. |   564     // backoff. | 
|   563     syncer_thread->vault_.current_wait_interval_.mode = WaitInterval::NORMAL; |   565     syncer_thread->vault_.current_wait_interval_.mode = WaitInterval::NORMAL; | 
|   564     interval = syncer_thread->CalculatePollingWaitTime( |   566     interval = syncer_thread->CalculatePollingWaitTime( | 
|   565         status, |  | 
|   566         2, |   567         2, | 
|   567         &user_idle_milliseconds_param, |   568         &user_idle_milliseconds_param, | 
|   568         &continue_sync_cycle_param, |   569         &continue_sync_cycle_param, | 
|   569         true); |   570         true); | 
|   570  |   571  | 
|   571     // 5 and 3 are bounds on the backoff randomization formula given input of 2. |   572     // 5 and 3 are bounds on the backoff randomization formula given input of 2. | 
|   572     ASSERT_GE(5, interval.poll_delta.InSeconds()); |   573     ASSERT_GE(5, interval.poll_delta.InSeconds()); | 
|   573     ASSERT_LE(3, interval.poll_delta.InSeconds()); |   574     ASSERT_LE(3, interval.poll_delta.InSeconds()); | 
|   574     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |   575     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); | 
|   575     ASSERT_FALSE(interval.had_nudge_during_backoff); |   576     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   576     ASSERT_TRUE(continue_sync_cycle_param); |   577     ASSERT_TRUE(continue_sync_cycle_param); | 
|   577  |   578  | 
|   578     // And if another interval expires, we get a bigger backoff. |   579     // And if another interval expires, we get a bigger backoff. | 
|   579     WaitInterval new_interval = syncer_thread->CalculatePollingWaitTime( |   580     WaitInterval new_interval = syncer_thread->CalculatePollingWaitTime( | 
|   580         status, |  | 
|   581         static_cast<int>(interval.poll_delta.InSeconds()), |   581         static_cast<int>(interval.poll_delta.InSeconds()), | 
|   582         &user_idle_milliseconds_param, |   582         &user_idle_milliseconds_param, | 
|   583         &continue_sync_cycle_param, |   583         &continue_sync_cycle_param, | 
|   584         false); |   584         false); | 
|   585  |   585  | 
|   586     ASSERT_GE(12, new_interval.poll_delta.InSeconds()); |   586     ASSERT_GE(12, new_interval.poll_delta.InSeconds()); | 
|   587     ASSERT_LE(5, new_interval.poll_delta.InSeconds()); |   587     ASSERT_LE(5, new_interval.poll_delta.InSeconds()); | 
|   588     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |   588     ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); | 
|   589     ASSERT_FALSE(new_interval.had_nudge_during_backoff); |   589     ASSERT_FALSE(new_interval.had_nudge_during_backoff); | 
|   590     ASSERT_TRUE(continue_sync_cycle_param); |   590     ASSERT_TRUE(continue_sync_cycle_param); | 
|   591  |   591  | 
|   592     // A nudge resets the continue_sync_cycle_param value, so our backoff |   592     // A nudge resets the continue_sync_cycle_param value, so our backoff | 
|   593     // should return to the minimum. |   593     // should return to the minimum. | 
|   594     continue_sync_cycle_param = false; |   594     continue_sync_cycle_param = false; | 
|   595     interval = syncer_thread->CalculatePollingWaitTime( |   595     interval = syncer_thread->CalculatePollingWaitTime( | 
|   596         status, |  | 
|   597         3600, |   596         3600, | 
|   598         &user_idle_milliseconds_param, |   597         &user_idle_milliseconds_param, | 
|   599         &continue_sync_cycle_param, |   598         &continue_sync_cycle_param, | 
|   600         true); |   599         true); | 
|   601  |   600  | 
|   602     ASSERT_LE(0, interval.poll_delta.InSeconds()); |   601     ASSERT_LE(0, interval.poll_delta.InSeconds()); | 
|   603     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   602     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   604     ASSERT_FALSE(interval.had_nudge_during_backoff); |   603     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   605     ASSERT_TRUE(continue_sync_cycle_param); |   604     ASSERT_TRUE(continue_sync_cycle_param); | 
|   606  |   605  | 
|   607     continue_sync_cycle_param = false; |   606     continue_sync_cycle_param = false; | 
|   608     interval = syncer_thread->CalculatePollingWaitTime( |   607     interval = syncer_thread->CalculatePollingWaitTime( | 
|   609         status, |  | 
|   610         3600, |   608         3600, | 
|   611         &user_idle_milliseconds_param, |   609         &user_idle_milliseconds_param, | 
|   612         &continue_sync_cycle_param, |   610         &continue_sync_cycle_param, | 
|   613         true); |   611         true); | 
|   614  |   612  | 
|   615     ASSERT_GE(2, interval.poll_delta.InSeconds()); |   613     ASSERT_GE(2, interval.poll_delta.InSeconds()); | 
|   616     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   614     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   617     ASSERT_FALSE(interval.had_nudge_during_backoff); |   615     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   618     ASSERT_TRUE(continue_sync_cycle_param); |   616     ASSERT_TRUE(continue_sync_cycle_param); | 
|   619  |   617  | 
|   620     // Setting unsynced_count = 0 returns us to the default polling interval. |   618     // Setting unsynced_count = 0 returns us to the default polling interval. | 
|   621     status.unsynced_count = 0; |   619     context->set_last_snapshot(SessionSnapshotForTest(0, 0, 0)); | 
|   622     interval = syncer_thread->CalculatePollingWaitTime( |   620     interval = syncer_thread->CalculatePollingWaitTime( | 
|   623         status, |  | 
|   624         4, |   621         4, | 
|   625         &user_idle_milliseconds_param, |   622         &user_idle_milliseconds_param, | 
|   626         &continue_sync_cycle_param, |   623         &continue_sync_cycle_param, | 
|   627         true); |   624         true); | 
|   628  |   625  | 
|   629     ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |   626     ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, | 
|   630               interval.poll_delta.InSeconds()); |   627               interval.poll_delta.InSeconds()); | 
|   631     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |   628     ASSERT_EQ(WaitInterval::NORMAL, interval.mode); | 
|   632     ASSERT_FALSE(interval.had_nudge_during_backoff); |   629     ASSERT_FALSE(interval.had_nudge_during_backoff); | 
|   633     ASSERT_FALSE(continue_sync_cycle_param); |   630     ASSERT_FALSE(continue_sync_cycle_param); | 
|   634   } |   631   } | 
|   635 } |   632 } | 
|   636  |   633  | 
|   637 TEST_F(SyncerThreadWithSyncerTest, Polling) { |   634 TEST_F(SyncerThreadWithSyncerTest, Polling) { | 
|   638   SyncShareIntercept interceptor; |   635   SyncShareIntercept interceptor; | 
|   639   connection()->SetMidCommitObserver(&interceptor); |   636   connection()->SetMidCommitObserver(&interceptor); | 
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1005       WillOnce(SignalEvent(&sync_cycle_ended_event)); |  1002       WillOnce(SignalEvent(&sync_cycle_ended_event)); | 
|  1006   EXPECT_CALL(listener, HandleChannelEvent( |  1003   EXPECT_CALL(listener, HandleChannelEvent( | 
|  1007       Field(&SyncerEvent::what_happened, SyncerEvent::SYNCER_THREAD_EXITING))); |  1004       Field(&SyncerEvent::what_happened, SyncerEvent::SYNCER_THREAD_EXITING))); | 
|  1008  |  1005  | 
|  1009   ASSERT_TRUE(Resume(&listener)); |  1006   ASSERT_TRUE(Resume(&listener)); | 
|  1010   ASSERT_TRUE(sync_cycle_ended_event.TimedWait(max_wait_time_)); |  1007   ASSERT_TRUE(sync_cycle_ended_event.TimedWait(max_wait_time_)); | 
|  1011   EXPECT_TRUE(syncer_thread()->Stop(2000)); |  1008   EXPECT_TRUE(syncer_thread()->Stop(2000)); | 
|  1012 } |  1009 } | 
|  1013  |  1010  | 
|  1014 }  // namespace browser_sync |  1011 }  // namespace browser_sync | 
| OLD | NEW |