| 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 |