14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/dom_distiller/core/dom_distiller_store.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/message_loop/message_loop.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/time/time.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/dom_distiller/core/article_entry.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/dom_distiller/core/dom_distiller_test_util.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/leveldb_proto/testing/fake_db.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "sync/api/attachments/attachment_id.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "sync/protocol/sync.pb.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using base::Time;
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using leveldb_proto::test::FakeDB;
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using sync_pb::EntitySpecifics;
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using syncer::ModelType;
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using syncer::SyncChange;
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using syncer::SyncChangeList;
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using syncer::SyncChangeProcessor;
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using syncer::SyncData;
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using syncer::SyncDataList;
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using syncer::SyncError;
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using syncer::SyncErrorFactory;
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::AssertionFailure;
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::AssertionResult;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::AssertionSuccess;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace dom_distiller {
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace {
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const ModelType kDomDistillerModelType = syncer::ARTICLES;
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)typedef base::hash_map<std::string, ArticleEntry> EntryMap;
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AddEntry(const ArticleEntry& e, EntryMap* map) {
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  (*map)[e.entry_id()] = e;
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class FakeSyncErrorFactory : public syncer::SyncErrorFactory {
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual syncer::SyncError CreateAndUploadError(
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const tracked_objects::Location& location,
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const std::string& message) OVERRIDE {
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return syncer::SyncError();
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class FakeSyncChangeProcessor : public syncer::SyncChangeProcessor {
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit FakeSyncChangeProcessor(EntryMap* model) : model_(model) {}
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual syncer::SyncDataList GetAllSyncData(
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      syncer::ModelType type) const OVERRIDE {
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ADD_FAILURE() << "FakeSyncChangeProcessor::GetAllSyncData not implemented.";
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return syncer::SyncDataList();
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual SyncError ProcessSyncChanges(
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const tracked_objects::Location&,
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const syncer::SyncChangeList& changes) OVERRIDE {
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (SyncChangeList::const_iterator it = changes.begin();
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         it != changes.end(); ++it) {
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      AddEntry(GetEntryFromChange(*it), model_);
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return SyncError();
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap* model_;
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ArticleEntry CreateEntry(std::string entry_id, std::string page_url1,
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         std::string page_url2, std::string page_url3) {
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ArticleEntry entry;
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  entry.set_entry_id(entry_id);
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!page_url1.empty()) {
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ArticleEntryPage* page = entry.add_pages();
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    page->set_url(page_url1);
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!page_url2.empty()) {
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ArticleEntryPage* page = entry.add_pages();
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    page->set_url(page_url2);
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!page_url3.empty()) {
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ArticleEntryPage* page = entry.add_pages();
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    page->set_url(page_url3);
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return entry;
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ArticleEntry GetSampleEntry(int id) {
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static ArticleEntry entries[] = {
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateEntry("entry0", "example.com/1", "example.com/2", "example.com/3"),
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateEntry("entry1", "example.com/1", "", ""),
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateEntry("entry2", "example.com/p1", "example.com/p2", ""),
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateEntry("entry3", "example.com/something/all", "", ""),
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateEntry("entry4", "example.com/somethingelse/1", "", ""),
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateEntry("entry5", "rock.example.com/p1", "rock.example.com/p2", ""),
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateEntry("entry7", "example.com/entry7/1", "example.com/entry7/2", ""),
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      CreateEntry("entry8", "example.com/entry8/1", "", ""),
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      CreateEntry("entry9", "example.com/entry9/all", "", ""),
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_LT(id, 9);
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return entries[id % 9];
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockDistillerObserver : public DomDistillerObserver {
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD1(ArticleEntriesUpdated, void(const std::vector<ArticleUpdate>&));
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~MockDistillerObserver() {}
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class DomDistillerStoreTest : public testing::Test {
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUp() {
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    db_model_.clear();
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    sync_model_.clear();
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    store_model_.clear();
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    next_sync_id_ = 1;
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void TearDown() {
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    store_.reset();
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fake_db_ = NULL;
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fake_sync_processor_ = NULL;
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Creates a simple DomDistillerStore initialized with |store_model_| and
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // with a FakeDB backed by |db_model_|.
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CreateStore() {
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    fake_db_ = new FakeDB<ArticleEntry>(&db_model_);
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    store_.reset(test::util::CreateStoreWithFakeDB(fake_db_, store_model_));
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void StartSyncing() {
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    fake_sync_processor_ = new FakeSyncChangeProcessor(&sync_model_);
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    store_->MergeDataAndStartSyncing(
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        kDomDistillerModelType, SyncDataFromEntryMap(sync_model_),
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        make_scoped_ptr<SyncChangeProcessor>(fake_sync_processor_),
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        scoped_ptr<SyncErrorFactory>(new FakeSyncErrorFactory()));
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SyncData CreateSyncData(const ArticleEntry& entry) {
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EntitySpecifics specifics = SpecificsFromEntry(entry);
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return SyncData::CreateRemoteData(
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        next_sync_id_++, specifics, Time::UnixEpoch(),
161a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        syncer::AttachmentIdList(),
162a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        syncer::AttachmentServiceProxyForTest::Create());
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SyncDataList SyncDataFromEntryMap(const EntryMap& model) {
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SyncDataList data;
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (EntryMap::const_iterator it = model.begin(); it != model.end(); ++it) {
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      data.push_back(CreateSyncData(it->second));
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return data;
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::MessageLoop message_loop_;
174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap db_model_;
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap sync_model_;
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  FakeDB<ArticleEntry>::EntryMap store_model_;
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<DomDistillerStore> store_;
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Both owned by |store_|.
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  FakeDB<ArticleEntry>* fake_db_;
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeSyncChangeProcessor* fake_sync_processor_;
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int64 next_sync_id_;
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)AssertionResult AreEntriesEqual(const DomDistillerStore::EntryVector& entries,
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                EntryMap expected_entries) {
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (entries.size() != expected_entries.size())
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return AssertionFailure() << "Expected " << expected_entries.size()
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                              << " entries but found " << entries.size();
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (DomDistillerStore::EntryVector::const_iterator it = entries.begin();
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       it != entries.end(); ++it) {
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EntryMap::iterator expected_it = expected_entries.find(it->entry_id());
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (expected_it == expected_entries.end()) {
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return AssertionFailure() << "Found unexpected entry with id <"
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                << it->entry_id() << ">";
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!AreEntriesEqual(expected_it->second, *it)) {
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return AssertionFailure() << "Mismatched entry with id <"
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                << it->entry_id() << ">";
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    expected_entries.erase(expected_it);
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return AssertionSuccess();
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)AssertionResult AreEntryMapsEqual(const EntryMap& left, const EntryMap& right) {
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DomDistillerStore::EntryVector entries;
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (EntryMap::const_iterator it = left.begin(); it != left.end(); ++it) {
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    entries.push_back(it->second);
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return AreEntriesEqual(entries, right);
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DomDistillerStoreTest, TestDatabaseLoad) {
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(0), &db_model_);
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(1), &db_model_);
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &db_model_);
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CreateStore();
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->InitCallback(true);
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(fake_db_->GetDirectory(),
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            FakeDB<ArticleEntry>::DirectoryForTestDB());
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->LoadCallback(true);
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), db_model_));
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DomDistillerStoreTest, TestDatabaseLoadMerge) {
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(0), &db_model_);
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(1), &db_model_);
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &db_model_);
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &store_model_);
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &store_model_);
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(4), &store_model_);
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap expected_model(db_model_);
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &expected_model);
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(4), &expected_model);
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CreateStore();
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->InitCallback(true);
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->LoadCallback(true);
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model));
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(DomDistillerStoreTest, TestAddAndRemoveEntry) {
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CreateStore();
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->InitCallback(true);
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->LoadCallback(true);
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(store_->GetEntries().empty());
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(db_model_.empty());
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  store_->AddEntry(GetSampleEntry(0));
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap expected_model;
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(0), &expected_model);
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model));
269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  store_->RemoveEntry(GetSampleEntry(0));
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_model.clear();
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model));
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DomDistillerStoreTest, TestAddAndUpdateEntry) {
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateStore();
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fake_db_->InitCallback(true);
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fake_db_->LoadCallback(true);
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(store_->GetEntries().empty());
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(db_model_.empty());
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_->AddEntry(GetSampleEntry(0));
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EntryMap expected_model;
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddEntry(GetSampleEntry(0), &expected_model);
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model));
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(store_->UpdateEntry(GetSampleEntry(0)));
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ArticleEntry updated_entry(GetSampleEntry(0));
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  updated_entry.set_title("updated title.");
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(store_->UpdateEntry(updated_entry));
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  expected_model.clear();
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddEntry(updated_entry, &expected_model);
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model));
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  store_->RemoveEntry(updated_entry);
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(store_->UpdateEntry(updated_entry));
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(store_->UpdateEntry(GetSampleEntry(0)));
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DomDistillerStoreTest, TestSyncMergeWithEmptyDatabase) {
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(0), &sync_model_);
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(1), &sync_model_);
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &sync_model_);
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CreateStore();
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->InitCallback(true);
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->LoadCallback(true);
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartSyncing();
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), sync_model_));
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(db_model_, sync_model_));
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DomDistillerStoreTest, TestSyncMergeAfterDatabaseLoad) {
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(0), &db_model_);
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(1), &db_model_);
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &db_model_);
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &sync_model_);
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &sync_model_);
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(4), &sync_model_);
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap expected_model(db_model_);
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &expected_model);
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(4), &expected_model);
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CreateStore();
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->InitCallback(true);
3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->LoadCallback(true);
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), db_model_));
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartSyncing();
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model));
3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(sync_model_, expected_model));
3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DomDistillerStoreTest, TestGetAllSyncData) {
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(0), &db_model_);
3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(1), &db_model_);
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &db_model_);
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &sync_model_);
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &sync_model_);
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(4), &sync_model_);
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap expected_model(db_model_);
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &expected_model);
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(4), &expected_model);
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CreateStore();
3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->InitCallback(true);
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->LoadCallback(true);
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartSyncing();
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SyncDataList data = store_->GetAllSyncData(kDomDistillerModelType);
371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DomDistillerStore::EntryVector entries;
3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (SyncDataList::iterator it = data.begin(); it != data.end(); ++it) {
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    entries.push_back(EntryFromSpecifics(it->GetSpecifics()));
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(entries, expected_model));
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DomDistillerStoreTest, TestProcessSyncChanges) {
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(0), &db_model_);
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(1), &db_model_);
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_model_ = db_model_;
3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap expected_model(db_model_);
3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &expected_model);
3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &expected_model);
3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CreateStore();
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->InitCallback(true);
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->LoadCallback(true);
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  StartSyncing();
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SyncChangeList changes;
395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  changes.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_ADD,
396f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               CreateSyncData(GetSampleEntry(2))));
397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  changes.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_ADD,
398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               CreateSyncData(GetSampleEntry(3))));
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  store_->ProcessSyncChanges(FROM_HERE, changes);
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model));
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(DomDistillerStoreTest, TestSyncMergeWithSecondDomDistillerStore) {
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(0), &db_model_);
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(1), &db_model_);
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &db_model_);
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap other_db_model;
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(2), &other_db_model);
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &other_db_model);
4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(4), &other_db_model);
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EntryMap expected_model(db_model_);
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(3), &expected_model);
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddEntry(GetSampleEntry(4), &expected_model);
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CreateStore();
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->InitCallback(true);
4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fake_db_->LoadCallback(true);
4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  FakeDB<ArticleEntry>* other_fake_db =
426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new FakeDB<ArticleEntry>(&other_db_model);
4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<DomDistillerStore> owned_other_store(new DomDistillerStore(
428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<leveldb_proto::ProtoDatabase<ArticleEntry> >(other_fake_db),
4291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      std::vector<ArticleEntry>(),
4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("/fake/other/path"))));
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DomDistillerStore* other_store = owned_other_store.get();
4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  other_fake_db->InitCallback(true);
4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  other_fake_db->LoadCallback(true);
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(AreEntriesEqual(store_->GetEntries(), expected_model));
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(AreEntriesEqual(other_store->GetEntries(), expected_model));
4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(AreEntriesEqual(other_store->GetEntries(), other_db_model));
4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FakeSyncErrorFactory* other_error_factory = new FakeSyncErrorFactory();
4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  store_->MergeDataAndStartSyncing(
441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kDomDistillerModelType, SyncDataFromEntryMap(other_db_model),
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      owned_other_store.PassAs<SyncChangeProcessor>(),
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      make_scoped_ptr<SyncErrorFactory>(other_error_factory));
4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(AreEntriesEqual(other_store->GetEntries(), expected_model));
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(DomDistillerStoreTest, TestObserver) {
450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CreateStore();
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockDistillerObserver observer;
452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  store_->AddObserver(&observer);
453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  fake_db_->InitCallback(true);
454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  fake_db_->LoadCallback(true);
455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<DomDistillerObserver::ArticleUpdate> expected_updates;
456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DomDistillerObserver::ArticleUpdate update;
457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.entry_id = GetSampleEntry(0).entry_id();
458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.update_type = DomDistillerObserver::ArticleUpdate::ADD;
459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.push_back(update);
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(observer, ArticleEntriesUpdated(
461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            test::util::HasExpectedUpdates(expected_updates)));
462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  store_->AddEntry(GetSampleEntry(0));
463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.clear();
465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.entry_id = GetSampleEntry(1).entry_id();
466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.update_type = DomDistillerObserver::ArticleUpdate::ADD;
467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.push_back(update);
468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(observer, ArticleEntriesUpdated(
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            test::util::HasExpectedUpdates(expected_updates)));
470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  store_->AddEntry(GetSampleEntry(1));
471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.clear();
473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.entry_id = GetSampleEntry(0).entry_id();
474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.update_type = DomDistillerObserver::ArticleUpdate::REMOVE;
475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.clear();
476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.push_back(update);
477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(observer, ArticleEntriesUpdated(
478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            test::util::HasExpectedUpdates(expected_updates)));
479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  store_->RemoveEntry(GetSampleEntry(0));
480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Add entry_id = 3 and update entry_id = 1.
482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.clear();
483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SyncDataList change_data;
484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  change_data.push_back(CreateSyncData(GetSampleEntry(3)));
485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ArticleEntry updated_entry(GetSampleEntry(1));
486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  updated_entry.set_title("changed_title");
487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  change_data.push_back(CreateSyncData(updated_entry));
488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.entry_id = GetSampleEntry(3).entry_id();
489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.update_type = DomDistillerObserver::ArticleUpdate::ADD;
490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.push_back(update);
491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.entry_id = GetSampleEntry(1).entry_id();
492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  update.update_type = DomDistillerObserver::ArticleUpdate::UPDATE;
493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  expected_updates.push_back(update);
494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_CALL(observer, ArticleEntriesUpdated(
495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            test::util::HasExpectedUpdates(expected_updates)));
496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FakeSyncErrorFactory* fake_error_factory = new FakeSyncErrorFactory();
498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EntryMap fake_model;
499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FakeSyncChangeProcessor* fake_sync_change_processor =
500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new FakeSyncChangeProcessor(&fake_model);
501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  store_->MergeDataAndStartSyncing(
502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kDomDistillerModelType, change_data,
503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      make_scoped_ptr<SyncChangeProcessor>(fake_sync_change_processor),
504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      make_scoped_ptr<SyncErrorFactory>(fake_error_factory));
505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace dom_distiller
508