Index: chrome/browser/extensions/app_notification_manager_sync_unittest.cc |
diff --git a/chrome/browser/extensions/app_notification_manager_sync_unittest.cc b/chrome/browser/extensions/app_notification_manager_sync_unittest.cc |
deleted file mode 100644 |
index c5f1d63203395a6ebcf349e667ee51826a849cdb..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/app_notification_manager_sync_unittest.cc |
+++ /dev/null |
@@ -1,759 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/bind.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/message_loop.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "chrome/browser/extensions/app_notification.h" |
-#include "chrome/browser/extensions/app_notification_manager.h" |
-#include "chrome/test/base/testing_profile.h" |
-#include "content/public/test/test_browser_thread.h" |
-#include "sync/api/sync_error_factory.h" |
-#include "sync/api/sync_error_factory_mock.h" |
-#include "sync/protocol/app_notification_specifics.pb.h" |
-#include "sync/protocol/sync.pb.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using content::BrowserThread; |
-using ::testing::_; |
-using ::testing::Return; |
- |
-namespace { |
- |
-// Extract notification guid from syncer::SyncData. |
-std::string GetGuid(const syncer::SyncData& sync_data) { |
- return sync_data.GetSpecifics().app_notification().guid(); |
-} |
- |
-// Dummy SyncChangeProcessor used to help review what SyncChanges are pushed |
-// back up to Sync. |
-class TestChangeProcessor : public syncer::SyncChangeProcessor { |
- public: |
- TestChangeProcessor() { } |
- virtual ~TestChangeProcessor() { } |
- |
- // Store a copy of all the changes passed in so we can examine them later. |
- virtual syncer::SyncError ProcessSyncChanges( |
- const tracked_objects::Location& from_here, |
- const syncer::SyncChangeList& change_list) OVERRIDE { |
- // change_map_.erase(change_map_.begin(), change_map_.end()); |
- for (syncer::SyncChangeList::const_iterator iter = change_list.begin(); |
- iter != change_list.end(); ++iter) { |
- change_map_[GetGuid(iter->sync_data())] = *iter; |
- } |
- |
- return syncer::SyncError(); |
- } |
- |
- bool ContainsGuid(const std::string& guid) { |
- return change_map_.find(guid) != change_map_.end(); |
- } |
- |
- syncer::SyncChange GetChangeByGuid(const std::string& guid) { |
- DCHECK(ContainsGuid(guid)); |
- return change_map_[guid]; |
- } |
- |
- size_t change_list_size() { return change_map_.size(); } |
- |
- private: |
- // Track the changes received in ProcessSyncChanges. |
- std::map<std::string, syncer::SyncChange> change_map_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestChangeProcessor); |
-}; |
- |
-class SyncChangeProcessorDelegate : public syncer::SyncChangeProcessor { |
- public: |
- explicit SyncChangeProcessorDelegate(syncer::SyncChangeProcessor* recipient) |
- : recipient_(recipient) { |
- DCHECK(recipient_); |
- } |
- virtual ~SyncChangeProcessorDelegate() {} |
- |
- // syncer::SyncChangeProcessor implementation. |
- virtual syncer::SyncError ProcessSyncChanges( |
- const tracked_objects::Location& from_here, |
- const syncer::SyncChangeList& change_list) OVERRIDE { |
- return recipient_->ProcessSyncChanges(from_here, change_list); |
- } |
- |
- private: |
- // The recipient of all sync changes. |
- syncer::SyncChangeProcessor* recipient_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SyncChangeProcessorDelegate); |
-}; |
- |
-} // namespace |
- |
-namespace extensions { |
- |
-class AppNotificationManagerSyncTest : public testing::Test { |
- public: |
- AppNotificationManagerSyncTest() |
- : ui_thread_(BrowserThread::UI, &ui_loop_), |
- file_thread_(BrowserThread::FILE), |
- sync_processor_(new TestChangeProcessor), |
- sync_processor_delegate_(new SyncChangeProcessorDelegate( |
- sync_processor_.get())) {} |
- |
- virtual ~AppNotificationManagerSyncTest() { |
- model_ = NULL; |
- } |
- |
- virtual void SetUp() { |
- ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- file_thread_.Start(); |
- |
- ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
- profile_.reset(new TestingProfile(temp_dir_.path())); |
- model_ = new AppNotificationManager(profile_.get()); |
- model_->Init(); |
- |
- WaitForFileThread(); |
- ASSERT_TRUE(model_->loaded()); |
- } |
- |
- virtual void TearDown() { |
- WaitForFileThread(); |
- } |
- |
- static void PostQuitToUIThread() { |
- BrowserThread::PostTask(BrowserThread::UI, |
- FROM_HERE, |
- MessageLoop::QuitClosure()); |
- } |
- |
- static void WaitForFileThread() { |
- BrowserThread::PostTask(BrowserThread::FILE, |
- FROM_HERE, |
- base::Bind(&PostQuitToUIThread)); |
- MessageLoop::current()->Run(); |
- } |
- |
- AppNotificationManager* model() { return model_.get(); } |
- TestChangeProcessor* processor() { return sync_processor_.get(); } |
- |
- scoped_ptr<syncer::SyncChangeProcessor> PassProcessor() { |
- return sync_processor_delegate_.PassAs<syncer::SyncChangeProcessor>(); |
- } |
- |
- // Creates a notification whose properties are set from the given integer. |
- static AppNotification* CreateNotification(int suffix) { |
- return CreateNotification(false, suffix); |
- } |
- static AppNotification* CreateNotification(bool is_local, int suffix) { |
- std::string s = base::IntToString(suffix); |
- return CreateNotification( |
- is_local, suffix, "guid" + s, "ext" + s, "text" + s, "body" + s, |
- "http://www.url" + s + ".com", "link text " + s); |
- } |
- static AppNotification* CreateNotification( |
- bool is_local, int suffix, const std::string& extension_id) { |
- std::string s = base::IntToString(suffix); |
- return CreateNotification( |
- is_local, suffix, "guid" + s, extension_id, "text" + s, "body" + s, |
- "http://www.url" + s + ".com", "link text " + s); |
- } |
- |
- // Creates a notification whose properties are set from the given integer |
- // but does not set link url and link text. |
- static AppNotification* CreateNotificationNoLink(int suffix) { |
- return CreateNotificationNoLink(false, suffix); |
- } |
- static AppNotification* CreateNotificationNoLink(bool is_local, int suffix) { |
- std::string s = base::IntToString(suffix); |
- return CreateNotification( |
- is_local, suffix, |
- "guid" + s, "ext" + s, "text" + s, "body" + s, "", ""); |
- } |
- |
- // link_url and link_text are only set if the passed in values are not empty. |
- static AppNotification* CreateNotification(bool is_local, |
- int64 time, |
- const std::string& guid, |
- const std::string& extension_id, |
- const std::string& title, |
- const std::string& body, |
- const std::string& link_url, |
- const std::string& link_text) { |
- AppNotification* notif = new AppNotification( |
- is_local, base::Time::FromInternalValue(time), |
- guid, extension_id, title, body); |
- if (!link_url.empty()) |
- notif->set_link_url(GURL(link_url)); |
- if (!link_text.empty()) |
- notif->set_link_text(link_text); |
- return notif; |
- } |
- |
- static syncer::SyncData CreateSyncData(int suffix) { |
- scoped_ptr<AppNotification> notif(CreateNotification(suffix)); |
- return AppNotificationManager::CreateSyncDataFromNotification(*notif); |
- } |
- static syncer::SyncData CreateSyncData( |
- int suffix, const std::string& extension_id) { |
- scoped_ptr<AppNotification> notif( |
- CreateNotification(false, suffix, extension_id)); |
- return AppNotificationManager::CreateSyncDataFromNotification(*notif); |
- } |
- |
- // Helper to create syncer::SyncChange. Takes ownership of |notif|. |
- static syncer::SyncChange CreateSyncChange( |
- syncer::SyncChange::SyncChangeType type, |
- AppNotification* notif) { |
- // Take control of notif to clean it up after we create data out of it. |
- scoped_ptr<AppNotification> scoped_notif(notif); |
- return syncer::SyncChange( |
- FROM_HERE, |
- type, |
- AppNotificationManager::CreateSyncDataFromNotification(*notif)); |
- } |
- |
- void AssertSyncChange(const syncer::SyncChange& change, |
- syncer::SyncChange::SyncChangeType type, |
- const AppNotification& notif) { |
- ASSERT_EQ(type, change.change_type()); |
- scoped_ptr<AppNotification> notif2( |
- AppNotificationManager::CreateNotificationFromSyncData( |
- change.sync_data())); |
- ASSERT_TRUE(notif.Equals(*notif2)); |
- } |
- |
- protected: |
- MessageLoop ui_loop_; |
- content::TestBrowserThread ui_thread_; |
- content::TestBrowserThread file_thread_; |
- |
- // We keep two TemplateURLServices to test syncing between them. |
- base::ScopedTempDir temp_dir_; |
- scoped_ptr<TestingProfile> profile_; |
- scoped_refptr<AppNotificationManager> model_; |
- |
- scoped_ptr<TestChangeProcessor> sync_processor_; |
- scoped_ptr<SyncChangeProcessorDelegate> sync_processor_delegate_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AppNotificationManagerSyncTest); |
-}; |
- |
-// Create an AppNotification, convert it to SyncData and convert it back. |
-TEST_F(AppNotificationManagerSyncTest, NotificationToSyncDataToNotification) { |
- { // Partial properties set. |
- scoped_ptr<AppNotification> notif1(CreateNotificationNoLink(1)); |
- syncer::SyncData sync_data = |
- AppNotificationManager::CreateSyncDataFromNotification(*notif1); |
- scoped_ptr<AppNotification> notif2( |
- AppNotificationManager::CreateNotificationFromSyncData(sync_data)); |
- EXPECT_TRUE(notif2.get()); |
- EXPECT_TRUE(notif1->Equals(*notif2)); |
- } |
- { // All properties set. |
- scoped_ptr<AppNotification> notif1(CreateNotification(1)); |
- syncer::SyncData sync_data = |
- AppNotificationManager::CreateSyncDataFromNotification(*notif1); |
- scoped_ptr<AppNotification> notif2( |
- AppNotificationManager::CreateNotificationFromSyncData(sync_data)); |
- EXPECT_TRUE(notif2.get()); |
- EXPECT_TRUE(notif1->Equals(*notif2)); |
- } |
-} |
- |
-// GetAllSyncData returns all notifications since none are marked local only. |
-TEST_F(AppNotificationManagerSyncTest, GetAllSyncDataNoLocal) { |
- model()->Add(CreateNotificationNoLink(1)); |
- model()->Add(CreateNotification(2)); |
- model()->Add(CreateNotification(3)); |
- syncer::SyncDataList all_sync_data = |
- model()->GetAllSyncData(syncer::APP_NOTIFICATIONS); |
- |
- EXPECT_EQ(3U, all_sync_data.size()); |
- |
- for (syncer::SyncDataList::const_iterator iter = all_sync_data.begin(); |
- iter != all_sync_data.end(); ++iter) { |
- scoped_ptr<AppNotification> notif1( |
- AppNotificationManager::CreateNotificationFromSyncData(*iter)); |
- |
- const std::string& guid = notif1->guid(); |
- const std::string& ext_id = notif1->extension_id(); |
- |
- const AppNotification* notif2 = model()->GetNotification(ext_id, guid); |
- ASSERT_TRUE(notif1->Equals(*notif2)); |
- } |
-} |
- |
-// GetAllSyncData should not return notifications marked as local only. |
-TEST_F(AppNotificationManagerSyncTest, GetAllSyncDataSomeLocal) { |
- model()->Add(CreateNotificationNoLink(1)); |
- model()->Add(CreateNotification(true, 2)); |
- model()->Add(CreateNotification(3)); |
- model()->Add(CreateNotification(true, 4)); |
- model()->Add(CreateNotification(5)); |
- syncer::SyncDataList all_sync_data = |
- model()->GetAllSyncData(syncer::APP_NOTIFICATIONS); |
- |
- EXPECT_EQ(3U, all_sync_data.size()); |
- |
- for (syncer::SyncDataList::const_iterator iter = all_sync_data.begin(); |
- iter != all_sync_data.end(); ++iter) { |
- scoped_ptr<AppNotification> notif1( |
- AppNotificationManager::CreateNotificationFromSyncData(*iter)); |
- const std::string& guid = notif1->guid(); |
- const std::string& ext_id = notif1->extension_id(); |
- |
- const AppNotification* notif2 = model()->GetNotification(ext_id, guid); |
- ASSERT_TRUE(notif1->Equals(*notif2)); |
- } |
-} |
- |
-// Model assocation: both models are empty. |
-TEST_F(AppNotificationManagerSyncTest, ModelAssocBothEmpty) { |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), // Empty. |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- EXPECT_EQ(0U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- EXPECT_EQ(0U, processor()->change_list_size()); |
-} |
- |
-// Model assocation: empty sync model and non-empty local model. |
-TEST_F(AppNotificationManagerSyncTest, ModelAssocModelEmpty) { |
- syncer::SyncDataList initial_data; |
- initial_data.push_back(CreateSyncData(1)); |
- initial_data.push_back(CreateSyncData(2)); |
- initial_data.push_back(CreateSyncData(3)); |
- initial_data.push_back(CreateSyncData(4)); |
- |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- initial_data, |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- EXPECT_EQ(4U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- // Model should all of the initial sync data. |
- for (syncer::SyncDataList::const_iterator iter = initial_data.begin(); |
- iter != initial_data.end(); ++iter) { |
- scoped_ptr<AppNotification> notif1( |
- AppNotificationManager::CreateNotificationFromSyncData(*iter)); |
- const std::string& ext_id = notif1->extension_id(); |
- const std::string& guid = notif1->guid(); |
- const AppNotification* notif2 = model()->GetNotification(ext_id, guid); |
- EXPECT_TRUE(notif2); |
- EXPECT_TRUE(notif1->Equals(*notif2)); |
- } |
- |
- EXPECT_EQ(0U, processor()->change_list_size()); |
-} |
- |
-// Model has some notifications, some of them are local only. Sync has some |
-// notifications. No items match up. |
-TEST_F(AppNotificationManagerSyncTest, ModelAssocBothNonEmptyNoOverlap) { |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(true, 2); |
- model()->Add(n2); |
- AppNotification* n3 = CreateNotification(3); |
- model()->Add(n3); |
- |
- syncer::SyncDataList initial_data; |
- initial_data.push_back(CreateSyncData(4)); |
- initial_data.push_back(CreateSyncData(5)); |
- initial_data.push_back(CreateSyncData(6)); |
- initial_data.push_back(CreateSyncData(7)); |
- |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- initial_data, |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- EXPECT_EQ(6U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- for (syncer::SyncDataList::const_iterator iter = initial_data.begin(); |
- iter != initial_data.end(); ++iter) { |
- scoped_ptr<AppNotification> notif1( |
- AppNotificationManager::CreateNotificationFromSyncData(*iter)); |
- const std::string& ext_id = notif1->extension_id(); |
- const std::string& guid = notif1->guid(); |
- const AppNotification* notif2 = model()->GetNotification(ext_id, guid); |
- EXPECT_TRUE(notif2); |
- EXPECT_TRUE(notif1->Equals(*notif2)); |
- } |
- EXPECT_TRUE(model()->GetNotification(n1->extension_id(), n1->guid())); |
- EXPECT_TRUE(model()->GetNotification(n2->extension_id(), n2->guid())); |
- EXPECT_TRUE(model()->GetNotification(n3->extension_id(), n3->guid())); |
- |
- EXPECT_EQ(2U, processor()->change_list_size()); |
- EXPECT_TRUE(processor()->ContainsGuid(n1->guid())); |
- EXPECT_EQ(syncer::SyncChange::ACTION_ADD, |
- processor()->GetChangeByGuid(n1->guid()).change_type()); |
- EXPECT_FALSE(processor()->ContainsGuid(n2->guid())); |
- EXPECT_TRUE(processor()->ContainsGuid(n3->guid())); |
- EXPECT_EQ(syncer::SyncChange::ACTION_ADD, |
- processor()->GetChangeByGuid(n3->guid()).change_type()); |
-} |
- |
-// Model has some notifications, some of them are local only. Sync has some |
-// notifications. Some items match up. |
-TEST_F(AppNotificationManagerSyncTest, ModelAssocBothNonEmptySomeOverlap) { |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(true, 2); |
- model()->Add(n2); |
- AppNotification* n3 = CreateNotification(3); |
- model()->Add(n3); |
- AppNotification* n4 = CreateNotification(4); |
- model()->Add(n4); |
- |
- syncer::SyncDataList initial_data; |
- initial_data.push_back(CreateSyncData(5)); |
- initial_data.push_back( |
- AppNotificationManager::CreateSyncDataFromNotification(*n1)); |
- initial_data.push_back(CreateSyncData(6)); |
- initial_data.push_back( |
- AppNotificationManager::CreateSyncDataFromNotification(*n4)); |
- initial_data.push_back(CreateSyncData(7)); |
- |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- initial_data, |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- EXPECT_EQ(6U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- for (syncer::SyncDataList::const_iterator iter = initial_data.begin(); |
- iter != initial_data.end(); ++iter) { |
- scoped_ptr<AppNotification> notif1( |
- AppNotificationManager::CreateNotificationFromSyncData(*iter)); |
- const std::string& ext_id = notif1->extension_id(); |
- const std::string& guid = notif1->guid(); |
- const AppNotification* notif2 = model()->GetNotification(ext_id, guid); |
- EXPECT_TRUE(notif2); |
- EXPECT_TRUE(notif1->Equals(*notif2)); |
- } |
- EXPECT_TRUE(model()->GetNotification(n1->extension_id(), n1->guid())); |
- EXPECT_TRUE(model()->GetNotification(n2->extension_id(), n2->guid())); |
- EXPECT_TRUE(model()->GetNotification(n3->extension_id(), n3->guid())); |
- EXPECT_TRUE(model()->GetNotification(n4->extension_id(), n4->guid())); |
- |
- EXPECT_EQ(1U, processor()->change_list_size()); |
- EXPECT_FALSE(processor()->ContainsGuid(n1->guid())); |
- EXPECT_FALSE(processor()->ContainsGuid(n2->guid())); |
- EXPECT_TRUE(processor()->ContainsGuid(n3->guid())); |
- EXPECT_EQ(syncer::SyncChange::ACTION_ADD, |
- processor()->GetChangeByGuid(n3->guid()).change_type()); |
- EXPECT_FALSE(processor()->ContainsGuid(n4->guid())); |
-} |
- |
-// When an item that matches up in model and sync is different, an error |
-// should be returned. |
-TEST_F(AppNotificationManagerSyncTest, ModelAssocBothNonEmptyTitleMismatch) { |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(true, 2); |
- model()->Add(n2); |
- |
- syncer::SyncDataList initial_data; |
- initial_data.push_back(CreateSyncData(1)); |
- scoped_ptr<AppNotification> n1_a(CreateNotification( |
- n1->is_local(), n1->creation_time().ToInternalValue(), |
- n1->guid(), n1->extension_id(), |
- n1->title() + "_changed", // different title |
- n1->body(), n1->link_url().spec(), n1->link_text())); |
- initial_data.push_back( |
- AppNotificationManager::CreateSyncDataFromNotification(*n1_a)); |
- |
- scoped_ptr<syncer::SyncErrorFactoryMock> error_handler( |
- new syncer::SyncErrorFactoryMock()); |
- EXPECT_CALL(*error_handler, CreateAndUploadError(_, _)). |
- WillOnce( |
- Return( |
- syncer::SyncError( |
- FROM_HERE, "error", syncer::APP_NOTIFICATIONS))); |
- |
- syncer::SyncError sync_error = model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- initial_data, |
- PassProcessor(), |
- error_handler.PassAs<syncer::SyncErrorFactory>()).error(); |
- |
- EXPECT_TRUE(sync_error.IsSet()); |
- EXPECT_EQ(syncer::APP_NOTIFICATIONS, sync_error.type()); |
- EXPECT_EQ(0U, processor()->change_list_size()); |
-} |
- |
-// When an item in sync matches with a local-only item in model, an error |
-// should be returned. |
-TEST_F(AppNotificationManagerSyncTest, ModelAssocBothNonEmptyMatchesLocal) { |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(true, 2); |
- model()->Add(n2); |
- |
- syncer::SyncDataList initial_data; |
- initial_data.push_back(CreateSyncData(1)); |
- scoped_ptr<AppNotification> n2_a(CreateNotification(2)); |
- initial_data.push_back( |
- AppNotificationManager::CreateSyncDataFromNotification(*n2_a)); |
- |
- scoped_ptr<syncer::SyncErrorFactoryMock> error_handler( |
- new syncer::SyncErrorFactoryMock()); |
- EXPECT_CALL(*error_handler, CreateAndUploadError(_, _)). |
- WillOnce( |
- Return( |
- syncer::SyncError( |
- FROM_HERE, "error", syncer::APP_NOTIFICATIONS))); |
- |
- syncer::SyncError sync_error = model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- initial_data, |
- PassProcessor(), |
- error_handler.PassAs<syncer::SyncErrorFactory>()).error(); |
- |
- EXPECT_TRUE(sync_error.IsSet()); |
- EXPECT_EQ(syncer::APP_NOTIFICATIONS, sync_error.type()); |
- EXPECT_EQ(0U, processor()->change_list_size()); |
-} |
- |
-// Process sync changes when model is empty. |
-TEST_F(AppNotificationManagerSyncTest, ProcessSyncChangesEmptyModel) { |
- // We initially have no data. |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- // Set up a bunch of ADDs. |
- syncer::SyncChangeList changes; |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_ADD, CreateNotification(1))); |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_ADD, CreateNotification(2))); |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_ADD, CreateNotification(3))); |
- |
- model()->ProcessSyncChanges(FROM_HERE, changes); |
- |
- EXPECT_EQ(3U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- EXPECT_EQ(0U, processor()->change_list_size()); |
-} |
- |
-// Process sync changes when model is not empty. |
-TEST_F(AppNotificationManagerSyncTest, ProcessSyncChangesNonEmptyModel) { |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(2); |
- model()->Add(n2); |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- // Some adds and some deletes. |
- syncer::SyncChangeList changes; |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_ADD, CreateNotification(3))); |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_DELETE, n1->Copy())); |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_ADD, CreateNotification(4))); |
- |
- model()->ProcessSyncChanges(FROM_HERE, changes); |
- |
- EXPECT_EQ(3U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- EXPECT_EQ(2U, processor()->change_list_size()); |
-} |
- |
-// Process sync changes should ignore a bad ADD. |
-// Hangs: http://crbug.com/149712 |
-TEST_F(AppNotificationManagerSyncTest, |
- DISABLED_ProcessSyncChangesIgnoreBadAdd) { |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(2); |
- model()->Add(n2); |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- // Some adds and some deletes. |
- syncer::SyncChangeList changes; |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_ADD, CreateNotification(1))); |
- |
- syncer::SyncError error = model()->ProcessSyncChanges(FROM_HERE, changes); |
- EXPECT_FALSE(error.IsSet()); |
- |
- EXPECT_EQ(2U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- EXPECT_EQ(2U, processor()->change_list_size()); |
-} |
- |
-// Process sync changes should ignore a bad DELETE. |
-TEST_F(AppNotificationManagerSyncTest, ProcessSyncChangesIgnoreBadDelete) { |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(2); |
- model()->Add(n2); |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- // Some adds and some deletes. |
- syncer::SyncChangeList changes; |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_DELETE, CreateNotification(3))); |
- |
- syncer::SyncError error = model()->ProcessSyncChanges(FROM_HERE, changes); |
- EXPECT_FALSE(error.IsSet()); |
- |
- EXPECT_EQ(2U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- EXPECT_EQ(2U, processor()->change_list_size()); |
-} |
- |
-// Process sync changes should ignore bad UPDATEs. |
-// Hangs: http://crbug.com/149712 |
-TEST_F(AppNotificationManagerSyncTest, |
- DISABLED_ProcessSyncChangesIgnoreBadUpdates) { |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(2); |
- model()->Add(n2); |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- // Some adds and some deletes. |
- syncer::SyncChangeList changes; |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_UPDATE, CreateNotification(3))); |
- AppNotification* n2_changed = n2->Copy(); |
- n2_changed->set_link_text(n2_changed->link_text() + "-changed"); |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_UPDATE, n2_changed)); |
- |
- syncer::SyncError error = model()->ProcessSyncChanges(FROM_HERE, changes); |
- EXPECT_FALSE(error.IsSet()); |
- |
- EXPECT_EQ(2U, model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- EXPECT_EQ(2U, processor()->change_list_size()); |
-} |
- |
-// Process over 15 changes when model is not empty. |
-TEST_F(AppNotificationManagerSyncTest, ProcessSyncChangesEmptyModelWithMax) { |
- const std::string& ext_id = "e1"; |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- for (unsigned int i = 0; |
- i < AppNotificationManager::kMaxNotificationPerApp * 2; i++) { |
- syncer::SyncChangeList changes; |
- changes.push_back(CreateSyncChange( |
- syncer::SyncChange::ACTION_ADD, CreateNotification(false, i, ext_id))); |
- model()->ProcessSyncChanges(FROM_HERE, changes); |
- if (i < AppNotificationManager::kMaxNotificationPerApp) { |
- EXPECT_EQ(i + 1, |
- model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- } else { |
- EXPECT_EQ(AppNotificationManager::kMaxNotificationPerApp, |
- model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- for (unsigned int j = i; j > i - 5; j--) { |
- EXPECT_EQ( |
- AppNotificationManager::kMaxNotificationPerApp, |
- model()->GetAllSyncData(syncer::APP_NOTIFICATIONS).size()); |
- } |
- } |
- } |
-} |
- |
-// Stop syncing sets state correctly. |
-TEST_F(AppNotificationManagerSyncTest, StopSyncing) { |
- EXPECT_FALSE(model()->sync_processor_.get()); |
- EXPECT_FALSE(model()->models_associated_); |
- |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- EXPECT_TRUE(model()->sync_processor_.get()); |
- EXPECT_TRUE(model()->models_associated_); |
- |
- model()->StopSyncing(syncer::APP_NOTIFICATIONS); |
- EXPECT_FALSE(model()->sync_processor_.get()); |
- EXPECT_FALSE(model()->models_associated_); |
-} |
- |
-// Adds get pushed to sync but local only are skipped. |
-TEST_F(AppNotificationManagerSyncTest, AddsGetsSynced) { |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- syncer::SyncDataList(), |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- AppNotification* n1 = CreateNotification(1); |
- model()->Add(n1); |
- AppNotification* n2 = CreateNotification(2); |
- model()->Add(n2); |
- AppNotification* n3 = CreateNotification(true, 2); |
- model()->Add(n3); |
- |
- EXPECT_EQ(2U, processor()->change_list_size()); |
- EXPECT_TRUE(processor()->ContainsGuid(n1->guid())); |
- syncer::SyncChange c1 = processor()->GetChangeByGuid(n1->guid()); |
- AssertSyncChange(c1, syncer::SyncChange::ACTION_ADD, *n1); |
- syncer::SyncChange c2 = processor()->GetChangeByGuid(n2->guid()); |
- AssertSyncChange(c2, syncer::SyncChange::ACTION_ADD, *n2); |
-} |
- |
-// Clear all gets pushed to sync. |
-TEST_F(AppNotificationManagerSyncTest, ClearAllGetsSynced) { |
- const std::string& ext_id = "e1"; |
- scoped_ptr<AppNotification> n1(CreateNotification(false, 1, ext_id)); |
- scoped_ptr<AppNotification> n2(CreateNotification(false, 2, ext_id)); |
- scoped_ptr<AppNotification> n3(CreateNotification(false, 3, ext_id)); |
- scoped_ptr<AppNotification> n4(CreateNotification(4)); |
- |
- syncer::SyncDataList initial_data; |
- initial_data.push_back( |
- AppNotificationManager::CreateSyncDataFromNotification(*n1)); |
- initial_data.push_back( |
- AppNotificationManager::CreateSyncDataFromNotification(*n2)); |
- initial_data.push_back( |
- AppNotificationManager::CreateSyncDataFromNotification(*n3)); |
- initial_data.push_back( |
- AppNotificationManager::CreateSyncDataFromNotification(*n4)); |
- model()->MergeDataAndStartSyncing( |
- syncer::APP_NOTIFICATIONS, |
- initial_data, |
- PassProcessor(), |
- scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
- |
- model()->ClearAll(ext_id); |
- |
- EXPECT_EQ(3U, processor()->change_list_size()); |
- EXPECT_TRUE(processor()->ContainsGuid(n1->guid())); |
- syncer::SyncChange c1 = processor()->GetChangeByGuid(n1->guid()); |
- AssertSyncChange(c1, syncer::SyncChange::ACTION_DELETE, *n1); |
- syncer::SyncChange c2 = processor()->GetChangeByGuid(n2->guid()); |
- AssertSyncChange(c2, syncer::SyncChange::ACTION_DELETE, *n2); |
- syncer::SyncChange c3 = processor()->GetChangeByGuid(n3->guid()); |
- AssertSyncChange(c3, syncer::SyncChange::ACTION_DELETE, *n3); |
-} |
- |
-} // namespace extensions |