| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/message_loop.h" | |
| 6 #include "base/time.h" | |
| 7 #include "chrome/browser/sync/engine/sync_scheduler.h" | |
| 8 #include "chrome/browser/sync/sessions/sync_session_context.h" | |
| 9 #include "chrome/browser/sync/sessions/test_util.h" | |
| 10 #include "chrome/browser/sync/test/engine/fake_model_safe_worker_registrar.h" | |
| 11 #include "chrome/browser/sync/test/engine/test_directory_setter_upper.h" | |
| 12 #include "chrome/browser/sync/test/engine/mock_connection_manager.h" | |
| 13 #include "chrome/browser/sync/test/fake_extensions_activity_monitor.h" | |
| 14 #include "testing/gmock/include/gmock/gmock.h" | |
| 15 #include "testing/gtest/include/gtest/gtest.h" | |
| 16 | |
| 17 using base::TimeDelta; | |
| 18 using base::TimeTicks; | |
| 19 | |
| 20 namespace browser_sync { | |
| 21 using browser_sync::Syncer; | |
| 22 using sessions::SyncSession; | |
| 23 using sessions::SyncSessionContext; | |
| 24 using sessions::SyncSourceInfo; | |
| 25 using sync_pb::GetUpdatesCallerInfo; | |
| 26 | |
| 27 class SyncSchedulerWhiteboxTest : public testing::Test { | |
| 28 public: | |
| 29 virtual void SetUp() { | |
| 30 dir_maker_.SetUp(); | |
| 31 Syncer* syncer = new Syncer(); | |
| 32 ModelSafeRoutingInfo routes; | |
| 33 routes[syncable::BOOKMARKS] = GROUP_UI; | |
| 34 routes[syncable::NIGORI] = GROUP_PASSIVE; | |
| 35 registrar_.reset(new FakeModelSafeWorkerRegistrar(routes)); | |
| 36 connection_.reset(new MockConnectionManager(NULL)); | |
| 37 connection_->SetServerReachable(); | |
| 38 context_ = | |
| 39 new SyncSessionContext( | |
| 40 connection_.get(), dir_maker_.directory(), | |
| 41 registrar_.get(), &extensions_activity_monitor_, | |
| 42 std::vector<SyncEngineEventListener*>(), NULL); | |
| 43 context_->set_notifications_enabled(true); | |
| 44 context_->set_account_name("Test"); | |
| 45 scheduler_.reset( | |
| 46 new SyncScheduler("TestSyncSchedulerWhitebox", context_, syncer)); | |
| 47 } | |
| 48 | |
| 49 virtual void TearDown() { | |
| 50 scheduler_.reset(); | |
| 51 } | |
| 52 | |
| 53 void SetMode(SyncScheduler::Mode mode) { | |
| 54 scheduler_->mode_ = mode; | |
| 55 } | |
| 56 | |
| 57 void SetLastSyncedTime(base::TimeTicks ticks) { | |
| 58 scheduler_->last_sync_session_end_time_ = ticks; | |
| 59 } | |
| 60 | |
| 61 void SetServerConnection(bool connected) { | |
| 62 scheduler_->server_connection_ok_ = connected; | |
| 63 } | |
| 64 | |
| 65 void ResetWaitInterval() { | |
| 66 scheduler_->wait_interval_.reset(); | |
| 67 } | |
| 68 | |
| 69 void SetWaitIntervalToThrottled() { | |
| 70 scheduler_->wait_interval_.reset(new SyncScheduler::WaitInterval( | |
| 71 SyncScheduler::WaitInterval::THROTTLED, TimeDelta::FromSeconds(1))); | |
| 72 } | |
| 73 | |
| 74 void SetWaitIntervalToExponentialBackoff() { | |
| 75 scheduler_->wait_interval_.reset( | |
| 76 new SyncScheduler::WaitInterval( | |
| 77 SyncScheduler::WaitInterval::EXPONENTIAL_BACKOFF, | |
| 78 TimeDelta::FromSeconds(1))); | |
| 79 } | |
| 80 | |
| 81 void SetWaitIntervalHadNudge(bool had_nudge) { | |
| 82 scheduler_->wait_interval_->had_nudge = had_nudge; | |
| 83 } | |
| 84 | |
| 85 SyncScheduler::JobProcessDecision DecideOnJob( | |
| 86 const SyncScheduler::SyncSessionJob& job) { | |
| 87 return scheduler_->DecideOnJob(job); | |
| 88 } | |
| 89 | |
| 90 void InitializeSyncerOnNormalMode() { | |
| 91 SetMode(SyncScheduler::NORMAL_MODE); | |
| 92 ResetWaitInterval(); | |
| 93 SetServerConnection(true); | |
| 94 SetLastSyncedTime(base::TimeTicks::Now()); | |
| 95 } | |
| 96 | |
| 97 SyncScheduler::JobProcessDecision CreateAndDecideJob( | |
| 98 SyncScheduler::SyncSessionJob::SyncSessionJobPurpose purpose) { | |
| 99 SyncSession* s = scheduler_->CreateSyncSession(SyncSourceInfo()); | |
| 100 SyncScheduler::SyncSessionJob job(purpose, TimeTicks::Now(), | |
| 101 make_linked_ptr(s), | |
| 102 false, | |
| 103 FROM_HERE); | |
| 104 return DecideOnJob(job); | |
| 105 } | |
| 106 | |
| 107 SyncSessionContext* context() { return context_; } | |
| 108 | |
| 109 protected: | |
| 110 scoped_ptr<SyncScheduler> scheduler_; | |
| 111 | |
| 112 private: | |
| 113 MessageLoop message_loop_; | |
| 114 scoped_ptr<MockConnectionManager> connection_; | |
| 115 SyncSessionContext* context_; | |
| 116 scoped_ptr<FakeModelSafeWorkerRegistrar> registrar_; | |
| 117 FakeExtensionsActivityMonitor extensions_activity_monitor_; | |
| 118 TestDirectorySetterUpper dir_maker_; | |
| 119 }; | |
| 120 | |
| 121 TEST_F(SyncSchedulerWhiteboxTest, SaveNudge) { | |
| 122 InitializeSyncerOnNormalMode(); | |
| 123 | |
| 124 // Now set the mode to configure. | |
| 125 SetMode(SyncScheduler::CONFIGURATION_MODE); | |
| 126 | |
| 127 SyncScheduler::JobProcessDecision decision = | |
| 128 CreateAndDecideJob(SyncScheduler::SyncSessionJob::NUDGE); | |
| 129 | |
| 130 EXPECT_EQ(decision, SyncScheduler::SAVE); | |
| 131 } | |
| 132 | |
| 133 TEST_F(SyncSchedulerWhiteboxTest, SaveNudgeWhileTypeThrottled) { | |
| 134 InitializeSyncerOnNormalMode(); | |
| 135 | |
| 136 syncable::ModelTypeSet types; | |
| 137 types.Put(syncable::BOOKMARKS); | |
| 138 | |
| 139 // Mark bookmarks as throttled. | |
| 140 context()->SetUnthrottleTime(types, | |
| 141 base::TimeTicks::Now() + base::TimeDelta::FromHours(2)); | |
| 142 | |
| 143 syncable::ModelTypePayloadMap types_with_payload; | |
| 144 types_with_payload[syncable::BOOKMARKS] = ""; | |
| 145 | |
| 146 SyncSourceInfo info(GetUpdatesCallerInfo::LOCAL, types_with_payload); | |
| 147 SyncSession* s = scheduler_->CreateSyncSession(info); | |
| 148 | |
| 149 // Now schedule a nudge with just bookmarks and the change is local. | |
| 150 SyncScheduler::SyncSessionJob job(SyncScheduler::SyncSessionJob::NUDGE, | |
| 151 TimeTicks::Now(), | |
| 152 make_linked_ptr(s), | |
| 153 false, | |
| 154 FROM_HERE); | |
| 155 | |
| 156 SyncScheduler::JobProcessDecision decision = DecideOnJob(job); | |
| 157 EXPECT_EQ(decision, SyncScheduler::SAVE); | |
| 158 } | |
| 159 | |
| 160 TEST_F(SyncSchedulerWhiteboxTest, ContinueNudge) { | |
| 161 InitializeSyncerOnNormalMode(); | |
| 162 | |
| 163 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 164 SyncScheduler::SyncSessionJob::NUDGE); | |
| 165 | |
| 166 EXPECT_EQ(decision, SyncScheduler::CONTINUE); | |
| 167 } | |
| 168 | |
| 169 TEST_F(SyncSchedulerWhiteboxTest, DropPoll) { | |
| 170 InitializeSyncerOnNormalMode(); | |
| 171 SetMode(SyncScheduler::CONFIGURATION_MODE); | |
| 172 | |
| 173 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 174 SyncScheduler::SyncSessionJob::POLL); | |
| 175 | |
| 176 EXPECT_EQ(decision, SyncScheduler::DROP); | |
| 177 } | |
| 178 | |
| 179 TEST_F(SyncSchedulerWhiteboxTest, ContinuePoll) { | |
| 180 InitializeSyncerOnNormalMode(); | |
| 181 | |
| 182 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 183 SyncScheduler::SyncSessionJob::POLL); | |
| 184 | |
| 185 EXPECT_EQ(decision, SyncScheduler::CONTINUE); | |
| 186 } | |
| 187 | |
| 188 TEST_F(SyncSchedulerWhiteboxTest, ContinueConfiguration) { | |
| 189 InitializeSyncerOnNormalMode(); | |
| 190 SetMode(SyncScheduler::CONFIGURATION_MODE); | |
| 191 | |
| 192 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 193 SyncScheduler::SyncSessionJob::CONFIGURATION); | |
| 194 | |
| 195 EXPECT_EQ(decision, SyncScheduler::CONTINUE); | |
| 196 } | |
| 197 | |
| 198 TEST_F(SyncSchedulerWhiteboxTest, SaveConfigurationWhileThrottled) { | |
| 199 InitializeSyncerOnNormalMode(); | |
| 200 SetMode(SyncScheduler::CONFIGURATION_MODE); | |
| 201 | |
| 202 SetWaitIntervalToThrottled(); | |
| 203 | |
| 204 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 205 SyncScheduler::SyncSessionJob::CONFIGURATION); | |
| 206 | |
| 207 EXPECT_EQ(decision, SyncScheduler::SAVE); | |
| 208 } | |
| 209 | |
| 210 TEST_F(SyncSchedulerWhiteboxTest, SaveNudgeWhileThrottled) { | |
| 211 InitializeSyncerOnNormalMode(); | |
| 212 SetMode(SyncScheduler::CONFIGURATION_MODE); | |
| 213 | |
| 214 SetWaitIntervalToThrottled(); | |
| 215 | |
| 216 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 217 SyncScheduler::SyncSessionJob::NUDGE); | |
| 218 | |
| 219 EXPECT_EQ(decision, SyncScheduler::SAVE); | |
| 220 } | |
| 221 | |
| 222 TEST_F(SyncSchedulerWhiteboxTest, | |
| 223 ContinueClearUserDataUnderAllCircumstances) { | |
| 224 InitializeSyncerOnNormalMode(); | |
| 225 | |
| 226 SetMode(SyncScheduler::CONFIGURATION_MODE); | |
| 227 SetWaitIntervalToThrottled(); | |
| 228 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 229 SyncScheduler::SyncSessionJob::CLEAR_USER_DATA); | |
| 230 EXPECT_EQ(decision, SyncScheduler::CONTINUE); | |
| 231 | |
| 232 SetMode(SyncScheduler::NORMAL_MODE); | |
| 233 SetWaitIntervalToExponentialBackoff(); | |
| 234 decision = CreateAndDecideJob( | |
| 235 SyncScheduler::SyncSessionJob::CLEAR_USER_DATA); | |
| 236 EXPECT_EQ(decision, SyncScheduler::CONTINUE); | |
| 237 } | |
| 238 | |
| 239 TEST_F(SyncSchedulerWhiteboxTest, ContinueNudgeWhileExponentialBackOff) { | |
| 240 InitializeSyncerOnNormalMode(); | |
| 241 SetMode(SyncScheduler::NORMAL_MODE); | |
| 242 SetWaitIntervalToExponentialBackoff(); | |
| 243 | |
| 244 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 245 SyncScheduler::SyncSessionJob::NUDGE); | |
| 246 | |
| 247 EXPECT_EQ(decision, SyncScheduler::CONTINUE); | |
| 248 } | |
| 249 | |
| 250 TEST_F(SyncSchedulerWhiteboxTest, DropNudgeWhileExponentialBackOff) { | |
| 251 InitializeSyncerOnNormalMode(); | |
| 252 SetMode(SyncScheduler::NORMAL_MODE); | |
| 253 SetWaitIntervalToExponentialBackoff(); | |
| 254 SetWaitIntervalHadNudge(true); | |
| 255 | |
| 256 SyncScheduler::JobProcessDecision decision = CreateAndDecideJob( | |
| 257 SyncScheduler::SyncSessionJob::NUDGE); | |
| 258 | |
| 259 EXPECT_EQ(decision, SyncScheduler::DROP); | |
| 260 } | |
| 261 | |
| 262 TEST_F(SyncSchedulerWhiteboxTest, ContinueCanaryJobConfig) { | |
| 263 InitializeSyncerOnNormalMode(); | |
| 264 SetMode(SyncScheduler::CONFIGURATION_MODE); | |
| 265 SetWaitIntervalToExponentialBackoff(); | |
| 266 | |
| 267 struct SyncScheduler::SyncSessionJob job; | |
| 268 job.purpose = SyncScheduler::SyncSessionJob::CONFIGURATION; | |
| 269 job.scheduled_start = TimeTicks::Now(); | |
| 270 job.is_canary_job = true; | |
| 271 SyncScheduler::JobProcessDecision decision = DecideOnJob(job); | |
| 272 | |
| 273 EXPECT_EQ(decision, SyncScheduler::CONTINUE); | |
| 274 } | |
| 275 | |
| 276 } // namespace browser_sync | |
| OLD | NEW |