1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/command_line.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/message_loop/message_loop.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/prefs/pref_service.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/test/test_timeouts.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/sync/test/integration/bookmarks_helper.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/sync/test/integration/preferences_helper.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_test.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/pref_names.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/internal_api/public/util/sync_db_util.h"
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "sync/test/fake_server/fake_server_verifier.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "sync/util/time.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using bookmarks_helper::AddFolder;
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using bookmarks_helper::AddURL;
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using bookmarks_helper::GetOtherNode;
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using bookmarks_helper::ModelMatchesVerifier;
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using bookmarks_helper::Move;
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using bookmarks_helper::Remove;
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using sync_integration_test_util::AwaitCommitActivityCompletion;
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kUrl1[] = "http://www.google.com";
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kUrl2[] = "http://map.google.com";
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kUrl3[] = "http://plus.google.com";
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // anonymous namespace
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SingleClientBackupRollbackTest : public SyncTest {
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SingleClientBackupRollbackTest() : SyncTest(SINGLE_CLIENT) {}
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~SingleClientBackupRollbackTest() {}
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void DisableBackup() {
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CommandLine::ForCurrentProcess()->AppendSwitch(
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          switches::kSyncDisableBackup);
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void DisableRollback() {
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          switches::kSyncDisableRollback);
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::Time GetBackupDbLastModified() {
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop run_loop;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::Time backup_time;
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    syncer::CheckSyncDbLastModifiedTime(
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        GetProfile(0)->GetPath().Append(FILE_PATH_LITERAL("Sync Data Backup")),
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::MessageLoopProxy::current(),
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(&SingleClientBackupRollbackTest::CheckDbCallback,
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   base::Unretained(this), &backup_time));
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::MessageLoopProxy::current()->PostTask(
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        FROM_HERE, run_loop.QuitClosure());
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    run_loop.Run();
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return backup_time;
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void CheckDbCallback(base::Time* time_out, base::Time time_in) {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *time_out = syncer::ProtoTimeToTime(syncer::TimeToProtoTime(time_in));
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SingleClientBackupRollbackTest);
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Waits until the ProfileSyncService's backend is in IDLE mode.
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class SyncBackendStoppedChecker : public ProfileSyncServiceBase::Observer {
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  explicit SyncBackendStoppedChecker(ProfileSyncService* service)
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : pss_(service),
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        timeout_(TestTimeouts::action_max_timeout()),
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        done_(false) {}
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void OnStateChanged() OVERRIDE {
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (ProfileSyncService::IDLE == pss_->backend_mode()) {
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      done_ = true;
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      run_loop_.Quit();
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool Wait() {
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    pss_->AddObserver(this);
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (ProfileSyncService::IDLE == pss_->backend_mode())
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return true;
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        FROM_HERE,
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        run_loop_.QuitClosure(),
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        timeout_);
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    run_loop_.Run();
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    pss_->RemoveObserver(this);
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return done_;
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ProfileSyncService* const pss_;
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const base::TimeDelta timeout_;
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::RunLoop run_loop_;
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool done_;
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Waits until a rollback finishes.
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class SyncRollbackChecker : public ProfileSyncServiceBase::Observer,
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                            public BrowsingDataRemover::Observer {
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  explicit SyncRollbackChecker(ProfileSyncService* service)
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      : pss_(service),
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        timeout_(TestTimeouts::action_max_timeout()),
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        rollback_started_(false),
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        clear_done_(false) {}
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // ProfileSyncServiceBase::Observer implementation.
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void OnStateChanged() OVERRIDE {
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (ProfileSyncService::ROLLBACK == pss_->backend_mode()) {
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      rollback_started_ = true;
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      if (clear_done_)
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        run_loop_.Quit();
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // BrowsingDataRemoverObserver::Observer implementation.
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void OnBrowsingDataRemoverDone() OVERRIDE {
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    clear_done_ = true;
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (rollback_started_) {
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      run_loop_.Quit();
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool Wait() {
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    pss_->AddObserver(this);
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    pss_->SetBrowsingDataRemoverObserverForTesting(this);
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        FROM_HERE,
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        run_loop_.QuitClosure(),
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        timeout_);
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    run_loop_.Run();
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    pss_->RemoveObserver(this);
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return rollback_started_ && clear_done_;
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ProfileSyncService* const pss_;
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const base::TimeDelta timeout_;
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::RunLoop run_loop_;
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool rollback_started_;
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool clear_done_;
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(ENABLE_PRE_SYNC_BACKUP)
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestBackup TestBackup
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestBackup DISABLED_TestBackup
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
164116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       MAYBE_TestBackup) {
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Setup sync, wait for its completion, and make sure changes were synced.
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService(0)));
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(ModelMatchesVerifier(0));
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Verify backup DB is created and backup time is set on device info.
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::Time backup_time = GetBackupDbLastModified();
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_FALSE(backup_time.is_null());
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(backup_time, GetSyncService(0)->GetDeviceBackupTimeForTesting());
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PRE_SYNC_BACKUP)
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestBackupDisabled TestBackupDisabled
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestBackupDisabled DISABLED_TestBackupDisabled
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
184116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       MAYBE_TestBackupDisabled) {
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DisableBackup();
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Setup sync, wait for its completion, and make sure changes were synced.
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService(0)));
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ModelMatchesVerifier(0));
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Verify backup DB is not created and backup time is not set on device info.
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_FALSE(base::PathExists(
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetProfile(0)->GetPath().Append(FILE_PATH_LITERAL("Sync Data Backup"))));
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(GetSyncService(0)->GetDeviceBackupTimeForTesting().is_null());
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PRE_SYNC_BACKUP)
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestRollback TestRollback
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestRollback DISABLED_TestRollback
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       MAYBE_TestRollback) {
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Starting state:
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // other_node
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //    -> top
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //      -> tier1_a
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //        -> http://mail.google.com  "tier1_a_url0"
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //      -> tier1_b
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //        -> http://www.nhl.com "tier1_b_url0"
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const BookmarkNode* top = AddFolder(0, GetOtherNode(0), 0, "top");
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const BookmarkNode* tier1_a = AddFolder(0, top, 0, "tier1_a");
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const BookmarkNode* tier1_b = AddFolder(0, top, 1, "tier1_b");
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, tier1_a, 0, "tier1_a_url0",
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     GURL("http://mail.google.com")));
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, tier1_b, 0, "tier1_b_url0",
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     GURL("http://www.nhl.com")));
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Setup sync, wait for its completion, and make sure changes were synced.
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService(0)));
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(ModelMatchesVerifier(0));
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Made bookmark changes while sync is on.
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Move(0, tier1_a->GetChild(0), tier1_b, 1);
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Remove(0, tier1_b, 0);
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(AddFolder(0, tier1_b, 1, "tier2_c"));
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService(0)));
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(ModelMatchesVerifier(0));
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Let server to return rollback command on next sync request.
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GetFakeServer()->TriggerError(sync_pb::SyncEnums::USER_ROLLBACK);
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Make another change to trigger downloading of rollback command.
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Remove(0, tier1_b, 0);
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Wait for rollback to finish and sync backend is completely shut down.
24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SyncRollbackChecker rollback_checker(GetSyncService(0));
24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(rollback_checker.Wait());
24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SyncBackendStoppedChecker shutdown_checker(GetSyncService(0));
24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(shutdown_checker.Wait());
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Verify bookmarks are restored.
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1, tier1_a->child_count());
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const BookmarkNode* url1 = tier1_a->GetChild(0);
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(GURL("http://mail.google.com"), url1->url());
251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(1, tier1_b->child_count());
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const BookmarkNode* url2 = tier1_b->GetChild(0);
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_EQ(GURL("http://www.nhl.com"), url2->url());
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PRE_SYNC_BACKUP)
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestRollbackDisabled TestRollbackDisabled
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestRollbackDisabled DISABLED_TestRollbackDisabled
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
262116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       MAYBE_TestRollbackDisabled) {
2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DisableRollback();
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Starting state:
2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // other_node
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //    -> http://mail.google.com  "url0"
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //    -> http://www.nhl.com "url1"
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 0, "url0",
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     GURL("http://mail.google.com")));
2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 1, "url1",
2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     GURL("http://www.nhl.com")));
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Setup sync, wait for its completion, and make sure changes were synced.
2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService(0)));
2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(ModelMatchesVerifier(0));
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Made bookmark changes while sync is on.
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Remove(0, GetOtherNode(0), 1);
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 1, "url2",
2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     GURL("http://www.yahoo.com")));
2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(ModelMatchesVerifier(0));
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Let server to return rollback command on next sync request.
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  GetFakeServer()->TriggerError(sync_pb::SyncEnums::USER_ROLLBACK);
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Make another change to trigger downloading of rollback command.
2936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Remove(0, GetOtherNode(0), 0);
2946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Wait for sync backend is completely shut down.
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SyncBackendStoppedChecker shutdown_checker(GetSyncService(0));
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(shutdown_checker.Wait());
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // With rollback disabled, bookmarks in backup DB should not be restored.
3006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Only bookmark added during sync is present.
3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(1, GetOtherNode(0)->child_count());
3026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(GURL("http://www.yahoo.com"),
3036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            GetOtherNode(0)->GetChild(0)->url());
3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(ENABLE_PRE_SYNC_BACKUP)
3076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestSyncDisabled TestSyncDisabled
3086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else
3096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MAYBE_TestSyncDisabled DISABLED_TestSyncDisabled
3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       MAYBE_TestSyncDisabled) {
3136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Starting state:
3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // other_node
3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //    -> http://mail.google.com  "url0"
3186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  //    -> http://www.nhl.com "url1"
3196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 0, "url0",
3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     GURL("http://mail.google.com")));
3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 1, "url1",
3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     GURL("http://www.nhl.com")));
3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Setup sync, wait for its completion, and make sure changes were synced.
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
3266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService(0)));
3276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(ModelMatchesVerifier(0));
3286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Made bookmark changes while sync is on.
3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Remove(0, GetOtherNode(0), 1);
3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 1, "url2",
3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     GURL("http://www.yahoo.com")));
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ModelMatchesVerifier(0));
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Let server to return birthday error on next sync request.
3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  GetFakeServer()->TriggerError(sync_pb::SyncEnums::NOT_MY_BIRTHDAY);
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Make another change to trigger downloading of rollback command.
3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Remove(0, GetOtherNode(0), 0);
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Wait sync backend is completely shut down.
34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SyncBackendStoppedChecker shutdown_checker(GetSyncService(0));
34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(shutdown_checker.Wait());
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Shouldn't restore bookmarks with sign-out only.
3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(1, GetOtherNode(0)->child_count());
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ(GURL("http://www.yahoo.com"),
3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            GetOtherNode(0)->GetChild(0)->url());
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PRE_SYNC_BACKUP)
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_RollbackNoBackup RollbackNoBackup
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_RollbackNoBackup DISABLED_RollbackNoBackup
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
357116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       MAYBE_RollbackNoBackup) {
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Starting state:
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // other_node
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //    -> http://mail.google.com  "url0"
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //    -> http://www.nhl.com "url1"
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 0, "url0",
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     GURL("http://mail.google.com")));
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Setup sync, wait for its completion, and make sure changes were synced.
3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(ModelMatchesVerifier(0));
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AddURL(0, GetOtherNode(0), 1, "url1",
3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     GURL("http://www.nhl.com")));
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Delete backup DB.
3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::DeleteFile(
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetProfile(0)->GetPath().Append(FILE_PATH_LITERAL("Sync Data Backup")),
3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true);
3806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Let server to return rollback command on next sync request.
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetFakeServer()->TriggerError(sync_pb::SyncEnums::USER_ROLLBACK);
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Make another change to trigger downloading of rollback command.
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Remove(0, GetOtherNode(0), 0);
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
38703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Wait for rollback to finish and sync backend is completely shut down.
38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SyncRollbackChecker rollback_checker(GetSyncService(0));
38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(rollback_checker.Wait());
39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SyncBackendStoppedChecker checker(GetSyncService(0));
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(checker.Wait());
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Without backup DB, bookmarks remain at the state when sync stops.
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1, GetOtherNode(0)->child_count());
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(GURL("http://www.nhl.com"),
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            GetOtherNode(0)->GetChild(0)->url());
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PRE_SYNC_BACKUP)
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DontChangeBookmarkOrdering DontChangeBookmarkOrdering
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_DontChangeBookmarkOrdering DISABLED_DontChangeBookmarkOrdering
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
404116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(SingleClientBackupRollbackTest,
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       MAYBE_DontChangeBookmarkOrdering) {
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const BookmarkNode* sub_folder = AddFolder(0, GetOtherNode(0), 0, "test");
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(AddURL(0, sub_folder, 0, "", GURL(kUrl1)));
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(AddURL(0, sub_folder, 1, "", GURL(kUrl2)));
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(AddURL(0, sub_folder, 2, "", GURL(kUrl3)));
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Setup sync, wait for its completion, and make sure changes were synced.
4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
4156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService(0)));
4166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(ModelMatchesVerifier(0));
4176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Made bookmark changes while sync is on.
4196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Remove(0, sub_folder, 0);
4206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Remove(0, sub_folder, 0);
4216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService(0)));
4226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(ModelMatchesVerifier(0));
4236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Let server to return rollback command on next sync request.
4256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  GetFakeServer()->TriggerError(sync_pb::SyncEnums::USER_ROLLBACK);
4266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Make another change to trigger downloading of rollback command.
4286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  Remove(0, sub_folder, 0);
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Wait for rollback to finish and sync backend is completely shut down.
43103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SyncRollbackChecker rollback_checker(GetSyncService(0));
43203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(rollback_checker.Wait());
43303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SyncBackendStoppedChecker shutdown_checker(GetSyncService(0));
43403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(shutdown_checker.Wait());
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify bookmarks are unchanged.
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(3, sub_folder->child_count());
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(GURL(kUrl1), sub_folder->GetChild(0)->url());
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(GURL(kUrl2), sub_folder->GetChild(1)->url());
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(GURL(kUrl3), sub_folder->GetChild(2)->url());
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
442