10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/internal_api/sync_rollback_manager.h"
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/files/scoped_temp_dir.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/internal_api/public/read_node.h"
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/internal_api/public/read_transaction.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "sync/internal_api/public/sessions/sync_session_snapshot.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/internal_api/public/test/test_internal_components_factory.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/internal_api/public/write_node.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/internal_api/public/write_transaction.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/internal_api/sync_backup_manager.h"
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/syncable/entry.h"
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/test/engine/fake_model_worker.h"
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "sync/test/test_directory_backing_store.h"
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "url/gurl.h"
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing ::testing::_;
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing ::testing::DoDefault;
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing ::testing::Invoke;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using ::testing::Truly;
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing ::testing::WithArgs;
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace syncer {
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass TestChangeDelegate : public SyncManager::ChangeDelegate {
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestChangeDelegate() {
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ON_CALL(*this, OnChangesApplied(_, _, _, _))
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        .WillByDefault(
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            WithArgs<3>(Invoke(this,
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                               &TestChangeDelegate::VerifyDeletes)));
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void add_expected_delete(int64 v) {
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    expected_deletes_.insert(v);
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  MOCK_METHOD4(OnChangesApplied,
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               void(ModelType model_type,
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                    int64 model_version,
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                    const BaseTransaction* trans,
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                    const ImmutableChangeRecordList& changes));
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  MOCK_METHOD1(OnChangesComplete, void(ModelType model_type));
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void VerifyDeletes(const ImmutableChangeRecordList& changes) {
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    std::set<int64> deleted;
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    for (size_t i = 0; i < changes.Get().size(); ++i) {
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const ChangeRecord& change = (changes.Get())[i];
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      EXPECT_EQ(ChangeRecord::ACTION_DELETE, change.action);
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      EXPECT_TRUE(deleted.find(change.id) == deleted.end());
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      deleted.insert(change.id);
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_TRUE(expected_deletes_ == deleted);
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::set<int64> expected_deletes_;
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class SyncRollbackManagerTest : public testing::Test,
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                public SyncManager::Observer {
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected:
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void SetUp() OVERRIDE {
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    CHECK(temp_dir_.CreateUniqueTempDir());
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    worker_ = new FakeModelWorker(GROUP_UI);
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(OnSyncCycleCompleted,
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               void(const sessions::SyncSessionSnapshot&));
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(OnConnectionStatusChange, void(ConnectionStatus));
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD4(OnInitializationComplete,
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               void(const WeakHandle<JsBackend>&,
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    const WeakHandle<DataTypeDebugInfoListener>&,
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    bool, ModelTypeSet));
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(OnActionableError, void(const SyncProtocolError&));
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(OnMigrationRequested, void(ModelTypeSet));;
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(OnProtocolEvent, void(const ProtocolEvent&));
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void OnConfigDone(bool success) {
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_TRUE(success);
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int64 CreateEntry(UserShare* user_share, ModelType type,
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                    const std::string& client_tag) {
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    WriteTransaction trans(FROM_HERE, user_share);
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ReadNode type_root(&trans);
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(BaseNode::INIT_OK, type_root.InitTypeRoot(type));
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    WriteNode node(&trans);
990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(WriteNode::INIT_SUCCESS,
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch              node.InitUniqueByCreation(type, type_root, client_tag));
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return node.GetEntry()->GetMetahandle();
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void InitManager(SyncManager* manager, ModelTypeSet types,
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   TestChangeDelegate* delegate,
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   InternalComponentsFactory::StorageOption storage_option) {
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_ = manager;
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    types_ = types;
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_CALL(*this, OnInitializationComplete(_, _, _, _))
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        .WillOnce(WithArgs<2>(Invoke(this,
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     &SyncRollbackManagerTest::HandleInit)));
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    manager->AddObserver(this);
1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop run_loop;
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SyncManager::InitArgs args;
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    args.database_location = temp_dir_.path();
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    args.service_url = GURL("https://example.com/");
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    args.workers.push_back(worker_);
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    args.change_delegate = delegate;
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    InternalComponentsFactory::StorageOption storage_used;
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    args.internal_components_factory.reset(new TestInternalComponentsFactory(
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        InternalComponentsFactory::Switches(), storage_option, &storage_used));
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    manager->Init(&args);
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(storage_option, storage_used);
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    loop_.PostTask(FROM_HERE, run_loop.QuitClosure());
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    run_loop.Run();
1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Create and persist an entry by unique tag in DB.
1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void PrepopulateDb(ModelType type, const std::string& client_tag) {
1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SyncBackupManager backup_manager;
1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    TestChangeDelegate delegate;
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    InitManager(&backup_manager, ModelTypeSet(type), &delegate,
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                InternalComponentsFactory::STORAGE_ON_DISK_DEFERRED);
1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    CreateEntry(backup_manager.GetUserShare(), type, client_tag);
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    backup_manager.ShutdownOnSyncThread(SWITCH_MODE_SYNC);
1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Verify entry with |client_tag| exists in sync directory.
1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool VerifyEntry(UserShare* user_share, ModelType type,
1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                   const std::string& client_tag) {
1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ReadTransaction trans(FROM_HERE, user_share);
1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ReadNode node(&trans);
1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return BaseNode::INIT_OK == node.InitByClientTagLookup(type, client_tag);
1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ConfigureSyncer() {
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_->ConfigureSyncer(
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          CONFIGURE_REASON_NEW_CLIENT,
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          types_,
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ModelTypeSet(), ModelTypeSet(), ModelTypeSet(),
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ModelSafeRoutingInfo(),
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          base::Bind(&SyncRollbackManagerTest::OnConfigDone,
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     base::Unretained(this), true),
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          base::Bind(&SyncRollbackManagerTest::OnConfigDone,
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     base::Unretained(this), false));
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void HandleInit(bool success) {
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (success) {
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      loop_.PostTask(FROM_HERE,
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     base::Bind(&SyncRollbackManagerTest::ConfigureSyncer,
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                base::Unretained(this)));
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    } else {
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      manager_->ShutdownOnSyncThread(STOP_SYNC);
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  base::ScopedTempDir temp_dir_;
1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<ModelSafeWorker> worker_;
1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  base::MessageLoop loop_;    // Needed for WeakHandle
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SyncManager* manager_;
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ModelTypeSet types_;
1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsRollbackDoneAction(SyncProtocolError e) {
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return e.action == syncer::ROLLBACK_DONE;
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1840529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(SyncRollbackManagerTest, RollbackBasic) {
1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  PrepopulateDb(PREFERENCES, "pref1");
1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestChangeDelegate delegate;
1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SyncRollbackManager rollback_manager;
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InitManager(&rollback_manager, ModelTypeSet(PREFERENCES), &delegate,
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              InternalComponentsFactory::STORAGE_ON_DISK);
1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Simulate a new entry added during type initialization.
1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int64 new_pref_id =
1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      CreateEntry(rollback_manager.GetUserShare(), PREFERENCES, "pref2");
1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  delegate.add_expected_delete(new_pref_id);
1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(delegate, OnChangesApplied(_, _, _, _))
1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      .Times(1)
1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      .WillOnce(DoDefault());
2000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(delegate, OnChangesComplete(_)).Times(1);
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(*this, OnActionableError(Truly(IsRollbackDoneAction))).Times(1);
2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ModelSafeRoutingInfo routing_info;
2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  routing_info[PREFERENCES] = GROUP_UI;
2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rollback_manager.StartSyncingNormally(routing_info);
2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2080529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(SyncRollbackManagerTest, NoRollbackOfTypesNotBackedUp) {
2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  PrepopulateDb(PREFERENCES, "pref1");
2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestChangeDelegate delegate;
2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  SyncRollbackManager rollback_manager;
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InitManager(&rollback_manager, ModelTypeSet(PREFERENCES, APPS), &delegate,
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              InternalComponentsFactory::STORAGE_ON_DISK);
2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Simulate new entry added during type initialization.
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int64 new_pref_id =
2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      CreateEntry(rollback_manager.GetUserShare(), PREFERENCES, "pref2");
2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CreateEntry(rollback_manager.GetUserShare(), APPS, "app1");
2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  delegate.add_expected_delete(new_pref_id);
2220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(delegate, OnChangesApplied(_, _, _, _))
2230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      .Times(1)
2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      .WillOnce(DoDefault());
2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(delegate, OnChangesComplete(_)).Times(1);
2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ModelSafeRoutingInfo routing_info;
2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  routing_info[PREFERENCES] = GROUP_UI;
2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rollback_manager.StartSyncingNormally(routing_info);
2300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // APP entry is still valid.
2320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(VerifyEntry(rollback_manager.GetUserShare(), APPS, "app1"));
2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2350529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(SyncRollbackManagerTest, BackupDbNotChangedOnAbort) {
2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  PrepopulateDb(PREFERENCES, "pref1");
2370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestChangeDelegate delegate;
2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<SyncRollbackManager> rollback_manager(
2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new SyncRollbackManager);
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate,
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              InternalComponentsFactory::STORAGE_ON_DISK);
2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Simulate a new entry added during type initialization.
2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CreateEntry(rollback_manager->GetUserShare(), PREFERENCES, "pref2");
2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Manager was shut down before sync starts.
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  rollback_manager->ShutdownOnSyncThread(STOP_SYNC);
2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Verify new entry was not persisted.
2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rollback_manager.reset(new SyncRollbackManager);
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), &delegate,
2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              InternalComponentsFactory::STORAGE_ON_DISK);
2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(VerifyEntry(rollback_manager->GetUserShare(), PREFERENCES,
2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                           "pref2"));
2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
258116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SyncRollbackManagerTest, OnInitializationFailure) {
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Test graceful shutdown on initialization failure.
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<SyncRollbackManager> rollback_manager(
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new SyncRollbackManager);
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InitManager(rollback_manager.get(), ModelTypeSet(PREFERENCES), NULL,
2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              InternalComponentsFactory::STORAGE_ON_DISK);
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // anonymous namespace
2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace syncer
269