12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/push_messaging/sync_setup_helper.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h" 18d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SyncSetupHelper::SyncSetupHelper() {} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SyncSetupHelper::~SyncSetupHelper() {} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SyncSetupHelper::InitializeSync(Profile* profile) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_ = profile; 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch client_.reset( 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileSyncServiceHarness::Create(profile_, username_, password_)); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (client_->service()->IsSyncEnabledAndLoggedIn()) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!client_->SetupSync()) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Because clients may modify sync data as part of startup (for example local 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // session-releated data is rewritten), we need to ensure all startup-based 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changes have propagated between the clients. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This could take several seconds. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AwaitQuiescence(); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Read the sync signin credentials from a file on the machine. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SyncSetupHelper::ReadPasswordFile(const base::FilePath& password_file) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(dcheng): Convert format of config file to JSON. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string file_contents; 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool success = base::ReadFileToString(password_file, &file_contents); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(success) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "Password file \"" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << password_file.value() << "\" does not exist."; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!success) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> tokens; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string delimiters = "\r\n"; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tokenize(file_contents, delimiters, &tokens); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5U, tokens.size()) << "Password file \"" 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << password_file.value() 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "\" must contain exactly five lines of text."; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (5U != tokens.size()) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) username_ = tokens[0]; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) password_ = tokens[1]; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_id_ = tokens[2]; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_secret_ = tokens[3]; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) refresh_token_ = tokens[4]; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SyncSetupHelper::AwaitQuiescence() { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ProfileSyncServiceHarness*> clients; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clients.push_back(client_.get()); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ProfileSyncServiceHarness::AwaitQuiescence(clients); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 83