1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <limits>
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "app/sql/statement.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "build/build_config.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/password_manager/encryptor.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/syncable/directory_manager.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/util/user_settings.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::numeric_limits;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst FilePath::CharType kV10UserSettingsDB[] =
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FILE_PATH_LITERAL("Version10Settings.sqlite3");
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst FilePath::CharType kV11UserSettingsDB[] =
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FILE_PATH_LITERAL("Version11Settings.sqlite3");
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst FilePath::CharType kOldStyleSyncDataDB[] =
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FILE_PATH_LITERAL("OldStyleSyncData.sqlite3");
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UserSettingsTest : public testing::Test {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UserSettingsTest() : sync_data_("Some sync data") {}
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Need to mock the Keychain for unit tests on Mac to avoid possible
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // blocking UI.  |SetAuthTokenForService| uses Encryptor.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Encryptor::UseMockKeychain(true);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates and populates the V10 database files within
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |destination_directory|.
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetUpVersion10Databases(const FilePath& destination_directory) {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    v10_user_setting_db_path_ =
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        destination_directory.Append(FilePath(kV10UserSettingsDB));
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sql::Connection db;
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Open(v10_user_setting_db_path_));
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    old_style_sync_data_path_ =
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        destination_directory.Append(FilePath(kOldStyleSyncDataDB));
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(sync_data_.length(),
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              static_cast<size_t>(file_util::WriteFile(
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  old_style_sync_data_path_, sync_data_.data(),
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  sync_data_.length())));
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Create settings table.
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Execute(
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "CREATE TABLE settings (email, key, value,  PRIMARY KEY(email, key)"
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        " ON CONFLICT REPLACE)"));
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Add a blank signin table.
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Execute(
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "CREATE TABLE signin_types (signin, signin_type)"));
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Create and populate version table.
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Execute("CREATE TABLE db_version (version)"));
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const char* query = "INSERT INTO db_version VALUES(?)";
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      sql::Statement s(db.GetUniqueStatement(query));
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!s)
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(FATAL) << query << "\n" << db.GetErrorMessage();
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      s.BindInt(0, 10);
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!s.Run())
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(FATAL) << query << "\n" << db.GetErrorMessage();
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Create shares table.
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Execute(
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "CREATE TABLE shares (email, share_name, file_name,"
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        " PRIMARY KEY(email, share_name) ON CONFLICT REPLACE)"));
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Populate a share.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const char* query = "INSERT INTO shares VALUES(?, ?, ?)";
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      sql::Statement s(db.GetUniqueStatement(query));
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!s)
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(FATAL) << query << "\n" << db.GetErrorMessage();
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      s.BindString(0, "foo@foo.com");
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      s.BindString(1, "foo@foo.com");
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      s.BindString(2, WideToUTF8(old_style_sync_data_path_.value()));
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_POSIX)
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      s.BindString(2, old_style_sync_data_path_.value());
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!s.Run())
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(FATAL) << query << "\n" << db.GetErrorMessage();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   // Creates and populates the V11 database file within
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |destination_directory|.
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetUpVersion11Database(const FilePath& destination_directory) {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    v11_user_setting_db_path_ =
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        destination_directory.Append(FilePath(kV11UserSettingsDB));
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sql::Connection db;
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Open(v11_user_setting_db_path_));
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Create settings table.
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Execute(
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "CREATE TABLE settings (email, key, value, PRIMARY KEY(email, key)"
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        " ON CONFLICT REPLACE)"));
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Create and populate version table.
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Execute("CREATE TABLE db_version (version)"));
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const char* query = "INSERT INTO db_version VALUES(?)";
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      sql::Statement s(db.GetUniqueStatement(query));
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!s)
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(FATAL) << query << "\n" << db.GetErrorMessage();
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      s.BindInt(0, 11);
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!s.Run())
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(FATAL) << query << "\n" << db.GetErrorMessage();
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(db.Execute(
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "CREATE TABLE signin_types (signin, signin_type)"));
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const char* query = "INSERT INTO signin_types VALUES(?, ?)";
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      sql::Statement s(db.GetUniqueStatement(query));
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!s)
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(FATAL) << query << "\n" << db.GetErrorMessage();
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      s.BindString(0, "test");
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      s.BindString(1, "test");
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!s.Run())
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(FATAL) << query << "\n" << db.GetErrorMessage();
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& sync_data() const { return sync_data_; }
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath& v10_user_setting_db_path() const {
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return v10_user_setting_db_path_;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath& v11_user_setting_db_path() const {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return v11_user_setting_db_path_;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath& old_style_sync_data_path() const {
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return old_style_sync_data_path_;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath v10_user_setting_db_path_;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath old_style_sync_data_path_;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath v11_user_setting_db_path_;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string sync_data_;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, MigrateFromV10ToV11) {
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedTempDir temp_dir;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetUpVersion10Databases(temp_dir.path());
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Create a UserSettings, which should trigger migration code. We do this
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // inside a scoped block so it closes itself and we can poke around to see
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // what happened later.
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    browser_sync::UserSettings settings;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    settings.Init(v10_user_setting_db_path());
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now poke around using sqlite to see if UserSettings migrated properly.
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Connection db;
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(db.Open(v10_user_setting_db_path()));
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note that we don't use ScopedStatement to avoid closing the sqlite handle
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // before finalizing the statement.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const char* query = "SELECT version FROM db_version";
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sql::Statement version_query(db.GetUniqueStatement(query));
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!version_query)
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(FATAL) << query << "\n" << db.GetErrorMessage();
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(version_query.Step());
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const int version = version_query.ColumnInt(0);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_GE(version, 11);
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::PathExists(old_style_sync_data_path()));
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath new_style_path = temp_dir.path().Append(
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      syncable::DirectoryManager::GetSyncDataDatabaseFilename());
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string contents;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::ReadFileToString(new_style_path, &contents));
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(sync_data() == contents);
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, MigrateFromV11ToV12) {
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedTempDir temp_dir;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetUpVersion11Database(temp_dir.path());
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    browser_sync::UserSettings settings;
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    settings.Init(v11_user_setting_db_path());
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  sql::Connection db;
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(db.Open(v11_user_setting_db_path()));
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const char* query = "SELECT version FROM db_version";
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sql::Statement version_query(db.GetUniqueStatement(query));
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!version_query)
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(FATAL) << query << "\n" << db.GetErrorMessage();
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(version_query.Step());
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const int version = version_query.ColumnInt(0);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_GE(version, 12);
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const char* query2 = "SELECT name FROM sqlite_master "
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         "WHERE type='table' AND name='signin_types'";
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sql::Statement table_query(db.GetUniqueStatement(query2));
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!table_query)
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(FATAL) << query2 << "\n" << db.GetErrorMessage();
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_FALSE(table_query.Step());
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, APEncode) {
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string test;
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char i;
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (i = numeric_limits<char>::min(); i < numeric_limits<char>::max(); ++i)
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    test.push_back(i);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test.push_back(i);
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string encoded = browser_sync::APEncode(test);
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string decoded = browser_sync::APDecode(encoded);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(test, decoded);
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, PersistEmptyToken) {
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedTempDir temp_dir;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser_sync::UserSettings settings;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  settings.Init(temp_dir.path().AppendASCII("UserSettings.sqlite3"));
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  settings.SetAuthTokenForService("username", "service", "");
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string username;
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string token;
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(settings.GetLastUserAndServiceToken("service", &username,
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &token));
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("", token);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("username", username);
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(UserSettingsTest, PersistNonEmptyToken) {
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ScopedTempDir temp_dir;
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser_sync::UserSettings settings;
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  settings.Init(temp_dir.path().AppendASCII("UserSettings.sqlite3"));
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  settings.SetAuthTokenForService("username", "service",
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah"
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah"
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah");
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string username;
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string token;
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(settings.GetLastUserAndServiceToken("service", &username,
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &token));
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah"
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah"
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "oonetuhasonteuhasonetuhasonetuhasonetuhasouhasonetuhasonetuhasonetuhah",
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      token);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("username", username);
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
282