Index: chrome/browser/sync/profile_sync_service_typed_url_unittest.cc |
diff --git a/chrome/browser/sync/profile_sync_service_typed_url_unittest.cc b/chrome/browser/sync/profile_sync_service_typed_url_unittest.cc |
index 09cd40fc95797b62b57b439579491da20ebec112..ab99174a37aaa532b254972c2e713fe649f3cefe 100644 |
--- a/chrome/browser/sync/profile_sync_service_typed_url_unittest.cc |
+++ b/chrome/browser/sync/profile_sync_service_typed_url_unittest.cc |
@@ -81,6 +81,7 @@ using testing::Return; |
using testing::SetArgumentPointee; |
using testing::WithArgs; |
+namespace { |
// Visits with this timestamp are treated as expired. |
static const int EXPIRED_VISIT = -1; |
@@ -117,6 +118,20 @@ class HistoryServiceMock : public HistoryService { |
virtual ~HistoryServiceMock() {} |
}; |
+class TestTypedUrlModelAssociator : public TypedUrlModelAssociator { |
+ public: |
+ TestTypedUrlModelAssociator( |
+ ProfileSyncService* sync_service, |
+ history::HistoryBackend* history_backend, |
+ browser_sync::DataTypeErrorHandler* error_handler) : |
+ TypedUrlModelAssociator(sync_service, history_backend, error_handler) {} |
+ |
+ protected: |
+ // Don't clear error stats - that way we can verify their values in our |
+ // tests. |
+ virtual void ClearErrorStats() {} |
+}; |
+ |
void RunOnDBThreadCallback(HistoryBackend* backend, |
HistoryDBTask* task) { |
task->RunOnDBThread(backend, NULL); |
@@ -131,17 +146,18 @@ ACTION_P2(RunTaskOnDBThread, thread, backend) { |
task)); |
} |
-ACTION_P5(MakeTypedUrlSyncComponents, |
+ACTION_P6(MakeTypedUrlSyncComponents, |
profile, |
service, |
hb, |
dtc, |
- error_handler) { |
- TypedUrlModelAssociator* model_associator = |
- new TypedUrlModelAssociator(service, hb, error_handler); |
+ error_handler, |
+ model_associator) { |
+ *model_associator = |
+ new TestTypedUrlModelAssociator(service, hb, error_handler); |
TypedUrlChangeProcessor* change_processor = |
- new TypedUrlChangeProcessor(profile, model_associator, hb, dtc); |
- return ProfileSyncComponentsFactory::SyncComponents(model_associator, |
+ new TypedUrlChangeProcessor(profile, *model_associator, hb, dtc); |
+ return ProfileSyncComponentsFactory::SyncComponents(*model_associator, |
change_processor); |
} |
@@ -187,7 +203,8 @@ class ProfileSyncServiceTypedUrlTest : public AbstractProfileSyncServiceTest { |
AbstractProfileSyncServiceTest::TearDown(); |
} |
- void StartSyncService(const base::Closure& callback) { |
+ TypedUrlModelAssociator* StartSyncService(const base::Closure& callback) { |
+ TypedUrlModelAssociator* model_associator = NULL; |
if (!service_.get()) { |
SigninManager* signin = SigninManagerFactory::GetForProfile(&profile_); |
signin->SetAuthenticatedUsername("test"); |
@@ -213,7 +230,8 @@ class ProfileSyncServiceTypedUrlTest : public AbstractProfileSyncServiceTest { |
service_.get(), |
history_backend_.get(), |
data_type_controller, |
- &error_handler_)); |
+ &error_handler_, |
+ &model_associator)); |
EXPECT_CALL(*factory, CreateDataTypeManager(_, _)). |
WillOnce(ReturnNewDataTypeManager()); |
@@ -231,6 +249,7 @@ class ProfileSyncServiceTypedUrlTest : public AbstractProfileSyncServiceTest { |
service_->Initialize(); |
MessageLoop::current()->Run(); |
} |
+ return model_associator; |
} |
void GetTypedUrlsFromSyncDB(history::URLRows* urls) { |
@@ -322,15 +341,19 @@ void AddTypedUrlEntries(ProfileSyncServiceTypedUrlTest* test, |
} |
} |
+} // namespace |
+ |
TEST_F(ProfileSyncServiceTypedUrlTest, EmptyNativeEmptySync) { |
EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). |
WillOnce(Return(true)); |
SetIdleChangeProcessorExpectations(); |
CreateRootHelper create_root(this, syncable::TYPED_URLS); |
- StartSyncService(create_root.callback()); |
+ TypedUrlModelAssociator* associator = |
+ StartSyncService(create_root.callback()); |
history::URLRows sync_entries; |
GetTypedUrlsFromSyncDB(&sync_entries); |
EXPECT_EQ(0U, sync_entries.size()); |
+ ASSERT_EQ(0, associator->GetErrorPercentage()); |
} |
TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeEmptySync) { |
@@ -345,11 +368,13 @@ TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeEmptySync) { |
WillRepeatedly(DoAll(SetArgumentPointee<2>(visits), Return(true))); |
SetIdleChangeProcessorExpectations(); |
CreateRootHelper create_root(this, syncable::TYPED_URLS); |
- StartSyncService(create_root.callback()); |
+ TypedUrlModelAssociator* associator = |
+ StartSyncService(create_root.callback()); |
history::URLRows sync_entries; |
GetTypedUrlsFromSyncDB(&sync_entries); |
ASSERT_EQ(1U, sync_entries.size()); |
EXPECT_TRUE(URLsEqual(entries[0], sync_entries[0])); |
+ ASSERT_EQ(0, associator->GetErrorPercentage()); |
} |
TEST_F(ProfileSyncServiceTypedUrlTest, HasNativeErrorReadingVisits) { |
@@ -845,6 +870,8 @@ TEST_F(ProfileSyncServiceTypedUrlTest, FailWriteToHistoryBackend) { |
native_entries.push_back(native_entry); |
EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). |
WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true))); |
+ EXPECT_CALL((*history_backend_.get()), GetURL(_, _)). |
+ WillOnce(DoAll(SetArgumentPointee<1>(native_entry), Return(true))); |
EXPECT_CALL((*history_backend_.get()), GetMostRecentVisitsForURL(_, _, _)). |
WillRepeatedly(DoAll(SetArgumentPointee<2>(native_visits), Return(true))); |
EXPECT_CALL((*history_backend_.get()), |
@@ -855,14 +882,47 @@ TEST_F(ProfileSyncServiceTypedUrlTest, FailWriteToHistoryBackend) { |
EXPECT_CALL((*history_backend_.get()), UpdateURL(_, _)). |
WillRepeatedly(Return(false)); |
+ TypedUrlModelAssociator* associator = |
+ StartSyncService(base::Bind(&AddTypedUrlEntries, this, sync_entries)); |
+ // Errors writing to the DB should be recorded, but should not cause an |
+ // unrecoverable error. |
+ ASSERT_FALSE( |
+ service_->failed_datatypes_handler().GetFailedTypes().Has( |
+ syncable::TYPED_URLS)); |
+ // Some calls should have succeeded, so the error percentage should be |
+ // somewhere > 0 and < 100. |
+ ASSERT_NE(0, associator->GetErrorPercentage()); |
+ ASSERT_NE(100, associator->GetErrorPercentage()); |
+} |
+ |
+TEST_F(ProfileSyncServiceTypedUrlTest, FailToGetTypedURLs) { |
+ history::VisitVector native_visits; |
+ history::VisitVector sync_visits; |
+ history::URLRow native_entry(MakeTypedUrlEntry("http://native.com", "entry", |
+ 2, 15, false, &native_visits)); |
+ history::URLRow sync_entry(MakeTypedUrlEntry("http://sync.com", "entry", |
+ 3, 16, false, &sync_visits)); |
+ |
+ history::URLRows native_entries; |
+ native_entries.push_back(native_entry); |
+ EXPECT_CALL((*history_backend_.get()), GetAllTypedURLs(_)). |
+ WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(false))); |
+ |
+ history::URLRows sync_entries; |
+ sync_entries.push_back(sync_entry); |
+ |
EXPECT_CALL(error_handler_, CreateAndUploadError(_, _, _)). |
WillOnce(Return(SyncError(FROM_HERE, |
- "Unit test", |
- syncable::TYPED_URLS))); |
+ "Unit test", |
+ syncable::TYPED_URLS))); |
StartSyncService(base::Bind(&AddTypedUrlEntries, this, sync_entries)); |
+ // Errors getting typed URLs will cause an unrecoverable error (since we can |
+ // do *nothing* in that case). |
ASSERT_TRUE( |
service_->failed_datatypes_handler().GetFailedTypes().Has( |
syncable::TYPED_URLS)); |
ASSERT_EQ( |
1u, service_->failed_datatypes_handler().GetFailedTypes().Size()); |
+ // Can't check GetErrorPercentage(), because generating an unrecoverable |
+ // error will free the model associator. |
} |