// 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

