Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(430)

Side by Side Diff: chrome/browser/sync/engine/sync_scheduler_unittest.cc

Issue 9372051: Don't retry failed attempts to poll sync server (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minor comment updates Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 833 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 844
845 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1) 845 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1)
846 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), 846 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
847 RecordSyncShareMultiple(&r, 1U))); 847 RecordSyncShareMultiple(&r, 1U)));
848 EXPECT_CALL(*delay(), GetDelay(_)). 848 EXPECT_CALL(*delay(), GetDelay(_)).
849 WillRepeatedly(Return(TimeDelta::FromDays(1))); 849 WillRepeatedly(Return(TimeDelta::FromDays(1)));
850 850
851 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 851 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
852 RunLoop(); 852 RunLoop();
853 853
854 // Run again to wait for polling. 854 // This nudge should fail and put us into backoff. Thanks to our mock
855 // GetDelay() setup above, this will be a long backoff.
856 scheduler()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL, types, FROM_HERE);
855 RunLoop(); 857 RunLoop();
856 858
857 // Pump loop to get rid of nudge.
858 PumpLoop();
859
860 Mock::VerifyAndClearExpectations(syncer()); 859 Mock::VerifyAndClearExpectations(syncer());
861 ASSERT_EQ(1U, r.snapshots.size()); 860 ASSERT_EQ(1U, r.snapshots.size());
862 EXPECT_EQ(GetUpdatesCallerInfo::PERIODIC, 861 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, r.snapshots[0]->source.updates_source);
863 r.snapshots[0]->source.updates_source);
864 862
865 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1) 863 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(1)
866 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed), 864 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
867 RecordSyncShare(&r))); 865 RecordSyncShare(&r)));
868 866
869 // We schedule a nudge with enough delay (10X poll interval) that at least 867 // We schedule a nudge with enough delay (10X poll interval) that at least
870 // one or two polls would have taken place. The nudge should succeed. 868 // one or two polls would have taken place. The nudge should succeed.
871 scheduler()->ScheduleNudge( 869 scheduler()->ScheduleNudge(poll * 10, NUDGE_SOURCE_LOCAL, types, FROM_HERE);
872 poll * 10, NUDGE_SOURCE_LOCAL, types, FROM_HERE);
873 RunLoop(); 870 RunLoop();
874 871
875 Mock::VerifyAndClearExpectations(syncer()); 872 Mock::VerifyAndClearExpectations(syncer());
876 Mock::VerifyAndClearExpectations(delay()); 873 Mock::VerifyAndClearExpectations(delay());
877 ASSERT_EQ(2U, r.snapshots.size()); 874 ASSERT_EQ(2U, r.snapshots.size());
878 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, 875 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL, r.snapshots[1]->source.updates_source);
879 r.snapshots[1]->source.updates_source);
880 876
881 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(0); 877 EXPECT_CALL(*syncer(), SyncShare(_,_,_)).Times(0);
882 EXPECT_CALL(*delay(), GetDelay(_)).Times(0); 878 EXPECT_CALL(*delay(), GetDelay(_)).Times(0);
883 879
884 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE); 880 StartSyncScheduler(SyncScheduler::CONFIGURATION_MODE);
885 RunLoop(); 881 RunLoop();
886 882
887 scheduler()->ScheduleConfig( 883 scheduler()->ScheduleConfig(
888 types, GetUpdatesCallerInfo::RECONFIGURATION); 884 types, GetUpdatesCallerInfo::RECONFIGURATION);
889 PumpLoop(); 885 PumpLoop();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE); 928 zero(), NUDGE_SOURCE_LOCAL, ModelTypeSet(), FROM_HERE);
933 RunLoop(); 929 RunLoop();
934 930
935 ASSERT_EQ(kMinNumSamples, r.snapshots.size()); 931 ASSERT_EQ(kMinNumSamples, r.snapshots.size());
936 EXPECT_GE(r.times[1] - r.times[0], second); 932 EXPECT_GE(r.times[1] - r.times[0], second);
937 EXPECT_GE(r.times[2] - r.times[1], third); 933 EXPECT_GE(r.times[2] - r.times[1], third);
938 EXPECT_GE(r.times[3] - r.times[2], fourth); 934 EXPECT_GE(r.times[3] - r.times[2], fourth);
939 EXPECT_GE(r.times[4] - r.times[3], fifth); 935 EXPECT_GE(r.times[4] - r.times[3], fifth);
940 } 936 }
941 937
942 // Test that things go back to normal once a canary task makes forward progress 938 // Test that things go back to normal once a retry makes forward progress.
943 // following a succession of failures. 939 TEST_F(SyncSchedulerTest, BackoffRelief) {
944 //
945 // TODO(rlarocque, 112954): The code this was intended to test is broken.
946 TEST_F(SyncSchedulerTest, DISABLED_BackoffRelief) {
947 SyncShareRecords r; 940 SyncShareRecords r;
948 const TimeDelta poll(TimeDelta::FromMilliseconds(10)); 941 const TimeDelta poll(TimeDelta::FromMilliseconds(10));
949 scheduler()->OnReceivedLongPollIntervalUpdate(poll); 942 scheduler()->OnReceivedLongPollIntervalUpdate(poll);
950 UseMockDelayProvider(); 943 UseMockDelayProvider();
951 944
952 const TimeDelta backoff = TimeDelta::FromMilliseconds(100); 945 const TimeDelta backoff = TimeDelta::FromMilliseconds(5);
953 946
954 EXPECT_CALL(*syncer(), SyncShare(_,_,_)) 947 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
955 .WillOnce(Invoke(sessions::test_util::SimulateCommitFailed)) 948 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
956 .WillOnce(Invoke(sessions::test_util::SimulateCommitFailed)) 949 RecordSyncShareMultiple(&r, kMinNumSamples)))
957 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess), 950 .WillRepeatedly(DoAll(Invoke(sessions::test_util::SimulateSuccess),
958 RecordSyncShareMultiple(&r, kMinNumSamples))); 951 RecordSyncShareMultiple(&r, kMinNumSamples)));
959 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff)); 952 EXPECT_CALL(*delay(), GetDelay(_)).WillOnce(Return(backoff));
960 953
961 // Optimal start for the post-backoff poll party. 954 // Optimal start for the post-backoff poll party.
962 TimeTicks optimal_start = TimeTicks::Now() + poll + backoff; 955 TimeTicks optimal_start = TimeTicks::Now();
963 StartSyncScheduler(SyncScheduler::NORMAL_MODE); 956 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
964 RunLoop(); 957 RunLoop();
965 958
966 // Run again to wait for polling. 959 // Run again to wait for polling.
960 scheduler()->ScheduleNudge(zero(), NUDGE_SOURCE_LOCAL,
961 ModelTypeSet(), FROM_HERE);
967 RunLoop(); 962 RunLoop();
968 963
969 StopSyncScheduler(); 964 StopSyncScheduler();
970 965
971 // Check for healthy polling after backoff is relieved. 966 EXPECT_EQ(kMinNumSamples, r.times.size());
972 // Can't use AnalyzePollRun because first sync is a continuation. Bleh. 967
973 for (size_t i = 0; i < r.times.size(); i++) { 968 // The first nudge ran as soon as possible. It failed.
969 TimeTicks optimal_job_time = optimal_start;
970 EXPECT_GE(r.times[0], optimal_job_time);
971 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
972 r.snapshots[0]->source.updates_source);
973
974 // It was followed by a successful retry nudge shortly afterward.
975 optimal_job_time = optimal_job_time + backoff;
976 EXPECT_GE(r.times[1], optimal_job_time);
977 EXPECT_EQ(GetUpdatesCallerInfo::LOCAL,
978 r.snapshots[1]->source.updates_source);
979 // After that, we went back to polling.
980 for (size_t i = 2; i < r.snapshots.size(); i++) {
981 optimal_job_time = optimal_job_time + poll;
974 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")"); 982 SCOPED_TRACE(testing::Message() << "SyncShare # (" << i << ")");
975 TimeTicks optimal_next_sync = optimal_start + poll * i; 983 EXPECT_GE(r.times[i], optimal_job_time);
976 EXPECT_GE(r.times[i], optimal_next_sync); 984 EXPECT_EQ(GetUpdatesCallerInfo::PERIODIC,
977 EXPECT_EQ(i == 0 ? GetUpdatesCallerInfo::SYNC_CYCLE_CONTINUATION
978 : GetUpdatesCallerInfo::PERIODIC,
979 r.snapshots[i]->source.updates_source); 985 r.snapshots[i]->source.updates_source);
980 } 986 }
981 } 987 }
982 988
989 // Test that poll failures are ignored. They should have no effect on
990 // subsequent poll attempts, nor should they trigger a backoff/retry.
991 TEST_F(SyncSchedulerTest, TransientPollFailure) {
992 SyncShareRecords r;
993 const TimeDelta poll_interval(TimeDelta::FromMilliseconds(10));
994 scheduler()->OnReceivedLongPollIntervalUpdate(poll_interval);
995 UseMockDelayProvider(); // Will cause test failure if backoff is initiated.
996
997 EXPECT_CALL(*syncer(), SyncShare(_,_,_))
998 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateCommitFailed),
999 RecordSyncShare(&r)))
1000 .WillOnce(DoAll(Invoke(sessions::test_util::SimulateSuccess),
1001 RecordSyncShare(&r)));
1002
1003 StartSyncScheduler(SyncScheduler::NORMAL_MODE);
1004 RunLoop();
1005
1006 // Run the unsucessful poll. The failed poll should not trigger backoff.
1007 RunLoop();
1008 EXPECT_FALSE(scheduler()->IsBackingOff());
1009
1010 // Run the successful poll.
1011 RunLoop();
1012 EXPECT_FALSE(scheduler()->IsBackingOff());
1013
1014 // Verify the the two SyncShare() calls were made one poll interval apart.
1015 ASSERT_EQ(2U, r.snapshots.size());
1016 EXPECT_GE(r.times[2] - r.times[1], poll_interval);
1017 }
1018
983 TEST_F(SyncSchedulerTest, GetRecommendedDelay) { 1019 TEST_F(SyncSchedulerTest, GetRecommendedDelay) {
984 EXPECT_LE(TimeDelta::FromSeconds(0), 1020 EXPECT_LE(TimeDelta::FromSeconds(0),
985 SyncScheduler::GetRecommendedDelay(TimeDelta::FromSeconds(0))); 1021 SyncScheduler::GetRecommendedDelay(TimeDelta::FromSeconds(0)));
986 EXPECT_LE(TimeDelta::FromSeconds(1), 1022 EXPECT_LE(TimeDelta::FromSeconds(1),
987 SyncScheduler::GetRecommendedDelay(TimeDelta::FromSeconds(1))); 1023 SyncScheduler::GetRecommendedDelay(TimeDelta::FromSeconds(1)));
988 EXPECT_LE(TimeDelta::FromSeconds(50), 1024 EXPECT_LE(TimeDelta::FromSeconds(50),
989 SyncScheduler::GetRecommendedDelay(TimeDelta::FromSeconds(50))); 1025 SyncScheduler::GetRecommendedDelay(TimeDelta::FromSeconds(50)));
990 EXPECT_LE(TimeDelta::FromSeconds(10), 1026 EXPECT_LE(TimeDelta::FromSeconds(10),
991 SyncScheduler::GetRecommendedDelay(TimeDelta::FromSeconds(10))); 1027 SyncScheduler::GetRecommendedDelay(TimeDelta::FromSeconds(10)));
992 EXPECT_EQ(TimeDelta::FromSeconds(kMaxBackoffSeconds), 1028 EXPECT_EQ(TimeDelta::FromSeconds(kMaxBackoffSeconds),
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 PumpLoop(); 1148 PumpLoop();
1113 // Pump again to run job. 1149 // Pump again to run job.
1114 PumpLoop(); 1150 PumpLoop();
1115 1151
1116 StopSyncScheduler(); 1152 StopSyncScheduler();
1117 1153
1118 EXPECT_TRUE(expected == context()->previous_session_routing_info()); 1154 EXPECT_TRUE(expected == context()->previous_session_routing_info());
1119 } 1155 }
1120 1156
1121 } // namespace browser_sync 1157 } // namespace browser_sync
OLDNEW
« chrome/browser/sync/engine/sync_scheduler.cc ('K') | « chrome/browser/sync/engine/sync_scheduler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698