Index: chrome/browser/sync/engine/syncer_thread_unittest.cc |
=================================================================== |
--- chrome/browser/sync/engine/syncer_thread_unittest.cc (revision 0) |
+++ chrome/browser/sync/engine/syncer_thread_unittest.cc (revision 0) |
@@ -0,0 +1,299 @@ |
+// Copyright (c) 2009 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 <list> |
+#include <map> |
+#include <set> |
+#include <strstream> |
+ |
+#include "base/scoped_ptr.h" |
+#include "chrome/browser/sync/engine/syncer_thread.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace browser_sync { |
+ |
+class SyncerThreadTest : public testing::Test { |
+ protected: |
+ SyncerThreadTest() {} |
+ virtual ~SyncerThreadTest() {} |
+ virtual void SetUp() {} |
+ virtual void TearDown() {} |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(SyncerThreadTest); |
+}; |
+ |
+TEST_F(SyncerThreadTest, Construction) { |
+ SyncerThread syncer_thread(NULL, NULL, NULL, NULL, NULL); |
+} |
+ |
+TEST_F(SyncerThreadTest, CalculateSyncWaitTime) { |
+ SyncerThread syncer_thread(NULL, NULL, NULL, NULL, NULL); |
+ syncer_thread.DisableIdleDetection(); |
+ |
+ // Syncer_polling_interval_ is less than max poll interval |
+ int syncer_polling_interval = 1; // Needed since AssertionResult is not a |
+ // friend of SyncerThread |
+ syncer_thread.syncer_polling_interval_ = syncer_polling_interval; |
+ |
+ // user_idle_ms is less than 10 * (syncer_polling_interval*1000). |
+ ASSERT_EQ(syncer_polling_interval * 1000, |
+ syncer_thread.CalculateSyncWaitTime(1000, 0)); |
+ ASSERT_EQ(syncer_polling_interval * 1000, |
+ syncer_thread.CalculateSyncWaitTime(1000, 1)); |
+ |
+ // user_idle_ms is ge than 10 * (syncer_polling_interval*1000). |
+ int last_poll_time = 2000; |
+ ASSERT_LE(last_poll_time, |
+ syncer_thread.CalculateSyncWaitTime(last_poll_time, 10000)); |
+ ASSERT_GE(last_poll_time*3, |
+ syncer_thread.CalculateSyncWaitTime(last_poll_time, 10000)); |
+ ASSERT_LE(last_poll_time, |
+ syncer_thread.CalculateSyncWaitTime(last_poll_time, 100000)); |
+ ASSERT_GE(last_poll_time*3, |
+ syncer_thread.CalculateSyncWaitTime(last_poll_time, 100000)); |
+ |
+ // Maximum backoff time should be syncer_max_interval. |
+ int near_threshold = SyncerThread::kDefaultMaxPollIntervalMs / 2 - 1; |
+ int threshold = SyncerThread::kDefaultMaxPollIntervalMs; |
+ int over_threshold = SyncerThread::kDefaultMaxPollIntervalMs + 1; |
+ ASSERT_LE(near_threshold, |
+ syncer_thread.CalculateSyncWaitTime(near_threshold, 10000)); |
+ ASSERT_GE(SyncerThread::kDefaultMaxPollIntervalMs, |
+ syncer_thread.CalculateSyncWaitTime(near_threshold, 10000)); |
+ ASSERT_EQ(SyncerThread::kDefaultMaxPollIntervalMs, |
+ syncer_thread.CalculateSyncWaitTime(threshold, 10000)); |
+ ASSERT_EQ(SyncerThread::kDefaultMaxPollIntervalMs, |
+ syncer_thread.CalculateSyncWaitTime(over_threshold, 10000)); |
+ |
+ // Possible idle time must be capped by syncer_max_interval. |
+ int over_sync_max_interval = |
+ SyncerThread::kDefaultMaxPollIntervalMs + 1; |
+ syncer_polling_interval = over_sync_max_interval / 100; // so 1000* is right |
+ syncer_thread.syncer_polling_interval_ = syncer_polling_interval; |
+ ASSERT_EQ(syncer_polling_interval * 1000, |
+ syncer_thread.CalculateSyncWaitTime(1000, over_sync_max_interval)); |
+ syncer_polling_interval = 1; |
+ syncer_thread.syncer_polling_interval_ = syncer_polling_interval; |
+ ASSERT_LE(last_poll_time, |
+ syncer_thread.CalculateSyncWaitTime(last_poll_time, |
+ over_sync_max_interval)); |
+ ASSERT_GE(last_poll_time * 3, |
+ syncer_thread.CalculateSyncWaitTime(last_poll_time, |
+ over_sync_max_interval)); |
+} |
+ |
+TEST_F(SyncerThreadTest, CalculatePollingWaitTime) { |
+ // Set up the environment |
+ int user_idle_milliseconds_param = 0; |
+ |
+ SyncerThread syncer_thread(NULL, NULL, NULL, NULL, NULL); |
+ syncer_thread.DisableIdleDetection(); |
+ |
+ // Notifications disabled should result in a polling interval of |
+ // kDefaultShortPollInterval |
+ { |
+ AllStatus::Status status = {}; |
+ status.notifications_enabled = 0; |
+ bool continue_sync_cycle_param = false; |
+ |
+ // No work and no backoff. |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_FALSE(continue_sync_cycle_param); |
+ |
+ // In this case the continue_sync_cycle is turned off. |
+ continue_sync_cycle_param = true; |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ 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 |
+ // SyncerThread::kDefaultLongPollIntervalSeconds |
+ { |
+ AllStatus::Status status = {}; |
+ status.notifications_enabled = 1; |
+ bool continue_sync_cycle_param = false; |
+ |
+ // No work and no backoff. |
+ ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, |
+ syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_FALSE(continue_sync_cycle_param); |
+ |
+ // In this case the continue_sync_cycle is turned off. |
+ continue_sync_cycle_param = true; |
+ ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds, |
+ syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ 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 |
+ // available do not match the updates received, or the unsynced count is |
+ // non-zero. |
+ { |
+ AllStatus::Status status = {}; |
+ status.updates_available = 1; |
+ status.updates_received = 0; |
+ bool continue_sync_cycle_param = false; |
+ |
+ ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ continue_sync_cycle_param = false; |
+ ASSERT_GE(3, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_GE(2, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ status.updates_received = 1; |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 10, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_FALSE(continue_sync_cycle_param); |
+ } |
+ |
+ { |
+ AllStatus::Status status = {}; |
+ status.unsynced_count = 1; |
+ bool continue_sync_cycle_param = false; |
+ |
+ ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ continue_sync_cycle_param = false; |
+ ASSERT_GE(2, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 0, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ status.unsynced_count = 0; |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 4, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_FALSE(continue_sync_cycle_param); |
+ } |
+ |
+ // Regression for exponential backoff reset when the |
+ // syncer is nudged. |
+ { |
+ AllStatus::Status status = {}; |
+ status.unsynced_count = 1; |
+ bool continue_sync_cycle_param = false; |
+ |
+ // Expect move from default polling interval to exponential backoff due to |
+ // unsynced_count != 0. |
+ ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 3600, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ continue_sync_cycle_param = false; |
+ ASSERT_GE(2, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 3600, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ // Expect exponential backoff. |
+ ASSERT_LE(2, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 2, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_GE(6, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 2, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ 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_LE(0, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 3600, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ continue_sync_cycle_param = false; |
+ ASSERT_GE(2, syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 3600, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_TRUE(continue_sync_cycle_param); |
+ |
+ // Setting unsynced_count = 0 returns us to the default polling interval. |
+ status.unsynced_count = 0; |
+ ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds, |
+ syncer_thread.CalculatePollingWaitTime( |
+ status, |
+ 4, |
+ &user_idle_milliseconds_param, |
+ &continue_sync_cycle_param)); |
+ ASSERT_FALSE(continue_sync_cycle_param); |
+ } |
+} |
+ |
+} // namespace browser_sync |
Property changes on: chrome\browser\sync\engine\syncer_thread_unittest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |