summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/sessions/sync_session_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/sessions/sync_session_unittest.cc')
-rw-r--r--chrome/browser/sync/sessions/sync_session_unittest.cc167
1 files changed, 167 insertions, 0 deletions
diff --git a/chrome/browser/sync/sessions/sync_session_unittest.cc b/chrome/browser/sync/sessions/sync_session_unittest.cc
new file mode 100644
index 0000000..e2a3c12
--- /dev/null
+++ b/chrome/browser/sync/sessions/sync_session_unittest.cc
@@ -0,0 +1,167 @@
+// 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 "chrome/browser/sync/sessions/sync_session.h"
+
+#include "chrome/browser/sync/engine/conflict_resolver.h"
+#include "chrome/browser/sync/engine/syncer_types.h"
+#include "chrome/browser/sync/engine/syncer_util.h"
+#include "chrome/browser/sync/syncable/directory_manager.h"
+#include "chrome/browser/sync/syncable/syncable.h"
+#include "chrome/test/sync/engine/test_directory_setter_upper.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using syncable::WriteTransaction;
+
+namespace browser_sync {
+namespace sessions {
+namespace {
+
+class SyncSessionTest : public testing::Test,
+ public SyncSession::Delegate {
+ public:
+ SyncSessionTest() : controller_invocations_allowed_(false) {}
+ virtual void SetUp() {
+ context_.reset(new SyncSessionContext(NULL, NULL, NULL));
+ session_.reset(new SyncSession(context_.get(), this));
+ }
+ virtual void TearDown() {
+ session_.reset();
+ context_.reset();
+ }
+
+ virtual void OnSilencedUntil(const base::TimeTicks& silenced_until) {
+ FailControllerInvocationIfDisabled("OnSilencedUntil");
+ }
+ virtual bool IsSyncingCurrentlySilenced() {
+ FailControllerInvocationIfDisabled("IsSyncingCurrentlySilenced");
+ return false;
+ }
+ virtual void OnReceivedLongPollIntervalUpdate(
+ const base::TimeDelta& new_interval) {
+ FailControllerInvocationIfDisabled("OnReceivedLongPollIntervalUpdate");
+ }
+ virtual void OnReceivedShortPollIntervalUpdate(
+ const base::TimeDelta& new_interval) {
+ FailControllerInvocationIfDisabled("OnReceivedShortPollIntervalUpdate");
+ }
+
+ StatusController* status() { return session_->status_controller(); }
+ protected:
+ void FailControllerInvocationIfDisabled(const std::string& msg) {
+ if (!controller_invocations_allowed_)
+ FAIL() << msg;
+ }
+ bool controller_invocations_allowed_;
+ scoped_ptr<SyncSession> session_;
+ scoped_ptr<SyncSessionContext> context_;
+};
+
+TEST_F(SyncSessionTest, ScopedContextHelpers) {
+ ConflictResolver resolver;
+ SyncerEventChannel* channel = new SyncerEventChannel(
+ SyncerEvent(SyncerEvent::SHUTDOWN_USE_WITH_CARE));
+ EXPECT_FALSE(context_->resolver());
+ EXPECT_FALSE(context_->syncer_event_channel());
+ {
+ ScopedSessionContextConflictResolver s_resolver(context_.get(), &resolver);
+ ScopedSessionContextSyncerEventChannel s_channel(context_.get(), channel);
+ EXPECT_EQ(&resolver, context_->resolver());
+ EXPECT_EQ(channel, context_->syncer_event_channel());
+ }
+ EXPECT_FALSE(context_->resolver());
+ EXPECT_FALSE(context_->syncer_event_channel());
+}
+
+TEST_F(SyncSessionTest, SetWriteTransaction) {
+ TestDirectorySetterUpper db;
+ db.SetUp();
+ session_.reset(NULL);
+ context_.reset(new SyncSessionContext(NULL, db.manager(), NULL));
+ session_.reset(new SyncSession(context_.get(), this));
+ context_->set_account_name(db.name());
+ syncable::ScopedDirLookup dir(context_->directory_manager(),
+ context_->account_name());
+ ASSERT_TRUE(dir.good());
+
+ SyncSession session(context_.get(), this);
+ EXPECT_TRUE(NULL == session.write_transaction());
+ {
+ WriteTransaction trans(dir, syncable::UNITTEST, __FILE__, __LINE__);
+ sessions::ScopedSetSessionWriteTransaction set_trans(&session, &trans);
+ EXPECT_TRUE(&trans == session.write_transaction());
+ }
+ db.TearDown();
+}
+
+TEST_F(SyncSessionTest, MoreToSyncIfUnsyncedGreaterThanCommitted) {
+ // If any forward progress was made during the session, and the number of
+ // unsynced handles still exceeds the number of commit ids we added, there is
+ // more to sync. For example, this occurs if we had more commit ids
+ // than could fit in a single commit batch.
+ EXPECT_FALSE(session_->HasMoreToSync());
+ std::vector<syncable::Id> commit_ids;
+ commit_ids.push_back(syncable::Id());
+ status()->set_commit_ids(commit_ids);
+ EXPECT_FALSE(session_->HasMoreToSync());
+
+ std::vector<int64> unsynced_handles;
+ unsynced_handles.push_back(1);
+ unsynced_handles.push_back(2);
+ status()->set_unsynced_handles(unsynced_handles);
+ EXPECT_FALSE(session_->HasMoreToSync());
+ status()->increment_num_successful_commits();
+ EXPECT_TRUE(session_->HasMoreToSync());
+ status()->ResetTransientState();
+ EXPECT_FALSE(session_->HasMoreToSync());
+}
+
+TEST_F(SyncSessionTest, MoreToSyncIfConflictSetsBuilt) {
+ // If we built conflict sets, then we need to loop back and try
+ // to get updates & commit again.
+ status()->set_conflict_sets_built(true);
+ EXPECT_TRUE(session_->HasMoreToSync());
+ status()->ResetTransientState();
+ EXPECT_FALSE(session_->HasMoreToSync());
+}
+
+TEST_F(SyncSessionTest, MoreToSyncIfDidNotGetZeroUpdates) {
+ // We're not done getting updates until we get an empty response.
+ ClientToServerResponse response;
+ response.mutable_get_updates()->add_entries();
+ status()->mutable_updates_response()->CopyFrom(response);
+ EXPECT_TRUE(session_->HasMoreToSync());
+ status()->mutable_updates_response()->Clear();
+ EXPECT_FALSE(session_->HasMoreToSync());
+ status()->mutable_updates_response()->CopyFrom(response);
+ EXPECT_TRUE(session_->HasMoreToSync());
+ status()->ResetTransientState();
+ EXPECT_FALSE(session_->HasMoreToSync());
+}
+
+TEST_F(SyncSessionTest, MoreToSyncIfConflictsResolved) {
+ // Conflict resolution happens after get updates and commit,
+ // so we need to loop back and get updates / commit again now
+ // that we have made forward progress.
+ status()->set_conflicts_resolved(true);
+ EXPECT_TRUE(session_->HasMoreToSync());
+ status()->ResetTransientState();
+ EXPECT_FALSE(session_->HasMoreToSync());
+}
+
+TEST_F(SyncSessionTest, MoreToSyncIfTimestampDirty) {
+ // If there are more changes on the server that weren't processed during this
+ // GetUpdates request, the client should send another GetUpdates request and
+ // use new_timestamp as the from_timestamp value within GetUpdatesMessage.
+ status()->set_timestamp_dirty(true);
+ status()->set_conflicts_resolved(true);
+ EXPECT_TRUE(session_->HasMoreToSync());
+ status()->ResetTransientState();
+ EXPECT_FALSE(session_->HasMoreToSync());
+}
+
+
+} // namespace
+} // namespace sessions
+} // namespace browser_sync