OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/callback.h" | 6 #include "base/callback.h" |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 293 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
294 records2.snapshots[0].source().updates_source); | 294 records2.snapshots[0].source().updates_source); |
295 } | 295 } |
296 | 296 |
297 // Make sure a regular config command is scheduled fine in the absence of any | 297 // Make sure a regular config command is scheduled fine in the absence of any |
298 // errors. | 298 // errors. |
299 TEST_F(SyncSchedulerTest, Config) { | 299 TEST_F(SyncSchedulerTest, Config) { |
300 SyncShareRecords records; | 300 SyncShareRecords records; |
301 const ModelTypeSet model_types(BOOKMARKS); | 301 const ModelTypeSet model_types(BOOKMARKS); |
302 | 302 |
303 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 303 EXPECT_CALL(*syncer(), |
| 304 SyncShare(_,_,_)) |
| 305 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) |
304 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 306 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
305 WithArg<0>(RecordSyncShare(&records)))); | 307 WithArg<0>(RecordSyncShare(&records)))); |
306 | 308 |
307 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 309 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
308 | 310 |
309 CallbackCounter counter; | 311 CallbackCounter counter; |
310 ConfigurationParams params( | 312 ConfigurationParams params( |
311 GetUpdatesCallerInfo::RECONFIGURATION, | 313 GetUpdatesCallerInfo::RECONFIGURATION, |
312 model_types, | 314 model_types, |
313 TypesToRoutingInfo(model_types), | 315 TypesToRoutingInfo(model_types), |
(...skipping 10 matching lines...) Expand all Loading... |
324 } | 326 } |
325 | 327 |
326 // Simulate a failure and make sure the config request is retried. | 328 // Simulate a failure and make sure the config request is retried. |
327 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { | 329 TEST_F(SyncSchedulerTest, ConfigWithBackingOff) { |
328 UseMockDelayProvider(); | 330 UseMockDelayProvider(); |
329 EXPECT_CALL(*delay(), GetDelay(_)) | 331 EXPECT_CALL(*delay(), GetDelay(_)) |
330 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); | 332 .WillRepeatedly(Return(TimeDelta::FromMilliseconds(1))); |
331 SyncShareRecords records; | 333 SyncShareRecords records; |
332 const ModelTypeSet model_types(BOOKMARKS); | 334 const ModelTypeSet model_types(BOOKMARKS); |
333 | 335 |
334 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 336 EXPECT_CALL(*syncer(), |
| 337 SyncShare(_,_,_)) |
| 338 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) |
335 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), | 339 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), |
336 WithArg<0>(RecordSyncShare(&records)))) | 340 WithArg<0>(RecordSyncShare(&records)))) |
337 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 341 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
338 WithArg<0>(RecordSyncShare(&records)))); | 342 WithArg<0>(RecordSyncShare(&records)))); |
339 | 343 |
340 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 344 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
341 | 345 |
342 ASSERT_EQ(0U, records.snapshots.size()); | 346 ASSERT_EQ(0U, records.snapshots.size()); |
343 CallbackCounter counter; | 347 CallbackCounter counter; |
344 ConfigurationParams params( | 348 ConfigurationParams params( |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 QuitLoopNowAction())); | 702 QuitLoopNowAction())); |
699 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 703 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
700 | 704 |
701 scheduler()->ScheduleNudgeAsync( | 705 scheduler()->ScheduleNudgeAsync( |
702 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 706 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); |
703 | 707 |
704 // We should detect the failure on the second sync share, and go into backoff. | 708 // We should detect the failure on the second sync share, and go into backoff. |
705 EXPECT_TRUE(RunAndGetBackoff()); | 709 EXPECT_TRUE(RunAndGetBackoff()); |
706 } | 710 } |
707 | 711 |
708 // Test that no syncing occurs when throttled. | 712 // Test that no syncing occurs when throttled (although CleanupDisabledTypes |
| 713 // is allowed). |
709 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { | 714 TEST_F(SyncSchedulerTest, ThrottlingDoesThrottle) { |
710 const ModelTypeSet types(BOOKMARKS); | 715 const ModelTypeSet types(BOOKMARKS); |
711 TimeDelta poll(TimeDelta::FromMilliseconds(5)); | 716 TimeDelta poll(TimeDelta::FromMilliseconds(5)); |
712 TimeDelta throttle(TimeDelta::FromMinutes(10)); | 717 TimeDelta throttle(TimeDelta::FromMinutes(10)); |
713 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 718 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
714 | 719 |
715 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 720 EXPECT_CALL(*syncer(), |
| 721 SyncShare(_, CLEANUP_DISABLED_TYPES, CLEANUP_DISABLED_TYPES)) |
| 722 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
| 723 EXPECT_CALL(*syncer(), SyncShare(_,Not(CLEANUP_DISABLED_TYPES), |
| 724 Not(CLEANUP_DISABLED_TYPES))) |
716 .WillOnce(WithArg<0>(sessions::test_util::SimulateThrottled(throttle))) | 725 .WillOnce(WithArg<0>(sessions::test_util::SimulateThrottled(throttle))) |
717 .WillRepeatedly(AddFailureAndQuitLoopNow()); | 726 .WillRepeatedly(AddFailureAndQuitLoopNow()); |
718 | 727 |
719 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 728 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
720 | 729 |
721 scheduler()->ScheduleNudgeAsync( | 730 scheduler()->ScheduleNudgeAsync( |
722 zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE); | 731 zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE); |
723 PumpLoop(); | 732 PumpLoop(); |
724 | 733 |
725 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 734 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 StopSyncScheduler(); | 767 StopSyncScheduler(); |
759 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); | 768 AnalyzePollRun(records, kMinNumSamples, optimal_start, poll); |
760 } | 769 } |
761 | 770 |
762 // Test nudges / polls don't run in config mode and config tasks do. | 771 // Test nudges / polls don't run in config mode and config tasks do. |
763 TEST_F(SyncSchedulerTest, ConfigurationMode) { | 772 TEST_F(SyncSchedulerTest, ConfigurationMode) { |
764 TimeDelta poll(TimeDelta::FromMilliseconds(15)); | 773 TimeDelta poll(TimeDelta::FromMilliseconds(15)); |
765 SyncShareRecords records; | 774 SyncShareRecords records; |
766 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 775 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
767 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) | 776 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) |
| 777 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)) |
768 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 778 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
769 WithArg<0>(RecordSyncShare(&records)))); | 779 WithArg<0>(RecordSyncShare(&records)))); |
770 | 780 |
771 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 781 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
772 | 782 |
773 const ModelTypeSet nudge_types(AUTOFILL); | 783 const ModelTypeSet nudge_types(AUTOFILL); |
774 scheduler()->ScheduleNudgeAsync( | 784 scheduler()->ScheduleNudgeAsync( |
775 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); | 785 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |
776 scheduler()->ScheduleNudgeAsync( | 786 scheduler()->ScheduleNudgeAsync( |
777 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); | 787 zero(), NUDGE_SOURCE_LOCAL, nudge_types, FROM_HERE); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 scheduler()->ScheduleNudgeAsync( | 892 scheduler()->ScheduleNudgeAsync( |
883 poll * 10, NUDGE_SOURCE_LOCAL, types, FROM_HERE); | 893 poll * 10, NUDGE_SOURCE_LOCAL, types, FROM_HERE); |
884 RunLoop(); | 894 RunLoop(); |
885 | 895 |
886 Mock::VerifyAndClearExpectations(syncer()); | 896 Mock::VerifyAndClearExpectations(syncer()); |
887 Mock::VerifyAndClearExpectations(delay()); | 897 Mock::VerifyAndClearExpectations(delay()); |
888 ASSERT_EQ(2U, r.snapshots.size()); | 898 ASSERT_EQ(2U, r.snapshots.size()); |
889 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, | 899 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, |
890 r.snapshots[1].source().updates_source); | 900 r.snapshots[1].source().updates_source); |
891 | 901 |
| 902 // Cleanup is not affected by backoff, but it should not relieve it either. |
| 903 EXPECT_CALL(*syncer(), |
| 904 SyncShare(_, CLEANUP_DISABLED_TYPES, CLEANUP_DISABLED_TYPES)) |
| 905 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
892 EXPECT_CALL(*delay(), GetDelay(_)).Times(0); | 906 EXPECT_CALL(*delay(), GetDelay(_)).Times(0); |
893 | 907 |
894 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 908 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
895 | 909 |
896 CallbackCounter counter; | 910 CallbackCounter counter; |
897 ConfigurationParams params( | 911 ConfigurationParams params( |
898 GetUpdatesCallerInfo::RECONFIGURATION, | 912 GetUpdatesCallerInfo::RECONFIGURATION, |
899 types, | 913 types, |
900 TypesToRoutingInfo(types), | 914 TypesToRoutingInfo(types), |
901 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, | 915 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 | 1069 |
1056 scheduler()->ScheduleNudgeAsync( | 1070 scheduler()->ScheduleNudgeAsync( |
1057 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 1071 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); |
1058 PumpLoop(); | 1072 PumpLoop(); |
1059 // Pump again to run job. | 1073 // Pump again to run job. |
1060 PumpLoop(); | 1074 PumpLoop(); |
1061 | 1075 |
1062 StopSyncScheduler(); | 1076 StopSyncScheduler(); |
1063 Mock::VerifyAndClearExpectations(syncer()); | 1077 Mock::VerifyAndClearExpectations(syncer()); |
1064 | 1078 |
1065 // Configuration. | 1079 // Configuration (always includes a cleanup disabled types). |
| 1080 EXPECT_CALL(*syncer(), |
| 1081 SyncShare(_, CLEANUP_DISABLED_TYPES, CLEANUP_DISABLED_TYPES)) |
| 1082 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
1066 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) | 1083 EXPECT_CALL(*syncer(), SyncShare(_, DOWNLOAD_UPDATES, APPLY_UPDATES)) |
1067 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); | 1084 .WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
1068 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); | 1085 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
1069 | 1086 |
1070 ModelTypeSet model_types(BOOKMARKS); | 1087 ModelTypeSet model_types(BOOKMARKS); |
1071 CallbackCounter counter; | 1088 CallbackCounter counter; |
1072 ConfigurationParams params( | 1089 ConfigurationParams params( |
1073 GetUpdatesCallerInfo::RECONFIGURATION, | 1090 GetUpdatesCallerInfo::RECONFIGURATION, |
1074 model_types, | 1091 model_types, |
1075 TypesToRoutingInfo(model_types), | 1092 TypesToRoutingInfo(model_types), |
1076 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, | 1093 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, |
1077 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); | 1094 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter))); |
1078 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); | 1095 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params)); |
1079 ASSERT_EQ(1, counter.times_called()); | 1096 ASSERT_EQ(1, counter.times_called()); |
1080 // Runs directly so no need to pump the loop. | 1097 // Runs directly so no need to pump the loop. |
1081 StopSyncScheduler(); | 1098 StopSyncScheduler(); |
1082 Mock::VerifyAndClearExpectations(syncer()); | 1099 Mock::VerifyAndClearExpectations(syncer()); |
1083 | 1100 |
| 1101 // Cleanup disabled types. Because no types are being configured, we just |
| 1102 // perform the cleanup. |
| 1103 EXPECT_CALL(*syncer(), |
| 1104 SyncShare(_, CLEANUP_DISABLED_TYPES, CLEANUP_DISABLED_TYPES)). |
| 1105 WillOnce(Invoke(sessions::test_util::SimulateSuccess)); |
| 1106 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); |
| 1107 |
| 1108 CallbackCounter counter2; |
| 1109 ConfigurationParams params2( |
| 1110 GetUpdatesCallerInfo::RECONFIGURATION, |
| 1111 ModelTypeSet(), |
| 1112 ModelSafeRoutingInfo(), |
| 1113 ConfigurationParams::KEYSTORE_KEY_UNNECESSARY, |
| 1114 base::Bind(&CallbackCounter::Callback, base::Unretained(&counter2))); |
| 1115 ASSERT_TRUE(scheduler()->ScheduleConfiguration(params2)); |
| 1116 ASSERT_EQ(1, counter2.times_called()); |
| 1117 StopSyncScheduler(); |
| 1118 Mock::VerifyAndClearExpectations(syncer()); |
| 1119 |
1084 StartSyncScheduler(SyncScheduler::NORMAL_MODE); | 1120 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
1085 | 1121 |
1086 // Poll. | 1122 // Poll. |
1087 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) | 1123 EXPECT_CALL(*syncer(), SyncShare(_, SYNCER_BEGIN, SYNCER_END)) |
1088 .Times(AtLeast(1)) | 1124 .Times(AtLeast(1)) |
1089 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), | 1125 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), |
1090 QuitLoopNowAction())); | 1126 QuitLoopNowAction())); |
1091 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); | 1127 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); |
1092 scheduler()->OnReceivedLongPollIntervalUpdate(poll); | 1128 scheduler()->OnReceivedLongPollIntervalUpdate(poll); |
1093 | 1129 |
(...skipping 25 matching lines...) Expand all Loading... |
1119 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); | 1155 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); |
1120 // Should save the nudge for until after the server is reachable. | 1156 // Should save the nudge for until after the server is reachable. |
1121 MessageLoop::current()->RunAllPending(); | 1157 MessageLoop::current()->RunAllPending(); |
1122 | 1158 |
1123 connection()->SetServerReachable(); | 1159 connection()->SetServerReachable(); |
1124 connection()->UpdateConnectionStatus(); | 1160 connection()->UpdateConnectionStatus(); |
1125 scheduler()->OnConnectionStatusChange(); | 1161 scheduler()->OnConnectionStatusChange(); |
1126 MessageLoop::current()->RunAllPending(); | 1162 MessageLoop::current()->RunAllPending(); |
1127 } | 1163 } |
1128 | 1164 |
| 1165 TEST_F(SyncSchedulerTest, SetsPreviousRoutingInfo) { |
| 1166 ModelSafeRoutingInfo info; |
| 1167 EXPECT_TRUE(info == context()->previous_session_routing_info()); |
| 1168 ModelSafeRoutingInfo expected(context()->routing_info()); |
| 1169 ASSERT_FALSE(expected.empty()); |
| 1170 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1); |
| 1171 |
| 1172 StartSyncScheduler(SyncScheduler::NORMAL_MODE); |
| 1173 |
| 1174 scheduler()->ScheduleNudgeAsync( |
| 1175 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); |
| 1176 PumpLoop(); |
| 1177 // Pump again to run job. |
| 1178 PumpLoop(); |
| 1179 |
| 1180 StopSyncScheduler(); |
| 1181 |
| 1182 EXPECT_TRUE(expected == context()->previous_session_routing_info()); |
| 1183 } |
| 1184 |
1129 } // namespace syncer | 1185 } // namespace syncer |
OLD | NEW |