blob: 0176cbb118db9ab3f7c2942c76f2825f85bf4f69 [file] [log] [blame]
// Copyright 2014 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/backup_rollback_controller.h"
#include "base/command_line.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "chrome/browser/sync/managed_user_signin_manager_wrapper.h"
#include "chrome/common/chrome_switches.h"
#include "components/sync_driver/sync_prefs.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::Return;
namespace {
#if defined(ENABLE_PRE_SYNC_BACKUP)
class MockSigninManagerWrapper : public ManagedUserSigninManagerWrapper {
public:
MockSigninManagerWrapper() : ManagedUserSigninManagerWrapper(NULL, NULL) {}
MOCK_CONST_METHOD0(GetEffectiveUsername, std::string());
};
class FakeSyncPrefs : public sync_driver::SyncPrefs {
public:
FakeSyncPrefs() : rollback_tries_left_(0) {}
virtual int GetRemainingRollbackTries() const OVERRIDE {
return rollback_tries_left_;
}
virtual void SetRemainingRollbackTries(int v) OVERRIDE {
rollback_tries_left_ = v;
}
private:
int rollback_tries_left_;
};
class BackupRollbackControllerTest : public testing::Test {
public:
void ControllerCallback(bool start_backup) {
if (start_backup)
backup_started_ = true;
else
rollback_started_ = true;
if (need_loop_quit_)
base::MessageLoop::current()->Quit();
}
protected:
virtual void SetUp() OVERRIDE {
backup_started_ = false;
rollback_started_ = false;
need_loop_quit_ = false;
EXPECT_CALL(signin_wrapper_, GetEffectiveUsername())
.WillRepeatedly(Return(""));
controller_.reset(new browser_sync::BackupRollbackController(
&fake_prefs_, &signin_wrapper_,
base::Bind(&BackupRollbackControllerTest::ControllerCallback,
base::Unretained(this), true),
base::Bind(&BackupRollbackControllerTest::ControllerCallback,
base::Unretained(this), false)));
}
MockSigninManagerWrapper signin_wrapper_;
FakeSyncPrefs fake_prefs_;
scoped_ptr<browser_sync::BackupRollbackController> controller_;
bool backup_started_;
bool rollback_started_;
bool need_loop_quit_;
base::MessageLoop loop_;
};
TEST_F(BackupRollbackControllerTest, DelayStart) {
controller_->Start(base::TimeDelta::FromMilliseconds(100));
EXPECT_FALSE(backup_started_);
need_loop_quit_ = true;
base::MessageLoop::current()->Run();
EXPECT_TRUE(backup_started_);
}
TEST_F(BackupRollbackControllerTest, NoDelayStart) {
controller_->Start(base::TimeDelta());
EXPECT_TRUE(backup_started_);
}
TEST_F(BackupRollbackControllerTest, NoStartWithUserSignedIn) {
EXPECT_CALL(signin_wrapper_, GetEffectiveUsername())
.Times(1)
.WillOnce(Return("test"));
controller_->Start(base::TimeDelta());
EXPECT_FALSE(backup_started_);
EXPECT_FALSE(rollback_started_);
}
TEST_F(BackupRollbackControllerTest, StartOnUserSignedOut) {
EXPECT_CALL(signin_wrapper_, GetEffectiveUsername())
.Times(2)
.WillOnce(Return("test"))
.WillOnce(Return(""));
controller_->Start(base::TimeDelta());
EXPECT_FALSE(backup_started_);
EXPECT_FALSE(rollback_started_);
// 2nd time no signed-in user. Starts backup.
controller_->Start(base::TimeDelta());
EXPECT_TRUE(backup_started_);
}
TEST_F(BackupRollbackControllerTest, StartRollback) {
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kSyncEnableRollback);
EXPECT_CALL(signin_wrapper_, GetEffectiveUsername())
.Times(2)
.WillOnce(Return("test"))
.WillOnce(Return(""));
controller_->Start(base::TimeDelta());
EXPECT_FALSE(backup_started_);
EXPECT_FALSE(rollback_started_);
controller_->OnRollbackReceived();
controller_->Start(base::TimeDelta());
EXPECT_TRUE(rollback_started_);
}
TEST_F(BackupRollbackControllerTest, RollbackOnBrowserStart) {
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kSyncEnableRollback);
fake_prefs_.SetRemainingRollbackTries(1);
controller_->Start(base::TimeDelta());
EXPECT_TRUE(rollback_started_);
}
TEST_F(BackupRollbackControllerTest, BackupAfterRollbackDone) {
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kSyncEnableRollback);
fake_prefs_.SetRemainingRollbackTries(3);
controller_->Start(base::TimeDelta());
EXPECT_TRUE(rollback_started_);
EXPECT_FALSE(backup_started_);
controller_->OnRollbackDone();
controller_->Start(base::TimeDelta());
EXPECT_TRUE(backup_started_);
}
TEST_F(BackupRollbackControllerTest, GiveUpRollback) {
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kSyncEnableRollback);
fake_prefs_.SetRemainingRollbackTries(3);
for (int i = 0; i < 3; ++i) {
controller_->Start(base::TimeDelta());
EXPECT_TRUE(rollback_started_);
EXPECT_FALSE(backup_started_);
rollback_started_ = false;
}
controller_->Start(base::TimeDelta());
EXPECT_FALSE(rollback_started_);
EXPECT_TRUE(backup_started_);
}
TEST_F(BackupRollbackControllerTest, SkipRollbackIfNotEnabled) {
EXPECT_CALL(signin_wrapper_, GetEffectiveUsername())
.Times(2)
.WillOnce(Return("test"))
.WillOnce(Return(""));
controller_->Start(base::TimeDelta());
EXPECT_FALSE(backup_started_);
EXPECT_FALSE(rollback_started_);
controller_->OnRollbackReceived();
controller_->Start(base::TimeDelta());
EXPECT_TRUE(backup_started_);
EXPECT_FALSE(rollback_started_);
}
#endif
} // anonymous namespace