Index: chrome/browser/sync/engine/syncer_thread_unittest.cc |
=================================================================== |
--- chrome/browser/sync/engine/syncer_thread_unittest.cc (revision 28645) |
+++ chrome/browser/sync/engine/syncer_thread_unittest.cc (working copy) |
@@ -22,6 +22,7 @@ |
namespace browser_sync { |
typedef testing::Test SyncerThreadTest; |
+typedef SyncerThread::WaitInterval WaitInterval; |
class SyncerThreadWithSyncerTest : public testing::Test { |
public: |
@@ -158,6 +159,8 @@ |
scoped_refptr<SyncerThread> syncer_thread( |
SyncerThreadFactory::Create(NULL, NULL, NULL, NULL, NULL)); |
syncer_thread->DisableIdleDetection(); |
+ // Hold the lock to appease asserts in code. |
+ AutoLock lock(syncer_thread->lock_); |
// Notifications disabled should result in a polling interval of |
// kDefaultShortPollInterval. |
@@ -167,27 +170,33 @@ |
bool continue_sync_cycle_param = false; |
// No work and no backoff. |
- ASSERT_TRUE(SyncerThread::kDefaultShortPollIntervalSeconds == |
- syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_FALSE(continue_sync_cycle_param); |
// In this case the continue_sync_cycle is turned off. |
continue_sync_cycle_param = true; |
- ASSERT_TRUE(SyncerThread::kDefaultShortPollIntervalSeconds == |
- syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_FALSE(continue_sync_cycle_param); |
- |
- // TODO(brg) : Find a way to test exponential backoff is inoperable. |
- // Exponential backoff should be turned on when notifications are disabled |
- // but this can not be tested since we can not set the last input info. |
} |
// Notifications enabled should result in a polling interval of |
@@ -198,27 +207,33 @@ |
bool continue_sync_cycle_param = false; |
// No work and no backoff. |
- ASSERT_TRUE(SyncerThread::kDefaultLongPollIntervalSeconds == |
- syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, |
+ interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_FALSE(continue_sync_cycle_param); |
// In this case the continue_sync_cycle is turned off. |
continue_sync_cycle_param = true; |
- ASSERT_TRUE(SyncerThread::kDefaultLongPollIntervalSeconds == |
- syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, |
+ interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_FALSE(continue_sync_cycle_param); |
- |
- // TODO(brg) : Find a way to test exponential backoff. |
- // Exponential backoff should be turned off when notifications are enabled, |
- // but this can not be tested since we can not set the last input info. |
} |
// There are two states which can cause a continuation, either the updates |
@@ -230,40 +245,66 @@ |
status.updates_received = 0; |
bool continue_sync_cycle_param = false; |
- ASSERT_TRUE(0 <= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_LE(0, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
continue_sync_cycle_param = false; |
- ASSERT_TRUE(3 >= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_GE(3, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
- ASSERT_TRUE(0 <= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
- ASSERT_TRUE(2 >= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_LE(0, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
+ |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_GE(2, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
status.updates_received = 1; |
- ASSERT_TRUE(SyncerThread::kDefaultShortPollIntervalSeconds == |
- syncer_thread->CalculatePollingWaitTime( |
- status, |
- 10, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_FALSE(continue_sync_cycle_param); |
} |
@@ -272,28 +313,43 @@ |
status.unsynced_count = 1; |
bool continue_sync_cycle_param = false; |
- ASSERT_TRUE(0 <= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_LE(0, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
continue_sync_cycle_param = false; |
- ASSERT_TRUE(2 >= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 0, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_GE(2, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
status.unsynced_count = 0; |
- ASSERT_TRUE(SyncerThread::kDefaultShortPollIntervalSeconds == |
- syncer_thread->CalculatePollingWaitTime( |
- status, |
- 4, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 4, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_FALSE(continue_sync_cycle_param); |
} |
@@ -305,60 +361,144 @@ |
// Expect move from default polling interval to exponential backoff due to |
// unsynced_count != 0. |
- ASSERT_TRUE(0 <= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 3600, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ WaitInterval interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 3600, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_LE(0, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
continue_sync_cycle_param = false; |
- ASSERT_TRUE(2 >= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 3600, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 3600, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_GE(2, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
// Expect exponential backoff. |
- ASSERT_TRUE(2 <= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 2, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
- ASSERT_TRUE(6 >= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 2, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 2, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_LE(2, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 2, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_GE(6, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ syncer_thread->vault_.current_wait_interval_ = interval; |
+ |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ static_cast<int>(interval.poll_delta.InSeconds()), |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ true); |
+ |
+ // Don't change poll on a failed nudge during backoff. |
+ ASSERT_TRUE(syncer_thread->vault_.current_wait_interval_.poll_delta == |
+ interval.poll_delta); |
+ ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |
+ ASSERT_TRUE(interval.had_nudge_during_backoff); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ // If we got a nudge and we weren't in backoff mode, we see exponential |
+ // backoff. |
+ syncer_thread->vault_.current_wait_interval_.mode = WaitInterval::NORMAL; |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 2, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ true); |
+ |
+ // 5 and 3 are bounds on the backoff randomization formula given input of 2. |
+ ASSERT_GE(5, interval.poll_delta.InSeconds()); |
+ ASSERT_LE(3, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ // And if another interval expires, we get a bigger backoff. |
+ WaitInterval new_interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ static_cast<int>(interval.poll_delta.InSeconds()), |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ false); |
+ |
+ ASSERT_GE(12, new_interval.poll_delta.InSeconds()); |
+ ASSERT_LE(5, new_interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::EXPONENTIAL_BACKOFF, interval.mode); |
+ ASSERT_FALSE(new_interval.had_nudge_during_backoff); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
// A nudge resets the continue_sync_cycle_param value, so our backoff |
// should return to the minimum. |
continue_sync_cycle_param = false; |
- ASSERT_TRUE(0 <= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 3600, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 3600, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ true); |
+ |
+ ASSERT_LE(0, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
continue_sync_cycle_param = false; |
- ASSERT_TRUE(2 >= syncer_thread->CalculatePollingWaitTime( |
- status, |
- 3600, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 3600, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ true); |
+ |
+ ASSERT_GE(2, interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_TRUE(continue_sync_cycle_param); |
// Setting unsynced_count = 0 returns us to the default polling interval. |
status.unsynced_count = 0; |
- ASSERT_TRUE(SyncerThread::kDefaultShortPollIntervalSeconds == |
- syncer_thread->CalculatePollingWaitTime( |
- status, |
- 4, |
- &user_idle_milliseconds_param, |
- &continue_sync_cycle_param)); |
+ interval = syncer_thread->CalculatePollingWaitTime( |
+ status, |
+ 4, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param, |
+ true); |
+ |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ interval.poll_delta.InSeconds()); |
+ ASSERT_EQ(WaitInterval::NORMAL, interval.mode); |
+ ASSERT_FALSE(interval.had_nudge_during_backoff); |
ASSERT_FALSE(continue_sync_cycle_param); |
} |
} |