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 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |