| Index: trunk/src/chrome/browser/sync/test_profile_sync_service.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/sync/test_profile_sync_service.cc (revision 238367)
|
| +++ trunk/src/chrome/browser/sync/test_profile_sync_service.cc (working copy)
|
| @@ -5,21 +5,19 @@
|
| #include "chrome/browser/sync/test_profile_sync_service.h"
|
|
|
| #include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
|
| #include "chrome/browser/signin/signin_manager.h"
|
| #include "chrome/browser/signin/signin_manager_factory.h"
|
| #include "chrome/browser/sync/glue/sync_backend_host.h"
|
| #include "chrome/browser/sync/glue/sync_backend_host_core.h"
|
| #include "chrome/browser/sync/profile_sync_components_factory.h"
|
| -#include "chrome/browser/sync/profile_sync_components_factory_mock.h"
|
| #include "chrome/browser/sync/test/test_http_bridge_factory.h"
|
| #include "sync/internal_api/public/test/sync_manager_factory_for_profile_sync_test.h"
|
| -#include "sync/internal_api/public/test/test_internal_components_factory.h"
|
| #include "sync/internal_api/public/user_share.h"
|
| #include "sync/js/js_reply_handler.h"
|
| #include "sync/protocol/encryption.pb.h"
|
|
|
| using syncer::InternalComponentsFactory;
|
| +using syncer::ModelSafeRoutingInfo;
|
| using syncer::TestInternalComponentsFactory;
|
| using syncer::UserShare;
|
|
|
| @@ -28,23 +26,42 @@
|
| SyncBackendHostForProfileSyncTest::SyncBackendHostForProfileSyncTest(
|
| Profile* profile,
|
| const base::WeakPtr<SyncPrefs>& sync_prefs,
|
| - base::Closure& callback)
|
| + base::Closure& callback,
|
| + bool set_initial_sync_ended_on_init,
|
| + bool synchronous_init,
|
| + bool fail_initial_download,
|
| + syncer::StorageOption storage_option)
|
| : browser_sync::SyncBackendHostImpl(
|
| profile->GetDebugName(), profile, sync_prefs),
|
| - callback_(callback) {}
|
| + callback_(callback),
|
| + fail_initial_download_(fail_initial_download),
|
| + set_initial_sync_ended_on_init_(set_initial_sync_ended_on_init),
|
| + synchronous_init_(synchronous_init),
|
| + storage_option_(storage_option),
|
| + weak_ptr_factory_(this) {}
|
|
|
| SyncBackendHostForProfileSyncTest::~SyncBackendHostForProfileSyncTest() {}
|
|
|
| +namespace {
|
| +
|
| +scoped_ptr<syncer::HttpPostProviderFactory> MakeTestHttpBridgeFactory() {
|
| + return scoped_ptr<syncer::HttpPostProviderFactory>(
|
| + new browser_sync::TestHttpBridgeFactory());
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| void SyncBackendHostForProfileSyncTest::InitCore(
|
| scoped_ptr<DoInitializeOptions> options) {
|
| - options->http_bridge_factory =
|
| - scoped_ptr<syncer::HttpPostProviderFactory>(
|
| - new browser_sync::TestHttpBridgeFactory());
|
| + options->http_bridge_factory = MakeTestHttpBridgeFactory();
|
| options->sync_manager_factory.reset(
|
| - new syncer::SyncManagerFactoryForProfileSyncTest(callback_));
|
| + new syncer::SyncManagerFactoryForProfileSyncTest(
|
| + callback_,
|
| + set_initial_sync_ended_on_init_));
|
| options->credentials.email = "testuser@gmail.com";
|
| options->credentials.sync_token = "token";
|
| options->restored_key_for_bootstrapping = "";
|
| + syncer::StorageOption storage = storage_option_;
|
|
|
| // It'd be nice if we avoided creating the InternalComponentsFactory in the
|
| // first place, but SyncBackendHost will have created one by now so we must
|
| @@ -52,12 +69,25 @@
|
| InternalComponentsFactory::Switches factory_switches =
|
| options->internal_components_factory->GetSwitches();
|
| options->internal_components_factory.reset(
|
| - new TestInternalComponentsFactory(factory_switches,
|
| - syncer::STORAGE_IN_MEMORY));
|
| + new TestInternalComponentsFactory(factory_switches, storage));
|
|
|
| SyncBackendHostImpl::InitCore(options.Pass());
|
| + if (synchronous_init_ && !base::MessageLoop::current()->is_running()) {
|
| + // The SyncBackend posts a task to the current loop when
|
| + // initialization completes.
|
| + base::MessageLoop::current()->Run();
|
| + }
|
| }
|
|
|
| +void SyncBackendHostForProfileSyncTest::UpdateCredentials(
|
| + const syncer::SyncCredentials& credentials) {
|
| + // If we had failed the initial download, complete initialization now.
|
| + if (!initial_download_closure_.is_null()) {
|
| + initial_download_closure_.Run();
|
| + initial_download_closure_.Reset();
|
| + }
|
| +}
|
| +
|
| void SyncBackendHostForProfileSyncTest::RequestConfigureSyncer(
|
| syncer::ConfigureReason reason,
|
| syncer::ModelTypeSet to_download,
|
| @@ -70,6 +100,8 @@
|
| syncer::ModelTypeSet)>& ready_task,
|
| const base::Closure& retry_callback) {
|
| syncer::ModelTypeSet failed_configuration_types;
|
| + if (fail_initial_download_)
|
| + failed_configuration_types = to_download;
|
|
|
| // The first parameter there should be the set of enabled types. That's not
|
| // something we have access to from this strange test harness. We'll just
|
| @@ -82,12 +114,41 @@
|
| ready_task);
|
| }
|
|
|
| +void
|
| +SyncBackendHostForProfileSyncTest::HandleInitializationSuccessOnFrontendLoop(
|
| + const syncer::WeakHandle<syncer::JsBackend> js_backend,
|
| + const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>
|
| + debug_info_listener) {
|
| + if (fail_initial_download_) {
|
| + // We interrupt this successful init to bring you a simulated failure.
|
| + initial_download_closure_ = base::Bind(
|
| + &SyncBackendHostForProfileSyncTest::
|
| + HandleInitializationSuccessOnFrontendLoop,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + js_backend,
|
| + debug_info_listener);
|
| + HandleControlTypesDownloadRetry();
|
| + if (synchronous_init_)
|
| + base::MessageLoop::current()->Quit();
|
| + } else {
|
| + SyncBackendHostImpl::HandleInitializationSuccessOnFrontendLoop(
|
| + js_backend,
|
| + debug_info_listener);
|
| + }
|
| +}
|
| +
|
| } // namespace browser_sync
|
|
|
| syncer::TestIdFactory* TestProfileSyncService::id_factory() {
|
| return &id_factory_;
|
| }
|
|
|
| +browser_sync::SyncBackendHostForProfileSyncTest*
|
| + TestProfileSyncService::GetBackendForTest() {
|
| + return static_cast<browser_sync::SyncBackendHostForProfileSyncTest*>(
|
| + ProfileSyncService::GetBackendForTest());
|
| +}
|
| +
|
| syncer::WeakHandle<syncer::JsEventHandler>
|
| TestProfileSyncService::GetJsEventHandler() {
|
| return syncer::WeakHandle<syncer::JsEventHandler>();
|
| @@ -98,12 +159,19 @@
|
| Profile* profile,
|
| SigninManagerBase* signin,
|
| ProfileOAuth2TokenService* oauth2_token_service,
|
| - ProfileSyncService::StartBehavior behavior)
|
| + ProfileSyncService::StartBehavior behavior,
|
| + bool synchronous_backend_initialization)
|
| : ProfileSyncService(factory,
|
| profile,
|
| signin,
|
| oauth2_token_service,
|
| - behavior) {
|
| + behavior),
|
| + synchronous_backend_initialization_(
|
| + synchronous_backend_initialization),
|
| + synchronous_sync_configuration_(false),
|
| + set_initial_sync_ended_on_init_(true),
|
| + fail_initial_download_(false),
|
| + storage_option_(syncer::STORAGE_IN_MEMORY) {
|
| SetSyncSetupCompleted();
|
| }
|
|
|
| @@ -124,7 +192,8 @@
|
| profile,
|
| signin,
|
| oauth2_token_service,
|
| - ProfileSyncService::AUTO_START);
|
| + ProfileSyncService::AUTO_START,
|
| + false);
|
| }
|
|
|
| ProfileSyncComponentsFactoryMock*
|
| @@ -133,20 +202,82 @@
|
| return static_cast<ProfileSyncComponentsFactoryMock*>(factory());
|
| }
|
|
|
| +void TestProfileSyncService::RequestAccessToken() {
|
| + ProfileSyncService::RequestAccessToken();
|
| + if (synchronous_backend_initialization_) {
|
| + base::MessageLoop::current()->Run();
|
| + }
|
| +}
|
| +
|
| +void TestProfileSyncService::OnGetTokenSuccess(
|
| + const OAuth2TokenService::Request* request,
|
| + const std::string& access_token,
|
| + const base::Time& expiration_time) {
|
| + ProfileSyncService::OnGetTokenSuccess(request, access_token,
|
| + expiration_time);
|
| + if (synchronous_backend_initialization_) {
|
| + base::MessageLoop::current()->Quit();
|
| + }
|
| +}
|
| +
|
| +void TestProfileSyncService::OnGetTokenFailure(
|
| + const OAuth2TokenService::Request* request,
|
| + const GoogleServiceAuthError& error) {
|
| + ProfileSyncService::OnGetTokenFailure(request, error);
|
| + if (synchronous_backend_initialization_) {
|
| + base::MessageLoop::current()->Quit();
|
| + }
|
| +}
|
| +
|
| +
|
| +void TestProfileSyncService::OnBackendInitialized(
|
| + const syncer::WeakHandle<syncer::JsBackend>& backend,
|
| + const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>&
|
| + debug_info_listener,
|
| + bool success) {
|
| + ProfileSyncService::OnBackendInitialized(backend,
|
| + debug_info_listener,
|
| + success);
|
| +
|
| + // TODO(akalin): Figure out a better way to do this.
|
| + if (synchronous_backend_initialization_) {
|
| + base::MessageLoop::current()->Quit();
|
| + }
|
| +}
|
| +
|
| void TestProfileSyncService::OnConfigureDone(
|
| const browser_sync::DataTypeManager::ConfigureResult& result) {
|
| ProfileSyncService::OnConfigureDone(result);
|
| - base::MessageLoop::current()->Quit();
|
| + if (!synchronous_sync_configuration_)
|
| + base::MessageLoop::current()->Quit();
|
| }
|
|
|
| UserShare* TestProfileSyncService::GetUserShare() const {
|
| return backend_->GetUserShare();
|
| }
|
|
|
| +void TestProfileSyncService::dont_set_initial_sync_ended_on_init() {
|
| + set_initial_sync_ended_on_init_ = false;
|
| +}
|
| +void TestProfileSyncService::set_synchronous_sync_configuration() {
|
| + synchronous_sync_configuration_ = true;
|
| +}
|
| +void TestProfileSyncService::fail_initial_download() {
|
| + fail_initial_download_ = true;
|
| +}
|
| +void TestProfileSyncService::set_storage_option(
|
| + syncer::StorageOption storage_option) {
|
| + storage_option_ = storage_option;
|
| +}
|
| +
|
| void TestProfileSyncService::CreateBackend() {
|
| backend_.reset(new browser_sync::SyncBackendHostForProfileSyncTest(
|
| profile(),
|
| sync_prefs_.AsWeakPtr(),
|
| - callback_));
|
| + callback_,
|
| + set_initial_sync_ended_on_init_,
|
| + synchronous_backend_initialization_,
|
| + fail_initial_download_,
|
| + storage_option_));
|
| }
|
|
|
|
|