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

Side by Side Diff: chrome/test/live_sync/profile_sync_service_test_harness.cc

Issue 3169028: Adding debugging info for sync integration tests. (Closed)
Patch Set: Adding id_ member to class ProfileSyncServiceTestHarness. Created 10 years, 4 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
« no previous file with comments | « chrome/test/live_sync/profile_sync_service_test_harness.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/message_loop.h" 5 #include "base/message_loop.h"
6 #include "chrome/browser/browser.h" 6 #include "chrome/browser/browser.h"
7 #include "chrome/browser/defaults.h" 7 #include "chrome/browser/defaults.h"
8 #include "chrome/browser/pref_service.h" 8 #include "chrome/browser/pref_service.h"
9 #include "chrome/browser/profile.h" 9 #include "chrome/browser/profile.h"
10 #include "chrome/browser/sync/glue/sync_backend_host.h" 10 #include "chrome/browser/sync/glue/sync_backend_host.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 } 75 }
76 } 76 }
77 } 77 }
78 78
79 bool StateChangeTimeoutEvent::Abort() { 79 bool StateChangeTimeoutEvent::Abort() {
80 aborted_ = true; 80 aborted_ = true;
81 caller_ = NULL; 81 caller_ = NULL;
82 return !did_timeout_; 82 return !did_timeout_;
83 } 83 }
84 84
85 ProfileSyncServiceTestHarness::ProfileSyncServiceTestHarness( 85 ProfileSyncServiceTestHarness::ProfileSyncServiceTestHarness(Profile* p,
86 Profile* p, const std::string& username, const std::string& password) 86 const std::string& username, const std::string& password, int id)
87 : wait_state_(WAITING_FOR_ON_AUTH_ERROR), profile_(p), service_(NULL), 87 : wait_state_(WAITING_FOR_ON_AUTH_ERROR), profile_(p), service_(NULL),
88 last_status_(kInvalidStatus), 88 last_status_(kInvalidStatus),
89 last_timestamp_(0), 89 last_timestamp_(0),
90 min_timestamp_needed_(kMinTimestampNeededNone), 90 min_timestamp_needed_(kMinTimestampNeededNone),
91 username_(username), password_(password) { 91 username_(username), password_(password), id_(id) {
92 // Ensure the profile has enough prefs registered for use by sync. 92 // Ensure the profile has enough prefs registered for use by sync.
93 if (!p->GetPrefs()->FindPreference(prefs::kAcceptLanguages)) 93 if (!p->GetPrefs()->FindPreference(prefs::kAcceptLanguages))
94 TabContents::RegisterUserPrefs(p->GetPrefs()); 94 TabContents::RegisterUserPrefs(p->GetPrefs());
95 } 95 }
96 96
97 bool ProfileSyncServiceTestHarness::SetupSync() { 97 bool ProfileSyncServiceTestHarness::SetupSync() {
98 service_ = profile_->GetProfileSyncService(); 98 service_ = profile_->GetProfileSyncService();
99 service_->StartUp(); 99 service_->StartUp();
100 service_->AddObserver(this); 100 service_->AddObserver(this);
101 return WaitForServiceInit(false); 101 return WaitForServiceInit(false);
(...skipping 13 matching lines...) Expand all
115 115
116 void ProfileSyncServiceTestHarness::SignalStateComplete() { 116 void ProfileSyncServiceTestHarness::SignalStateComplete() {
117 MessageLoopForUI::current()->Quit(); 117 MessageLoopForUI::current()->Quit();
118 } 118 }
119 119
120 bool ProfileSyncServiceTestHarness::RunStateChangeMachine() { 120 bool ProfileSyncServiceTestHarness::RunStateChangeMachine() {
121 WaitState state = wait_state_; 121 WaitState state = wait_state_;
122 ProfileSyncService::Status status(service_->QueryDetailedSyncStatus()); 122 ProfileSyncService::Status status(service_->QueryDetailedSyncStatus());
123 switch (wait_state_) { 123 switch (wait_state_) {
124 case WAITING_FOR_ON_AUTH_ERROR: { 124 case WAITING_FOR_ON_AUTH_ERROR: {
125 LogClientInfo("WAITING_FOR_ON_AUTH_ERROR");
125 SignalStateCompleteWithNextState(WAITING_FOR_ON_BACKEND_INITIALIZED); 126 SignalStateCompleteWithNextState(WAITING_FOR_ON_BACKEND_INITIALIZED);
126 break; 127 break;
127 } 128 }
128 case WAITING_FOR_ON_BACKEND_INITIALIZED: { 129 case WAITING_FOR_ON_BACKEND_INITIALIZED: {
130 LogClientInfo("WAITING_FOR_ON_BACKEND_INITIALIZED");
129 if (service_->GetAuthError().state() != GoogleServiceAuthError::NONE) { 131 if (service_->GetAuthError().state() != GoogleServiceAuthError::NONE) {
130 SignalStateCompleteWithNextState(AUTH_ERROR); 132 SignalStateCompleteWithNextState(AUTH_ERROR);
131 } 133 }
132 if (service_->sync_initialized()) { 134 if (service_->sync_initialized()) {
133 SignalStateCompleteWithNextState(WAITING_FOR_NOTIFICATIONS_ENABLED); 135 SignalStateCompleteWithNextState(WAITING_FOR_NOTIFICATIONS_ENABLED);
134 } 136 }
135 break; 137 break;
136 } 138 }
137 case WAITING_FOR_NOTIFICATIONS_ENABLED: { 139 case WAITING_FOR_NOTIFICATIONS_ENABLED: {
140 LogClientInfo("WAITING_FOR_NOTIFICATIONS_ENABLED");
138 if (status.notifications_enabled) { 141 if (status.notifications_enabled) {
139 SignalStateCompleteWithNextState(FULLY_SYNCED); 142 SignalStateCompleteWithNextState(FULLY_SYNCED);
140 } 143 }
141 break; 144 break;
142 } 145 }
143 case WAITING_FOR_SYNC_TO_FINISH: { 146 case WAITING_FOR_SYNC_TO_FINISH: {
147 LogClientInfo("WAITING_FOR_SYNC_TO_FINISH");
144 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); 148 const SyncSessionSnapshot* snap = GetLastSessionSnapshot();
145 DCHECK(snap) << "Should have been at least one sync session by now"; 149 DCHECK(snap) << "Should have been at least one sync session by now";
146 // TODO(rsimha): In an ideal world, snap->has_more_to_sync == false should 150 // TODO(rsimha): In an ideal world, snap->has_more_to_sync == false should
147 // be a sufficient condition for sync to have completed. However, the 151 // be a sufficient condition for sync to have completed. However, the
148 // additional check of snap->unsynced_count is required due to 152 // additional check of snap->unsynced_count is required due to
149 // http://crbug.com/48989. 153 // http://crbug.com/48989.
150 if (snap->has_more_to_sync || snap->unsynced_count != 0) { 154 if (snap->has_more_to_sync || snap->unsynced_count != 0) {
151 break; 155 break;
152 } 156 }
153 EXPECT_LE(last_timestamp_, snap->max_local_timestamp); 157 EXPECT_LE(last_timestamp_, snap->max_local_timestamp);
154 last_timestamp_ = snap->max_local_timestamp; 158 last_timestamp_ = snap->max_local_timestamp;
155 SignalStateCompleteWithNextState(FULLY_SYNCED); 159 SignalStateCompleteWithNextState(FULLY_SYNCED);
156 break; 160 break;
157 } 161 }
158 case WAITING_FOR_UPDATES: { 162 case WAITING_FOR_UPDATES: {
163 LogClientInfo("WAITING_FOR_UPDATES");
159 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); 164 const SyncSessionSnapshot* snap = GetLastSessionSnapshot();
160 DCHECK(snap) << "Should have been at least one sync session by now"; 165 DCHECK(snap) << "Should have been at least one sync session by now";
161 if (snap->max_local_timestamp < min_timestamp_needed_) { 166 if (snap->max_local_timestamp < min_timestamp_needed_) {
162 break; 167 break;
163 } 168 }
164 EXPECT_LE(last_timestamp_, snap->max_local_timestamp); 169 EXPECT_LE(last_timestamp_, snap->max_local_timestamp);
165 last_timestamp_ = snap->max_local_timestamp; 170 last_timestamp_ = snap->max_local_timestamp;
166 SignalStateCompleteWithNextState(FULLY_SYNCED); 171 SignalStateCompleteWithNextState(FULLY_SYNCED);
167 break; 172 break;
168 } 173 }
169 case FULLY_SYNCED: 174 case FULLY_SYNCED: {
175 LogClientInfo("FULLY_SYNCED");
176 break;
177 }
178 case AUTH_ERROR: {
179 LogClientInfo("AUTH_ERROR");
180 break;
181 }
170 default: 182 default:
171 // Invalid state during observer callback which may be triggered by other 183 // Invalid state during observer callback which may be triggered by other
172 // classes using the the UI message loop. Defer to their handling. 184 // classes using the the UI message loop. Defer to their handling.
173 break; 185 break;
174 } 186 }
175 last_status_ = status; 187 last_status_ = status;
176 return state != wait_state_; 188 return state != wait_state_;
177 } 189 }
178 190
179 void ProfileSyncServiceTestHarness::OnStateChanged() { 191 void ProfileSyncServiceTestHarness::OnStateChanged() {
180 RunStateChangeMachine(); 192 RunStateChangeMachine();
181 } 193 }
182 194
183 bool ProfileSyncServiceTestHarness::AwaitSyncCycleCompletion( 195 bool ProfileSyncServiceTestHarness::AwaitSyncCycleCompletion(
184 const std::string& reason) { 196 const std::string& reason) {
197 LogClientInfo("AwaitSyncCycleCompletion");
185 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); 198 const SyncSessionSnapshot* snap = GetLastSessionSnapshot();
186 DCHECK(snap) << "Should have been at least one sync session by now"; 199 DCHECK(snap) << "Should have been at least one sync session by now";
187 // TODO(rsimha): Remove additional checks of snap->has_more_to_sync and 200 // TODO(rsimha): Remove additional checks of snap->has_more_to_sync and
188 // snap->unsynced_count once http://crbug.com/48989 is fixed. 201 // snap->unsynced_count once http://crbug.com/48989 is fixed.
189 if (service()->backend()->HasUnsyncedItems() || 202 if (service()->backend()->HasUnsyncedItems() ||
190 snap->has_more_to_sync || 203 snap->has_more_to_sync ||
191 snap->unsynced_count != 0) { 204 snap->unsynced_count != 0) {
192 wait_state_ = WAITING_FOR_SYNC_TO_FINISH; 205 wait_state_ = WAITING_FOR_SYNC_TO_FINISH;
193 return AwaitStatusChangeWithTimeout(60, reason); 206 return AwaitStatusChangeWithTimeout(60, reason);
194 } else { 207 } else {
195 EXPECT_LE(last_timestamp_, snap->max_local_timestamp); 208 EXPECT_LE(last_timestamp_, snap->max_local_timestamp);
196 last_timestamp_ = snap->max_local_timestamp; 209 last_timestamp_ = snap->max_local_timestamp;
197 return true; 210 return true;
198 } 211 }
199 } 212 }
200 213
201 bool ProfileSyncServiceTestHarness::AwaitMutualSyncCycleCompletion( 214 bool ProfileSyncServiceTestHarness::AwaitMutualSyncCycleCompletion(
202 ProfileSyncServiceTestHarness* partner) { 215 ProfileSyncServiceTestHarness* partner) {
216 LogClientInfo("AwaitMutualSyncCycleCompletion");
203 bool success = AwaitSyncCycleCompletion( 217 bool success = AwaitSyncCycleCompletion(
204 "Sync cycle completion on active client."); 218 "Sync cycle completion on active client.");
205 if (!success) 219 if (!success)
206 return false; 220 return false;
207 return partner->WaitUntilTimestampIsAtLeast(last_timestamp_, 221 return partner->WaitUntilTimestampIsAtLeast(last_timestamp_,
208 "Sync cycle completion on passive client."); 222 "Sync cycle completion on passive client.");
209 } 223 }
210 224
211 bool ProfileSyncServiceTestHarness::AwaitGroupSyncCycleCompletion( 225 bool ProfileSyncServiceTestHarness::AwaitGroupSyncCycleCompletion(
212 std::vector<ProfileSyncServiceTestHarness*>& partners) { 226 std::vector<ProfileSyncServiceTestHarness*>& partners) {
227 LogClientInfo("AwaitGroupSyncCycleCompletion");
213 bool success = AwaitSyncCycleCompletion( 228 bool success = AwaitSyncCycleCompletion(
214 "Sync cycle completion on active client."); 229 "Sync cycle completion on active client.");
215 if (!success) 230 if (!success)
216 return false; 231 return false;
217 bool return_value = true; 232 bool return_value = true;
218 for (std::vector<ProfileSyncServiceTestHarness*>::iterator it = 233 for (std::vector<ProfileSyncServiceTestHarness*>::iterator it =
219 partners.begin(); it != partners.end(); ++it) { 234 partners.begin(); it != partners.end(); ++it) {
220 if (this != *it) { 235 if (this != *it) {
221 return_value = return_value && 236 return_value = return_value &&
222 (*it)->WaitUntilTimestampIsAtLeast(last_timestamp_, 237 (*it)->WaitUntilTimestampIsAtLeast(last_timestamp_,
223 "Sync cycle completion on partner client."); 238 "Sync cycle completion on partner client.");
224 } 239 }
225 } 240 }
226 return return_value; 241 return return_value;
227 } 242 }
228 243
229 // static 244 // static
230 bool ProfileSyncServiceTestHarness::AwaitQuiescence( 245 bool ProfileSyncServiceTestHarness::AwaitQuiescence(
231 std::vector<ProfileSyncServiceTestHarness*>& clients) { 246 std::vector<ProfileSyncServiceTestHarness*>& clients) {
247 LOG(INFO) << "AwaitQuiescence.";
232 bool return_value = true; 248 bool return_value = true;
233 for (std::vector<ProfileSyncServiceTestHarness*>::iterator it = 249 for (std::vector<ProfileSyncServiceTestHarness*>::iterator it =
234 clients.begin(); it != clients.end(); ++it) { 250 clients.begin(); it != clients.end(); ++it) {
235 return_value = return_value && 251 return_value = return_value &&
236 (*it)->AwaitGroupSyncCycleCompletion(clients); 252 (*it)->AwaitGroupSyncCycleCompletion(clients);
237 } 253 }
238 return return_value; 254 return return_value;
239 } 255 }
240 256
241 bool ProfileSyncServiceTestHarness::WaitUntilTimestampIsAtLeast( 257 bool ProfileSyncServiceTestHarness::WaitUntilTimestampIsAtLeast(
242 int64 timestamp, const std::string& reason) { 258 int64 timestamp, const std::string& reason) {
259 LogClientInfo("WaitUntilTimestampIsAtLeast");
243 min_timestamp_needed_ = timestamp; 260 min_timestamp_needed_ = timestamp;
244 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); 261 const SyncSessionSnapshot* snap = GetLastSessionSnapshot();
245 DCHECK(snap) << "Should have been at least one sync session by now"; 262 DCHECK(snap) << "Should have been at least one sync session by now";
246 if (snap->max_local_timestamp < min_timestamp_needed_) { 263 if (snap->max_local_timestamp < min_timestamp_needed_) {
247 wait_state_ = WAITING_FOR_UPDATES; 264 wait_state_ = WAITING_FOR_UPDATES;
248 return AwaitStatusChangeWithTimeout(60, reason); 265 return AwaitStatusChangeWithTimeout(60, reason);
249 } else { 266 } else {
250 return true; 267 return true;
251 } 268 }
252 } 269 }
253 270
254 bool ProfileSyncServiceTestHarness::AwaitStatusChangeWithTimeout( 271 bool ProfileSyncServiceTestHarness::AwaitStatusChangeWithTimeout(
255 int timeout_seconds, 272 int timeout_seconds,
256 const std::string& reason) { 273 const std::string& reason) {
274 LogClientInfo("AwaitStatusChangeWithTimeout");
257 scoped_refptr<StateChangeTimeoutEvent> timeout_signal( 275 scoped_refptr<StateChangeTimeoutEvent> timeout_signal(
258 new StateChangeTimeoutEvent(this, reason)); 276 new StateChangeTimeoutEvent(this, reason));
259 MessageLoopForUI* loop = MessageLoopForUI::current(); 277 MessageLoopForUI* loop = MessageLoopForUI::current();
260 loop->PostDelayedTask( 278 loop->PostDelayedTask(
261 FROM_HERE, 279 FROM_HERE,
262 NewRunnableMethod(timeout_signal.get(), 280 NewRunnableMethod(timeout_signal.get(),
263 &StateChangeTimeoutEvent::Callback), 281 &StateChangeTimeoutEvent::Callback),
264 1000 * timeout_seconds); 282 1000 * timeout_seconds);
283 LogClientInfo("Before RunMessageLoop");
265 ui_test_utils::RunMessageLoop(); 284 ui_test_utils::RunMessageLoop();
285 LogClientInfo("After RunMessageLoop");
266 return timeout_signal->Abort(); 286 return timeout_signal->Abort();
267 } 287 }
268 288
269 bool ProfileSyncServiceTestHarness::WaitForServiceInit(bool is_auth_retry) { 289 bool ProfileSyncServiceTestHarness::WaitForServiceInit(bool is_auth_retry) {
290 LogClientInfo("WaitForServiceInit");
270 if (!is_auth_retry) { 291 if (!is_auth_retry) {
271 // Wait for the OnAuthError() callback. 292 // Wait for the OnAuthError() callback.
272 EXPECT_EQ(wait_state_, WAITING_FOR_ON_AUTH_ERROR); 293 EXPECT_EQ(wait_state_, WAITING_FOR_ON_AUTH_ERROR);
273 EXPECT_TRUE(AwaitStatusChangeWithTimeout(30, 294 EXPECT_TRUE(AwaitStatusChangeWithTimeout(30,
274 "Waiting for the OnAuthError() callback.")) << 295 "Waiting for the OnAuthError() callback.")) <<
275 "OnAuthError() not seen after 30 seconds."; 296 "OnAuthError() not seen after 30 seconds.";
276 } 297 }
277 298
278 // Enter GAIA credentials and wait for the OnBackendInitialized() callback. 299 // Enter GAIA credentials and wait for the OnBackendInitialized() callback.
279 service_->backend()->Authenticate(username_, password_, std::string()); 300 service_->backend()->Authenticate(username_, password_, std::string());
(...skipping 23 matching lines...) Expand all
303 "notifications_enabled not set to true after 30 seconds."; 324 "notifications_enabled not set to true after 30 seconds.";
304 325
305 return true; 326 return true;
306 } 327 }
307 328
308 const SyncSessionSnapshot* 329 const SyncSessionSnapshot*
309 ProfileSyncServiceTestHarness::GetLastSessionSnapshot() const { 330 ProfileSyncServiceTestHarness::GetLastSessionSnapshot() const {
310 EXPECT_FALSE(service_ == NULL) << "Sync service has not yet been set up."; 331 EXPECT_FALSE(service_ == NULL) << "Sync service has not yet been set up.";
311 return service_->backend()->GetLastSessionSnapshot(); 332 return service_->backend()->GetLastSessionSnapshot();
312 } 333 }
334
335 void ProfileSyncServiceTestHarness::LogClientInfo(std::string message) {
336 const SyncSessionSnapshot* snap = GetLastSessionSnapshot();
337 if (snap) {
338 LOG(INFO) << "Client " << id_ << ": " << message << ": "
339 << "has_more_to_sync: " << snap->has_more_to_sync
340 << ", max_local_timestamp: " << snap->max_local_timestamp
341 << ", unsynced_count: " << snap->unsynced_count
342 << ", has_unsynced_items: " << service()->backend()->HasUnsyncedItems()
343 << ".";
344 } else {
345 LOG(INFO) << "Client " << id_ << ": " << message << ": "
346 << "Snap not available.";
347 }
348 }
OLDNEW
« no previous file with comments | « chrome/test/live_sync/profile_sync_service_test_harness.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698