1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/sync/backup_rollback_controller.h"
6
7#include "base/command_line.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/message_loop/message_loop.h"
10#include "base/run_loop.h"
11#include "chrome/browser/sync/supervised_user_signin_manager_wrapper.h"
12#include "chrome/common/chrome_switches.h"
13#include "components/sync_driver/sync_prefs.h"
14#include "testing/gmock/include/gmock/gmock.h"
15#include "testing/gtest/include/gtest/gtest.h"
16
17using ::testing::Return;
18
19namespace {
20
21#if defined(ENABLE_PRE_SYNC_BACKUP)
22
23class MockSigninManagerWrapper : public SupervisedUserSigninManagerWrapper {
24 public:
25  MockSigninManagerWrapper() : SupervisedUserSigninManagerWrapper(NULL, NULL) {}
26
27  MOCK_CONST_METHOD0(GetEffectiveUsername, std::string());
28};
29
30class FakeSyncPrefs : public sync_driver::SyncPrefs {
31 public:
32  FakeSyncPrefs() : rollback_tries_left_(0) {}
33
34  virtual int GetRemainingRollbackTries() const OVERRIDE {
35    return rollback_tries_left_;
36  }
37
38  virtual void SetRemainingRollbackTries(int v) OVERRIDE {
39    rollback_tries_left_ = v;
40  }
41
42 private:
43  int rollback_tries_left_;
44};
45
46class BackupRollbackControllerTest : public testing::Test {
47 public:
48  void ControllerCallback(bool start_backup) {
49    if (start_backup)
50      backup_started_ = true;
51    else
52      rollback_started_ = true;
53  }
54
55 protected:
56  virtual void SetUp() OVERRIDE {
57    backup_started_ = false;
58    rollback_started_ = false;
59
60    EXPECT_CALL(signin_wrapper_, GetEffectiveUsername())
61        .WillRepeatedly(Return(""));
62
63    controller_.reset(new browser_sync::BackupRollbackController(
64        &fake_prefs_, &signin_wrapper_,
65        base::Bind(&BackupRollbackControllerTest::ControllerCallback,
66                   base::Unretained(this), true),
67        base::Bind(&BackupRollbackControllerTest::ControllerCallback,
68                   base::Unretained(this), false)));
69  }
70
71  void PumpLoop() {
72    base::RunLoop run_loop;
73    loop_.PostTask(FROM_HERE, run_loop.QuitClosure());
74    run_loop.Run();
75  }
76
77  MockSigninManagerWrapper signin_wrapper_;
78  FakeSyncPrefs fake_prefs_;
79  scoped_ptr<browser_sync::BackupRollbackController> controller_;
80  bool backup_started_;
81  bool rollback_started_;
82  base::MessageLoop loop_;
83};
84
85TEST_F(BackupRollbackControllerTest, StartBackup) {
86  EXPECT_TRUE(controller_->StartBackup());
87  PumpLoop();
88  EXPECT_TRUE(backup_started_);
89}
90
91TEST_F(BackupRollbackControllerTest, NoBackupIfDisabled) {
92  CommandLine::ForCurrentProcess()->AppendSwitch(
93        switches::kSyncDisableBackup);
94
95  base::RunLoop run_loop;
96  EXPECT_FALSE(controller_->StartBackup());
97  loop_.PostTask(FROM_HERE, run_loop.QuitClosure());
98  run_loop.Run();
99  EXPECT_FALSE(backup_started_);
100}
101
102TEST_F(BackupRollbackControllerTest, StartRollback) {
103  fake_prefs_.SetRemainingRollbackTries(1);
104
105  EXPECT_TRUE(controller_->StartRollback());
106  PumpLoop();
107  EXPECT_TRUE(rollback_started_);
108  EXPECT_EQ(0, fake_prefs_.GetRemainingRollbackTries());
109}
110
111TEST_F(BackupRollbackControllerTest, NoRollbackIfOutOfTries) {
112  fake_prefs_.SetRemainingRollbackTries(0);
113
114  EXPECT_FALSE(controller_->StartRollback());
115  PumpLoop();
116  EXPECT_FALSE(rollback_started_);
117}
118
119TEST_F(BackupRollbackControllerTest, NoRollbackIfUserSignedIn) {
120  fake_prefs_.SetRemainingRollbackTries(1);
121  EXPECT_CALL(signin_wrapper_, GetEffectiveUsername())
122      .Times(1)
123      .WillOnce(Return("test"));
124  EXPECT_FALSE(controller_->StartRollback());
125  EXPECT_EQ(0, fake_prefs_.GetRemainingRollbackTries());
126
127  PumpLoop();
128  EXPECT_FALSE(backup_started_);
129  EXPECT_FALSE(rollback_started_);
130}
131
132TEST_F(BackupRollbackControllerTest, NoRollbackIfDisabled) {
133  fake_prefs_.SetRemainingRollbackTries(1);
134
135  CommandLine::ForCurrentProcess()->AppendSwitch(
136        switches::kSyncDisableRollback);
137  EXPECT_FALSE(controller_->StartRollback());
138  EXPECT_EQ(0, fake_prefs_.GetRemainingRollbackTries());
139
140  PumpLoop();
141  EXPECT_FALSE(rollback_started_);
142}
143
144#endif
145
146}  // anonymous namespace
147
148