| OLD | NEW |
| 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/prefs/pref_service.h" | 8 #include "chrome/browser/prefs/pref_service.h" |
| 9 #include "chrome/browser/profile.h" | 9 #include "chrome/browser/profile.h" |
| 10 #include "chrome/browser/net/gaia/token_service.h" |
| 10 #include "chrome/browser/sync/glue/sync_backend_host.h" | 11 #include "chrome/browser/sync/glue/sync_backend_host.h" |
| 11 #include "chrome/browser/sync/sessions/session_state.h" | 12 #include "chrome/browser/sync/sessions/session_state.h" |
| 12 #include "chrome/browser/tab_contents/tab_contents.h" | 13 #include "chrome/browser/tab_contents/tab_contents.h" |
| 14 #include "chrome/common/net/gaia/gaia_constants.h" |
| 13 #include "chrome/common/net/gaia/google_service_auth_error.h" | 15 #include "chrome/common/net/gaia/google_service_auth_error.h" |
| 14 #include "chrome/common/pref_names.h" | 16 #include "chrome/common/pref_names.h" |
| 15 #include "chrome/test/live_sync/profile_sync_service_test_harness.h" | 17 #include "chrome/test/live_sync/profile_sync_service_test_harness.h" |
| 16 #include "chrome/test/ui_test_utils.h" | 18 #include "chrome/test/ui_test_utils.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 20 |
| 19 // The default value for min_timestamp_needed_ when we're not in the | 21 // The default value for min_timestamp_needed_ when we're not in the |
| 20 // WAITING_FOR_UPDATES state. | 22 // WAITING_FOR_UPDATES state. |
| 21 static const int kMinTimestampNeededNone = -1; | 23 static const int kMinTimestampNeededNone = -1; |
| 22 | 24 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 } | 79 } |
| 78 | 80 |
| 79 bool StateChangeTimeoutEvent::Abort() { | 81 bool StateChangeTimeoutEvent::Abort() { |
| 80 aborted_ = true; | 82 aborted_ = true; |
| 81 caller_ = NULL; | 83 caller_ = NULL; |
| 82 return !did_timeout_; | 84 return !did_timeout_; |
| 83 } | 85 } |
| 84 | 86 |
| 85 ProfileSyncServiceTestHarness::ProfileSyncServiceTestHarness(Profile* p, | 87 ProfileSyncServiceTestHarness::ProfileSyncServiceTestHarness(Profile* p, |
| 86 const std::string& username, const std::string& password, int id) | 88 const std::string& username, const std::string& password, int id) |
| 87 : wait_state_(WAITING_FOR_ON_AUTH_ERROR), profile_(p), service_(NULL), | 89 : wait_state_(WAITING_FOR_ON_BACKEND_INITIALIZED), |
| 90 profile_(p), service_(NULL), |
| 88 last_status_(kInvalidStatus), | 91 last_status_(kInvalidStatus), |
| 89 last_timestamp_(0), | 92 last_timestamp_(0), |
| 90 min_timestamp_needed_(kMinTimestampNeededNone), | 93 min_timestamp_needed_(kMinTimestampNeededNone), |
| 91 username_(username), password_(password), id_(id) { | 94 username_(username), password_(password), id_(id) { |
| 92 // Ensure the profile has enough prefs registered for use by sync. | 95 // Ensure the profile has enough prefs registered for use by sync. |
| 93 if (!p->GetPrefs()->FindPreference(prefs::kAcceptLanguages)) | 96 if (!p->GetPrefs()->FindPreference(prefs::kAcceptLanguages)) |
| 94 TabContents::RegisterUserPrefs(p->GetPrefs()); | 97 TabContents::RegisterUserPrefs(p->GetPrefs()); |
| 95 } | 98 } |
| 96 | 99 |
| 97 bool ProfileSyncServiceTestHarness::SetupSync() { | 100 bool ProfileSyncServiceTestHarness::SetupSync() { |
| 98 service_ = profile_->GetProfileSyncService(); | 101 service_ = profile_->GetProfileSyncService(""); |
| 99 service_->StartUp(); | |
| 100 service_->AddObserver(this); | 102 service_->AddObserver(this); |
| 101 return WaitForServiceInit(false); | 103 service_->signin_.StartSignIn(username_, password_, "", ""); |
| 102 } | |
| 103 | 104 |
| 104 bool ProfileSyncServiceTestHarness::RetryAuthentication() { | 105 return WaitForServiceInit(); |
| 105 wait_state_ = WAITING_FOR_ON_BACKEND_INITIALIZED; | |
| 106 return WaitForServiceInit(true); | |
| 107 } | 106 } |
| 108 | 107 |
| 109 void ProfileSyncServiceTestHarness::SignalStateCompleteWithNextState( | 108 void ProfileSyncServiceTestHarness::SignalStateCompleteWithNextState( |
| 110 WaitState next_state) { | 109 WaitState next_state) { |
| 111 | 110 |
| 112 wait_state_ = next_state; | 111 wait_state_ = next_state; |
| 113 SignalStateComplete(); | 112 SignalStateComplete(); |
| 114 } | 113 } |
| 115 | 114 |
| 116 void ProfileSyncServiceTestHarness::SignalStateComplete() { | 115 void ProfileSyncServiceTestHarness::SignalStateComplete() { |
| 117 MessageLoopForUI::current()->Quit(); | 116 MessageLoopForUI::current()->Quit(); |
| 118 } | 117 } |
| 119 | 118 |
| 120 bool ProfileSyncServiceTestHarness::RunStateChangeMachine() { | 119 bool ProfileSyncServiceTestHarness::RunStateChangeMachine() { |
| 121 WaitState state = wait_state_; | 120 WaitState state = wait_state_; |
| 122 ProfileSyncService::Status status(service_->QueryDetailedSyncStatus()); | 121 ProfileSyncService::Status status(service_->QueryDetailedSyncStatus()); |
| 123 switch (wait_state_) { | 122 switch (wait_state_) { |
| 124 case WAITING_FOR_ON_AUTH_ERROR: { | |
| 125 LogClientInfo("WAITING_FOR_ON_AUTH_ERROR"); | |
| 126 SignalStateCompleteWithNextState(WAITING_FOR_ON_BACKEND_INITIALIZED); | |
| 127 break; | |
| 128 } | |
| 129 case WAITING_FOR_ON_BACKEND_INITIALIZED: { | 123 case WAITING_FOR_ON_BACKEND_INITIALIZED: { |
| 130 LogClientInfo("WAITING_FOR_ON_BACKEND_INITIALIZED"); | 124 LogClientInfo("WAITING_FOR_ON_BACKEND_INITIALIZED"); |
| 131 if (service_->GetAuthError().state() != GoogleServiceAuthError::NONE) { | 125 if (service_->GetAuthError().state() != GoogleServiceAuthError::NONE) { |
| 132 SignalStateCompleteWithNextState(AUTH_ERROR); | 126 SignalStateCompleteWithNextState(AUTH_ERROR); |
| 133 } | 127 } |
| 134 if (service_->sync_initialized()) { | 128 if (service_->sync_initialized()) { |
| 135 SignalStateCompleteWithNextState(WAITING_FOR_NOTIFICATIONS_ENABLED); | 129 SignalStateCompleteWithNextState(WAITING_FOR_NOTIFICATIONS_ENABLED); |
| 136 } | 130 } |
| 137 break; | 131 break; |
| 138 } | 132 } |
| 139 case WAITING_FOR_NOTIFICATIONS_ENABLED: { | 133 case WAITING_FOR_NOTIFICATIONS_ENABLED: { |
| 140 LogClientInfo("WAITING_FOR_NOTIFICATIONS_ENABLED"); | 134 LogClientInfo("WAITING_FOR_NOTIFICATIONS_ENABLED"); |
| 141 if (status.notifications_enabled) { | 135 if (status.notifications_enabled) { |
| 142 SignalStateCompleteWithNextState(FULLY_SYNCED); | 136 SignalStateCompleteWithNextState(FULLY_SYNCED); |
| 143 } | 137 } |
| 144 break; | 138 break; |
| 145 } | 139 } |
| 140 case WAITING_FOR_SERVER_REACHABLE: { |
| 141 LogClientInfo("WAITING_FOR_SERVER_REACHABLE"); |
| 142 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); |
| 143 if (!status.server_reachable) { |
| 144 break; |
| 145 } |
| 146 if (service()->backend()->HasUnsyncedItems() || |
| 147 snap->has_more_to_sync || snap->unsynced_count != 0) { |
| 148 SignalStateCompleteWithNextState(WAITING_FOR_SYNC_TO_FINISH); |
| 149 break; |
| 150 } |
| 151 last_timestamp_ = snap->max_local_timestamp; |
| 152 SignalStateCompleteWithNextState(FULLY_SYNCED); |
| 153 break; |
| 154 } |
| 146 case WAITING_FOR_SYNC_TO_FINISH: { | 155 case WAITING_FOR_SYNC_TO_FINISH: { |
| 147 LogClientInfo("WAITING_FOR_SYNC_TO_FINISH"); | 156 LogClientInfo("WAITING_FOR_SYNC_TO_FINISH"); |
| 148 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); | 157 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); |
| 149 DCHECK(snap) << "Should have been at least one sync session by now"; | 158 DCHECK(snap) << "Should have been at least one sync session by now"; |
| 150 // TODO(rsimha): In an ideal world, snap->has_more_to_sync == false should | 159 // TODO(rsimha): In an ideal world, snap->has_more_to_sync == false should |
| 151 // be a sufficient condition for sync to have completed. However, the | 160 // be a sufficient condition for sync to have completed. However, the |
| 152 // additional check of snap->unsynced_count is required due to | 161 // additional check of snap->unsynced_count is required due to |
| 153 // http://crbug.com/48989. | 162 // http://crbug.com/48989. |
| 154 if (snap->has_more_to_sync || snap->unsynced_count != 0) { | 163 if (service()->backend()->HasUnsyncedItems() || |
| 164 snap->has_more_to_sync || snap->unsynced_count != 0) { |
| 165 if (!status.server_reachable) |
| 166 SignalStateCompleteWithNextState(WAITING_FOR_SERVER_REACHABLE); |
| 155 break; | 167 break; |
| 156 } | 168 } |
| 157 EXPECT_LE(last_timestamp_, snap->max_local_timestamp); | 169 EXPECT_LE(last_timestamp_, snap->max_local_timestamp); |
| 158 last_timestamp_ = snap->max_local_timestamp; | 170 last_timestamp_ = snap->max_local_timestamp; |
| 159 SignalStateCompleteWithNextState(FULLY_SYNCED); | 171 SignalStateCompleteWithNextState(FULLY_SYNCED); |
| 160 break; | 172 break; |
| 161 } | 173 } |
| 162 case WAITING_FOR_UPDATES: { | 174 case WAITING_FOR_UPDATES: { |
| 163 LogClientInfo("WAITING_FOR_UPDATES"); | 175 LogClientInfo("WAITING_FOR_UPDATES"); |
| 164 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); | 176 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 FROM_HERE, | 291 FROM_HERE, |
| 280 NewRunnableMethod(timeout_signal.get(), | 292 NewRunnableMethod(timeout_signal.get(), |
| 281 &StateChangeTimeoutEvent::Callback), | 293 &StateChangeTimeoutEvent::Callback), |
| 282 1000 * timeout_seconds); | 294 1000 * timeout_seconds); |
| 283 LogClientInfo("Before RunMessageLoop"); | 295 LogClientInfo("Before RunMessageLoop"); |
| 284 ui_test_utils::RunMessageLoop(); | 296 ui_test_utils::RunMessageLoop(); |
| 285 LogClientInfo("After RunMessageLoop"); | 297 LogClientInfo("After RunMessageLoop"); |
| 286 return timeout_signal->Abort(); | 298 return timeout_signal->Abort(); |
| 287 } | 299 } |
| 288 | 300 |
| 289 bool ProfileSyncServiceTestHarness::WaitForServiceInit(bool is_auth_retry) { | 301 bool ProfileSyncServiceTestHarness::WaitForServiceInit() { |
| 290 LogClientInfo("WaitForServiceInit"); | 302 LogClientInfo("WaitForServiceInit"); |
| 291 if (!is_auth_retry) { | |
| 292 // Wait for the OnAuthError() callback. | |
| 293 EXPECT_EQ(wait_state_, WAITING_FOR_ON_AUTH_ERROR); | |
| 294 EXPECT_TRUE(AwaitStatusChangeWithTimeout(30, | |
| 295 "Waiting for the OnAuthError() callback.")) << | |
| 296 "OnAuthError() not seen after 30 seconds."; | |
| 297 } | |
| 298 | 303 |
| 299 // Enter GAIA credentials and wait for the OnBackendInitialized() callback. | 304 // Wait for the OnBackendInitialized() callback. |
| 300 service_->backend()->Authenticate(username_, password_, std::string()); | |
| 301 EXPECT_EQ(wait_state_, WAITING_FOR_ON_BACKEND_INITIALIZED); | 305 EXPECT_EQ(wait_state_, WAITING_FOR_ON_BACKEND_INITIALIZED); |
| 302 EXPECT_TRUE(AwaitStatusChangeWithTimeout(30, | 306 EXPECT_TRUE(AwaitStatusChangeWithTimeout(30, |
| 303 "Waiting for OnBackendInitialized().")) << | 307 "Waiting for OnBackendInitialized().")) << |
| 304 "OnBackendInitialized() not seen after 30 seconds."; | 308 "OnBackendInitialized() not seen after 30 seconds."; |
| 305 | 309 |
| 306 if (wait_state_ == AUTH_ERROR) { | 310 if (wait_state_ == AUTH_ERROR) { |
| 307 return false; | 311 return false; |
| 308 } | 312 } |
| 309 | 313 |
| 310 // Choose datatypes to be synced. Note: This is unnecessary on Chrome OS. | 314 // Choose datatypes to be synced. |
| 311 if (!browser_defaults::kBootstrapSyncAuthentication) { | 315 syncable::ModelTypeSet set; |
| 312 syncable::ModelTypeSet set; | 316 for (int i = syncable::FIRST_REAL_MODEL_TYPE; |
| 313 for (int i = syncable::FIRST_REAL_MODEL_TYPE; | 317 i < syncable::MODEL_TYPE_COUNT; ++i) { |
| 314 i < syncable::MODEL_TYPE_COUNT; ++i) { | 318 set.insert(syncable::ModelTypeFromInt(i)); |
| 315 set.insert(syncable::ModelTypeFromInt(i)); | |
| 316 } | |
| 317 service_->OnUserChoseDatatypes(true, set); | |
| 318 } | 319 } |
| 320 service_->OnUserChoseDatatypes(true, set); |
| 319 | 321 |
| 320 // Wait for notifications_enabled to be set to true. | 322 // Wait for notifications_enabled to be set to true. |
| 321 EXPECT_EQ(wait_state_, WAITING_FOR_NOTIFICATIONS_ENABLED); | 323 EXPECT_EQ(wait_state_, WAITING_FOR_NOTIFICATIONS_ENABLED); |
| 322 EXPECT_TRUE(AwaitStatusChangeWithTimeout(30, | 324 EXPECT_TRUE(AwaitStatusChangeWithTimeout(30, |
| 323 "Waiting for notifications_enabled to be set to true.")) << | 325 "Waiting for notifications_enabled to be set to true.")) << |
| 324 "notifications_enabled not set to true after 30 seconds."; | 326 "notifications_enabled not set to true after 30 seconds."; |
| 325 | 327 |
| 326 return true; | 328 return true; |
| 327 } | 329 } |
| 328 | 330 |
| 329 const SyncSessionSnapshot* | 331 const SyncSessionSnapshot* |
| 330 ProfileSyncServiceTestHarness::GetLastSessionSnapshot() const { | 332 ProfileSyncServiceTestHarness::GetLastSessionSnapshot() const { |
| 331 EXPECT_FALSE(service_ == NULL) << "Sync service has not yet been set up."; | 333 EXPECT_FALSE(service_ == NULL) << "Sync service has not yet been set up."; |
| 332 return service_->backend()->GetLastSessionSnapshot(); | 334 if (service_->backend()) { |
| 335 return service_->backend()->GetLastSessionSnapshot(); |
| 336 } |
| 337 return NULL; |
| 333 } | 338 } |
| 334 | 339 |
| 335 void ProfileSyncServiceTestHarness::LogClientInfo(std::string message) { | 340 void ProfileSyncServiceTestHarness::LogClientInfo(std::string message) { |
| 336 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); | 341 const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); |
| 337 if (snap) { | 342 if (snap) { |
| 338 LOG(INFO) << "Client " << id_ << ": " << message << ": " | 343 LOG(INFO) << "Client " << id_ << ": " << message << ": " |
| 339 << "has_more_to_sync: " << snap->has_more_to_sync | 344 << "has_more_to_sync: " << snap->has_more_to_sync |
| 340 << ", max_local_timestamp: " << snap->max_local_timestamp | 345 << ", max_local_timestamp: " << snap->max_local_timestamp |
| 341 << ", unsynced_count: " << snap->unsynced_count | 346 << ", unsynced_count: " << snap->unsynced_count |
| 342 << ", has_unsynced_items: " << service()->backend()->HasUnsyncedItems() | 347 << ", has_unsynced_items: " << service()->backend()->HasUnsyncedItems() |
| 343 << "."; | 348 << "."; |
| 344 } else { | 349 } else { |
| 345 LOG(INFO) << "Client " << id_ << ": " << message << ": " | 350 LOG(INFO) << "Client " << id_ << ": " << message << ": " |
| 346 << "Snap not available."; | 351 << "Snap not available."; |
| 347 } | 352 } |
| 348 } | 353 } |
| OLD | NEW |