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