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