| Index: chrome/browser/sync/engine/syncer_thread_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/sync/engine/syncer_thread_unittest.cc (revision 27123)
|
| +++ chrome/browser/sync/engine/syncer_thread_unittest.cc (working copy)
|
| @@ -7,159 +7,90 @@
|
| #include <set>
|
| #include <strstream>
|
|
|
| -#include "base/command_line.h"
|
| #include "base/scoped_ptr.h"
|
| -#include "base/time.h"
|
| -#include "chrome/browser/sync/engine/model_safe_worker.h"
|
| #include "chrome/browser/sync/engine/syncer_thread.h"
|
| -#include "chrome/browser/sync/engine/syncer_thread_timed_stop.h"
|
| -#include "chrome/test/sync/engine/mock_server_connection.h"
|
| -#include "chrome/test/sync/engine/test_directory_setter_upper.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| -using base::Time;
|
| -using base::TimeDelta;
|
| -
|
| namespace browser_sync {
|
|
|
| -typedef testing::Test SyncerThreadTest;
|
| +class SyncerThreadTest : public testing::Test {
|
| + protected:
|
| + SyncerThreadTest() {}
|
| + virtual ~SyncerThreadTest() {}
|
| + virtual void SetUp() {}
|
| + virtual void TearDown() {}
|
|
|
| -class SyncerThreadWithSyncerTest : public testing::Test {
|
| - public:
|
| - SyncerThreadWithSyncerTest() {}
|
| - virtual void SetUp() {
|
| - metadb_.SetUp();
|
| - connection_.reset(new MockConnectionManager(metadb_.manager(),
|
| - metadb_.name()));
|
| - allstatus_.reset(new AllStatus());
|
| -
|
| - syncer_thread_ = SyncerThreadFactory::Create(NULL, metadb_.manager(),
|
| - connection_.get(), allstatus_.get(), new ModelSafeWorker());
|
| -
|
| - allstatus_->WatchSyncerThread(syncer_thread_);
|
| - syncer_thread_->SetConnected(true);
|
| - }
|
| - virtual void TearDown() {
|
| - syncer_thread_ = NULL;
|
| - allstatus_.reset();
|
| - connection_.reset();
|
| - metadb_.TearDown();
|
| - }
|
| -
|
| - ManuallyOpenedTestDirectorySetterUpper* metadb() { return &metadb_; }
|
| - MockConnectionManager* connection() { return connection_.get(); }
|
| - SyncerThread* syncer_thread() { return syncer_thread_; }
|
| private:
|
| - ManuallyOpenedTestDirectorySetterUpper metadb_;
|
| - scoped_ptr<MockConnectionManager> connection_;
|
| - scoped_ptr<AllStatus> allstatus_;
|
| - scoped_refptr<SyncerThread> syncer_thread_;
|
| - DISALLOW_COPY_AND_ASSIGN(SyncerThreadWithSyncerTest);
|
| + DISALLOW_COPY_AND_ASSIGN(SyncerThreadTest);
|
| };
|
|
|
| -class SyncShareIntercept : public MockConnectionManager::MidCommitObserver {
|
| - public:
|
| - SyncShareIntercept() : sync_occured_(false, false) {}
|
| - virtual ~SyncShareIntercept() {}
|
| - virtual void Observe() {
|
| - times_sync_occured_.push_back(Time::NowFromSystemTime());
|
| - sync_occured_.Signal();
|
| - }
|
| - void WaitForSyncShare(int at_least_this_many, TimeDelta max_wait) {
|
| - while (at_least_this_many-- > 0)
|
| - sync_occured_.TimedWait(max_wait);
|
| - }
|
| - std::vector<Time> times_sync_occured() const {
|
| - return times_sync_occured_;
|
| - }
|
| - private:
|
| - std::vector<Time> times_sync_occured_;
|
| - base::WaitableEvent sync_occured_;
|
| - DISALLOW_COPY_AND_ASSIGN(SyncShareIntercept);
|
| -};
|
| -
|
| TEST_F(SyncerThreadTest, Construction) {
|
| - scoped_refptr<SyncerThread> syncer_thread(
|
| - SyncerThreadFactory::Create(NULL, NULL, NULL, NULL, NULL));
|
| + SyncerThread syncer_thread(NULL, NULL, NULL, NULL, NULL);
|
| }
|
|
|
| -TEST_F(SyncerThreadTest, StartStop) {
|
| - scoped_refptr<SyncerThread> syncer_thread(
|
| - SyncerThreadFactory::Create(NULL, NULL, NULL, NULL, NULL));
|
| - EXPECT_TRUE(syncer_thread->Start());
|
| - EXPECT_TRUE(syncer_thread->Stop(2000));
|
| -
|
| - // Do it again for good measure. I caught some bugs by adding this so
|
| - // I would recommend keeping it.
|
| - EXPECT_TRUE(syncer_thread->Start());
|
| - EXPECT_TRUE(syncer_thread->Stop(2000));
|
| -}
|
| -
|
| TEST_F(SyncerThreadTest, CalculateSyncWaitTime) {
|
| - scoped_refptr<SyncerThread> syncer_thread(
|
| - SyncerThreadFactory::Create(NULL, NULL, NULL, NULL, NULL));
|
| - syncer_thread->DisableIdleDetection();
|
| + SyncerThread syncer_thread(NULL, NULL, NULL, NULL, NULL);
|
| + syncer_thread.DisableIdleDetection();
|
|
|
| - // Syncer_polling_interval_ is less than max poll interval.
|
| - TimeDelta syncer_polling_interval = TimeDelta::FromSeconds(1);
|
| + // 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;
|
|
|
| - syncer_thread->SetSyncerPollingInterval(syncer_polling_interval);
|
| -
|
| // user_idle_ms is less than 10 * (syncer_polling_interval*1000).
|
| - ASSERT_EQ(syncer_polling_interval.InMilliseconds(),
|
| - syncer_thread->CalculateSyncWaitTime(1000, 0));
|
| - ASSERT_EQ(syncer_polling_interval.InMilliseconds(),
|
| - syncer_thread->CalculateSyncWaitTime(1000, 1));
|
| + 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));
|
| + syncer_thread.CalculateSyncWaitTime(last_poll_time, 10000));
|
| ASSERT_GE(last_poll_time*3,
|
| - syncer_thread->CalculateSyncWaitTime(last_poll_time, 10000));
|
| + syncer_thread.CalculateSyncWaitTime(last_poll_time, 10000));
|
| ASSERT_LE(last_poll_time,
|
| - syncer_thread->CalculateSyncWaitTime(last_poll_time, 100000));
|
| + syncer_thread.CalculateSyncWaitTime(last_poll_time, 100000));
|
| ASSERT_GE(last_poll_time*3,
|
| - syncer_thread->CalculateSyncWaitTime(last_poll_time, 100000));
|
| + 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));
|
| + syncer_thread.CalculateSyncWaitTime(near_threshold, 10000));
|
| ASSERT_GE(SyncerThread::kDefaultMaxPollIntervalMs,
|
| - syncer_thread->CalculateSyncWaitTime(near_threshold, 10000));
|
| + syncer_thread.CalculateSyncWaitTime(near_threshold, 10000));
|
| ASSERT_EQ(SyncerThread::kDefaultMaxPollIntervalMs,
|
| - syncer_thread->CalculateSyncWaitTime(threshold, 10000));
|
| + syncer_thread.CalculateSyncWaitTime(threshold, 10000));
|
| ASSERT_EQ(SyncerThread::kDefaultMaxPollIntervalMs,
|
| - syncer_thread->CalculateSyncWaitTime(over_threshold, 10000));
|
| + 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 = TimeDelta::FromSeconds(
|
| - over_sync_max_interval / 100); // so 1000* is right
|
| - syncer_thread->SetSyncerPollingInterval(syncer_polling_interval);
|
| - ASSERT_EQ(syncer_polling_interval.InSeconds() * 1000,
|
| - syncer_thread->CalculateSyncWaitTime(1000, over_sync_max_interval));
|
| - syncer_polling_interval = TimeDelta::FromSeconds(1);
|
| - syncer_thread->SetSyncerPollingInterval(syncer_polling_interval);
|
| + 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,
|
| + syncer_thread.CalculateSyncWaitTime(last_poll_time,
|
| over_sync_max_interval));
|
| ASSERT_GE(last_poll_time * 3,
|
| - syncer_thread->CalculateSyncWaitTime(last_poll_time,
|
| + syncer_thread.CalculateSyncWaitTime(last_poll_time,
|
| over_sync_max_interval));
|
| }
|
|
|
| TEST_F(SyncerThreadTest, CalculatePollingWaitTime) {
|
| // Set up the environment.
|
| int user_idle_milliseconds_param = 0;
|
| - scoped_refptr<SyncerThread> syncer_thread(
|
| - SyncerThreadFactory::Create(NULL, NULL, NULL, NULL, NULL));
|
| - syncer_thread->DisableIdleDetection();
|
|
|
| + SyncerThread syncer_thread(NULL, NULL, NULL, NULL, NULL);
|
| + syncer_thread.DisableIdleDetection();
|
| +
|
| // Notifications disabled should result in a polling interval of
|
| // kDefaultShortPollInterval.
|
| {
|
| @@ -169,7 +100,7 @@
|
|
|
| // No work and no backoff.
|
| ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds,
|
| - syncer_thread->CalculatePollingWaitTime(
|
| + syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| @@ -179,7 +110,7 @@
|
| // In this case the continue_sync_cycle is turned off.
|
| continue_sync_cycle_param = true;
|
| ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds,
|
| - syncer_thread->CalculatePollingWaitTime(
|
| + syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| @@ -200,7 +131,7 @@
|
|
|
| // No work and no backoff.
|
| ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds,
|
| - syncer_thread->CalculatePollingWaitTime(
|
| + syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| @@ -210,7 +141,7 @@
|
| // In this case the continue_sync_cycle is turned off.
|
| continue_sync_cycle_param = true;
|
| ASSERT_EQ(SyncerThread::kDefaultLongPollIntervalSeconds,
|
| - syncer_thread->CalculatePollingWaitTime(
|
| + syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| @@ -231,7 +162,7 @@
|
| status.updates_received = 0;
|
| bool continue_sync_cycle_param = false;
|
|
|
| - ASSERT_LE(0, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| @@ -239,19 +170,19 @@
|
| ASSERT_TRUE(continue_sync_cycle_param);
|
|
|
| continue_sync_cycle_param = false;
|
| - ASSERT_GE(3, syncer_thread->CalculatePollingWaitTime(
|
| + 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(
|
| + ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| &continue_sync_cycle_param));
|
| - ASSERT_GE(2, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_GE(2, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| @@ -260,7 +191,7 @@
|
|
|
| status.updates_received = 1;
|
| ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds,
|
| - syncer_thread->CalculatePollingWaitTime(
|
| + syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 10,
|
| &user_idle_milliseconds_param,
|
| @@ -273,7 +204,7 @@
|
| status.unsynced_count = 1;
|
| bool continue_sync_cycle_param = false;
|
|
|
| - ASSERT_LE(0, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| @@ -281,7 +212,7 @@
|
| ASSERT_TRUE(continue_sync_cycle_param);
|
|
|
| continue_sync_cycle_param = false;
|
| - ASSERT_GE(2, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_GE(2, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 0,
|
| &user_idle_milliseconds_param,
|
| @@ -290,7 +221,7 @@
|
|
|
| status.unsynced_count = 0;
|
| ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds,
|
| - syncer_thread->CalculatePollingWaitTime(
|
| + syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 4,
|
| &user_idle_milliseconds_param,
|
| @@ -306,7 +237,7 @@
|
|
|
| // Expect move from default polling interval to exponential backoff due to
|
| // unsynced_count != 0.
|
| - ASSERT_LE(0, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 3600,
|
| &user_idle_milliseconds_param,
|
| @@ -314,7 +245,7 @@
|
| ASSERT_TRUE(continue_sync_cycle_param);
|
|
|
| continue_sync_cycle_param = false;
|
| - ASSERT_GE(2, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_GE(2, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 3600,
|
| &user_idle_milliseconds_param,
|
| @@ -322,12 +253,12 @@
|
| ASSERT_TRUE(continue_sync_cycle_param);
|
|
|
| // Expect exponential backoff.
|
| - ASSERT_LE(2, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_LE(2, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 2,
|
| &user_idle_milliseconds_param,
|
| &continue_sync_cycle_param));
|
| - ASSERT_GE(6, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_GE(6, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 2,
|
| &user_idle_milliseconds_param,
|
| @@ -337,7 +268,7 @@
|
| // 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(
|
| + ASSERT_LE(0, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 3600,
|
| &user_idle_milliseconds_param,
|
| @@ -345,7 +276,7 @@
|
| ASSERT_TRUE(continue_sync_cycle_param);
|
|
|
| continue_sync_cycle_param = false;
|
| - ASSERT_GE(2, syncer_thread->CalculatePollingWaitTime(
|
| + ASSERT_GE(2, syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 3600,
|
| &user_idle_milliseconds_param,
|
| @@ -355,7 +286,7 @@
|
| // Setting unsynced_count = 0 returns us to the default polling interval.
|
| status.unsynced_count = 0;
|
| ASSERT_EQ(SyncerThread::kDefaultShortPollIntervalSeconds,
|
| - syncer_thread->CalculatePollingWaitTime(
|
| + syncer_thread.CalculatePollingWaitTime(
|
| status,
|
| 4,
|
| &user_idle_milliseconds_param,
|
| @@ -364,67 +295,4 @@
|
| }
|
| }
|
|
|
| -TEST_F(SyncerThreadWithSyncerTest, Polling) {
|
| - SyncShareIntercept interceptor;
|
| - connection()->SetMidCommitObserver(&interceptor);
|
| -
|
| - const TimeDelta poll_interval = TimeDelta::FromSeconds(1);
|
| - syncer_thread()->SetSyncerShortPollInterval(poll_interval);
|
| - EXPECT_TRUE(syncer_thread()->Start());
|
| -
|
| - // Calling Open() should cause the SyncerThread to create a Syncer.
|
| - metadb()->Open();
|
| -
|
| - TimeDelta two_polls = poll_interval + poll_interval;
|
| - // We could theoretically return immediately from the wait if the interceptor
|
| - // was already signaled for a SyncShare (the first one comes quick).
|
| - interceptor.WaitForSyncShare(1, two_polls);
|
| - EXPECT_FALSE(interceptor.times_sync_occured().empty());
|
| -
|
| - // Wait for at least 2 more SyncShare operations.
|
| - interceptor.WaitForSyncShare(2, two_polls);
|
| - EXPECT_TRUE(syncer_thread()->Stop(2000));
|
| -
|
| - // Now analyze the run.
|
| - std::vector<Time> data = interceptor.times_sync_occured();
|
| -
|
| - EXPECT_GE(data.size(), static_cast<unsigned int>(3));
|
| - for (unsigned int i = 0; i < data.size() - 1; i++) {
|
| - Time optimal_next_sync = data[i] + poll_interval;
|
| - // The pthreads impl uses a different time impl and is slightly (~900usecs)
|
| - // off, so this expectation can fail with --syncer-thread-pthreads.
|
| - EXPECT_TRUE(data[i + 1] >= optimal_next_sync)
|
| - << "difference is "
|
| - << (data[i + 1] - optimal_next_sync).InMicroseconds() << " usecs. "
|
| - << "~900usec delta is OK with --syncer-thread-pthreads";
|
| - // This should be reliable, as there are no blocking or I/O operations
|
| - // except the explicit 2 second wait, so if it takes longer than this
|
| - // there is a problem.
|
| - EXPECT_TRUE(data[i + 1] < optimal_next_sync + poll_interval);
|
| - }
|
| -}
|
| -
|
| -TEST_F(SyncerThreadWithSyncerTest, Nudge) {
|
| - SyncShareIntercept interceptor;
|
| - connection()->SetMidCommitObserver(&interceptor);
|
| - // We don't want a poll to happen during this test (except the first one).
|
| - const TimeDelta poll_interval = TimeDelta::FromMinutes(5);
|
| - syncer_thread()->SetSyncerShortPollInterval(poll_interval);
|
| - EXPECT_TRUE(syncer_thread()->Start());
|
| - metadb()->Open();
|
| - interceptor.WaitForSyncShare(1, poll_interval + poll_interval);
|
| -
|
| - EXPECT_EQ(static_cast<unsigned int>(1),
|
| - interceptor.times_sync_occured().size());
|
| - // The SyncerThread should be waiting for the poll now. Nudge it to sync
|
| - // immediately (5ms).
|
| - syncer_thread()->NudgeSyncer(5, SyncerThread::kUnknown);
|
| - interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(1));
|
| - EXPECT_EQ(static_cast<unsigned int>(2),
|
| - interceptor.times_sync_occured().size());
|
| -
|
| - // SyncerThread should be waiting again. Signal it to stop.
|
| - EXPECT_TRUE(syncer_thread()->Stop(2000));
|
| -}
|
| -
|
| } // namespace browser_sync
|
|
|